summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/storage/posix/src/posix.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 301bc4872..a2e4ad761 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -3500,6 +3500,10 @@ posix_readdir (call_frame_t *frame, xlator_t *this,
off_t in_case = -1;
int32_t this_size = -1;
+ char * real_path = NULL;
+ int real_path_len = -1;
+ char * entry_path = NULL;
+ int entry_path_len = -1;
VALIDATE_OR_GOTO (frame, out);
VALIDATE_OR_GOTO (this, out);
@@ -3516,6 +3520,22 @@ posix_readdir (call_frame_t *frame, xlator_t *this,
}
pfd = (struct posix_fd *)(long)tmp_pfd;
+ real_path = pfd->path;
+ real_path_len = strlen (real_path);
+
+ entry_path_len = real_path_len + NAME_MAX;
+ entry_path = alloca (entry_path_len);
+
+ if (!entry_path) {
+ op_errno = errno;
+ gf_log (this->name, GF_LOG_ERROR,
+ "Out of memory.");
+ goto out;
+ }
+
+ strncpy (entry_path, real_path, entry_path_len);
+ entry_path[real_path_len] = '/';
+
dir = pfd->dir;
if (!dir) {
@@ -3580,6 +3600,9 @@ posix_readdir (call_frame_t *frame, xlator_t *this,
filled += this_size;
count ++;
+
+ strcpy (entry_path + real_path_len + 1, this_entry->d_name);
+ lstat (entry_path, &this_entry->d_stat);
}
op_ret = count;