diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2009-11-18 01:15:30 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-11-18 21:14:04 -0800 | 
| commit | c7dba5ff1468f5e56d22b47cc97ff6cd4937f98f (patch) | |
| tree | 39c29a1e5b5f2750581b4eae4019e5ffaec80ce0 /booster | |
| parent | 119b179fdc83d49e8242a93439fb043990eb74c9 (diff) | |
booster: implement fchdir.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 369 (Samba does not work with booster.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=369
Diffstat (limited to 'booster')
| -rw-r--r-- | booster/src/booster.c | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/booster/src/booster.c b/booster/src/booster.c index 6264695ab4e..540fd3c2404 100644 --- a/booster/src/booster.c +++ b/booster/src/booster.c @@ -191,6 +191,8 @@ static ssize_t (*real_sendfile64) (int out_fd, int in_fd, off_t *offset,                                     size_t count);  static int (*real_fcntl) (int fd, int cmd, ...);  static int (*real_chdir) (const char *path); +static int (*real_fchdir) (int fd);   +static char * (*real_getcwd) (char *buf, size_t size);  #define RESOLVE(sym) do {                                       \                  if (!real_##sym)                                \ @@ -2740,6 +2742,45 @@ unlock:  } +int +fchdir (int fd) +{ +        int              ret     = -1; +        glusterfs_file_t glfs_fd = 0; +        char             cwd[PATH_MAX];  +        char            *res     = NULL; + +        glfs_fd = booster_fdptr_get (booster_fdtable, fd); + +        if (!glfs_fd) { +                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); +                if (real_write == NULL) { +                        errno = ENOSYS; +                        ret = -1; +                } else { +                        ret = real_fchdir (fd); +                        if (ret == 0) { +                                res = real_getcwd (cwd, PATH_MAX); +                                if (res == NULL) { +                                        gf_log ("booster", GF_LOG_ERROR, +                                                "getcwd failed (%s)", +                                                strerror (errno)); +                                        ret = -1; +                                } else { +                                        glusterfs_chdir (cwd); +                                } +                        } +                } +        } else { +                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); +                ret = glusterfs_fchdir (glfs_fd); +                booster_fdptr_put (glfs_fd); +        } +  +        return ret; +} + +  void  booster_lib_init (void)  { @@ -2818,6 +2859,8 @@ booster_lib_init (void)          RESOLVE (readdir64_r);          RESOLVE (fcntl);          RESOLVE (chdir); +        RESOLVE (fchdir); +        RESOLVE (getcwd);          /* This must be called after resolving real functions           * above so that the socket based IO calls in libglusterfsclient  | 
