diff options
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 55 | ||||
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.h | 17 |
2 files changed, 72 insertions, 0 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 0e7f81b5360..11ee08d038c 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -3598,6 +3598,61 @@ libgf_client_readdir (libglusterfs_client_ctx_t *ctx, fd_t *fd, return op_ret; } + +int +glusterfs_readdir_r (glusterfs_dir_t dirfd, struct dirent *entry, + struct dirent **result) +{ + int op_ret = -1; + libglusterfs_client_ctx_t *ctx = NULL; + off_t offset = 0; + libglusterfs_client_fd_ctx_t *fd_ctx = NULL; + struct dirent *dirp = NULL; + + GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, entry, out); + + fd_ctx = libgf_get_fd_ctx (dirfd); + if (!fd_ctx) { + errno = EBADF; + goto out; + } + + pthread_mutex_lock (&fd_ctx->lock); + { + ctx = fd_ctx->ctx; + offset = fd_ctx->offset; + dirp = &fd_ctx->dirp; + + memset (dirp, 0, sizeof (struct dirent)); + op_ret = libgf_client_readdir (ctx, (fd_t *)dirfd, dirp, + &offset); + if (op_ret <= 0) { + if (result && (op_ret == 0)) { + *result = NULL; + } else if (op_ret < 0){ + op_ret = errno; + } + goto unlock; + } + + fd_ctx->offset = offset; + + if (result) { + *result = memcpy (entry, dirp, sizeof (*entry)); + } else { + memcpy (entry, dirp, sizeof (*entry)); + } + + op_ret = 0; + } +unlock: + pthread_mutex_unlock (&fd_ctx->lock); + +out: + return op_ret; +} + + struct dirent * glusterfs_readdir (glusterfs_dir_t dirfd) { diff --git a/libglusterfsclient/src/libglusterfsclient.h b/libglusterfsclient/src/libglusterfsclient.h index e8b19f4bc51..7ce7288f897 100755 --- a/libglusterfsclient/src/libglusterfsclient.h +++ b/libglusterfsclient/src/libglusterfsclient.h @@ -635,6 +635,23 @@ glusterfs_readdir (glusterfs_dir_t dirfd); +/* re-entrant version of glusterfs_readdir. + * + * @dirfd : The handle of directory to be read. This handle is the one + * returned by opendir. + * @entry : Pointer to storage to store a directory entry. The storage + * pointed to by entry shall be large enough for a dirent with + * an array of char d_name members containing at least + * {NAME_MAX}+1 elements. + * @result : Upon successful return, the pointer returned at *result shall + * have the same value as the argument entry. Upon reaching the + * end of the directory stream, this pointer shall have the + * value NULL. + */ +int +glusterfs_readdir_r (glusterfs_dir_t dirfd, struct dirent *entry, + struct dirent **result); + /* Close a directory handle. * * @fd : The directory handle to be closed. |