X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvspace.c;h=db2ef2ab2ef06f2af9c63640e4c36a3bc0cee681;hb=27862613d32cb19d2d8ddbe2c9d13c01f114564c;hp=30d1ab427758d09796b207ee4ea13a5e4e28f080;hpb=fbc451923c71119a8dc7c6db5e262770bbb57d1f;p=util-vserver.git diff --git a/src/vspace.c b/src/vspace.c index 30d1ab4..db2ef2a 100644 --- a/src/vspace.c +++ b/src/vspace.c @@ -49,15 +49,25 @@ CMDLINE_OPTIONS[] = { { "new", no_argument, 0, 'n' }, { "enter", required_argument, 0, 'e' }, { "set", no_argument, 0, 's' }, + { "index", required_argument, 0, 'i' }, { "mask", required_argument, 0, 'm' }, + { "default", no_argument, 0, 'd' }, + { "~default", no_argument, 0, 'd' | 0x10000 }, { "mount", no_argument, 0, 'M' }, + { "~mount", no_argument, 0, 'M' | 0x10000 }, { "fs", no_argument, 0, 'F' }, + { "~fs", no_argument, 0, 'F' | 0x10000 }, { "ipc", no_argument, 0, 'I' }, + { "~ipc", no_argument, 0, 'I' | 0x10000 }, { "uts", no_argument, 0, 'U' }, + { "~uts", no_argument, 0, 'U' | 0x10000 }, { "user", no_argument, 0, 'S' }, + { "~user", no_argument, 0, 'S' | 0x10000 }, { "pid", no_argument, 0, 'P' }, + { "~pid", no_argument, 0, 'P' | 0x10000 }, { "net", no_argument, 0, 'N' }, + { "~net", no_argument, 0, 'N' | 0x10000 }, {0,0,0,0} }; @@ -80,6 +90,7 @@ showHelp(int fd, char const *cmd, int res) "* specifies the spaces to manipulate.\n" "It can be any combination of:\n" " --mask ... specify a mask of spaces\n" + " --default ... the default spaces for this kernel\n" " --mount ... the mount namespace\n" " --fs ... the fs_struct\n" " --ipc ... the IPC namespace\n" @@ -110,10 +121,6 @@ newSpaces(uint_least64_t mask) { pid_t pid; - /* optimize default case */ - if (mask == 0) - return; - mask &= ~CLONE_FS; signal(SIGCHLD, SIG_DFL); @@ -136,18 +143,18 @@ newSpaces(uint_least64_t mask) } static void -enterSpaces(xid_t xid, uint_least64_t mask) +enterSpaces(xid_t xid, uint_least64_t mask, uint32_t index) { - if (vc_enter_namespace(xid, mask)==-1) { + if (vc_enter_namespace(xid, mask, index)==-1) { perror(ENSC_WRAPPERS_PREFIX "vc_enter_namespace()"); exit(wrapper_exit_code); } } static void -setSpaces(xid_t xid, uint_least64_t mask) +setSpaces(xid_t xid, uint_least64_t mask, uint32_t index) { - if (vc_set_namespace(xid, mask)==-1) { + if (vc_set_namespace(xid, mask, index)==-1) { perror(ENSC_WRAPPERS_PREFIX "vc_set_namespace()"); exit(wrapper_exit_code); } @@ -159,14 +166,16 @@ int main(int argc, char *argv[]) bool do_enter = false; bool do_set = false; uint_least64_t mask = 0; + uint32_t index = 0; xid_t xid = VC_NOCTX; int sum = 0; while (1) { - int c = getopt_long(argc, argv, "+nsce:m:" "MFIUSPN", CMDLINE_OPTIONS, 0); + int c = getopt_long(argc, argv, "+nsce:m:i:" "MFIUSPN", CMDLINE_OPTIONS, 0); + uint_least64_t thisbit = 0; if (c==-1) break; - switch (c) { + switch (c & 0xFFFF) { case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); case 'n' : do_new = true; break; @@ -175,6 +184,17 @@ int main(int argc, char *argv[]) do_enter = true; xid = Evc_xidopt2xid(optarg,true); break; + case 'i' : { + unsigned long index_l; + if (!isNumberUnsigned(optarg, &index_l, true)) { + WRITE_MSG(2, "Invalid index '"); + WRITE_STR(2, optarg); + WRITE_MSG(2, "'; try '--help' for more information\n"); + return wrapper_exit_code; + } + index = (uint32_t)index_l; + break; + } case 'm' : { unsigned long mask_l; if (!isNumberUnsigned(optarg, &mask_l, true)) { @@ -186,13 +206,21 @@ int main(int argc, char *argv[]) mask = mask_l; break; } - case 'M' : mask |= CLONE_NEWNS; break; - case 'F' : mask |= CLONE_FS; break; - case 'I' : mask |= CLONE_NEWIPC; break; - case 'U' : mask |= CLONE_NEWUTS; break; - case 'S' : mask |= CLONE_NEWUSER; break; - case 'P' : mask |= CLONE_NEWPID; break; - case 'N' : mask |= CLONE_NEWNET; break; + case 'M' : thisbit = CLONE_NEWNS; break; + case 'F' : thisbit = CLONE_FS; break; + case 'I' : thisbit = CLONE_NEWIPC; break; + case 'U' : thisbit = CLONE_NEWUTS; break; + case 'S' : thisbit = CLONE_NEWUSER; break; + case 'P' : thisbit = CLONE_NEWPID; break; + case 'N' : thisbit = CLONE_NEWNET; break; + case 'd' : + thisbit = vc_get_space_default(); + if (thisbit == (__typeof__(thisbit)) -1) { + thisbit = vc_get_space_mask(); + if (thisbit == (__typeof__(thisbit)) -1) + thisbit = 0; + } + break; default : WRITE_MSG(2, "Try '"); @@ -201,6 +229,11 @@ int main(int argc, char *argv[]) return 255; break; } + /* ~ option used */ + if (c & 0xFFFF0000) + mask &= ~thisbit; + else + mask |= thisbit; } sum = ((do_new ? 1 : 0) + (do_enter ? 1 : 0) + @@ -214,8 +247,8 @@ int main(int argc, char *argv[]) WRITE_MSG(2, "No command specified; try '--help' for more information\n"); else { if (do_new) newSpaces(mask); - else if (do_set) setSpaces(VC_SAMECTX, mask); - else if (do_enter) enterSpaces(xid, mask); + else if (do_set) setSpaces(VC_SAMECTX, mask, index); + else if (do_enter) enterSpaces(xid, mask, index); if (optind