diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-10-23 13:02:01 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-10-26 07:09:12 -0700 |
commit | 106a651826eeaacf9d0b40fe6d088d6bdc997675 (patch) | |
tree | dd2340ec387ae0caa22a9ab71ce45b72bf1de447 /booster/src | |
parent | 7445700d0323cbfac11b0e1367b0052438e38318 (diff) |
booster: seperate out the implementations of readdir and readdir64.
- readdir and readdir64 should not call same procedure booster_readdir
in their implementation, since the layout of dirent structures returned by
libc implementations of readdir and readdir64 is different (readdir returns
struct dirent *, where as readdir64 returns struct dirent64 *).
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 333 (ls on paths not on virtual mounts report wrong directory contents)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=333
Diffstat (limited to 'booster/src')
-rw-r--r-- | booster/src/booster.c | 42 | ||||
-rw-r--r-- | booster/src/booster_stat.c | 12 |
2 files changed, 41 insertions, 13 deletions
diff --git a/booster/src/booster.c b/booster/src/booster.c index 8d3a1dedbcd..3f171646c44 100644 --- a/booster/src/booster.c +++ b/booster/src/booster.c @@ -151,6 +151,7 @@ static int (*real_readlink) (const char *path, char *buf, size_t bufsize); static char * (*real_realpath) (const char *path, char *resolved); static DIR * (*real_opendir) (const char *path); static struct dirent * (*real_readdir) (DIR *dir); +static struct dirent64 * (*real_readdir64) (DIR *dir); static int (*real_readdir_r) (DIR *dir, struct dirent *entry, struct dirent **result); static int (*real_readdir64_r) (DIR *dir, struct dirent64 *entry, @@ -1686,7 +1687,13 @@ out: } struct dirent * -booster_readdir (DIR *dir) +__REDIRECT (booster_false_readdir, (DIR *dir), readdir) __nonnull ((1)); + +struct dirent64 * +__REDIRECT (booster_false_readdir64, (DIR *dir), readdir64) __nonnull ((1)); + +struct dirent * +booster_false_readdir (DIR *dir) { struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; struct dirent *dirp = NULL; @@ -1717,6 +1724,38 @@ out: return dirp; } +struct dirent64 * +booster_false_readdir64 (DIR *dir) +{ + struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; + struct dirent64 *dirp = NULL; + + if (!bh) { + errno = EFAULT; + goto out; + } + + if (bh->type == BOOSTER_GL_DIR) { + gf_log ("booster", GF_LOG_TRACE, "readdir on gluster"); + dirp = glusterfs_readdir ((glusterfs_dir_t)bh->dirh); + } else if (bh->type == BOOSTER_POSIX_DIR) { + gf_log ("booster", GF_LOG_TRACE, "readdir on posix"); + if (real_readdir == NULL) { + errno = ENOSYS; + dirp = NULL; + goto out; + } + + dirp = real_readdir64 ((DIR *)bh->dirh); + } else { + dirp = NULL; + errno = EINVAL; + } + +out: + return dirp; +} + int closedir (DIR *dh) { @@ -2696,6 +2735,7 @@ booster_lib_init (void) RESOLVE (realpath); RESOLVE (opendir); RESOLVE (readdir); + RESOLVE (readdir64); RESOLVE (closedir); RESOLVE (__xstat); RESOLVE (__xstat64); diff --git a/booster/src/booster_stat.c b/booster/src/booster_stat.c index 09da554c896..23bc10c0d1f 100644 --- a/booster/src/booster_stat.c +++ b/booster/src/booster_stat.c @@ -169,18 +169,6 @@ statvfs64 (const char *pathname, void *buf) return booster_statvfs64 (pathname, buf); } -void * -readdir (void *dir) -{ - return booster_readdir (dir); -} - -void * -readdir64 (void *dir) -{ - return booster_readdir (dir); -} - void rewinddir (void *dir) { |