From: Ross Lagerwall Date: Sun, 27 Jul 2014 20:16:01 +0000 (+0100) Subject: libnfs: Add lutimes X-Git-Tag: upstream/1.9.6^2~15^2~1 X-Git-Url: https://git.piment-noir.org/?p=deb_libnfs.git;a=commitdiff_plain;h=6505b5396731ca6ec1a6786fa9a67dd528cdf947 libnfs: Add lutimes Add lutimes which is like utimes but operates on the symbolic link itself if the destination is a symbolic link. Signed-off-by: Ross Lagerwall --- diff --git a/include/nfsc/libnfs.h b/include/nfsc/libnfs.h index 48a70ba..27efa46 100644 --- a/include/nfsc/libnfs.h +++ b/include/nfsc/libnfs.h @@ -1157,6 +1157,34 @@ EXTERN int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct ti * -errno : The command failed. */ EXTERN int nfs_utimes(struct nfs_context *nfs, const char *path, struct timeval *times); +/* + * Async utimes() + * + * Like utimes except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was initiated. Once the operation finishes, the callback will be invoked. + * <0 : An error occured when trying to set up the operation. The callback will not be invoked. + * + * When the callback is invoked, status indicates the result: + * 0 : Success. + * data is NULL + * -errno : An error occured. + * data is the error string. + */ +EXTERN int nfs_lutimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data); +/* + * Sync utimes() + * + * Like utimes except if the destination is a symbolic link, it acts on the + * symbolic link itself. + * + * Function returns + * 0 : The operation was successfull. + * -errno : The command failed. + */ +EXTERN int nfs_lutimes(struct nfs_context *nfs, const char *path, struct timeval *times); /* diff --git a/lib/libnfs-sync.c b/lib/libnfs-sync.c index 8b57cb4..fe1e063 100644 --- a/lib/libnfs-sync.c +++ b/lib/libnfs-sync.c @@ -1170,6 +1170,22 @@ int nfs_utimes(struct nfs_context *nfs, const char *path, struct timeval *times) return cb_data.status; } +int nfs_lutimes(struct nfs_context *nfs, const char *path, struct timeval *times) +{ + struct sync_cb_data cb_data; + + cb_data.is_finished = 0; + + if (nfs_lutimes_async(nfs, path, times, utimes_cb, &cb_data) != 0) { + nfs_set_error(nfs, "nfs_lutimes_async failed"); + return -1; + } + + wait_for_nfs_reply(nfs, &cb_data); + + return cb_data.status; +} + /* diff --git a/lib/libnfs.c b/lib/libnfs.c index 290360e..72d4df4 100644 --- a/lib/libnfs.c +++ b/lib/libnfs.c @@ -4228,8 +4228,7 @@ static int nfs_utimes_continue_internal(struct nfs_context *nfs, fattr3 *attr _U return 0; } - -int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data) +int nfs_utimes_async_internal(struct nfs_context *nfs, const char *path, int no_follow, struct timeval *times, nfs_cb cb, void *private_data) { struct timeval *new_times = NULL; @@ -4243,7 +4242,7 @@ int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval * memcpy(new_times, times, sizeof(struct timeval)*2); } - if (nfs_lookuppath_async(nfs, path, 0, cb, private_data, nfs_utimes_continue_internal, new_times, free, 0) != 0) { + if (nfs_lookuppath_async(nfs, path, no_follow, cb, private_data, nfs_utimes_continue_internal, new_times, free, 0) != 0) { rpc_set_error(nfs->rpc, "Out of memory: failed to start parsing the path components"); return -1; } @@ -4251,6 +4250,16 @@ int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval * return 0; } +int nfs_utimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data) +{ + return nfs_utimes_async_internal(nfs, path, 0, times, cb, private_data); +} + +int nfs_lutimes_async(struct nfs_context *nfs, const char *path, struct timeval *times, nfs_cb cb, void *private_data) +{ + return nfs_utimes_async_internal(nfs, path, 1, times, cb, private_data); +} + /* * Async utime() */