X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=bin%2Fad%2Fad_cp.c;h=5cefe9648a30484cb007d99fd834eabd8bacd4bc;hb=22a32e7449133013789f3fc7ff6b32772b0c76cc;hp=720ea6d3175027bc5d62480cbd31a58b61f2bcd3;hpb=bea0c55cc833ccc859c8a9413d52af5c61cf3593;p=netatalk.git diff --git a/bin/ad/ad_cp.c b/bin/ad/ad_cp.c index 720ea6d3..5cefe964 100644 --- a/bin/ad/ad_cp.c +++ b/bin/ad/ad_cp.c @@ -67,7 +67,6 @@ #include #include #include -#include #include #include #include @@ -96,36 +95,14 @@ static volatile sig_atomic_t alarmed; static int badcp, rval; static int ftw_options = FTW_MOUNT | FTW_PHYS | FTW_ACTIONRETVAL; -static char *netatalk_dirs[] = { - ".AppleDouble", - ".AppleDB", - ".AppleDesktop", - NULL -}; - /* Forward declarations */ static int copy(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf); static int ftw_copy_file(const struct FTW *, const char *, const struct stat *, int); static int ftw_copy_link(const struct FTW *, const char *, const struct stat *, int); static int setfile(const struct stat *, int); -static int preserve_dir_acls(const struct stat *, char *, char *); +// static int preserve_dir_acls(const struct stat *, char *, char *); static int preserve_fd_acls(int, int); -/* - Check for netatalk special folders e.g. ".AppleDB" or ".AppleDesktop" - Returns pointer to name or NULL. -*/ -static const char *check_netatalk_dirs(const char *name) -{ - int c; - - for (c=0; netatalk_dirs[c]; c++) { - if ((strcmp(name, netatalk_dirs[c])) == 0) - return netatalk_dirs[c]; - } - return NULL; -} - static void upfunc(void) { did = pdid; @@ -212,7 +189,7 @@ static void usage_cp(void) exit(EXIT_FAILURE); } -int ad_cp(int argc, char *argv[]) +int ad_cp(int argc, char *argv[], AFPObj *obj) { struct stat to_stat, tmp_stat; int r, ch, have_trailing_slash; @@ -352,11 +329,11 @@ int ad_cp(int argc, char *argv[]) #endif /* Load .volinfo file for destination*/ - openvol(to.p_path, &dvolume); + openvol(obj, to.p_path, &dvolume); for (int i = 0; argv[i] != NULL; i++) { /* Load .volinfo file for source */ - openvol(argv[i], &svolume); + openvol(obj, argv[i], &svolume); if (nftw(argv[i], copy, upfunc, 20, ftw_options) == -1) { if (alarmed) { @@ -396,7 +373,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; /* @@ -475,7 +452,7 @@ static int copy(const char *path, } /* Convert basename to appropiate volume encoding */ - if (dvolume.volinfo.v_path) { + if (dvolume.vol->v_path) { if ((convert_dots_encoding(&svolume, &dvolume, to.p_path, MAXPATHLEN)) == -1) { SLOG("Error converting name for %s", to.p_path); badcp = rval = 1; @@ -511,18 +488,19 @@ static int copy(const char *path, } /* Create ad dir and copy ".Parent" */ - if (dvolume.volinfo.v_path && dvolume.volinfo.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 (svolume.volinfo.v_path && svolume.volinfo.v_adouble == AD_VERSION2) { - /* copy ".Parent" file */ - if (dvolume.volume.vfs->vfs_copyfile(&dvolume.volume, -1, path, to.p_path)) { + 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 && 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; break; @@ -531,7 +509,7 @@ static int copy(const char *path, /* Get CNID of Parent and add new childir to CNID database */ ppdid = pdid; - if ((did = cnid_for_path(&dvolume, to.p_path, &pdid)) == CNID_INVALID) { + if ((did = cnid_for_path(dvolume.vol->v_cdb, dvolume.vol->v_path, to.p_path, &pdid)) == CNID_INVALID) { SLOG("Error resolving CNID for %s", to.p_path); badcp = rval = 1; return -1; @@ -543,18 +521,19 @@ static int copy(const char *path, badcp = rval = 1; break; } - ad_init(&ad, dvolume.volinfo.v_adouble, dvolume.volinfo.v_ad_options); - if (ad_open_metadata(to.p_path, ADFLAGS_DIR, O_RDWR | O_CREAT, &ad) != 0) { + ad_init(&ad, dvolume.vol); + if (ad_open(&ad, to.p_path, ADFLAGS_HF | ADFLAGS_DIR | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) != 0) { 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.volinfo, 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); ad_setdate(&ad, AD_DATE_BACKUP, AD_DATE_START); ad_flush(&ad); - ad_close_metadata(&ad); + ad_close(&ad, ADFLAGS_HF); umask(omask); } @@ -583,12 +562,12 @@ static int copy(const char *path, if (ftw_copy_file(ftw, path, statp, dne)) badcp = rval = 1; - if (dvolume.volinfo.v_path && dvolume.volinfo.v_adouble == AD_VERSION2) { + if (dvolume.vol->v_path && ADVOL_V2_OR_EA(dvolume.vol->v_adouble)) { mode_t omask = umask(0); - if (svolume.volinfo.v_path && svolume.volinfo.v_adouble == AD_VERSION2) { + if (svolume.vol->v_path && ADVOL_V2_OR_EA(svolume.vol->v_adouble)) { /* copy ad-file */ - if (dvolume.volume.vfs->vfs_copyfile(&dvolume.volume, -1, path, to.p_path)) { + 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; break; @@ -598,7 +577,7 @@ static int copy(const char *path, /* Get CNID of Parent and add new childir to CNID database */ pdid = did; cnid_t cnid; - if ((cnid = cnid_for_path(&dvolume, to.p_path, &did)) == CNID_INVALID) { + if ((cnid = cnid_for_path(dvolume.vol->v_cdb, dvolume.vol->v_path, to.p_path, &did)) == CNID_INVALID) { SLOG("Error resolving CNID for %s", to.p_path); badcp = rval = 1; return -1; @@ -610,18 +589,19 @@ static int copy(const char *path, badcp = rval = 1; break; } - ad_init(&ad, dvolume.volinfo.v_adouble, dvolume.volinfo.v_ad_options); - if (ad_open_metadata(to.p_path, 0, O_RDWR | O_CREAT, &ad) != 0) { + ad_init(&ad, dvolume.vol); + if (ad_open(&ad, to.p_path, ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) != 0) { 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.volinfo, 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); ad_setdate(&ad, AD_DATE_BACKUP, AD_DATE_START); ad_flush(&ad); - ad_close_metadata(&ad); + ad_close(&ad, ADFLAGS_HF); umask(omask); } break; @@ -693,7 +673,7 @@ static int ftw_copy_file(const struct FTW *entp, /* remove existing destination file name, * create a new file */ (void)unlink(to.p_path); - (void)dvolume.volume.vfs->vfs_deletefile(&dvolume.volume, -1, to.p_path); + (void)dvolume.vol->vfs->vfs_deletefile(dvolume.vol, -1, to.p_path); to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT, sp->st_mode & ~(S_ISUID | S_ISGID)); } else { @@ -951,9 +931,9 @@ static int preserve_fd_acls(int source_fd, int dest_fd) return (0); } +#if 0 static int preserve_dir_acls(const struct stat *fs, char *source_dir, char *dest_dir) { -#if 0 acl_t (*aclgetf)(const char *, acl_type_t); int (*aclsetf)(const char *, acl_type_t, acl_t); struct acl *aclp; @@ -1035,6 +1015,6 @@ static int preserve_dir_acls(const struct stat *fs, char *source_dir, char *dest return (1); } acl_free(acl); -#endif return (0); } +#endif