X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvattribute.c;h=0c98a2e2beefe78dc52ed6ccbbbd8eec7c695046;hb=2198bce8b4e20700ca72473140980208d0937e9d;hp=b3fd69d9a64c6407e6d217aa95299bf006ad53e0;hpb=92cc2793f07b1925c27da50f3dd58520b62e49d5;p=util-vserver.git diff --git a/src/vattribute.c b/src/vattribute.c index b3fd69d..0c98a2e 100644 --- a/src/vattribute.c +++ b/src/vattribute.c @@ -21,6 +21,7 @@ #endif #include "util.h" +#include "attribute-util.h" #include #include @@ -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 ... system capability to be set\n" " --ccap ... context capability to be set\n" " --flag ... context flag to be set\n" + " --umask ... 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