diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/common-utils.c | 43 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.h | 1 |
2 files changed, 44 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 54ee3e53818..be8bd6298ac 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3232,3 +3232,46 @@ gf_compare_sockaddr (const struct sockaddr *addr1, } return _gf_false; } + +/* + * gf_set_timestamp: + * It sets the mtime and atime of 'dest' file as of 'src'. + */ + +int +gf_set_timestamp (const char *src, const char* dest) +{ + struct stat sb = {0, }; + struct timeval new_time[2] = {{0, },{0,}}; + int ret = 0; + xlator_t *this = NULL; + + this = THIS; + GF_ASSERT (this); + GF_ASSERT (src); + GF_ASSERT (dest); + + ret = stat (src, &sb); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "stat on %s failed: %s", + src, strerror(errno)); + goto out; + } + new_time[0].tv_sec = sb.st_atime; + new_time[0].tv_usec = ST_ATIM_NSEC (&sb)/1000; + + new_time[1].tv_sec = sb.st_mtime; + new_time[1].tv_usec = ST_MTIM_NSEC (&sb)/1000; + + /* The granularity is micro seconds as per the current + * requiremnt. Hence using 'utimes'. This can be updated + * to 'utimensat' if we need timestamp in nanoseconds. + */ + ret = utimes (dest, new_time); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "utimes on %s failed: %s", + dest, strerror(errno)); + } +out: + return ret; +} diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 98f30fc47b0..4eec5170c60 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -620,6 +620,7 @@ int gf_get_hostname_from_ip (char *client_ip, char **hostname); gf_boolean_t gf_is_local_addr (char *hostname); gf_boolean_t gf_is_same_address (char *host1, char *host2); void md5_wrapper(const unsigned char *data, size_t len, char *md5); +int gf_set_timestamp (const char *src, const char* dest); int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); |