From patchwork Fri Nov 16 08:41:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 30162 Received: (qmail 2925 invoked by alias); 16 Nov 2018 08:41:39 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 2904 invoked by uid 89); 16 Nov 2018 08:41:38 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.2 spammy=2104 X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault , commit-hurd@gnu.org Subject: [hurd,commited] hurd: Fix F_*LK* fcntl with __USE_FILE_OFFSET64 Date: Fri, 16 Nov 2018 09:41:30 +0100 Message-Id: <20181116084130.7928-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 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. --- ChangeLog | 15 ++++++++ sysdeps/mach/hurd/Makefile | 4 ++ sysdeps/mach/hurd/bits/fcntl.h | 15 ++++++-- sysdeps/mach/hurd/f_setlk.c | 69 ++++++++++++++++++++++++++++++++++ sysdeps/mach/hurd/f_setlk.h | 23 ++++++++++++ sysdeps/mach/hurd/fcntl.c | 58 +++++++++++++--------------- sysdeps/mach/hurd/fcntl64.c | 1 + 7 files changed, 151 insertions(+), 34 deletions(-) create mode 100644 sysdeps/mach/hurd/f_setlk.c create mode 100644 sysdeps/mach/hurd/f_setlk.h create mode 100644 sysdeps/mach/hurd/fcntl64.c diff --git a/ChangeLog b/ChangeLog index b24b6b002e..8dcdcc8b07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2018-11-15 Samuel Thibault + + * 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. + 2018-11-15 Paul Eggert mktime: DEBUG_MKTIME cleanup diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 3a853a6cd9..e15341ca8d 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -194,6 +194,10 @@ ifeq (hurd, $(subdir)) sysdep_routines += cthreads endif +ifeq (io, $(subdir)) +sysdep_routines += f_setlk +endif + ifeq ($(subdir),sunrpc) sysdep_headers += nfs/nfs.h endif diff --git a/sysdeps/mach/hurd/bits/fcntl.h b/sysdeps/mach/hurd/bits/fcntl.h index 2cfaa872a5..ef9b501167 100644 --- a/sysdeps/mach/hurd/bits/fcntl.h +++ b/sysdeps/mach/hurd/bits/fcntl.h @@ -163,9 +163,18 @@ # define F_GETOWN 5 /* Get owner (receiver of SIGIO). */ # define F_SETOWN 6 /* Set owner (receiver of SIGIO). */ #endif -#define F_GETLK 7 /* Get record locking info. */ -#define F_SETLK 8 /* Set record locking info (non-blocking). */ -#define F_SETLKW 9 /* Set record locking info (blocking). */ +#ifdef __USE_FILE_OFFSET64 +# define F_GETLK F_GETLK64 +# define F_SETLK F_SETLK64 +# define F_SETLKW F_SETLKW64 +#else +# define F_GETLK 7 /* Get record locking info. */ +# define F_SETLK 8 /* Set record locking info (non-blocking). */ +# define F_SETLKW 9 /* Set record locking info (blocking). */ +#endif +#define F_GETLK64 10 /* Get record locking info. */ +#define F_SETLK64 11 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 12 /* Set record locking info (blocking). */ #ifdef __USE_XOPEN2K8 # define F_DUPFD_CLOEXEC 1030 /* Duplicate, set FD_CLOEXEC on new one. */ diff --git a/sysdeps/mach/hurd/f_setlk.c b/sysdeps/mach/hurd/f_setlk.c new file mode 100644 index 0000000000..718af67e32 --- /dev/null +++ b/sysdeps/mach/hurd/f_setlk.c @@ -0,0 +1,69 @@ +/* f_setlk -- locking part of fcntl + Copyright (C) 2014-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include + +/* 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 (?). */ +int +__f_setlk (int fd, int type, int whence, __off64_t start, __off64_t len, int wait) +{ + int cmd = 0; + + switch (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; + } + + if (cmd != LOCK_UN && wait == 0) + cmd |= LOCK_NB; + + switch (whence) + { + case SEEK_SET: + if (start == 0 && 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 (start == 0 && len == 1) + break; + /* FALLTHROUGH */ + case SEEK_CUR: + case SEEK_END: + errno = ENOTSUP; + return -1; + default: + errno = EINVAL; + return -1; + } + + return __flock (fd, cmd); +} diff --git a/sysdeps/mach/hurd/f_setlk.h b/sysdeps/mach/hurd/f_setlk.h new file mode 100644 index 0000000000..16c7a8ca8d --- /dev/null +++ b/sysdeps/mach/hurd/f_setlk.h @@ -0,0 +1,23 @@ +/* Copyright (C) 2014-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _F_SETLK_H +#define _F_SETLK_H 1 + +extern int __f_setlk (int fd, int type, int whence, __off64_t start, __off64_t len, int wait); + +#endif /* f_setlk.h */ 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 #include #include /* 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) diff --git a/sysdeps/mach/hurd/fcntl64.c b/sysdeps/mach/hurd/fcntl64.c new file mode 100644 index 0000000000..8b85360690 --- /dev/null +++ b/sysdeps/mach/hurd/fcntl64.c @@ -0,0 +1 @@ +/* fcntl64 is defined in fcntl.c as an alias. */