OSDN Git Service

libc: add setns()
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 17 Feb 2015 22:41:47 +0000 (23:41 +0100)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 17 Feb 2015 22:42:34 +0000 (23:42 +0100)
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libc/sysdeps/linux/common/Makefile.in
libc/sysdeps/linux/common/bits/sched.h
libc/sysdeps/linux/common/setns.c [new file with mode: 0644]
libc/sysdeps/linux/common/stubs.c

index 9d41771..8ee956b 100644 (file)
@@ -45,6 +45,7 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += \
        sendfile.c \
        setfsgid.c \
        setfsuid.c \
+       setns.c \
        setresgid.c \
        setresuid.c \
        signalfd.c \
index a5eb6ee..9d05314 100644 (file)
@@ -1,7 +1,6 @@
 /* Definitions of constants and data structure for POSIX 1003.1b-1993
    scheduling interface.
-   Copyright (C) 1996-1999,2001-2003,2005,2006,2007,2008
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-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
 
 
 /* Scheduling algorithms.  */
-#define SCHED_OTHER    0
-#define SCHED_FIFO     1
-#define SCHED_RR       2
+#define SCHED_OTHER            0
+#define SCHED_FIFO             1
+#define SCHED_RR               2
 #ifdef __USE_GNU
-# define SCHED_BATCH   3
+# define SCHED_BATCH           3
+# define SCHED_IDLE            5
+
+# define SCHED_RESET_ON_FORK   0x40000000
 #endif
 
-#ifdef __USE_MISC
+#ifdef __USE_GNU
 /* Cloning flags.  */
 # define CSIGNAL       0x000000ff /* Signal mask to be sent at exit.  */
 # define CLONE_VM      0x00000100 /* Set if VM shared between processes.  */
@@ -58,7 +60,6 @@
                                      force CLONE_PTRACE on this clone.  */
 # define CLONE_CHILD_SETTID 0x01000000 /* Store TID in userlevel buffer in
                                          the child.  */
-# define CLONE_STOPPED 0x02000000 /* Start in stopped state.  */
 # define CLONE_NEWUTS  0x04000000      /* New utsname group.  */
 # define CLONE_NEWIPC  0x08000000      /* New ipcs.  */
 # define CLONE_NEWUSER 0x10000000      /* New user namespace.  */
@@ -75,7 +76,7 @@ struct sched_param
 
 __BEGIN_DECLS
 
-#ifdef __USE_MISC
+#ifdef __USE_GNU
 /* Clone current process.  */
 extern int clone (int (*__fn) (void *__arg), void *__child_stack,
                  int __flags, void *__arg, ...) __THROW;
@@ -85,8 +86,12 @@ extern int unshare (int __flags) __THROW;
 
 /* Get index of currently used CPU.  */
 extern int sched_getcpu (void) __THROW;
+
+/* Switch process to namespace of type NSTYPE indicated by FD.  */
+extern int setns (int __fd, int __nstype) __THROW;
 #endif
 
+
 __END_DECLS
 
 #endif /* need schedparam */
@@ -124,7 +129,11 @@ typedef struct
 } cpu_set_t;
 
 /* Access functions for CPU masks.  */
-# define __CPU_ZERO_S(setsize, cpusetp) \
+# if __GNUC_PREREQ (2, 91)
+#  define __CPU_ZERO_S(setsize, cpusetp) \
+  do __builtin_memset (cpusetp, '\0', setsize); while (0)
+# else
+#  define __CPU_ZERO_S(setsize, cpusetp) \
   do {                                                                       \
     size_t __i;                                                                      \
     size_t __imax = (setsize) / sizeof (__cpu_mask);                         \
@@ -132,47 +141,53 @@ typedef struct
     for (__i = 0; __i < __imax; ++__i)                                       \
       __bits[__i] = 0;                                                       \
   } while (0)
+# endif
 # define __CPU_SET_S(cpu, setsize, cpusetp) \
   (__extension__                                                             \
    ({ size_t __cpu = (cpu);                                                  \
-      __cpu < 8 * (setsize)                                                  \
+      __cpu / 8 < (setsize)                                                  \
       ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]                      \
         |= __CPUMASK (__cpu))                                                \
       : 0; }))
 # define __CPU_CLR_S(cpu, setsize, cpusetp) \
   (__extension__                                                             \
    ({ size_t __cpu = (cpu);                                                  \
-      __cpu < 8 * (setsize)                                                  \
+      __cpu / 8 < (setsize)                                                  \
       ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]                      \
         &= ~__CPUMASK (__cpu))                                               \
       : 0; }))
 # define __CPU_ISSET_S(cpu, setsize, cpusetp) \
   (__extension__                                                             \
    ({ size_t __cpu = (cpu);                                                  \
-      __cpu < 8 * (setsize)                                                  \
-      ? ((((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]             \
+      __cpu / 8 < (setsize)                                                  \
+      ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]       \
          & __CPUMASK (__cpu))) != 0                                          \
       : 0; }))
 
 # define __CPU_COUNT_S(setsize, cpusetp) \
   __sched_cpucount (setsize, cpusetp)
 
-# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
+# if __GNUC_PREREQ (2, 91)
+#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
+  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
+# else
+#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
   (__extension__                                                             \
-   ({ __cpu_mask *__arr1 = (cpusetp1)->__bits;                               \
-      __cpu_mask *__arr2 = (cpusetp2)->__bits;                               \
+   ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits;                         \
+      const __cpu_mask *__arr2 = (cpusetp2)->__bits;                         \
       size_t __imax = (setsize) / sizeof (__cpu_mask);                       \
       size_t __i;                                                            \
       for (__i = 0; __i < __imax; ++__i)                                     \
        if (__arr1[__i] != __arr2[__i])                                       \
          break;                                                              \
       __i == __imax; }))
+# endif
 
 # define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
   (__extension__                                                             \
    ({ cpu_set_t *__dest = (destset);                                         \
-      __cpu_mask *__arr1 = (srcset1)->__bits;                                \
-      __cpu_mask *__arr2 = (srcset2)->__bits;                                \
+      const __cpu_mask *__arr1 = (srcset1)->__bits;                          \
+      const __cpu_mask *__arr2 = (srcset2)->__bits;                          \
       size_t __imax = (setsize) / sizeof (__cpu_mask);                       \
       size_t __i;                                                            \
       for (__i = 0; __i < __imax; ++__i)                                     \
diff --git a/libc/sysdeps/linux/common/setns.c b/libc/sysdeps/linux/common/setns.c
new file mode 100644 (file)
index 0000000..a697720
--- /dev/null
@@ -0,0 +1,15 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * setns() for uClibc
+ *
+ * Copyright (C) 2015 Bernhard Reutner-Fischer <uclibc@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
+
+#include <sys/syscall.h>
+#include <sched.h>
+
+#ifdef __NR_setns
+_syscall2(int, setns, int, fd, int, nstype)
+#endif
index 57c4664..2c50307 100644 (file)
@@ -346,6 +346,10 @@ make_stub(setfsgid)
 make_stub(setfsuid)
 #endif
 
+#if !defined __NR_setns && defined __UCLIBC_LINUX_SPECIFIC__
+make_stub(setns)
+#endif
+
 #if !defined __NR_setresgid32 && !defined __NR_setresgid && defined __UCLIBC_LINUX_SPECIFIC__
 make_stub(setresgid)
 #endif