X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Fvattribute.c;h=566125b9a3e7e5607ac883cd5567b5f84d0ba1b0;hb=a917f24ef7b003dcef54a3db2644cf9cb4bc2db2;hp=f5cac3579ed0418e6430bc5e33788949c897ca50;hpb=0b91e0752e23069af888807c17414c736d7bdebc;p=util-vserver.git diff --git a/util-vserver/src/vattribute.c b/util-vserver/src/vattribute.c index f5cac35..566125b 100644 --- a/util-vserver/src/vattribute.c +++ b/util-vserver/src/vattribute.c @@ -25,17 +25,21 @@ #include #include +#include +#define ENSC_WRAPPERS_PREFIX "vattribute: " #define ENSC_WRAPPERS_VSERVER 1 +#define ENSC_WRAPPERS_UNISTD 1 #include #define CMD_HELP 0x1000 #define CMD_VERSION 0x1001 #define CMD_XID 0x2000 #define CMD_SET 0x2001 -#define CMD_CAP 0x2002 +#define CMD_CCAP 0x2002 #define CMD_FLAG 0x2003 #define CMD_SECURE 0x2004 +#define CMD_BCAP 0x2005 int wrapper_exit_code = 1; @@ -45,7 +49,8 @@ CMDLINE_OPTIONS[] = { { "version", no_argument, 0, CMD_VERSION }, { "xid", required_argument, 0, CMD_XID }, { "set", no_argument, 0, CMD_SET }, - { "cap", required_argument, 0, CMD_CAP }, + { "ccap", required_argument, 0, CMD_CCAP }, + { "bcap", required_argument, 0, CMD_BCAP }, { "flag", required_argument, 0, CMD_FLAG }, { "secure", no_argument, 0, CMD_SECURE }, {0,0,0,0} @@ -54,7 +59,7 @@ CMDLINE_OPTIONS[] = { struct Arguments { xid_t xid; struct vc_ctx_flags flags; - struct vc_ctx_flags caps; + struct vc_ctx_caps caps; }; static void @@ -63,7 +68,10 @@ showHelp(int fd, char const *cmd, int res) WRITE_MSG(fd, "Usage:\n "); WRITE_STR(fd, cmd); WRITE_MSG(fd, - " --set [--xid ] [--cap [~!]] [--flag [~!]] [--secure] -- [ *]\n" + " --set [--xid ] [--bcap [~!]] [--ccap [~!]] [--flag [~!]] [--secure] -- [ *]\n" + "\n" + " --bcap ... system capability to be added\n" + " --cap ... context capability to be added\n" "\n" "Please report bugs to " PACKAGE_BUGREPORT "\n"); @@ -82,31 +90,69 @@ showVersion() } static void -setFlags(char const UNUSED *str, struct vc_ctx_flags UNUSED * flags) +parseFlags(char const *str, struct vc_ctx_flags *flags) { - abort(); + struct vc_err_listparser err; + int rc; + + rc = vc_list2flag(str,0, &err, flags); + + if (rc==-1) { + WRITE_MSG(2, "Unknown flag '"); + write(2, err.ptr, err.len); + WRITE_MSG(2, "'\n"); + exit(wrapper_exit_code); + } } static void -setCaps(char const UNUSED *str, struct vc_ctx_flags UNUSED * caps) +parseBCaps(char const *str, struct vc_ctx_caps *caps) { - abort(); + struct vc_err_listparser err; + int rc; + + rc = vc_list2bcap(str,0, &err, caps); + + if (rc==-1) { + WRITE_MSG(2, "Unknown bcap '"); + write(2, err.ptr, err.len); + WRITE_MSG(2, "'\n"); + exit(wrapper_exit_code); + } } static void -setSecure(struct vc_ctx_flags UNUSED * flags, - struct vc_ctx_flags UNUSED * caps) +parseCCaps(char const *str, struct vc_ctx_caps *caps) { - abort(); + struct vc_err_listparser err; + int rc; + + rc = vc_list2ccap(str,0, &err, caps); + + if (rc==-1) { + WRITE_MSG(2, "Unknown ccap '"); + write(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) +{ + caps->ccaps = ~0ull; + caps->cmask = ~0ull; + caps->bcaps = ~vc_get_insecurecaps(); + caps->bmask = ~0ull; +} int main(int argc, char *argv[]) { struct Arguments args = { .xid = VC_NOCTX, .flags = { .flagword = 0, .mask = 0 }, - .caps = { .flagword = 0, .mask = 0 }, + .caps = { .bcaps = 0, .bmask = 0,.ccaps = 0, .cmask = 0 }, }; while (1) { @@ -117,10 +163,11 @@ int main(int argc, char *argv[]) case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); case CMD_SET : break; // default op currently - case CMD_XID : args.xid = atoi(optarg); break; - case CMD_FLAG : setFlags(optarg, &args.flags); break; - case CMD_CAP : setCaps(optarg, &args.caps); break; - case CMD_SECURE : setSecure(&args.flags, &args.caps); 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; + case CMD_BCAP : parseBCaps(optarg, &args.caps); break; + case CMD_SECURE : parseSecure(&args.flags, &args.caps); break; default : WRITE_MSG(2, "Try '"); WRITE_STR(2, argv[0]); @@ -132,10 +179,14 @@ int main(int argc, char *argv[]) if (args.xid==VC_NOCTX) args.xid = Evc_get_task_xid(0); - if (vc_set_flags(args.xid,&args.flags)==-1) - perror("vc_set_flags()"); -// else if (vc_set_caps(xid, &args.caps)==-1) -// perror("vc_set_caps()"); + 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_flags(args.xid, &args.flags)==-1) + perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()"); + else if (optind