From 078369f41d8fd245945ddb82b07626bb4a678d6d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 4 May 2012 12:46:17 +0200 Subject: nfsclient: Fix hard link operation --- cpukit/libfs/src/nfsclient/src/nfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpukit/libfs/src/nfsclient/src/nfs.c b/cpukit/libfs/src/nfsclient/src/nfs.c index b3e24a95b6..812797b364 100644 --- a/cpukit/libfs/src/nfsclient/src/nfs.c +++ b/cpukit/libfs/src/nfsclient/src/nfs.c @@ -1493,7 +1493,7 @@ static int nfs_link( ) { int rv = 0; -NfsNode pNode; +NfsNode pNode = parentloc->node_access; nfsstat status; NfsNode tNode = targetloc->node_access; char *dupname; -- cgit v1.2.3 From 2cd2ed3288e8ac35d69ec6f6140ad431b135109c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 4 May 2012 13:26:07 +0200 Subject: nfsclient: Add rename operation --- cpukit/libfs/src/nfsclient/src/nfs.c | 46 +++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/cpukit/libfs/src/nfsclient/src/nfs.c b/cpukit/libfs/src/nfsclient/src/nfs.c index 812797b364..15b6def0d2 100644 --- a/cpukit/libfs/src/nfsclient/src/nfs.c +++ b/cpukit/libfs/src/nfsclient/src/nfs.c @@ -2044,6 +2044,50 @@ static ssize_t nfs_readlink( return (ssize_t) strlen(rr.strbuf.buf); } +static int nfs_rename( + const rtems_filesystem_location_info_t *oldparentloc, + const rtems_filesystem_location_info_t *oldloc, + const rtems_filesystem_location_info_t *newparentloc, + const char *name, + size_t namelen +) +{ + int rv = 0; + char *dupname = nfs_dupname(name, namelen); + + if (dupname != NULL) { + NfsNode oldParentNode = oldparentloc->node_access; + NfsNode oldNode = oldloc->node_access; + NfsNode newParentNode = newparentloc->node_access; + Nfs nfs = oldParentNode->nfs; + const nfs_fh *toDirSrc = &SERP_FILE(newParentNode); + nfs_fh *toDirDst = &SERP_ARGS(oldParentNode).renamearg.to.dir; + nfsstat status; + + SERP_ARGS(oldParentNode).renamearg.name = oldNode->str; + SERP_ARGS(oldParentNode).renamearg.to.name = dupname; + memcpy(toDirDst, toDirSrc, sizeof(*toDirDst)); + + rv = nfscall( + nfs->server, + NFSPROC_RENAME, + (xdrproc_t) xdr_renameargs, + &SERP_FILE(oldParentNode), + (xdrproc_t) xdr_nfsstat, + &status + ); + if (rv == 0 && (errno = status) != NFS_OK) { + rv = -1; + } + + free(dupname); + } else { + rv = -1; + } + + return rv; +} + static void nfs_lock(rtems_filesystem_mount_table_entry_t *mt_entry) { } @@ -2104,7 +2148,7 @@ const struct _rtems_filesystem_operations_table nfs_fs_ops = { .utime_h = nfs_utime, .symlink_h = nfs_symlink, .readlink_h = nfs_readlink, - .rename_h = rtems_filesystem_default_rename, + .rename_h = nfs_rename, .statvfs_h = rtems_filesystem_default_statvfs }; -- cgit v1.2.3