]> arthur.barton.de Git - netatalk.git/commitdiff
Fix ad cp on appledouble = ea volumes
authorFrank Lahm <franklahm@googlemail.com>
Mon, 2 Apr 2012 14:22:36 +0000 (16:22 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Mon, 2 Apr 2012 14:22:36 +0000 (16:22 +0200)
NEWS
bin/ad/ad.h
bin/ad/ad_cp.c
bin/ad/ad_util.c

diff --git a/NEWS b/NEWS
index 98dd864935366238ca32a76770469039022440df..f1fe79159c5f0fb3290d9326a76f89f95d69f296 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ Changes in 3.0 alpha2
        we rely on a properly installed version on libevent CPPFLAGS and LDFLAGS
        should be set properly to pick that up
 * UPD: Run ldconfig on Linux at the end of make install
+* FIX: afpd: ad cp on appledouble = ea volumes
 * REM: Volumes options "use dots" and "hex encoding"
 
 Changes in 3.0 alpha1
index fcfe1220115c48e43639a65ea3db3e98f681ed0b..c405ef680bb4cdbf17b86dc7fd26785e0401cc5c 100644 (file)
@@ -38,6 +38,8 @@
     }
 #endif
 
+#define ADVOL_V2_OR_EA(ad) ((ad) == AD_VERSION2 || (ad) == AD_VERSION_EA)
+
 enum logtype {STD, DBG};
 
 #define SLOG(...)                             \
index 8f14e3f18a0b3d4d7f292d03d93201125559a6af..ef995ce8cf3f159c6346a5e32a4858e9cfad8948 100644 (file)
@@ -395,7 +395,7 @@ static int copy(const char *path,
         dir = path;
     else
         dir++;
-    if (check_netatalk_dirs(dir) != NULL)
+    if (!dvolume.vol->vfs->vfs_validupath(dvolume.vol, dir))
         return FTW_SKIP_SUBTREE;
 
     /*
@@ -510,17 +510,18 @@ static int copy(const char *path,
         }
 
         /* Create ad dir and copy ".Parent" */
-        if (dvolume.vol->v_path && dvolume.vol->v_adouble == AD_VERSION2) {
-
-            /* Create ".AppleDouble" dir */
+        if (dvolume.vol->v_path && ADVOL_V2_OR_EA(dvolume.vol->v_adouble)) {
             mode_t omask = umask(0);
-            bstring addir = bfromcstr(to.p_path);
-            bcatcstr(addir, "/.AppleDouble");
-            mkdir(cfrombstr(addir), 02777);
-            bdestroy(addir);
+            if (dvolume.vol->v_adouble == AD_VERSION2) {
+                /* Create ".AppleDouble" dir */
+                bstring addir = bfromcstr(to.p_path);
+                bcatcstr(addir, "/.AppleDouble");
+                mkdir(cfrombstr(addir), 02777);
+                bdestroy(addir);
+            }
 
-            if (svolume.vol->v_path && svolume.vol->v_adouble == AD_VERSION2) {
-                /* copy ".Parent" file */
+            if (svolume.vol->v_path && ADVOL_V2_OR_EA(svolume.vol->v_adouble)) {
+                /* copy metadata file */
                 if (dvolume.vol->vfs->vfs_copyfile(dvolume.vol, -1, path, to.p_path)) {
                     SLOG("Error copying adouble for %s -> %s", path, to.p_path);
                     badcp = rval = 1;
@@ -547,7 +548,8 @@ static int copy(const char *path,
                 ERROR("Error opening adouble for: %s", to.p_path);
             }
             ad_setid( &ad, st.st_dev, st.st_ino, did, pdid, dvolume.db_stamp);
-            ad_setname(&ad, utompath(dvolume.vol, basename(to.p_path)));
+            if (dvolume.vol->v_adouble == AD_VERSION2)
+                ad_setname(&ad, utompath(dvolume.vol, basename(to.p_path)));
             ad_setdate(&ad, AD_DATE_CREATE | AD_DATE_UNIX, st.st_mtime);
             ad_setdate(&ad, AD_DATE_MODIFY | AD_DATE_UNIX, st.st_mtime);
             ad_setdate(&ad, AD_DATE_ACCESS | AD_DATE_UNIX, st.st_mtime);
@@ -582,10 +584,10 @@ static int copy(const char *path,
         if (ftw_copy_file(ftw, path, statp, dne))
             badcp = rval = 1;
 
-        if (dvolume.vol->v_path && dvolume.vol->v_adouble == AD_VERSION2) {
+        if (dvolume.vol->v_path && ADVOL_V2_OR_EA(dvolume.vol->v_adouble)) {
 
             mode_t omask = umask(0);
-            if (svolume.vol->v_path && svolume.vol->v_adouble == AD_VERSION2) {
+            if (svolume.vol->v_path && ADVOL_V2_OR_EA(svolume.vol->v_adouble)) {
                 /* copy ad-file */
                 if (dvolume.vol->vfs->vfs_copyfile(dvolume.vol, -1, path, to.p_path)) {
                     SLOG("Error copying adouble for %s -> %s", path, to.p_path);
@@ -614,7 +616,8 @@ static int copy(const char *path,
                 ERROR("Error opening adouble for: %s", to.p_path);
             }
             ad_setid( &ad, st.st_dev, st.st_ino, cnid, did, dvolume.db_stamp);
-            ad_setname(&ad, utompath(dvolume.vol, basename(to.p_path)));
+            if (dvolume.vol->v_adouble == AD_VERSION2)
+                ad_setname(&ad, utompath(dvolume.vol, basename(to.p_path)));
             ad_setdate(&ad, AD_DATE_CREATE | AD_DATE_UNIX, st.st_mtime);
             ad_setdate(&ad, AD_DATE_MODIFY | AD_DATE_UNIX, st.st_mtime);
             ad_setdate(&ad, AD_DATE_ACCESS | AD_DATE_UNIX, st.st_mtime);
index 682bc57c98190191bccdc5f6721315395b62d6d3..897bdf3b1415c609efdae24f2104d019ef3464fc 100644 (file)
@@ -211,7 +211,8 @@ int convert_dots_encoding(const afpvol_t *svol, const afpvol_t *dvol, char *path
     if ( ! svol->vol->v_path) {
         /* no source volume: escape special chars (eg ':') */
         from = dvol->vol->v_volcharset; /* src = dst charset */
-        flags |= CONV_ESCAPEHEX;
+        if (dvol->vol->v_adouble == AD_VERSION2)
+            flags |= CONV_ESCAPEHEX;
     } else {
         from = svol->vol->v_volcharset;
     }