X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvspace.c;h=37ac2c3944d285503aab81cbf52c1e16d21bb3af;hb=148ab3024621f97b9cf95091657db2448098bc66;hp=202012b9024b47a0c7be77a1f435b7810bc4387b;hpb=effa822abc0d4375e6c63bede99ab19e61ad21ce;p=util-vserver.git diff --git a/src/vspace.c b/src/vspace.c index 202012b..37ac2c3 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} }; @@ -76,10 +86,12 @@ showHelp(int fd, char const *cmd, int res) " there; is mandatory in this\n" " case\n" " --set|-s ... assign the current spaces to the current context\n" + " --index|-i ... work with the namespaces for \n" "\n" "* 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" @@ -106,14 +118,10 @@ showVersion() } static void -newSpaces(uint_least64_t mask, const char *cmd) +newSpaces(uint_least64_t mask) { pid_t pid; - /* optimize default case */ - if (mask == 0) - return; - mask &= ~CLONE_FS; signal(SIGCHLD, SIG_DFL); @@ -131,23 +139,23 @@ newSpaces(uint_least64_t mask, const char *cmd) case 0 : break; default : - exitLikeProcess(pid, cmd, wrapper_exit_code); + vc_exitLikeProcess(pid, wrapper_exit_code); } } 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 +167,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 +185,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 +207,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 +230,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) + @@ -213,9 +247,9 @@ int main(int argc, char *argv[]) else if (optind==argc && (do_new || do_enter)) WRITE_MSG(2, "No command specified; try '--help' for more information\n"); else { - if (do_new) newSpaces(mask, argv[optind]); - else if (do_set) setSpaces(VC_SAMECTX, mask); - else if (do_enter) enterSpaces(xid, mask); + if (do_new) newSpaces(mask); + else if (do_set) setSpaces(VC_SAMECTX, mask, index); + else if (do_enter) enterSpaces(xid, mask, index); if (optind