X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fvfs%2Fvfs.c;h=a349cfe8cd4c63b1e6137f1400073ae33b4664c3;hb=0253f09e2f0dab6d6d721264234161539aad4774;hp=89b7a23ad57d5ab4b7e43f8149a06a90c59e45b1;hpb=fe1adbf1170ad207b09021942a3b262dfeb2851d;p=netatalk.git diff --git a/libatalk/vfs/vfs.c b/libatalk/vfs/vfs.c index 89b7a23a..a349cfe8 100644 --- a/libatalk/vfs/vfs.c +++ b/libatalk/vfs/vfs.c @@ -49,11 +49,11 @@ struct perm { gid_t gid; }; -typedef int (*rf_loop)(struct dirent *, char *, void *, int , mode_t ); +typedef int (*rf_loop)(const struct vol *, struct dirent *, char *, void *, int); /* ----------------------------- */ static int -for_each_adouble(const char *from, const char *name, rf_loop fn, void *data, int flag, mode_t v_umask) +for_each_adouble(const char *from, const char *name, rf_loop fn, const struct vol *vol, void *data, int flag) { char buf[ MAXPATHLEN + 1]; char *m; @@ -79,7 +79,7 @@ for_each_adouble(const char *from, const char *name, rf_loop fn, void *data, int } strlcat(buf, de->d_name, sizeof(buf)); - if (fn && (ret = fn(de, buf, data, flag, v_umask))) { + if (fn && (ret = fn(vol, de, buf, data, flag))) { closedir(dp); return ret; } @@ -89,26 +89,21 @@ for_each_adouble(const char *from, const char *name, rf_loop fn, void *data, int return ret; } -/******************************************************************************* - * classic adouble format - *******************************************************************************/ - static int netatalk_name(const char *name) { - return strcasecmp(name,".AppleDouble") && - strcasecmp(name,".AppleDB") && - strcasecmp(name,".AppleDesktop"); + return strcmp(name,".AppleDB") && strcmp(name,".AppleDesktop"); } +/******************************************************************************* + * classic adouble format + *******************************************************************************/ + static int validupath_adouble(VFS_FUNC_ARGS_VALIDUPATH) { if (name[0] != '.') return 1; - if (!(vol->v_flags & AFPVOL_USEDOTS)) - return 0; - - return netatalk_name(name) && strcasecmp(name,".Parent"); + return netatalk_name(name) && strcmp(name,".AppleDouble") && strcasecmp(name,".Parent"); } /* ----------------- */ @@ -132,7 +127,7 @@ static int RF_renamedir_adouble(VFS_FUNC_ARGS_RENAMEDIR) } /* ----------------- */ -static int deletecurdir_adouble_loop(struct dirent *de, char *name, void *data _U_, int flag _U_, mode_t v_umask) +static int deletecurdir_adouble_loop(const struct vol *vol, struct dirent *de, char *name, void *data _U_, int flag _U_) { struct stat st; int err; @@ -155,34 +150,33 @@ static int RF_deletecurdir_adouble(VFS_FUNC_ARGS_DELETECURDIR) /* delete stray .AppleDouble files. this happens to get .Parent files as well. */ - if ((err = for_each_adouble("deletecurdir", ".AppleDouble", deletecurdir_adouble_loop, NULL, 1, vol->v_umask))) + if ((err = for_each_adouble("deletecurdir", ".AppleDouble", deletecurdir_adouble_loop, vol, NULL, 1))) return err; return netatalk_rmdir(-1, ".AppleDouble" ); } /* ----------------- */ -static int adouble_setfilmode(const char * name, mode_t mode, struct stat *st, mode_t v_umask) +static int adouble_setfilmode(const struct vol *vol, const char *name, mode_t mode, struct stat *st) { - return setfilmode(name, ad_hf_mode(mode), st, v_umask); + return setfilmode(vol, name, ad_hf_mode(mode), st); } static int RF_setfilmode_adouble(VFS_FUNC_ARGS_SETFILEMODE) { - return adouble_setfilmode(vol->ad_path(name, ADFLAGS_HF ), mode, st, vol->v_umask); + return adouble_setfilmode(vol, vol->ad_path(name, ADFLAGS_HF ), mode, st); } /* ----------------- */ static int RF_setdirunixmode_adouble(VFS_FUNC_ARGS_SETDIRUNIXMODE) { const char *adouble = vol->ad_path(name, ADFLAGS_DIR ); - int dropbox = vol->v_flags; if (dir_rx_set(mode)) { if (chmod_acl(ad_dir(adouble), (DIRBITS | mode) & ~vol->v_umask) < 0 ) return -1; } - if (adouble_setfilmode(vol->ad_path(name, ADFLAGS_DIR ), mode, st, vol->v_umask) < 0) + if (adouble_setfilmode(vol, vol->ad_path(name, ADFLAGS_DIR ), mode, st) < 0) return -1; if (!dir_rx_set(mode)) { @@ -193,18 +187,18 @@ static int RF_setdirunixmode_adouble(VFS_FUNC_ARGS_SETDIRUNIXMODE) } /* ----------------- */ -static int setdirmode_adouble_loop(struct dirent *de _U_, char *name, void *data, int flag, mode_t v_umask) +static int setdirmode_adouble_loop(const struct vol *vol, struct dirent *de _U_, char *name, void *data, int flag) { mode_t hf_mode = *(mode_t *)data; struct stat st; - if ( stat( name, &st ) < 0 ) { + if (ostat(name, &st, vol_syml_opt(vol)) < 0 ) { if (flag) return 0; LOG(log_error, logtype_afpd, "setdirmode: stat %s: %s", name, strerror(errno) ); } else if (!S_ISDIR(st.st_mode)) { - if (setfilmode(name, hf_mode , &st, v_umask) < 0) { + if (setfilmode(vol, name, hf_mode, &st) < 0) { /* FIXME what do we do then? */ } } @@ -213,7 +207,6 @@ static int setdirmode_adouble_loop(struct dirent *de _U_, char *name, void *data static int RF_setdirmode_adouble(VFS_FUNC_ARGS_SETDIRMODE) { - int dropbox = vol->v_flags; mode_t hf_mode = ad_hf_mode(mode); const char *adouble = vol->ad_path(name, ADFLAGS_DIR ); const char *adouble_p = ad_dir(adouble); @@ -223,7 +216,7 @@ static int RF_setdirmode_adouble(VFS_FUNC_ARGS_SETDIRMODE) return -1; } - if (for_each_adouble("setdirmode", adouble_p, setdirmode_adouble_loop, &hf_mode, 0, vol->v_umask)) + if (for_each_adouble("setdirmode", adouble_p, setdirmode_adouble_loop, vol, &hf_mode, 0)) return -1; if (!dir_rx_set(mode)) { @@ -262,7 +255,7 @@ static int RF_renamefile_adouble(VFS_FUNC_ARGS_RENAMEFILE) if (errno == ENOENT) { struct adouble ad; - if (lstatat(dirfd, adsrc, &st)) /* source has no ressource fork, */ + if (ostatat(dirfd, adsrc, &st, vol_syml_opt(vol))) /* source has no ressource fork, */ return 0; /* We are here because : @@ -415,6 +408,9 @@ static int RF_posix_acl(VFS_FUNC_ARGS_ACL) struct stat st; int len; + if (stat(path, &st) == -1) + EC_FAIL; + if (S_ISDIR(st.st_mode)) { len = snprintf(buf, MAXPATHLEN, "%s/.AppleDouble",path); if (len < 0 || len >= MAXPATHLEN) @@ -469,15 +465,12 @@ static int validupath_ea(VFS_FUNC_ARGS_VALIDUPATH) if (name[0] != '.') return 1; - if (!(vol->v_flags & AFPVOL_USEDOTS)) - return 0; - #ifndef HAVE_EAFD if (name[1] == '_') - return 0; + return ad_valid_header_osx(name); #endif - return netatalk_name(name) && strcasecmp(name,".Parent"); -} + return netatalk_name(name); +} /* ----------------- */ static int RF_chown_ea(VFS_FUNC_ARGS_CHOWN) @@ -495,7 +488,7 @@ static int RF_renamedir_ea(VFS_FUNC_ARGS_RENAMEDIR) } /* Returns 1 if the entry is NOT an ._ file */ -static int deletecurdir_ea_osx_chkifempty_loop(struct dirent *de, char *name, void *data _U_, int flag _U_, mode_t v_umask _U_) +static int deletecurdir_ea_osx_chkifempty_loop(const struct vol *vol, struct dirent *de, char *name, void *data _U_, int flag _U_) { if (de->d_name[0] != '.' || de->d_name[0] == '_') return 1; @@ -503,7 +496,7 @@ static int deletecurdir_ea_osx_chkifempty_loop(struct dirent *de, char *name, vo return 0; } -static int deletecurdir_ea_osx_loop(struct dirent *de, char *name, void *data _U_, int flag _U_, mode_t v_umask _U_) +static int deletecurdir_ea_osx_loop(const struct vol *vol, struct dirent *de, char *name, void *data _U_, int flag _U_) { int ret; @@ -523,7 +516,7 @@ static int RF_deletecurdir_ea(VFS_FUNC_ARGS_DELETECURDIR) /* first check if there's really no other file besides files starting with ._ */ if ((err = for_each_adouble("deletecurdir_ea_osx", ".", deletecurdir_ea_osx_chkifempty_loop, - NULL, 0, 0)) != 0) { + vol, NULL, 0)) != 0) { if (err == 1) return AFPERR_DIRNEMPT; return AFPERR_MISC; @@ -532,7 +525,7 @@ static int RF_deletecurdir_ea(VFS_FUNC_ARGS_DELETECURDIR) /* Now delete orphaned ._ files */ if ((err = for_each_adouble("deletecurdir_ea_osx", ".", deletecurdir_ea_osx_loop, - NULL, 0, 0)) != 0) + vol, NULL, 0)) != 0) return err; #endif @@ -550,7 +543,7 @@ static int RF_setdirunixmode_ea(VFS_FUNC_ARGS_SETDIRUNIXMODE) static int RF_setfilmode_ea(VFS_FUNC_ARGS_SETFILEMODE) { #ifndef HAVE_EAFD - return adouble_setfilmode(vol->ad_path(name, ADFLAGS_HF ), mode, st, vol->v_umask); + return adouble_setfilmode(vol, vol->ad_path(name, ADFLAGS_HF ), mode, st); #endif return 0; } @@ -616,7 +609,17 @@ static int RF_copyfile_ea(VFS_FUNC_ARGS_COPYFILE) EC_ZERO(bcatcstr(d, "/._")); EC_ZERO(bcatcstr(d, name)); - EC_ZERO(copy_file(sfd, cfrombstr(s), cfrombstr(d), 0666)); + if (copy_file(sfd, cfrombstr(s), cfrombstr(d), 0666) != 0) { + switch (errno) { + case ENOENT: + break; + default: + LOG(log_error, logtype_afpd, "[VFS] copyfile(\"%s\" -> \"%s\"): %s", + cfrombstr(s), cfrombstr(d), strerror(errno)); + EC_FAIL; + + } + } EC_CLEANUP: bdestroy(s); @@ -641,7 +644,7 @@ static int RF_renamefile_ea(VFS_FUNC_ARGS_RENAMEFILE) struct stat st; err = errno; - if (errno == ENOENT && lstatat(dirfd, adsrc, &st)) /* source has no ressource fork, */ + if (errno == ENOENT && ostatat(dirfd, adsrc, &st, vol_syml_opt(vol))) /* source has no ressource fork, */ return 0; errno = err; return -1;