Quoting Oren Laadan (orenl@xxxxxxxxxxx): > This is useful when it isn't convenient to redirect/pipe in the > checkpoint image. > > Signed-off-by: Oren Laadan <orenl@xxxxxxxxxxxxxxx> Haha, I was surprised how long it took for this to show up :) I wanted to do it a long time ago, but refused to admit that some tests were tough to script with stdin :) Especially when a wrapper program wants to close fds... Code looks good. Acked-by: Serge Hallyn <serue@xxxxxxxxxx> thanks, -serge > --- > restart.c | 40 ++++++++++++++++++++++++++++++---------- > 1 files changed, 30 insertions(+), 10 deletions(-) > > diff --git a/restart.c b/restart.c > index a25aaa9..600a282 100644 > --- a/restart.c > +++ b/restart.c > @@ -1,5 +1,5 @@ > /* > - * restart.c: restart of multiple processes > + * restart.c: restart process(es) from a checkpoint > * > * Copyright (C) 2008-2009 Oren Laadan > * > @@ -63,7 +63,6 @@ static char usage_str[] = > " -p,--pidns create a new pid namspace (default with --pids)\n" > " -P,--no-pidns do not create a new pid namespace (default)\n" > " --pids restore original pids (default with --pidns)\n" > -" -i,--inspect inspect image on-the-fly for error records\n" > " -r,--root=ROOT restart under the directory ROOT instead of current\n" > " --signal=SIG send SIG to root task on SIGINT (default: SIGKILL\n" > " to container root, SIGINT otherwise)\n" > @@ -72,6 +71,8 @@ static char usage_str[] = > " --copy-status imitate exit status of root task (implies -w)\n" > " -W,--no-wait do not wait for root task to terminate\n" > " -F,--freezer=CGROUP freeze tasks in freezer group CGROUP on success\n" > +" -i,--input=FILE read data from FILE instead of standard input\n" > +" --inspect inspect image on-the-fly for error records\n" > " -v,--verbose verbose output\n" > " -d,--debug debugging output\n" > ""; > @@ -343,6 +344,7 @@ struct args { > int show_status; > int copy_status; > char *freezer; > + char *input; > }; > > static void usage(char *str) > @@ -371,7 +373,8 @@ static void parse_args(struct args *args, int argc, char *argv[]) > { "no-pidns", no_argument, NULL, 'P' }, > { "pids", no_argument, NULL, 3 }, > { "signal", required_argument, NULL, 4 }, > - { "inspect", no_argument, NULL, 'i' }, > + { "inspect", no_argument, NULL, 5 }, > + { "input", required_argument, NULL, 'i' }, > { "root", required_argument, NULL, 'r' }, > { "wait", no_argument, NULL, 'w' }, > { "show-status", no_argument, NULL, 1 }, > @@ -382,7 +385,7 @@ static void parse_args(struct args *args, int argc, char *argv[]) > { "debug", no_argument, NULL, 'd' }, > { NULL, 0, NULL, 0 } > }; > - static char optc[] = "hdivpPwWF:r:"; > + static char optc[] = "hdvpPwWF:r:i:"; > > int sig; > > @@ -402,16 +405,19 @@ static void parse_args(struct args *args, int argc, char *argv[]) > case 'v': > global_verbose = 1; > break; > - case 'i': > + case 5: /* --inspect */ > args->inspect = 1; > break; > + case 'i': > + args->input = optarg; > + break; > case 'p': > args->pidns = 1; > break; > case 'P': > args->no_pidns = 1; > break; > - case 4: > + case 4: /* --signal */ > sig = str2sig(optarg); > if (sig < 0) > sig = str2num(optarg); > @@ -421,7 +427,7 @@ static void parse_args(struct args *args, int argc, char *argv[]) > } > global_send_sigint = sig; > break; > - case 3: > + case 3: /* --pids */ > args->pids = 1; > args->pidns = 1; /* implied */ > break; > @@ -434,11 +440,11 @@ static void parse_args(struct args *args, int argc, char *argv[]) > case 'W': > args->wait = 0; > break; > - case 1: > + case 1: /* --show-status */ > args->wait = 1; > args->show_status = 1; > break; > - case 2: > + case 2: /* --copy-status */ > args->wait = 1; > args->copy_status = 1; > break; > @@ -625,14 +631,28 @@ int main(int argc, char *argv[]) > memset(&ctx, 0, sizeof(ctx)); > > parse_args(&args, argc, argv); > - > ctx.args = &args; > > + /* input file (default: stdin) */ > + if (args.input) { > + ret = open(args.input, O_RDONLY, 0); > + if (ret < 0) { > + perror("open input file"); > + exit(1); > + } > + if (dup2(ret, STDIN_FILENO) < 0) { > + perror("dup2 input file"); > + exit(1); > + } > + } > + > + /* freezer preparation */ > if (args.freezer && freezer_prepare(&ctx) < 0) > exit(1); > > setpgrp(); > > + /* chroot ? */ > if (args.root && chroot(args.root) < 0) { > perror("chroot"); > exit(1); > -- > 1.6.0.4 > > _______________________________________________ > Containers mailing list > Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx > https://lists.linux-foundation.org/mailman/listinfo/containers _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers