#include <atalk/util.h>
#include <atalk/unix.h>
#include <atalk/volume.h>
-#include <atalk/volinfo.h>
#include <atalk/bstrlib.h>
#include <atalk/bstradd.h>
#include <atalk/queue.h>
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;
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;
#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) {
dir = path;
else
dir++;
- if (check_netatalk_dirs(dir) != NULL)
+ if (!dvolume.vol->vfs->vfs_validupath(dvolume.vol, dir))
return FTW_SKIP_SUBTREE;
/*
}
/* 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;
}
/* 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;
/* 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;
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);
}
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;
/* 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;
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;
/* 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 {
islink = !fdval && S_ISLNK(fs->st_mode);
mode = fs->st_mode & (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO);
+#if defined(__FreeBSD__)
+ TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atimespec);
+ TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtimespec);
+#else
TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atim);
TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtim);
+#endif
+
if (utimes(to.p_path, tv)) {
SLOG("utimes: %s", to.p_path);
rval = 1;
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;
return (1);
}
acl_free(acl);
-#endif
return (0);
}
+#endif