X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffiledir.c;h=9a897d1b969759dc838f2278812770894cbc2c13;hb=ff117107526219d5ce89d5ff683eddd414e40293;hp=01df0d97bd32d39b972e1167d0735f7cffea7924;hpb=3fe5a7e789d4bf2c1417ab3975b2e0822f6d4dd2;p=netatalk.git diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 01df0d97..9a897d1b 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "directory.h" #include "dircache.h" @@ -103,7 +104,7 @@ int afp_getfildirparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *r if (!dir) return AFPERR_NOOBJ; - ret = getdirparams(vol, dbitmap, s_path, dir, + ret = getdirparams(obj, vol, dbitmap, s_path, dir, rbuf + 3 * sizeof( uint16_t ), &buflen ); if (ret != AFP_OK ) return( ret ); @@ -111,8 +112,8 @@ int afp_getfildirparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *r /* this is a directory */ *(rbuf + 2 * sizeof( uint16_t )) = (char) FILDIRBIT_ISDIR; } else { - if (fbitmap && AFP_OK != (ret = getfilparams(vol, fbitmap, s_path, curdir, - rbuf + 3 * sizeof( uint16_t ), &buflen )) ) { + if (fbitmap && AFP_OK != (ret = getfilparams(obj, vol, fbitmap, s_path, curdir, + rbuf + 3 * sizeof( uint16_t ), &buflen, 0)) ) { return( ret ); } /* this is a file */ @@ -188,7 +189,7 @@ int afp_setfildirparams(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf if (S_ISDIR(st->st_mode)) { rc = setdirparams(vol, path, bitmap, ibuf ); } else { - rc = setfilparams(vol, path, bitmap, ibuf ); + rc = setfilparams(obj, vol, path, bitmap, ibuf ); } if ( rc == AFP_OK ) { setvoltime(obj, vol ); @@ -202,13 +203,6 @@ int afp_setfildirparams(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf */ int check_name(const struct vol *vol, char *name) { - /* check for illegal characters in the unix filename */ - if (!wincheck(vol, name)) - return AFPERR_PARAM; - - if ((vol->v_flags & AFPVOL_NOHEX) && strchr(name, '/')) - return AFPERR_PARAM; - if (!vol->vfs->vfs_validupath(vol, name)) { LOG(log_error, logtype_afpd, "check_name: illegal name: '%s'", name); return AFPERR_EXIST; @@ -224,7 +218,7 @@ int check_name(const struct vol *vol, char *name) move and rename sdir:oldname to curdir:newname in volume vol special care is needed for lock */ -static int moveandrename(const struct vol *vol, +static int moveandrename(struct vol *vol, struct dir *sdir, int sdir_fd, char *oldname, @@ -252,7 +246,7 @@ static int moveandrename(const struct vol *vol, adflags = 0; if (!isdir) { - if ((oldunixname = strdup(mtoupath(vol, oldname, sdir->d_did, utf8_encoding()))) == NULL) + if ((oldunixname = strdup(mtoupath(vol, oldname, sdir->d_did, utf8_encoding(vol->v_obj)))) == NULL) return AFPERR_PARAM; /* can't convert */ id = cnid_get(vol->v_cdb, sdir->d_did, oldunixname, strlen(oldunixname)); @@ -319,7 +313,7 @@ static int moveandrename(const struct vol *vol, } } - if (NULL == (upath = mtoupath(vol, newname, curdir->d_did, utf8_encoding()))){ + if (NULL == (upath = mtoupath(vol, newname, curdir->d_did, utf8_encoding(vol->v_obj)))){ rc = AFPERR_PARAM; goto exit; } @@ -336,7 +330,7 @@ static int moveandrename(const struct vol *vol, goto exit; } - if (stat(upath, st) == 0 || caseenumerate(vol, &path, curdir) == 0) { + if (stat(upath, st) == 0) { if (!stat(oldunixname, &nst) && !(nst.st_dev == st->st_dev && nst.st_ino == st->st_ino) ) { /* not the same file */ rc = AFPERR_EXIST; @@ -344,7 +338,7 @@ static int moveandrename(const struct vol *vol, } errno = 0; } - } else if (stat(upath, st ) == 0 || caseenumerate(vol, &path, curdir) == 0) { + } else if (stat(upath, st ) == 0) { rc = AFPERR_EXIST; goto exit; } @@ -355,7 +349,7 @@ static int moveandrename(const struct vol *vol, if (of_findname(&path)) { rc = AFPERR_EXIST; /* was AFPERR_BUSY; */ } else { - rc = renamefile(vol, sdir_fd, oldunixname, upath, newname, adp ); + rc = renamefile(vol, curdir, sdir_fd, oldunixname, upath, newname, adp ); if (rc == AFP_OK) of_rename(vol, opened, sdir, oldname, curdir, newname); } @@ -473,12 +467,13 @@ int afp_rename(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size /* ------------------------------- */ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen) { - struct vol *vol; - struct dir *dir; - struct path *s_path; + struct vol *vol; + struct dir *dir; + struct path *s_path; char *upath; - int did, rc; - uint16_t vid; + int did; + int rc = AFP_OK; + uint16_t vid; *rbuflen = 0; ibuf += 2; @@ -530,7 +525,7 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size delcnid = cnid_get(vol->v_cdb, curdir->d_did, upath, strlen(upath)); if (delcnid != CNID_INVALID) cnid_delete(vol->v_cdb, delcnid); - fce_register_delete_dir(upath); + fce_register(FCE_DIR_DELETE, fullpathname(upath), NULL, fce_dir); } else { /* we have to cache this, the structs are lost in deletcurdir*/ /* but we need the positive returncode to send our event */ @@ -538,7 +533,7 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size if ((dname = bstrcpy(curdir->d_u_name)) == NULL) return AFPERR_MISC; if ((rc = deletecurdir(vol)) == AFP_OK) - fce_register_delete_dir(cfrombstr(dname)); + fce_register(FCE_DIR_DELETE, fullpathname(cfrombstr(dname)), NULL, fce_dir); bdestroy(dname); } } else if (of_findname(s_path)) { @@ -552,7 +547,7 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size rc = AFPERR_NOOBJ; } else { if ((rc = deletefile(vol, -1, upath, 1)) == AFP_OK) { - fce_register_delete_file( s_path ); + fce_register(FCE_FILE_DELETE, fullpathname(upath), NULL, fce_file); if (vol->v_tm_used < s_path->st.st_size) vol->v_tm_used = 0; else @@ -602,7 +597,7 @@ char *ctoupath(const struct vol *vol, struct dir *dir, char *name) { if (vol == NULL || dir == NULL || name == NULL) return NULL; - return absupath(vol, dir, mtoupath(vol, name, dir->d_did, utf8_encoding())); + return absupath(vol, dir, mtoupath(vol, name, dir->d_did, utf8_encoding(vol->v_obj))); } /* ------------------------- */ @@ -698,7 +693,7 @@ int afp_moveandrename(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U rc = moveandrename(vol, sdir, sdir_fd, oldname, newname, isdir); if ( rc == AFP_OK ) { - char *upath = mtoupath(vol, newname, pdid, utf8_encoding()); + char *upath = mtoupath(vol, newname, pdid, utf8_encoding(obj)); if (NULL == upath) { rc = AFPERR_PARAM;