about summary refs log tree commit diff
path: root/sysdeps/mach
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-11-19 20:22:30 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-11-19 20:22:30 +0100
commitb15b1a959040fe8cdfbc51092a7b72032f6c9b86 (patch)
treec9fb074b5b255296be118f5e6c0ffba21bf2caca /sysdeps/mach
parent0c7f97aead9bf82f868d39cf7dc179caf224189a (diff)
downloadglibc-b15b1a959040fe8cdfbc51092a7b72032f6c9b86.tar.gz
glibc-b15b1a959040fe8cdfbc51092a7b72032f6c9b86.tar.xz
glibc-b15b1a959040fe8cdfbc51092a7b72032f6c9b86.zip
hurd: Support lockf at offset 0 with size 0 or 1.
	* sysdeps/mach/hurd/f_setlk.c: Include <unistd.h>.
	(__f_setlk): When whence is SEEK_CUR, use __lseek64 to convert it to
	SEEK_SET.
Diffstat (limited to 'sysdeps/mach')
-rw-r--r--sysdeps/mach/hurd/f_setlk.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/f_setlk.c b/sysdeps/mach/hurd/f_setlk.c
index 718af67e32..edfb292dbf 100644
--- a/sysdeps/mach/hurd/f_setlk.c
+++ b/sysdeps/mach/hurd/f_setlk.c
@@ -19,6 +19,7 @@
 #include <sys/types.h>
 #include <sys/file.h>
 #include <fcntl.h>
+#include <unistd.h>
 #include <errno.h>
 
 /* XXX
@@ -45,6 +46,18 @@ __f_setlk (int fd, int type, int whence, __off64_t start, __off64_t len, int wai
   if (cmd != LOCK_UN && wait == 0)
     cmd |= LOCK_NB;
 
+  if (whence == SEEK_CUR)
+    {
+      /* In case the target position is 0, we can support it below.  */
+      __off64_t cur = __lseek64 (fd, 0, SEEK_CUR);
+
+      if (cur >= 0)
+	{
+	  start = cur + start;
+	  whence = SEEK_SET;
+	}
+    }
+
   switch (whence)
     {
     case SEEK_SET: