X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=nfs3%2Fnfs3.c;h=cffad527ac86de393240f8851dde04ec6ded1b0d;hb=0325ee9e9afb02b08bdec3497e8cc54cb942989d;hp=1b8318120f463ae5f58292a1a556742b04ed84af;hpb=d0a45c81bf33bab1297bc4dfae9c25af6e1136c1;p=bluesky.git diff --git a/nfs3/nfs3.c b/nfs3/nfs3.c index 1b83181..cffad52 100644 --- a/nfs3/nfs3.c +++ b/nfs3/nfs3.c @@ -16,7 +16,7 @@ static void *null_result = (void *)&null_int; * UTF-8, that it not be empty, and that it not contain embedded forward * slashes. Also checks that the length of the string is not more than the * maximum allowed length. This function does allow the names "." and "..". - * Returns TRUE if te string is allowed as a filename. */ + * Returns TRUE if the string is allowed as a filename. */ gboolean validate_filename(const char *filename) { if (filename == NULL || filename[0] == '\0') @@ -376,7 +376,7 @@ nfsproc3_create_3_svc(create3args *argp, struct svc_req *rqstp) file->nlink = 1; file->mode = 0755; int64_t time = bluesky_get_current_time(); - printf("time: %lld\n", time); + printf("time: %"PRIi64"\n", time); file->mtime = time; file->ctime = time; file->atime = time; @@ -488,7 +488,31 @@ nfsproc3_remove_3_svc(diropargs3 *argp, struct svc_req *rqstp) { static wccstat3 result; - result.status = NFS3ERR_NOTSUPP; + result.wccstat3_u.wcc.before.present = FALSE; + result.wccstat3_u.wcc.after.present = FALSE; + + BlueSkyInode *dir = lookup_fh(&argp->dir); + if (dir == NULL) { + result.status = NFS3ERR_STALE; + return &result; + } + + encode_pre_wcc(&result.wccstat3_u.wcc, dir); + + if (!validate_filename(argp->name) + || strcmp(argp->name, ".") == 0 + || strcmp(argp->name, "..") == 0) + { + result.status = NFS3ERR_NOENT; + return &result; + } + + bluesky_directory_remove(dir, argp->name); + + result.status = NFS3_OK; + result.wccstat3_u.wcc.after.present = TRUE; + encode_fattr3(&result.wccstat3_u.wcc.after.post_op_attr_u.attributes, + dir); return &result; } @@ -548,7 +572,7 @@ nfsproc3_readdir_3_svc(readdir3args *argp, struct svc_req *rqstp) static entry3 dirents[MAX_READDIR_DIRENTS]; int count = 0; - BlueSkyDirent start = {NULL, argp->cookie, 0}; + BlueSkyDirent start = {NULL, NULL, argp->cookie, 0}; GSequenceIter *i = g_sequence_search(dir->dirents, &start, bluesky_dirent_compare, NULL);