Trivial patch, and I'm not sure whether we want this or want to do it this way. But it saves me having to do it during my restart.sh wrapper shell-script. Signed-off-by: Serge E. Hallyn <serue@xxxxxxxxxx> --- restart.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-) diff --git a/restart.c b/restart.c index 063e973..03c1850 100644 --- a/restart.c +++ b/restart.c @@ -30,6 +30,7 @@ #include <asm/unistd.h> #include <sys/syscall.h> #include <sys/prctl.h> +#include <sys/mount.h> #include <linux/sched.h> #include <linux/checkpoint.h> @@ -79,6 +80,7 @@ static char usage_str[] = " -l,--logfile=FILE write error and debug data to FILE (default=none)\n" " --logfile-fd=FD write error and debug data to file desctiptor FD\n" " --inspect inspect image on-the-fly for error records\n" +" -t,--pty start in a new devpts namespace to support ptys\n" " -v,--verbose verbose output\n" " -d,--debug debugging output\n" " --warn-COND warn on condition COND, but proceed anyways\n" @@ -365,6 +367,7 @@ struct args { long warn; long fail; int keep_lsm; + int pty; }; #define CKPT_COND_PIDZERO 0x1 @@ -444,9 +447,10 @@ static void parse_args(struct args *args, int argc, char *argv[]) { "debug", no_argument, NULL, 'd' }, { "warn-pidzero", no_argument, NULL, 9 }, { "fail-pidzero", no_argument, NULL, 10 }, + { "pty", no_argument, NULL, 't'}, { NULL, 0, NULL, 0 } }; - static char optc[] = "hdvkpPwWF:r:i:l:"; + static char optc[] = "hdvkpPwWF:r:i:l:t"; int optind; int sig; @@ -456,6 +460,7 @@ static void parse_args(struct args *args, int argc, char *argv[]) args->wait = 1; args->infd = -1; args->logfd = -1; + args->pty = 0; while (1) { int c = getopt_long(argc, argv, optc, opts, &optind); @@ -469,6 +474,9 @@ static void parse_args(struct args *args, int argc, char *argv[]) case 'v': global_verbose = 1; break; + case 't': + args->pty = 1; + break; case 5: /* --inspect */ args->inspect = 1; break; @@ -786,6 +794,31 @@ int main(int argc, char *argv[]) exit(1); } + /* private devpts namespace? */ + if (args.pty) { + struct stat ptystat; + /* make sure /dev/ptmx is a link else we'll just break */ + ret = lstat("/dev/ptmx", &ptystat); + if (ret) { + perror("stat /dev/ptmx"); + exit(1); + } + if ((ptystat.st_mode & S_IFMT) != S_IFLNK) { + printf("Error: /dev/ptmx must be a link to /dev/pts/ptmx\n"); + exit(1); + } + ret = unshare(CLONE_NEWNS); + if (ret) { + perror("unshare mounts ns (for -pty)"); + exit(1); + } + ret = mount("pts", "/dev/pts", "devpts", 0, "newinstance"); + if (ret) { + perror("mount -t devpts -o newinstance"); + exit(1); + } + } + /* self-restart ends here: */ if (args.self) { restart(getpid(), STDIN_FILENO, RESTART_TASKSELF, args.logfd); -- 1.6.1.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers