X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvspace.c;h=202012b9024b47a0c7be77a1f435b7810bc4387b;hb=4c5e881f765be86bb1da5ce4d3fcc86effc5fdc7;hp=4819138928710745b7b5f3804197a46a3633832f;hpb=724ab5b8c85dd45b6ad3c682d402f554f862f549;p=util-vserver.git diff --git a/src/vspace.c b/src/vspace.c index 4819138..202012b 100644 --- a/src/vspace.c +++ b/src/vspace.c @@ -22,7 +22,7 @@ #endif #include "util.h" -#include +#include #include @@ -106,14 +106,32 @@ showVersion() } static void -newSpaces(uint_least64_t mask) +newSpaces(uint_least64_t mask, const char *cmd) { - int rc; + pid_t pid; - rc = sys_unshare(mask); - if (rc) { - perror(ENSC_WRAPPERS_PREFIX "unshare()"); - exit(wrapper_exit_code); + /* optimize default case */ + if (mask == 0) + return; + + mask &= ~CLONE_FS; + + signal(SIGCHLD, SIG_DFL); + +#ifdef NDEBUG + pid = sys_clone((int) mask | CLONE_VFORK|SIGCHLD, 0); +#else + pid = sys_clone((int) mask | SIGCHLD, 0); +#endif + + switch (pid) { + case -1 : + perror(ENSC_WRAPPERS_PREFIX "clone()"); + exit(wrapper_exit_code); + case 0 : + break; + default : + exitLikeProcess(pid, cmd, wrapper_exit_code); } } @@ -195,7 +213,7 @@ 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); + if (do_new) newSpaces(mask, argv[optind]); else if (do_set) setSpaces(VC_SAMECTX, mask); else if (do_enter) enterSpaces(xid, mask);