X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvspace.c;h=30d1ab427758d09796b207ee4ea13a5e4e28f080;hb=5817e191c23c4c53548472b5aa77a29d995c3410;hp=4819138928710745b7b5f3804197a46a3633832f;hpb=724ab5b8c85dd45b6ad3c682d402f554f862f549;p=util-vserver.git diff --git a/src/vspace.c b/src/vspace.c index 4819138..30d1ab4 100644 --- a/src/vspace.c +++ b/src/vspace.c @@ -22,7 +22,7 @@ #endif #include "util.h" -#include +#include #include @@ -108,12 +108,30 @@ showVersion() static void newSpaces(uint_least64_t mask) { - 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 : + vc_exitLikeProcess(pid, wrapper_exit_code); } }