diff options
Diffstat (limited to 'booster/src/booster.c')
-rw-r--r-- | booster/src/booster.c | 105 |
1 files changed, 104 insertions, 1 deletions
diff --git a/booster/src/booster.c b/booster/src/booster.c index 27ff9278faf..04a8906c283 100644 --- a/booster/src/booster.c +++ b/booster/src/booster.c @@ -42,6 +42,7 @@ #include <dirent.h> #include <sys/statfs.h> #include <sys/statvfs.h> +#include <fcntl.h> #ifndef GF_UNIT_KB #define GF_UNIT_KB 1024 @@ -211,6 +212,7 @@ static ssize_t (*real_sendfile) (int out_fd, int in_fd, off_t *offset, size_t count); 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, ...); #define RESOLVE(sym) do { \ if (!real_##sym) \ @@ -540,7 +542,7 @@ open (const char *pathname, int flags, ...) return ret; } -#if defined (__USE_LARGEFILE64) || !defined (__USE_FILE_OFFSET64) +#if !defined (__USE_LARGEFILE64) && !defined (__USE_FILE_OFFSET64) int open64 (const char *pathname, int flags, ...) { @@ -2133,6 +2135,106 @@ sendfile64 (int out_fd, int in_fd, off_t *offset, size_t count) return ret; } + +int +fcntl (int fd, int cmd, ...) +{ + va_list ap; + int ret = -1; + long arg = 0; + struct flock *lock = NULL; + glusterfs_file_t glfs_fd = 0; + + glfs_fd = booster_get_glfs_fd (booster_glfs_fdtable, fd); + + switch (cmd) { + case F_DUPFD: + case F_DUPFD_CLOEXEC: + case F_GETFD: + case F_GETFL: + case F_GETOWN: + case F_GETSIG: + case F_GETLEASE: + if (glfs_fd) { + ret = glusterfs_fcntl (glfs_fd, cmd); + } else { + if (!real_fcntl) { + errno = ENOSYS; + goto out; + } + + ret = real_fcntl (fd, cmd); + } + break; + + case F_SETFD: + case F_SETFL: + case F_SETOWN: + case F_SETSIG: + case F_SETLEASE: + case F_NOTIFY: + va_start (ap, cmd); + arg = va_arg (ap, long); + va_end (ap); + + if (glfs_fd) { + ret = glusterfs_fcntl (glfs_fd, cmd, arg); + } else { + if (!real_fcntl) { + errno = ENOSYS; + goto out; + } + + ret = real_fcntl (fd, cmd, arg); + } + break; + + case F_GETLK: + case F_SETLK: + case F_SETLKW: +#if F_GETLK != F_GETLK64 + case F_GETLK64: +#endif +#if F_SETLK != F_SETLK64 + case F_SETLK64: +#endif +#if F_SETLKW != F_SETLKW64 + case F_SETLKW64: +#endif + va_start (ap, cmd); + lock = va_arg (ap, struct flock *); + va_end (ap); + + if (lock == NULL) { + errno = EINVAL; + goto out; + } + + if (glfs_fd) { + ret = glusterfs_fcntl (glfs_fd, cmd, lock); + } else { + if (!real_fcntl) { + errno = ENOSYS; + goto out; + } + + ret = real_fcntl (fd, cmd, lock); + } + break; + + default: + errno = EINVAL; + break; + } + +out: + if (glfs_fd) { + booster_put_glfs_fd (glfs_fd); + } + + return ret; +} + void _init (void) { @@ -2208,6 +2310,7 @@ _init (void) RESOLVE (sendfile64); RESOLVE (readdir_r); RESOLVE (readdir64_r); + RESOLVE (fcntl); /* This must be called after resolving real functions * above so that the socket based IO calls in libglusterfsclient |