X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvattribute.c;h=b3fd69d9a64c6407e6d217aa95299bf006ad53e0;hb=65ee8e8556e0c293b039fcea0cdcde40cf412483;hp=a20c0e6c3a730a5627f8f30f281de126caa2b128;hpb=9c78378bebc1a9f3d400f422df8ede9efea57dea;p=util-vserver.git diff --git a/src/vattribute.c b/src/vattribute.c index a20c0e6..b3fd69d 100644 --- a/src/vattribute.c +++ b/src/vattribute.c @@ -40,6 +40,7 @@ #define CMD_FLAG 0x2003 #define CMD_SECURE 0x2004 #define CMD_BCAP 0x2005 +#define CMD_GET 0x2006 int wrapper_exit_code = 1; @@ -49,6 +50,7 @@ CMDLINE_OPTIONS[] = { { "version", no_argument, 0, CMD_VERSION }, { "xid", required_argument, 0, CMD_XID }, { "set", no_argument, 0, CMD_SET }, + { "get", no_argument, 0, CMD_GET }, { "ccap", required_argument, 0, CMD_CCAP }, { "bcap", required_argument, 0, CMD_BCAP }, { "flag", required_argument, 0, CMD_FLAG }, @@ -60,6 +62,7 @@ struct Arguments { xid_t xid; struct vc_ctx_flags flags; struct vc_ctx_caps caps; + int mode; }; static void @@ -68,10 +71,12 @@ showHelp(int fd, char const *cmd, int res) WRITE_MSG(fd, "Usage:\n "); WRITE_STR(fd, cmd); WRITE_MSG(fd, - " --set [--xid ] [--bcap [~!]] [--ccap [~!]] [--flag [~!]] [--secure] -- [ *]\n" + " [--xid ] {--get|--set [--bcap [~!]] [--ccap [~!]]\n" + " [--flag [~!]] [--secure]} -- [ *]\n" "\n" - " --bcap ... system capability to be added\n" - " --cap ... context capability to be added\n" + " --bcap ... system capability to be set\n" + " --ccap ... context capability to be set\n" + " --flag ... context flag to be set\n" "\n" "Please report bugs to " PACKAGE_BUGREPORT "\n"); @@ -82,7 +87,7 @@ static void showVersion() { WRITE_MSG(1, - "vattribute " VERSION " -- sets attributes of vservers\n" + "vattribute " VERSION " -- sets/gets attributes of vservers\n" "This program is part of " PACKAGE_STRING "\n\n" "Copyright (C) 2004 Enrico Scholz\n" VERSION_COPYRIGHT_DISCLAIMER); @@ -151,14 +156,73 @@ 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; + + 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); + + return 0; +} + int main(int argc, char *argv[]) { struct Arguments args = { .xid = VC_NOCTX, .flags = { .flagword = 0, .mask = 0 }, .caps = { .bcaps = 0, .bmask = 0,.ccaps = 0, .cmask = 0 }, + .mode = CMD_SET, }; - + while (1) { int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); if (c==-1) break; @@ -166,7 +230,8 @@ int main(int argc, char *argv[]) switch (c) { case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); - case CMD_SET : break; // default op currently + case CMD_SET : args.mode = CMD_SET; break; + case CMD_GET : args.mode = CMD_GET; break; case CMD_XID : args.xid = Evc_xidopt2xid(optarg,true); break; case CMD_FLAG : parseFlags(optarg, &args.flags); break; case CMD_CCAP : parseCCaps(optarg, &args.caps); break; @@ -175,7 +240,7 @@ int main(int argc, char *argv[]) default : WRITE_MSG(2, "Try '"); WRITE_STR(2, argv[0]); - WRITE_MSG(2, " --help\" for more information.\n"); + WRITE_MSG(2, " --help' for more information.\n"); return 255; break; } @@ -183,16 +248,25 @@ int main(int argc, char *argv[]) if (args.xid==VC_NOCTX) args.xid = Evc_get_task_xid(0); - if ((args.caps.cmask || args.caps.bmask) && - vc_set_ccaps(args.xid, &args.caps)==-1) - perror(ENSC_WRAPPERS_PREFIX "vc_set_ccaps()"); - else if (args.flags.mask && - vc_set_cflags(args.xid, &args.flags)==-1) - perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()"); - else if (optind