X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fsrc%2Fnew-namespace.c;h=43862fc33d5ef1a0bfa3556c65bd748c530e4451;hb=6b8e8be311f1f826e1ab6cedad1a5d50ef6dd4d6;hp=5684f1e259db581d98a1f4970d60c8d2e2543ad9;hpb=b562f3d09686bb1686646c949b6f92c94eb2d64c;p=util-vserver.git diff --git a/util-vserver/src/new-namespace.c b/util-vserver/src/new-namespace.c index 5684f1e..43862fc 100644 --- a/util-vserver/src/new-namespace.c +++ b/util-vserver/src/new-namespace.c @@ -25,34 +25,33 @@ #endif #include "util.h" +#include "stack-start.h" +#include "sys_clone.h" +#include #include #include #include #include -#include #include #include #include -#include +#include + +#define ENSC_WRAPPERS_WAIT 1 +#include #ifndef CLONE_NEWNS # define CLONE_NEWNS 0x00020000 #endif -static int -childFunc(void *argv_v) -{ - char ** argv = argv_v; - - execvp(argv[0], argv); - perror("execvp()"); - exit(255); -} +int wrapper_exit_code = 255; static void -usage(int fd, char const *cmd, int exit_code) +showHelp(int fd, char const *cmd, int exit_code) { + VSERVER_DECLARE_CMD(cmd); + WRITE_MSG(fd, "Usage: "); WRITE_STR(fd, cmd); WRITE_MSG(fd, @@ -69,35 +68,37 @@ static void showVersion() { WRITE_MSG(1, - "new-namespace 0.1\n" + "new-namespace " VERSION " -- executes programs in a new namespace\n" + "This program is part of " PACKAGE_STRING "\n" "Copyright (C) 2003 Enrico Scholz\n" VERSION_COPYRIGHT_DISCLAIMER); exit(0); } - + int main(int argc, char *argv[]) { - char buf[128]; - int status; - pid_t pid, p; + pid_t pid; - if (argc==1) usage(2, argv[0], 255); - if (!strcmp(argv[1], "--help")) usage(1, argv[0], 0); + if (argc==1) showHelp(2, argv[0], 255); + if (!strcmp(argv[1], "--help")) showHelp(1, argv[0], 0); if (!strcmp(argv[1], "--version")) showVersion(); if (!strcmp(argv[1], "--")) ++argv; - pid = clone(childFunc, buf+sizeof(buf)/2, CLONE_NEWNS|CLONE_VFORK|SIGCHLD, argv+1); - if (pid==-1) { - perror("clone()"); - exit(255); - } - - p = wait4(pid, &status, 0,0); - if (p==-1) { - perror("waitpid()"); - exit(255); + +#ifdef NDEBUG + pid = sys_clone(CLONE_NEWNS|CLONE_VFORK|SIGCHLD, 0); +#else + pid = sys_clone(CLONE_NEWNS|SIGCHLD, 0); +#endif + switch (pid) { + case -1 : + perror("clone()"); + exit(wrapper_exit_code); + case 0 : + execvp(argv[1], argv+1); + perror("execvp()"); + exit(wrapper_exit_code); + default : + exitLikeProcess(pid); } - - if (WIFEXITED(status)) return WEXITSTATUS(status); - else return 255; }