Linux keeps surprising me everytime!

This time its their pipe2 system call which adds flags to the pipe call.
Its the unix-ish way apparently to turn pipes into files on a kernel
filesystem, or so they claim.

Anywho, this fixes glibc pipe2 system calls by wrapping against the
regular pipe systemcall if no flags are set and by signaling we don't
support that if they are.

Okay?


Index: linux_ipc.c
===================================================================
RCS file: /cvs/src/sys/compat/linux/linux_ipc.c,v
retrieving revision 1.11
diff -u -p -r1.11 linux_ipc.c
--- linux_ipc.c 5 Sep 2009 10:28:43 -0000       1.11
+++ linux_ipc.c 19 Sep 2011 22:37:33 -0000
@@ -719,3 +719,21 @@ linux_shmctl(p, v, retval)
        }
 }
 #endif /* SYSVSHM */
+
+int
+linux_sys_pipe2(struct proc *p, void *v, register_t *retval)
+{
+       struct linux_sys_pipe2_args *uap = v;
+       struct sys_pipe_args pargs;
+
+       /*
+        * We don't really support pipe2, but glibc falls back to pipe
+        * we return signal that.
+        * /
+       if (SCARG(uap, flags) != 0)
+               return ENOSYS;
+
+       /* If no flag is set then the this is a plain pipe call. */
+       SCARG(&pargs, fdp) = SCARG(uap, fdp);
+       return sys_pipe(p, &pargs, retval);
+}
Index: linux_syscall.h
===================================================================
RCS file: /cvs/src/sys/compat/linux/linux_syscall.h,v
retrieving revision 1.66
diff -u -p -r1.66 linux_syscall.h
--- linux_syscall.h     19 Sep 2011 14:33:40 -0000      1.66
+++ linux_syscall.h     19 Sep 2011 22:37:34 -0000
@@ -1,10 +1,10 @@
-/*     $OpenBSD: linux_syscall.h,v 1.66 2011/09/19 14:33:40 pirofti Exp $      
*/
+/*     $OpenBSD$       */
 
 /*
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        OpenBSD: syscalls.master,v 1.62 2011/09/18 02:23:18 
pirofti Exp 
+ * created from        OpenBSD: syscalls.master,v 1.63 2011/09/19 14:33:14 
pirofti Exp 
  */
 
 /* syscall: "syscall" ret: "int" args: */
@@ -747,5 +747,8 @@
 
 /* syscall: "get_robust_list" ret: "int" args: "int" "struct 
linux_robust_list_head **" "size_t *" */
 #define        LINUX_SYS_get_robust_list       312
+
+/* syscall: "pipe2" ret: "int" args: "int *" "int" */
+#define        LINUX_SYS_pipe2 331
 
 #define        LINUX_SYS_MAXSYSCALL    338
Index: linux_syscallargs.h
===================================================================
RCS file: /cvs/src/sys/compat/linux/linux_syscallargs.h,v
retrieving revision 1.68
diff -u -p -r1.68 linux_syscallargs.h
--- linux_syscallargs.h 19 Sep 2011 14:33:40 -0000      1.68
+++ linux_syscallargs.h 19 Sep 2011 22:37:35 -0000
@@ -1,10 +1,10 @@
-/*     $OpenBSD: linux_syscallargs.h,v 1.68 2011/09/19 14:33:40 pirofti Exp $  
*/
+/*     $OpenBSD$       */
 
 /*
  * System call argument lists.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        OpenBSD: syscalls.master,v 1.62 2011/09/18 02:23:18 
pirofti Exp 
+ * created from        OpenBSD: syscalls.master,v 1.63 2011/09/19 14:33:14 
pirofti Exp 
  */
 
 #ifdef syscallarg
@@ -610,6 +610,11 @@ struct linux_sys_get_robust_list_args {
        syscallarg(size_t *) len;
 };
 
+struct linux_sys_pipe2_args {
+       syscallarg(int *) fdp;
+       syscallarg(int) flags;
+};
+
 /*
  * System call prototypes.
  */
@@ -876,3 +881,4 @@ int linux_sys_clock_gettime(struct proc 
 int    linux_sys_clock_getres(struct proc *, void *, register_t *);
 int    linux_sys_set_robust_list(struct proc *, void *, register_t *);
 int    linux_sys_get_robust_list(struct proc *, void *, register_t *);
+int    linux_sys_pipe2(struct proc *, void *, register_t *);
Index: linux_syscalls.c
===================================================================
RCS file: /cvs/src/sys/compat/linux/linux_syscalls.c,v
retrieving revision 1.66
diff -u -p -r1.66 linux_syscalls.c
--- linux_syscalls.c    19 Sep 2011 14:33:40 -0000      1.66
+++ linux_syscalls.c    19 Sep 2011 22:37:35 -0000
@@ -1,10 +1,10 @@
-/*     $OpenBSD: linux_syscalls.c,v 1.66 2011/09/19 14:33:40 pirofti Exp $     
*/
+/*     $OpenBSD$       */
 
 /*
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        OpenBSD: syscalls.master,v 1.62 2011/09/18 02:23:18 
pirofti Exp 
+ * created from        OpenBSD: syscalls.master,v 1.63 2011/09/19 14:33:14 
pirofti Exp 
  */
 
 char *linux_syscallnames[] = {
@@ -359,7 +359,7 @@ char *linux_syscallnames[] = {
        "#328 (unimplemented eventfd2)",                /* 328 = unimplemented 
eventfd2 */
        "#329 (unimplemented epoll_create1)",           /* 329 = unimplemented 
epoll_create1 */
        "#330 (unimplemented dup3)",            /* 330 = unimplemented dup3 */
-       "#331 (unimplemented pipe2)",           /* 331 = unimplemented pipe2 */
+       "pipe2",                        /* 331 = pipe2 */
        "#332 (unimplemented inotify_init1)",           /* 332 = unimplemented 
inotify_init1 */
        "#333 (unimplemented preadv)",          /* 333 = unimplemented preadv */
        "#334 (unimplemented pwritev)",         /* 334 = unimplemented pwritev 
*/
Index: linux_sysent.c
===================================================================
RCS file: /cvs/src/sys/compat/linux/linux_sysent.c,v
retrieving revision 1.67
diff -u -p -r1.67 linux_sysent.c
--- linux_sysent.c      19 Sep 2011 14:33:40 -0000      1.67
+++ linux_sysent.c      19 Sep 2011 22:37:36 -0000
@@ -1,10 +1,10 @@
-/*     $OpenBSD: linux_sysent.c,v 1.67 2011/09/19 14:33:40 pirofti Exp $       
*/
+/*     $OpenBSD$       */
 
 /*
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * created from        OpenBSD: syscalls.master,v 1.62 2011/09/18 02:23:18 
pirofti Exp 
+ * created from        OpenBSD: syscalls.master,v 1.63 2011/09/19 14:33:14 
pirofti Exp 
  */
 
 #include <sys/param.h>
@@ -708,8 +708,8 @@ struct sysent linux_sysent[] = {
            sys_nosys },                        /* 329 = unimplemented 
epoll_create1 */
        { 0, 0, 0,
            sys_nosys },                        /* 330 = unimplemented dup3 */
-       { 0, 0, 0,
-           sys_nosys },                        /* 331 = unimplemented pipe2 */
+       { 2, s(struct linux_sys_pipe2_args), 0,
+           linux_sys_pipe2 },                  /* 331 = pipe2 */
        { 0, 0, 0,
            sys_nosys },                        /* 332 = unimplemented 
inotify_init1 */
        { 0, 0, 0,
Index: syscalls.master
===================================================================
RCS file: /cvs/src/sys/compat/linux/syscalls.master,v
retrieving revision 1.63
diff -u -p -r1.63 syscalls.master
--- syscalls.master     19 Sep 2011 14:33:14 -0000      1.63
+++ syscalls.master     19 Sep 2011 22:37:36 -0000
@@ -479,7 +479,7 @@
 328    UNIMPL          eventfd2
 329    UNIMPL          epoll_create1
 330    UNIMPL          dup3
-331    UNIMPL          pipe2
+331    STD             { int linux_sys_pipe2(int *fdp, int flags); }
 332    UNIMPL          inotify_init1
 333    UNIMPL          preadv
 334    UNIMPL          pwritev

Reply via email to