X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_open.c;h=b0eb42350553b2924d2e42e9cbc31a1abcf26691;hb=6f3a5b930085e56f39b415f20db02df98dbecfff;hp=6b6e09ca3035ed914903ea6b5c7b88cc836b5864;hpb=9685b2154cf9f48f586698e1f79d89659efcbe7b;p=netatalk.git diff --git a/libatalk/adouble/ad_open.c b/libatalk/adouble/ad_open.c index 6b6e09ca..b0eb4235 100644 --- a/libatalk/adouble/ad_open.c +++ b/libatalk/adouble/ad_open.c @@ -1,5 +1,5 @@ /* - * $Id: ad_open.c,v 1.63 2010-01-05 13:48:47 franklahm Exp $ + * $Id: ad_open.c,v 1.68 2010-01-06 14:05:15 franklahm Exp $ * * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -1080,9 +1080,8 @@ ad_mkdir( const char *path, int mode) int st_invalid; struct stat stbuf; -#ifdef DEBUG - LOG(log_debug9, logtype_default, "ad_mkdir: Creating directory with mode %d", mode); -#endif + LOG(log_debug, logtype_default, "ad_mkdir: creating ad-directory '%s/%s' with mode %04o", + getcwdpath(), path, mode); st_invalid = ad_mode_st(path, &mode, &stbuf); ret = mkdir( path, mode ); @@ -1365,7 +1364,7 @@ int ad_open( const char *path, int adflags, int oflags, int mode, struct adouble * here. * if ((oflags & O_CREAT) ==> (oflags & O_RDWR) */ - LOG(logtype_default, log_debug, "ad_open: creating new adouble file: %s/%s", getcwdpath(), ad_p); + LOG(log_debug, logtype_default, "ad_open: creating new adouble file: %s/%s", getcwdpath(), ad_p); admode = mode; errno = 0; st_invalid = ad_mode_st(ad_p, &admode, &st_dir); @@ -1373,7 +1372,7 @@ int ad_open( const char *path, int adflags, int oflags, int mode, struct adouble admode = mode; } admode = ad_hf_mode(admode); - if ( errno == ENOENT && !(ad->ad_options & ADVOL_NOADOUBLE) && ad->ad_flags != AD_VERSION2_OSX) { + if ((errno == ENOENT) && (ad->ad_flags != AD_VERSION2_OSX)) { if (ad->ad_ops->ad_mkrf( ad_p) < 0) { return ad_error(ad, adflags); } @@ -1506,16 +1505,34 @@ 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. Whether ADFLAGS_CREATE really creates + * a adouble file depends on various other volume options, eg. ADVOL_CACHE */ 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; + int create = 0; + + dir = flags & ADFLAGS_DIR; + + /* Check if we shall call ad_open with O_CREAT */ + if ( (adp->ad_options & ADVOL_CACHE) + && ! (adp->ad_options & ADVOL_NOADOUBLE) + && (flags & ADFLAGS_CREATE) ) + create = O_CREAT; + + 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));