From 106a651826eeaacf9d0b40fe6d088d6bdc997675 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Fri, 23 Oct 2009 13:02:01 +0000 Subject: 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 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 --- booster/src/booster.c | 42 +++++++++++++++++++++++++++++++++++++++++- booster/src/booster_stat.c | 12 ------------ 2 files changed, 41 insertions(+), 13 deletions(-) (limited to 'booster') diff --git a/booster/src/booster.c b/booster/src/booster.c index 8d3a1dedb..3f171646c 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 09da554c8..23bc10c0d 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) { -- cgit