diff options
| -rw-r--r-- | libglusterfs/src/syscall.c | 47 | ||||
| -rw-r--r-- | libglusterfs/src/syscall.h | 6 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 2 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 6 | 
4 files changed, 42 insertions, 19 deletions
diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index 7cf1c7757fe..d8b5024f67b 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -57,25 +57,44 @@ sys_fstatat(int dirfd, const char *pathname, struct stat *buf, int flags)  int -sys_openat(int dirfd, const char *pathname, int flags, ...) -{ -        mode_t mode = 0; -        if (flags & O_CREAT) { -                va_list ap; -                va_start(ap, flags); -                mode = va_arg(ap, int); -                va_end(ap); -        } +sys_openat(int dirfd, const char *pathname, int flags, int mode) +{ +        int fd;  #ifdef GF_DARWIN_HOST_OS          if (fchdir(dirfd) < 0)                  return -1; -        return open (pathname, flags, mode); -#else -        return openat (dirfd, pathname, flags, mode); -#endif +        fd = open (pathname, flags, mode); +        /* TODO: Shouldn't we restore the old current directory */ +#else /* GF_DARWIN_HOST_OS */ +        fd = openat (dirfd, pathname, flags, mode); +#ifdef __FreeBSD__ +        /* On FreeBSD S_ISVTX flag is ignored for an open() with O_CREAT set. +         * We need to force the flag using fchmod(). */ +        if ((fd >= 0) && +            ((flags & O_CREAT) != 0) && ((mode & S_ISVTX) != 0)) { +                sys_fchmod(fd, mode); +                /* TODO: It's unlikely that fchmod could fail here. However, +                         if it fails we cannot always restore the old state +                         (if the file existed, we cannot recover it). We would +                         need many more system calls to correctly handle all +                         possible cases and it doesn't worth it. For now we +                         simply ignore the error. */ +        } +#endif /* __FreeBSD__ */ +#endif /* !GF_DARWIN_HOST_OS */ + +        return fd;  } + +int +sys_open(const char *pathname, int flags, int mode) +{ +        return sys_openat(AT_FDCWD, pathname, flags, mode); +} + +  DIR *  sys_opendir (const char *name)  { @@ -239,7 +258,7 @@ sys_utimes (const char *filename, const struct timeval times[2])  int  sys_creat (const char *pathname, mode_t mode)  { -        return creat (pathname, mode); +        return sys_open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode);  } diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h index 81884f88164..68d72112b89 100644 --- a/libglusterfs/src/syscall.h +++ b/libglusterfs/src/syscall.h @@ -63,8 +63,12 @@ sys_fstat (int fd, struct stat *buf);  int  sys_fstatat (int dirfd, const char *pathname, struct stat *buf,               int flags); + +int +sys_open (const char *pathname, int flags, int mode); +  int -sys_openat (int dirfd, const char *pathname, int flags, ...); +sys_openat (int dirfd, const char *pathname, int flags, int mode);  DIR *sys_opendir (const char *name); diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 7d396373f46..26cd0fc4f25 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -876,7 +876,7 @@ check_prepare_mountbroker_root (char *mountbroker_root)          dfd0 = dup (dfd);          for (;;) { -                ret = sys_openat (dfd, "..", O_RDONLY); +                ret = sys_openat (dfd, "..", O_RDONLY, 0);                  if (ret != -1) {                          dfd2 = ret;                          ret = sys_fstat (dfd2, &st2); diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 2c51d1967a8..aa5a526423f 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -1994,7 +1994,7 @@ posix_unlink (call_frame_t *frame, xlator_t *this,          if (fdstat_requested ||              (priv->background_unlink && IA_ISREG (loc->inode->ia_type))) { -                fd = open (real_path, O_RDONLY); +                fd = sys_open (real_path, O_RDONLY, 0);                  if (fd == -1) {                          op_ret = -1;                          op_errno = errno; @@ -2856,7 +2856,7 @@ posix_create (call_frame_t *frame, xlator_t *this,          if (priv->o_direct)                  _flags |= O_DIRECT; -        _fd = open (real_path, _flags, mode); +        _fd = sys_open (real_path, _flags, mode);          if (_fd == -1) {                  op_errno = errno; @@ -3017,7 +3017,7 @@ posix_open (call_frame_t *frame, xlator_t *this,          if (priv->o_direct)                  flags |= O_DIRECT; -        _fd = open (real_path, flags, 0); +        _fd = sys_open (real_path, flags, 0);          if (_fd == -1) {                  op_ret   = -1;                  op_errno = errno;  | 
