about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/fcntl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd/fcntl.c')
-rw-r--r--sysdeps/mach/hurd/fcntl.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c
index 95b0ebff0f..564d9dcd23 100644
--- a/sysdeps/mach/hurd/fcntl.c
+++ b/sysdeps/mach/hurd/fcntl.c
@@ -21,6 +21,11 @@
 #include <hurd/fd.h>
 #include <stdarg.h>
 #include <sys/file.h>		/* XXX for LOCK_* */
+#ifdef NOCANCEL
+#include <not-cancel.h>
+#else
+#include <sysdep-cancel.h>
+#endif
 #include "f_setlk.h"
 
 /* Perform file control operations on FD.  */
@@ -155,8 +160,19 @@ __libc_fcntl (int fd, int cmd, ...)
 	  .l_pid = fl->l_pid
 	};
 
-	err = HURD_FD_PORT_USE (d, __file_record_lock (port, cmd, &fl64,
-				MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND));
+#ifndef NOCANCEL
+	if (cmd == F_SETLKW64)
+	  {
+	    int cancel_oldtype = LIBC_CANCEL_ASYNC();
+	    err = HURD_FD_PORT_USE_CANCEL (d, __file_record_lock (port, cmd,
+					   &fl64, MACH_PORT_NULL,
+					   MACH_MSG_TYPE_MAKE_SEND));
+	    LIBC_CANCEL_RESET (cancel_oldtype);
+	  }
+	else
+#endif
+	  err = HURD_FD_PORT_USE (d, __file_record_lock (port, cmd, &fl64,
+				  MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND));
 
 	/* XXX: To remove once file_record_lock RPC is settled.  */
 	if (err == EMIG_BAD_ID || err == EOPNOTSUPP)
@@ -207,8 +223,19 @@ __libc_fcntl (int fd, int cmd, ...)
       {
 	struct flock64 *fl = va_arg (ap, struct flock64 *);
 
-	err = HURD_FD_PORT_USE (d, __file_record_lock (port, cmd, fl,
-				MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND));
+#ifndef NOCANCEL
+	if (cmd == F_SETLKW64)
+	  {
+	    int cancel_oldtype = LIBC_CANCEL_ASYNC();
+	    err = HURD_FD_PORT_USE_CANCEL (d, __file_record_lock (port, cmd,
+					   fl, MACH_PORT_NULL,
+					   MACH_MSG_TYPE_MAKE_SEND));
+	    LIBC_CANCEL_RESET (cancel_oldtype);
+	  }
+	else
+#endif
+	  err = HURD_FD_PORT_USE (d, __file_record_lock (port, cmd, fl,
+				  MACH_PORT_NULL, MACH_MSG_TYPE_MAKE_SEND));
 
 	/* XXX: To remove once file_record_lock RPC is settled.  */
 	if (err == EMIG_BAD_ID || err == EOPNOTSUPP)
@@ -263,6 +290,8 @@ __libc_fcntl (int fd, int cmd, ...)
   return result;
 }
 libc_hidden_def (__libc_fcntl)
+
+#ifndef NOCANCEL
 weak_alias (__libc_fcntl, __fcntl)
 libc_hidden_weak (__fcntl)
 weak_alias (__libc_fcntl, fcntl)
@@ -272,3 +301,4 @@ libc_hidden_def (__libc_fcntl64)
 weak_alias (__libc_fcntl64, __fcntl64)
 libc_hidden_weak (__fcntl64)
 weak_alias (__fcntl64, fcntl64)
+#endif