From 461587c2cfea98f334cf6575dbaeefe43eb41eba Mon Sep 17 00:00:00 2001 From: franklahm Date: Wed, 6 Jan 2010 11:08:53 +0000 Subject: [PATCH] Reintroduce adouble file creation on enumeration --- etc/afpd/directory.c | 4 ++-- etc/afpd/file.c | 4 ++-- libatalk/adouble/ad_open.c | 25 ++++++++++++++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 82e28e4c..9917dd43 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1,5 +1,5 @@ /* - * $Id: directory.c,v 1.124 2010-01-06 06:06:20 didg Exp $ + * $Id: directory.c,v 1.125 2010-01-06 11:08:53 franklahm Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -1646,7 +1646,7 @@ int getdirparams(const struct vol *vol, (1 << DIRPBIT_FINFO)))) { ad_init(&ad, vol->v_adouble, vol->v_ad_options); - if ( !ad_metadata( upath, ADFLAGS_DIR, &ad) ) { + if ( !ad_metadata( upath, ADFLAGS_CREATE|ADFLAGS_DIR, &ad) ) { isad = 1; } } diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 184286c7..098d6d47 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -1,5 +1,5 @@ /* - * $Id: file.c,v 1.128 2010-01-05 15:12:19 franklahm Exp $ + * $Id: file.c,v 1.129 2010-01-06 11:08:53 franklahm Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -527,7 +527,7 @@ int getfilparams(struct vol *vol, adp = of_ad(vol, path, &ad); upath = path->u_name; - if ( ad_metadata( upath, flags, adp) < 0 ) { + if ( ad_metadata( upath, flags|ADFLAGS_CREATE, adp) < 0 ) { switch (errno) { case EACCES: LOG(log_error, logtype_afpd, "getfilparams(%s): %s: check resource fork permission?", diff --git a/libatalk/adouble/ad_open.c b/libatalk/adouble/ad_open.c index 7fd82572..5531091a 100644 --- a/libatalk/adouble/ad_open.c +++ b/libatalk/adouble/ad_open.c @@ -1,5 +1,5 @@ /* - * $Id: ad_open.c,v 1.65 2010-01-05 15:46:13 franklahm Exp $ + * $Id: ad_open.c,v 1.66 2010-01-06 11:08:53 franklahm Exp $ * * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -1505,16 +1505,27 @@ sfm: return 0 ; } -/* ----------------------------------- - * return only metadata but try very hard ie at first try as user, then try as root +/*! + * @brief open metadata, possibly as root + * + * Return only metadata but try very hard ie at first try as user, then try as root. + * + * @param name name of file/dir + * @param flags ADFLAGS_DIR: name is a directory \n + * ADFLAGS_CREATE: force creation of header file, but only as use, not as root + * @param adp pointer to struct adouble + * + * @note caller MUST pass ADFLAGS_DIR for directories */ int ad_metadata(const char *name, int flags, struct adouble *adp) { uid_t uid; - int ret, err; - int dir = flags & ADFLAGS_DIR; - - if ((ret = ad_open(name, ADFLAGS_HF | dir, O_RDWR, 0666, adp)) < 0 && errno == EACCES) { + int ret, err, dir, create; + + dir = flags & ADFLAGS_DIR; + create = (flags & ADFLAGS_CREATE) ? O_CREAT : 0; + + if ((ret = ad_open(name, ADFLAGS_HF | dir, O_RDWR | create, 0666, adp)) < 0 && errno == EACCES) { uid = geteuid(); if (seteuid(0)) { LOG(log_error, logtype_default, "ad_metadata(%s): seteuid failed %s", name, strerror(errno)); -- 2.39.2