/*
- * $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.
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 );
* 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);
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);
}
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));