#endif
#include "util.h"
+#include "attribute-util.h"
#include <lib/vserver.h>
#include <getopt.h>
#define CMD_FLAG 0x2003
#define CMD_SECURE 0x2004
#define CMD_BCAP 0x2005
+#define CMD_GET 0x2006
+#define CMD_UMASK 0x2007
int wrapper_exit_code = 1;
{ "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 },
{ "secure", no_argument, 0, CMD_SECURE },
+ { "umask", required_argument, 0, CMD_UMASK },
{0,0,0,0}
};
xid_t xid;
struct vc_ctx_flags flags;
struct vc_ctx_caps caps;
+ struct vc_umask umask;
+ int mode;
};
static void
WRITE_MSG(fd, "Usage:\n ");
WRITE_STR(fd, cmd);
WRITE_MSG(fd,
- " --set [--xid <xid>] [--bcap [~!]<cap>] [--ccap [~!]<cap>] [--flag [~!]<flag>] [--secure] -- [<program> <args>*]\n"
+ " [--xid <xid>] {--get|--set [--bcap [~!]<cap>] [--ccap [~!]<cap>]\n"
+ " [--flag [~!]<flag>] [--secure]} -- [<program> <args>*]\n"
"\n"
- " --bcap <cap> ... system capability to be added\n"
- " --cap <cap> ... context capability to be added\n"
+ " --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");
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);
}
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)
{
flags->mask = VC_VXF_HIDE_NETIF;
}
+static int
+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);
+ Evc_get_umask(args->xid, &umask);
+
+ print_bitfield(1, bcap, "bcapabilities", &caps.bcaps);
+ print_bitfield(1, ccap, "ccapabilities", &caps.ccaps);
+ print_bitfield(1, cflag, "flags", &flags.flagword);
+ print_bitfield(1, umask, "umask", &umask.umask);
+
+ 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 },
+ .umask = { .umask = 0, .mask = 0 },
+ .mode = CMD_SET,
};
-
+
while (1) {
int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0);
if (c==-1) break;
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;
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]);
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<argc)
- EexecvpD(argv[optind], argv+optind);
- else
- return EXIT_SUCCESS;
+ if (args.mode == CMD_SET) {
+ 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 (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
+ return EXIT_SUCCESS;
+ }
+ else if (args.mode == CMD_GET) {
+ printAttrs(&args);
+ if (optind<argc)
+ EexecvpD(argv[optind], argv+optind);
+ else
+ return EXIT_SUCCESS;
+ }
return EXIT_FAILURE;
}