From 253027f8607b535a682d0972b323bacb4750e4ed Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Mon, 2 Apr 2012 16:22:36 +0200 Subject: [PATCH] Fix ad cp on appledouble = ea volumes --- NEWS | 1 + bin/ad/ad.h | 2 ++ bin/ad/ad_cp.c | 31 +++++++++++++++++-------------- bin/ad/ad_util.c | 3 ++- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index 98dd8649..f1fe7915 100644 --- 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 diff --git a/bin/ad/ad.h b/bin/ad/ad.h index fcfe1220..c405ef68 100644 --- a/bin/ad/ad.h +++ b/bin/ad/ad.h @@ -38,6 +38,8 @@ } #endif +#define ADVOL_V2_OR_EA(ad) ((ad) == AD_VERSION2 || (ad) == AD_VERSION_EA) + enum logtype {STD, DBG}; #define SLOG(...) \ diff --git a/bin/ad/ad_cp.c b/bin/ad/ad_cp.c index 8f14e3f1..ef995ce8 100644 --- a/bin/ad/ad_cp.c +++ b/bin/ad/ad_cp.c @@ -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); diff --git a/bin/ad/ad_util.c b/bin/ad/ad_util.c index 682bc57c..897bdf3b 100644 --- a/bin/ad/ad_util.c +++ b/bin/ad/ad_util.c @@ -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; } -- 2.39.2