diff options
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 64 | ||||
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.h | 14 |
2 files changed, 78 insertions, 0 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 58803e893..dcfda772e 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -7843,6 +7843,70 @@ out: } +char * +glusterfs_getcwd (char *buf, size_t size) +{ + char *res = NULL; + size_t len = 0; + loc_t loc = {0, }; + glusterfs_handle_t handle = NULL; + char vpath[PATH_MAX]; + int32_t op_ret = 0; + + pthread_mutex_lock (&cwdlock); + { + if (!cwd_inited) { + errno = ENODEV; + goto unlock; + } + + if (buf == NULL) { + buf = CALLOC (1, len); + if (buf == NULL) { + gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, + "out of memory"); + goto unlock; + } + } else { + if (size == 0) { + errno = EINVAL; + goto unlock; + } + + if (len > size) { + errno = ERANGE; + goto unlock; + } + } + + strcpy (buf, cwd); + res = buf; + } +unlock: + pthread_mutex_unlock (&cwdlock); + + if (res != NULL) { + handle = libgf_resolved_path_handle (res, vpath); + + if (handle != NULL) { + loc.path = strdup (vpath); + if (loc.path == NULL) { + gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, + "strdup failed"); + } else { + op_ret = libgf_client_path_lookup (&loc, handle, + 0); + if (op_ret == -1) { + res = NULL; + } + } + } + } + + return res; +} + + static struct xlator_fops libgf_client_fops = { }; diff --git a/libglusterfsclient/src/libglusterfsclient.h b/libglusterfsclient/src/libglusterfsclient.h index 74575fa61..1684381c9 100755 --- a/libglusterfsclient/src/libglusterfsclient.h +++ b/libglusterfsclient/src/libglusterfsclient.h @@ -1325,6 +1325,20 @@ glusterfs_chdir (const char *path); int glusterfs_fchdir (glusterfs_file_t fd); +/* copies the current working directory into @buf if it is big enough + * + * @buf: buffer to copy into it. If @buf is NULL, a buffer will be allocated. + * The size of the buffer will be @size if it is not zero, otherwise the + * size will be big enough to hold the current working directory. + * @size: size of the buffer. + * + * Returns the pointer to buffer holding current working directory on success + * and NULL on failure. + */ + +char * +glusterfs_getcwd (char *buf, size_t size); + /* FIXME: review the need for these apis */ /* added for log related initialization in booster fork implementation */ void |