X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fdirectory.c;h=470cfb0184b95cb8e93ffe31a018ba1e7aef9837;hb=76b379ad71f4b129fade5611356b103b7ca6d39a;hp=0bbfade20bbf355e0707ef8d206239e180f8355f;hpb=8086e405be87facbc266aa65eb7c070a392df919;p=netatalk.git diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 0bbfade2..470cfb01 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1083,7 +1083,7 @@ struct path *cname(struct vol *vol, struct dir *dir, char **cpath) int size = 0; int toUTF8 = 0; - LOG(log_maxdebug, logtype_afpd, "came('%s'): {start}", cfrombstr(dir->d_fullpath)); + LOG(log_maxdebug, logtype_afpd, "cname('%s'): {start}", cfrombstr(dir->d_fullpath)); data = *cpath; afp_errno = AFPERR_NOOBJ; @@ -1172,6 +1172,14 @@ struct path *cname(struct vol *vol, struct dir *dir, char **cpath) /* the name is illegal */ LOG(log_info, logtype_afpd, "cname: illegal path: '%s'", ret.u_name); afp_errno = AFPERR_PARAM; + if (vol->v_obj->options.flags & OPTION_VETOMSG) { + bstring message = bformat("Attempt to access vetoed file or directory \"%s\" in directory \"%s\"", + ret.u_name, bdata(dir->d_u_name)); + if (setmessage(bdata(message)) == 0) + /* Client may make multiple attempts, only send the message the first time */ + kill(getpid(), SIGUSR2); + bdestroy(message); + } return NULL; } @@ -1278,7 +1286,7 @@ struct path *cname(struct vol *vol, struct dir *dir, char **cpath) ret.d_dir = dir; } - LOG(log_debug, logtype_afpd, "came('%s') {end: curdir:'%s', path:'%s'}", + LOG(log_debug, logtype_afpd, "cname('%s') {end: curdir:'%s', path:'%s'}", cfrombstr(dir->d_fullpath), cfrombstr(curdir->d_fullpath), ret.u_name); @@ -2206,7 +2214,7 @@ int afp_createdir(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_ ad_setname(&ad, s_path->m_name); ad_setid( &ad, s_path->st.st_dev, s_path->st.st_ino, dir->d_did, did, vol->v_stamp); - fce_register(FCE_DIR_CREATE, bdata(curdir->d_fullpath), NULL, fce_dir); + fce_register(obj, FCE_DIR_CREATE, bdata(curdir->d_fullpath), NULL); ad_flush(&ad); ad_close(&ad, ADFLAGS_HF); @@ -2280,7 +2288,6 @@ int deletecurdir(struct vol *vol) struct dirent *de; struct stat st; struct dir *fdir, *pdir; - DIR *dp; struct adouble ad; uint16_t ashort; int err; @@ -2303,33 +2310,11 @@ int deletecurdir(struct vol *vol) } err = vol->vfs->vfs_deletecurdir(vol); if (err) { - LOG(log_error, logtype_afpd, "deletecurdir: error deleting .AppleDouble in \"%s\"", + LOG(log_error, logtype_afpd, "deletecurdir: error deleting AppleDouble files in \"%s\"", cfrombstr(curdir->d_fullpath)); return err; } - /* now get rid of dangling symlinks */ - if ((dp = opendir("."))) { - while ((de = readdir(dp))) { - /* skip this and previous directory */ - if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) - continue; - - /* bail if it's not a symlink */ - if ((lstat(de->d_name, &st) == 0) && !S_ISLNK(st.st_mode)) { - LOG(log_error, logtype_afpd, "deletecurdir(\"%s\"): not empty", - bdata(curdir->d_fullpath)); - closedir(dp); - return AFPERR_DIRNEMPT; - } - - if ((err = netatalk_unlink(de->d_name))) { - closedir(dp); - return err; - } - } - } - if (movecwd(vol, pdir) < 0) { err = afp_errno; goto delete_done; @@ -2339,24 +2324,29 @@ int deletecurdir(struct vol *vol) cfrombstr(curdir->d_fullpath)); err = netatalk_rmdir_all_errors(-1, cfrombstr(fdir->d_u_name)); - if ( err == AFP_OK || err == AFPERR_NOOBJ) { - AFP_CNID_START("cnid_delete"); - cnid_delete(vol->v_cdb, fdir->d_did); - AFP_CNID_DONE(); - dir_remove( vol, fdir ); - } else { + + switch (err) { + case AFP_OK: + case AFPERR_NOOBJ: + break; + case AFPERR_DIRNEMPT: + if (delete_vetoed_files(vol, bdata(fdir->d_u_name), false) != 0) + goto delete_done; + err = AFP_OK; + break; + default: LOG(log_error, logtype_afpd, "deletecurdir(\"%s\"): netatalk_rmdir_all_errors error", cfrombstr(curdir->d_fullpath)); + goto delete_done; } + AFP_CNID_START("cnid_delete"); + cnid_delete(vol->v_cdb, fdir->d_did); + AFP_CNID_DONE(); + + dir_remove( vol, fdir ); + delete_done: - if (dp) { - /* inode is used as key for cnid. - * Close the descriptor only after cnid_delete - * has been called. - */ - closedir(dp); - } return err; }