]> arthur.barton.de Git - netatalk.git/commitdiff
Fixes
authorFrank Lahm <franklahm@googlemail.com>
Sat, 21 Jan 2012 14:48:17 +0000 (15:48 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Sat, 21 Jan 2012 14:48:17 +0000 (15:48 +0100)
etc/afpd/file.c
include/atalk/adouble.h
libatalk/adouble/ad_flush.c
libatalk/adouble/ad_open.c
libatalk/vfs/vfs.c

index 342349a00347d5966cc9028377278ee2ac1120ce..69c3388b5473c3b6a08d3a97ae9a49ee9df4ac61 100644 (file)
@@ -1656,6 +1656,7 @@ int deletefile(const struct vol *vol, int dirfd, char *file, int checkAttrib)
     }
 
     if (adp && ad_tmplock( &ad, ADEID_DFORK, ADLOCK_WR, 0, 0, 0 ) < 0) {
+        LOG(log_error, logtype_afpd, "deletefile('%s'): ad_tmplock error: %s", file, strerror(errno));
         err = AFPERR_BUSY;
     } else if (!(err = vol->vfs->vfs_deletefile(vol, dirfd, file)) && !(err = netatalk_unlinkat(dirfd, file )) ) {
         cnid_t id;
index 659460283da6a582c19aef20a1726b4c5df706ca..118dd613a4ff18ceb1644be2c41acee3195e0b3b 100644 (file)
@@ -390,6 +390,7 @@ extern uid_t ad_getfuid   (void );
 extern char *ad_dir       (const char *);
 extern const char *ad_path      (const char *, int);
 extern const char *ad_path_ea   (const char *, int);
+extern const char *ad_path_osx  (const char *path, int adflags);
 extern int ad_mode        (const char *, mode_t);
 extern int ad_mkdir       (const char *, mode_t);
 struct vol;
index 77dfd7eaff97cef1f0a9973293e31563f64668d5..397e8167ea2a5fc2eb10ec09a9b7a48a6fee9e05 100644 (file)
@@ -252,7 +252,7 @@ static int ad_flush_hf(struct adouble *ad)
                 if (ad->ad_adflags & ADFLAGS_DIR) {
                     EC_NEG1_LOG( cwd = open(".", O_RDONLY) );
                     EC_NEG1_LOG( fchdir(ad_data_fileno(ad)) );
-                    EC_ZERO_LOG( sys_fsetxattr(".", AD_EA_META, ad->ad_data, AD_DATASZ_EA, 0) );
+                    EC_ZERO_LOG( sys_lsetxattr(".", AD_EA_META, ad->ad_data, AD_DATASZ_EA, 0) );
                     EC_NEG1_LOG( fchdir(cwd) );
                     cwd = -1;
                 } else {
index e8034d0e817eadb6e6f21f4efddfe21e4c64655a..be149077f833713eef978f1d780657c4afbc0342 100644 (file)
@@ -107,7 +107,6 @@ static int ad_mkrf_ea(const char *path);
 static int ad_header_read_ea(const char *path, struct adouble *ad, struct stat *hst);
 static int ad_header_upgrade_ea(struct adouble *ad, const char *name);
 static int ad_reso_size(const char *path, int adflags, struct adouble *ad);
-static const char *ad_path_osx(const char *path, int adflags);
 static int ad_mkrf_osx(const char *path);
 
 
@@ -923,6 +922,7 @@ static int ad_open_hf_ea(const char *path, int adflags, int mode, struct adouble
 {
     ssize_t rforklen;
     int oflags;
+    int opened = 0;
 
     LOG(log_debug, logtype_default, "ad_open_hf_ea(\"%s\", %s, %04o)",
         path, adflags2logstr(adflags), mode);
@@ -951,6 +951,7 @@ static int ad_open_hf_ea(const char *path, int adflags, int mode, struct adouble
             LOG(log_debug, logtype_default, "ad_open_hf_ea(\"%s\"): opening base file for meta adouble EA", path);
             if ((ad_meta_fileno(ad) = open(path, oflags)) == -1)
                 goto error;
+            opened = 1;
             ad->ad_mdp->adf_flags = oflags;
         }
         ad->ad_mdp->adf_refcount = 1;
@@ -989,12 +990,13 @@ static int ad_open_hf_ea(const char *path, int adflags, int mode, struct adouble
     return 0;
 
 error:
-    if (ad_meta_fileno(ad) != -1) {
+    if (opened && ad_meta_fileno(ad) != -1) {
         close(ad_meta_fileno(ad));
         ad_meta_fileno(ad) = -1;
         ad->ad_mdp->adf_refcount = 0;
     }
-    return ad_error(ad, adflags);
+    (void)ad_reso_size(path, adflags, ad);
+    return -1;
 }
 
 static int ad_open_hf(const char *path, int adflags, int mode, struct adouble *ad)
@@ -1141,7 +1143,7 @@ static int ad_open_rf(const char *path, int adflags, int mode, struct adouble *a
     }
 #endif
 
-    EC_NEG1_LOG( ad_reso_size(path, adflags, ad));
+    (void)ad_reso_size(path, adflags, ad);
 
 EC_CLEANUP:
     if (ret != 0) {
@@ -1447,7 +1449,7 @@ int ad_open(struct adouble *ad, const char *path, int adflags, ...)
         adflags |= ADFLAGS_DF;
 
     if (ad->ad_inited != AD_INITED) {
-        ad->ad_adflags = adflags;
+        ad->ad_adflags = (adflags & ~(ADFLAGS_DF | ADFLAGS_HF | ADFLAGS_RF));
         ad->ad_inited = AD_INITED;
     } else {
         ad->ad_open_forks = ((ad->ad_data_fork.adf_refcount > 0) ? ATTRBIT_DOPEN : 0);
@@ -1480,7 +1482,10 @@ int ad_open(struct adouble *ad, const char *path, int adflags, ...)
     }
 
 EC_CLEANUP:
-    return ret;
+    LOG(log_debug, logtype_default, "ad_open(\"%s\", %s): result: %d",
+        fullpathname(path), adflags2logstr(ad->ad_adflags), ret);
+
+    EC_EXIT;
 }
 
 /*!
index 044000922796b6eab4fb3a4d69f2877aa6021148..fe272407096f19d3888b48883bd0c6e682ad24f6 100644 (file)
@@ -945,7 +945,11 @@ void initvol_vfs(struct vol *vol)
         vol->ad_path = ad_path;
     } else {
         vol->vfs_modules[0] = &netatalk_adouble_ea;
+#ifdef HAVE_EAFD
         vol->ad_path = ad_path_ea;
+#else
+        vol->ad_path = ad_path_osx;
+#endif
     }
 
     /* Extended Attributes */