[Devel] Re: [PATCH] restart: add switch '-i/--input=FILE' to indicate an input file
Serge E. Hallyn
serue at us.ibm.com
Tue Sep 22 21:23:41 PDT 2009
Quoting Oren Laadan (orenl at librato.com):
> This is useful when it isn't convenient to redirect/pipe in the
> checkpoint image.
>
> Signed-off-by: Oren Laadan <orenl at cs.columbia.edu>
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 at us.ibm.com>
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 at lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/containers
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list