All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.