]> arthur.barton.de Git - netatalk.git/commitdiff
Fix removal of zero truncated rforks
authorFrank Lahm <franklahm@googlemail.com>
Sun, 18 Mar 2012 09:51:30 +0000 (10:51 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Sun, 18 Mar 2012 09:51:30 +0000 (10:51 +0100)
etc/afpd/fork.c
libatalk/adouble/ad_write.c

index b2e09193572eda2bf57d2600d8205d6d4c2de467..bb7c6880194ecf8712d646dd4a12ebeaac6f07d1 100644 (file)
@@ -574,15 +574,8 @@ int afp_setforkparams(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf _U_, s
             ad_tmplock(ofork->of_ad, eid, ADLOCK_WR, size, st_size -size, ofork->of_refnum) < 0) {
             goto afp_setfork_err;
         }
-        if (ofork->of_ad->ad_vers == AD_VERSION_EA) {
-#if HAVE_EAFD
-            err = sys_lremovexattr(of_name(ofork), AD_EA_RESO);
-#else
-            err = unlink(ofork->of_vol->ad_path(of_name(ofork), 0));
-#endif
-        } else {
-            err = ad_rtruncate(ofork->of_ad, size);
-        }
+
+        err = ad_rtruncate(ofork->of_ad, size);
         if (st_size > size)
             ad_tmplock(ofork->of_ad, eid, ADLOCK_CLR, size, st_size -size, ofork->of_refnum);
         if (err < 0)
index a142ef00fa47ac954beb6765e164085298b1123d..97667d476afdf2b27bbbf21fcb878d8d53a78c51 100644 (file)
@@ -162,14 +162,25 @@ char            c = 0;
 /* ------------------------ */
 int ad_rtruncate( struct adouble *ad, const off_t size)
 {
-    if (sys_ftruncate(ad_reso_fileno(ad), size + ad->ad_eid[ ADEID_RFORK ].ade_off ) < 0 ) {
-        LOG(log_error, logtype_default, "sys_ftruncate: %s", strerror(errno));
-        return -1;
+    EC_INIT;
+
+    if (ad->ad_vers == AD_VERSION_EA && size == 0) {
+#if HAVE_EAFD
+        EC_NEG1( sys_lremovexattr(of_name(ofork), AD_EA_RESO) );
+#else
+        EC_NEG1( unlink(ad->ad_ops->ad_path(ad->ad_name, 0)) );
+#endif
     }
 
-    ad->ad_rlen = size;    
+    EC_NEG1( sys_ftruncate(ad_reso_fileno(ad), size + ad->ad_eid[ ADEID_RFORK ].ade_off) );
 
-    return 0;
+EC_CLEANUP:
+    if (ret == 0)
+        ad->ad_rlen = size;    
+    else
+        LOG(log_error, logtype_default, "ad_rtruncate(\"%s\"): %s",
+            fullpathname(ad->ad_name), strerror(errno));
+    EC_EXIT;
 }
 
 int ad_dtruncate(struct adouble *ad, const off_t size)