diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-11-15 00:52:36 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-11-16 09:41:05 +0100 |
commit | 346ef23f197a0c8ba807c344bd39101b711050ee (patch) | |
tree | f3f7bc136c9b631e6ddab27dad944715158155aa /sysdeps/mach/hurd/fcntl.c | |
parent | 5d8af1566bd98aa9c2728f8f63f7ba43cfa84d09 (diff) | |
download | glibc-346ef23f197a0c8ba807c344bd39101b711050ee.tar glibc-346ef23f197a0c8ba807c344bd39101b711050ee.tar.gz glibc-346ef23f197a0c8ba807c344bd39101b711050ee.tar.bz2 glibc-346ef23f197a0c8ba807c344bd39101b711050ee.zip |
hurd: Fix F_*LK* fcntl with __USE_FILE_OFFSET64
struct flock64 uses 64bit values. This introduces other values for F_GETLK,
F_SETLK, F_SETLKW to distinguish between both.
* sysdeps/mach/hurd/bits/fcntl.h (F_GETLK64, F_SETLK64, F_SETLKW64): New
macros
[__USE_FILE_OFFSET64] (F_GETLK, F_SETLK, F_SETLKW): Define to F_GETLK64,
F_SETLK64, F_SETLKW64, respectively.
* sysdeps/mach/hurd/f_setlk.c: New file.
* sysdeps/mach/hurd/f_setlk.h: New file.
* sysdeps/mach/hurd/Makefile [$(subdir) = io] (sysdeps_routines): Add
f_setlk.
* sysdeps/mach/hurd/fcntl.c: Include "f_setlk.h".h".
(__libc_fcntl): Move non-flock operations to...
* sysdeps/mach/hurd/vfcntl.c (__libc_vfcntl): ... New file.
* sysdeps/mach/hurd/fcntl.c (fcntl64): Add missing alias.
Diffstat (limited to 'sysdeps/mach/hurd/fcntl.c')
-rw-r--r-- | sysdeps/mach/hurd/fcntl.c | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c index 598317d811..6fa63f2fc7 100644 --- a/sysdeps/mach/hurd/fcntl.c +++ b/sysdeps/mach/hurd/fcntl.c @@ -21,6 +21,7 @@ #include <hurd/fd.h> #include <stdarg.h> #include <sys/file.h> /* XXX for LOCK_* */ +#include "f_setlk.h" /* Perform file control operations on FD. */ int @@ -128,56 +129,50 @@ __libc_fcntl (int fd, int cmd, ...) case F_SETLK: case F_SETLKW: { - /* XXX - We need new RPCs to support POSIX.1 fcntl file locking!! - For the time being we support the whole-file case only, - with all kinds of WRONG WRONG WRONG semantics, - by using flock. This is definitely the Wrong Thing, - but it might be better than nothing (?). */ struct flock *fl = va_arg (ap, struct flock *); + int wait = 0; va_end (ap); switch (cmd) { case F_GETLK: errno = ENOSYS; return -1; + case F_SETLKW: + wait = 1; + /* FALLTHROUGH */ case F_SETLK: - cmd = LOCK_NB; - break; - default: - cmd = 0; + result = __f_setlk (fd, fl->l_type, fl->l_whence, + fl->l_start, fl->l_len, wait); break; - } - switch (fl->l_type) - { - case F_RDLCK: cmd |= LOCK_SH; break; - case F_WRLCK: cmd |= LOCK_EX; break; - case F_UNLCK: cmd |= LOCK_UN; break; default: errno = EINVAL; return -1; } - switch (fl->l_whence) + } + + case F_GETLK64: + case F_SETLK64: + case F_SETLKW64: + { + struct flock64 *fl = va_arg (ap, struct flock64 *); + int wait = 0; + va_end (ap); + switch (cmd) { - case SEEK_SET: - if (fl->l_start == 0 && fl->l_len == 0) /* Whole file request. */ - break; - /* It seems to be common for applications to lock the first - byte of the file when they are really doing whole-file locking. - So, since it's so wrong already, might as well do that too. */ - if (fl->l_start == 0 && fl->l_len == 1) - break; - /* FALLTHROUGH */ - case SEEK_CUR: - case SEEK_END: - errno = ENOTSUP; + case F_GETLK: + errno = ENOSYS; return -1; + case F_SETLKW: + wait = 1; + /* FALLTHROUGH */ + case F_SETLK: + result = __f_setlk (fd, fl->l_type, fl->l_whence, + fl->l_start, fl->l_len, wait); + break; default: errno = EINVAL; return -1; } - - return __flock (fd, cmd); } case F_GETFL: /* Get per-open flags. */ @@ -215,3 +210,4 @@ strong_alias (__libc_fcntl, __libc_fcntl64) libc_hidden_def (__libc_fcntl64) weak_alias (__libc_fcntl64, __fcntl64) libc_hidden_weak (__fcntl64) +weak_alias (__fcntl64, fcntl64) |