X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvattribute.c;h=0c98a2e2beefe78dc52ed6ccbbbd8eec7c695046;hb=2198bce8b4e20700ca72473140980208d0937e9d;hp=86e90bab612f7ea50f6bff412ca6446545ab4e06;hpb=8957c6c79a87a95d564b7683978da288496f3c93;p=util-vserver.git diff --git a/src/vattribute.c b/src/vattribute.c index 86e90ba..0c98a2e 100644 --- a/src/vattribute.c +++ b/src/vattribute.c @@ -42,6 +42,7 @@ #define CMD_SECURE 0x2004 #define CMD_BCAP 0x2005 #define CMD_GET 0x2006 +#define CMD_UMASK 0x2007 int wrapper_exit_code = 1; @@ -56,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} }; @@ -63,6 +65,7 @@ struct Arguments { xid_t xid; struct vc_ctx_flags flags; struct vc_ctx_caps caps; + struct vc_umask umask; int mode; }; @@ -78,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"); @@ -144,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) { @@ -162,6 +182,7 @@ printAttrs(struct Arguments *args) { struct vc_ctx_flags flags; struct vc_ctx_caps caps; + struct vc_umask umask = { .mask = ~0, .umask = 0x20200 }; Evc_get_cflags(args->xid, &flags); Evc_get_ccaps(args->xid, &caps); @@ -169,6 +190,9 @@ printAttrs(struct Arguments *args) 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; } @@ -179,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, }; @@ -196,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]); @@ -214,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