X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffiledir.c;h=8f1109c9efea834d53752530d176c83f2988937b;hb=edf01c724768d494e522ec84380e8e49b37a2bd6;hp=61386d66f4e09064aae40668223458ecff6ed691;hpb=15c1fc2f2328736dd428ec3be37c893d8ee2e065;p=netatalk.git diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 61386d66..8f1109c9 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,7 +112,7 @@ 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, + if (fbitmap && AFP_OK != (ret = getfilparams(obj, vol, fbitmap, s_path, curdir, rbuf + 3 * sizeof( uint16_t ), &buflen )) ) { return( ret ); } @@ -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,10 +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; @@ -247,12 +244,12 @@ static int moveandrename(const struct vol *vol, "moveandrename: [\"%s\"/\"%s\"] -> \"%s\"", cfrombstr(sdir->d_u_name), oldname, newname); - ad_init(&ad, vol->v_adouble, vol->v_ad_options); + ad_init(&ad, vol); adp = &ad; 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)); @@ -305,7 +302,7 @@ static int moveandrename(const struct vol *vol, ad_getattr(adp, &bshort); - ad_close_metadata( adp); + ad_close(adp, ADFLAGS_HF); if ((bshort & htons(ATTRBIT_NORENAME))) { rc = AFPERR_OLOCK; goto exit; @@ -319,7 +316,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; } @@ -380,7 +377,7 @@ static int moveandrename(const struct vol *vol, if (!ad_metadata(upath, adflags, adp)) { ad_setid(adp, st->st_dev, st->st_ino, id, curdir->d_did, vol->v_stamp); ad_flush(adp); - ad_close_metadata(adp); + ad_close(adp, ADFLAGS_HF); } /* fix up the catalog entry */ @@ -473,12 +470,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; @@ -504,9 +502,33 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size } upath = s_path->u_name; - if ( path_isadir( s_path) ) { + if (path_isadir(s_path)) { if (*s_path->m_name != '\0' || curdir->d_did == DIRDID_ROOT) { - rc = AFPERR_ACCESS; + if (vol->v_adouble == AD_VERSION2) + return AFPERR_ACCESS; + if (*s_path->m_name == '\0' && curdir->d_did == DIRDID_ROOT) + return AFPERR_ACCESS; + if (rmdir(upath) != 0) { + switch (errno) { + case ENOTEMPTY: + return AFPERR_DIRNEMPT; + case EACCES: + return AFPERR_ACCESS; + default: + return AFPERR_MISC; + } + } + struct dir *deldir; + cnid_t delcnid = CNID_INVALID; + if ((deldir = dircache_search_by_name(vol, curdir, upath, strlen(upath)))) { + delcnid = deldir->d_did; + dir_remove(vol, deldir); + } + if (delcnid == CNID_INVALID) + 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); } else { /* we have to cache this, the structs are lost in deletcurdir*/ /* but we need the positive returncode to send our event */ @@ -578,7 +600,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))); } /* ------------------------- */ @@ -674,7 +696,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;