* [PATCH] restart: add switch '-i/--input=FILE' to indicate an input file
@ 2009-09-23 0:16 Oren Laadan
[not found] ` <1253664983-3406-1-git-send-email-orenl-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
0 siblings, 1 reply; 2+ messages in thread
From: Oren Laadan @ 2009-09-23 0:16 UTC (permalink / raw)
To: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA
This is useful when it isn't convenient to redirect/pipe in the
checkpoint image.
Signed-off-by: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
---
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] restart: add switch '-i/--input=FILE' to indicate an input file
[not found] ` <1253664983-3406-1-git-send-email-orenl-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
@ 2009-09-23 4:23 ` Serge E. Hallyn
0 siblings, 0 replies; 2+ messages in thread
From: Serge E. Hallyn @ 2009-09-23 4:23 UTC (permalink / raw)
To: Oren Laadan; +Cc: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA
Quoting Oren Laadan (orenl-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org):
> This is useful when it isn't convenient to redirect/pipe in the
> checkpoint image.
>
> Signed-off-by: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
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-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
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-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
> https://lists.linux-foundation.org/mailman/listinfo/containers
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-09-23 4:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-23 0:16 [PATCH] restart: add switch '-i/--input=FILE' to indicate an input file Oren Laadan
[not found] ` <1253664983-3406-1-git-send-email-orenl-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
2009-09-23 4:23 ` Serge E. Hallyn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.