gentoo: use /var/run for new /run compatibility
[util-vserver.git] / src / vattribute.c
index b3fd69d..0c98a2e 100644 (file)
@@ -21,6 +21,7 @@
 #endif
 
 #include "util.h"
+#include "attribute-util.h"
 #include <lib/vserver.h>
 
 #include <getopt.h>
@@ -41,6 +42,7 @@
 #define CMD_SECURE             0x2004
 #define CMD_BCAP               0x2005
 #define CMD_GET                        0x2006
+#define CMD_UMASK              0x2007
 
 int                    wrapper_exit_code = 1;
 
@@ -55,6 +57,7 @@ CMDLINE_OPTIONS[] = {
   { "bcap",       required_argument, 0, CMD_BCAP },
   { "flag",       required_argument, 0, CMD_FLAG },
   { "secure",     no_argument,       0, CMD_SECURE },
+  { "umask",      required_argument, 0, CMD_UMASK },
   {0,0,0,0}
 };
 
@@ -62,6 +65,7 @@ struct Arguments {
     xid_t              xid;
     struct vc_ctx_flags flags;
     struct vc_ctx_caps  caps;
+    struct vc_umask     umask;
     int                        mode;
 };
 
@@ -77,6 +81,7 @@ showHelp(int fd, char const *cmd, int res)
            " --bcap <cap>   ...  system  capability to be set\n"
            " --ccap <cap>   ...  context capability to be set\n"
            " --flag <flag>  ...  context flag to be set\n"
+           " --umask <mask> ...  unshare mask to be set\n"
            "\n"
            "Please report bugs to " PACKAGE_BUGREPORT "\n");
 
@@ -143,6 +148,22 @@ parseCCaps(char const *str, struct vc_ctx_caps *caps)
 }
 
 static void
+parseUMask(char const *str, struct vc_umask *umask)
+{
+  struct vc_err_listparser     err;
+  int                          rc;
+
+  rc = vc_list2umask(str, 0, &err, umask);
+  
+  if (rc==-1) {
+    WRITE_MSG(2, "Unknown namespace '");
+    Vwrite(2, err.ptr, err.len);
+    WRITE_MSG(2, "'\n");
+    exit(wrapper_exit_code);
+  }
+}
+
+static void
 parseSecure(struct vc_ctx_flags UNUSED * flags,
            struct vc_ctx_caps  UNUSED * caps)
 {
@@ -156,60 +177,22 @@ parseSecure(struct vc_ctx_flags UNUSED * flags,
   flags->mask     = VC_VXF_HIDE_NETIF;
 }
 
-static inline int
-ffsull(unsigned long long word)
-{
-  int bit;
-  for (bit = 0; bit < 64; bit++) {
-    if (word & (1ULL << bit))
-      break;
-  }
-  if (bit == 64)
-    bit = 0;
-  return bit;
-}
-
 static int
 printAttrs(struct Arguments *args)
 {
   struct vc_ctx_flags flags;
   struct vc_ctx_caps caps;
-  int first;
+  struct vc_umask umask = { .mask = ~0, .umask = 0x20200 };
 
   Evc_get_cflags(args->xid, &flags);
   Evc_get_ccaps(args->xid, &caps);
 
-#define PRINT_VALUES(type, name, var)  \
-  WRITE_MSG(1, name ":\n");            \
-  first = 1;                           \
-  while (1) {                          \
-    char const *i;                     \
-    i = vc_lo ## type ## 2text(var);   \
-    if (!i)                            \
-      break;                           \
-    if (!first)                                \
-      WRITE_MSG(1, ",");               \
-    else                               \
-      first = 0;                       \
-    WRITE_STR(1, i);                   \
-  }                                    \
-  while (*(var)) {                     \
-    int bit = ffsull(*(var));          \
-    if (!bit)                          \
-      break;                           \
-    if (!first)                                \
-      WRITE_MSG(1, ",");               \
-    else                               \
-      first = 0;                       \
-    WRITE_MSG(1, "^");                 \
-    WRITE_INT(1, bit);                 \
-    *(var) &= ~(1ULL << bit);          \
-  }                                    \
-  WRITE_MSG(1, "\n");
-
-  PRINT_VALUES(bcap, "bcapabilities", &caps.bcaps);
-  PRINT_VALUES(ccap, "ccapabilities", &caps.ccaps);
-  PRINT_VALUES(cflag, "flags", &flags.flagword);
+  print_bitfield(1, bcap, "bcapabilities", &caps.bcaps);
+  print_bitfield(1, ccap, "ccapabilities", &caps.ccaps);
+  print_bitfield(1, cflag, "flags", &flags.flagword);
+  if (vc_get_umask(args->xid, &umask) == 0) {
+    print_bitfield(1, umask, "umask", &umask.umask);
+  }
 
   return 0;
 }
@@ -220,6 +203,7 @@ int main(int argc, char *argv[])
     .xid   = VC_NOCTX,
     .flags = { .flagword = 0, .mask = 0 },
     .caps  = { .bcaps = 0, .bmask = 0,.ccaps = 0, .cmask = 0 },
+    .umask = { .umask = 0, .mask = 0 },
     .mode  = CMD_SET,
   };
 
@@ -237,6 +221,7 @@ int main(int argc, char *argv[])
       case CMD_CCAP    :  parseCCaps(optarg, &args.caps);         break;
       case CMD_BCAP    :  parseBCaps(optarg, &args.caps);         break;
       case CMD_SECURE  :  parseSecure(&args.flags, &args.caps);   break;
+      case CMD_UMASK   :  parseUMask(optarg, &args.umask);        break;
       default          :
        WRITE_MSG(2, "Try '");
        WRITE_STR(2, argv[0]);
@@ -255,6 +240,9 @@ int main(int argc, char *argv[])
     else if (args.flags.mask &&
             vc_set_cflags(args.xid, &args.flags)==-1)
       perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()");
+    else if (args.umask.mask &&
+             vc_set_umask(args.xid, &args.umask)==-1)
+      perror(ENSC_WRAPPERS_PREFIX "vc_set_umask()");
     else if (optind<argc)
       EexecvpD(argv[optind], argv+optind);
     else