X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvcontext.c;h=1e23637cf4814cfdcf457b3df460299042ad356b;hb=148ab3024621f97b9cf95091657db2448098bc66;hp=fd2f59fa439efb442e4ccd1316f33083da6e9b03;hpb=f00e4d6f0962a8ce745f9c343a191fe5bbde0de2;p=util-vserver.git diff --git a/src/vcontext.c b/src/vcontext.c index fd2f59f..1e23637 100644 --- a/src/vcontext.c +++ b/src/vcontext.c @@ -1,16 +1,16 @@ // $Id$ --*- c -*-- // Copyright (C) 2004-2006 Enrico Scholz -// +// // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -21,6 +21,7 @@ #endif #include "util.h" +#include "compat-pivot_root.h" #include "lib/internal.h" #include "lib_internal/jail.h" #include "lib_internal/sys_personality.h" @@ -99,9 +100,9 @@ CMDLINE_OPTIONS[] = { { "personality-flags", required_argument, 0, CMD_PERSFLAG }, { "vlogin", no_argument, 0, CMD_VLOGIN }, { "pivot-root", no_argument, 0, CMD_PIVOT_ROOT }, -#if 1 +#if 1 { "fakeinit", no_argument, 0, CMD_INITPID }, // compatibility -#endif +#endif { 0,0,0,0 }, }; @@ -205,7 +206,7 @@ connectExternalSync(char const *filename) { int fd; struct sockaddr_un addr; - + if (filename==0) return -1; ENSC_INIT_UNIX_SOCK(addr, filename); @@ -237,7 +238,7 @@ static void doExternalSync(int fd, char const *msg) { char c; - + if (fd==-1) return; if (msg) EsendAll(fd, msg, strlen(msg)); @@ -256,13 +257,13 @@ doit(struct Arguments const *args, int argc, char *argv[]) { int p[2][2]; pid_t pid = initSync(p, args->do_disconnect); - + if (pid==0) { xid_t xid; int ext_sync_fd = connectExternalSync(args->sync_sock); - doSyncStage0(p, args->do_disconnect); - + doSyncStage0(p, args->do_disconnect); + if (args->do_create) { xid = vc_ctx_create(args->xid, NULL); if (xid==VC_NOCTX) { @@ -367,6 +368,10 @@ doit(struct Arguments const *args, int argc, char *argv[]) doExternalSync(ext_sync_fd, args->sync_msg); doSyncStage1(p, args->do_disconnect); DPRINTF("doit: pid=%u, ppid=%u\n", getpid(), getppid()); + + if (args->do_migrateself) + setsid(); + if (!args->do_vlogin) execvp (argv[optind],argv+optind); else @@ -378,7 +383,7 @@ doit(struct Arguments const *args, int argc, char *argv[]) } assert(args->do_disconnect); - + waitOnSync(pid, p, args->xid!=VC_DYNAMIC_XID && args->do_migrate); return EXIT_SUCCESS; } @@ -430,11 +435,11 @@ int main (int argc, char *argv[]) .personality_flags = 0, .sync_msg = "ok", }; - + while (1) { int c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0); if (c==-1) break; - + switch (c) { case CMD_HELP : showHelp(1, argv[0], 0); case CMD_VERSION : showVersion(); @@ -474,10 +479,10 @@ int main (int argc, char *argv[]) } signal(SIGCHLD, SIG_DFL); - + if (args.do_migrateself) args.xid = Evc_get_task_xid(0); - + if (!args.do_create && !args.do_migrate) WRITE_MSG(2, "Neither '--create' nor '--migrate' specified; try '--help' for more information\n"); else if (args.do_create && args.do_migrate)