]> arthur.barton.de Git - netatalk.git/commitdiff
Reintroduce adouble file creation on enumeration
authorfranklahm <franklahm>
Wed, 6 Jan 2010 11:08:53 +0000 (11:08 +0000)
committerfranklahm <franklahm>
Wed, 6 Jan 2010 11:08:53 +0000 (11:08 +0000)
etc/afpd/directory.c
etc/afpd/file.c
libatalk/adouble/ad_open.c

index 82e28e4c226ec75bd6308a8a757eb162731362b6..9917dd43358173c6e0a0fed5e3757b495476d325 100644 (file)
@@ -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;
         }
     }
index 184286c7aaf695aaa27e0cd817894bbfc9534e14..098d6d47e1812a9daf854fa2c30c3fce6b9f881b 100644 (file)
@@ -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?",
index 7fd8257289d8717108cb9d2c580b3d8091c7a9e6..5531091a7db6094dbcaa30b31945dc26edf0f587 100644 (file)
@@ -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));