From: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> Date: Wed, 10 Mar 2010 22:24:17 -0800 Subject: [PATCH 3/5][lxc] lxc_checkpoint: Add --image option The existing --directory option to lxc_checkpoint expects to save the checkpoint state in a directory. USERCR however uses a single regular file to store the checkpoint image. So add a --image option to enable checkpointing and restarting applications using USERCR. Users should specify either --image or --directory option (but not both) to select the file/directory where the application state will be stored. Signed-off-by: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> --- src/lxc/lxc_checkpoint.c | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c index a8c74a9..3554518 100644 --- a/src/lxc/lxc_checkpoint.c +++ b/src/lxc/lxc_checkpoint.c @@ -39,10 +39,17 @@ lxc_log_define(lxc_checkpoint_ui, lxc_checkpoint); static int my_checker(const struct lxc_arguments* args) { - if (!args->statefile) { - lxc_error(args, "no statefile specified"); - return -1; - } + int i, s; + + /* make them boolean */ + i = !!(args->imagefile); + s = !!(args->statefile); + + if (!(i ^ s)) { + lxc_error(args, "Must specify exactly one of --directory " + "and --image options"); + return -1; + } return 0; } @@ -53,6 +60,7 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg) case 'k': args->flags = LXC_FLAG_HALT; break; case 'p': args->flags = LXC_FLAG_PAUSE; break; case 'd': args->statefile = arg; break; + case 'i': args->imagefile = arg; break; } return 0; } @@ -61,6 +69,7 @@ static const struct option my_longopts[] = { {"kill", no_argument, 0, 'k'}, {"pause", no_argument, 0, 'p'}, {"directory", required_argument, 0, 'd'}, + {"image", required_argument, 0, 'i'}, LXC_COMMON_OPTIONS }; @@ -68,6 +77,7 @@ static struct lxc_arguments my_args = { .progname = "lxc-checkpoint", .help = "\ --name=NAME --directory STATEFILE\n\ +\tlxc_checkpoint --name=NAME --image CHECKPOINT-IMAGE\n\ \n\ lxc-checkpoint checkpoints in STATEFILE the NAME container\n\ \n\ @@ -75,7 +85,8 @@ Options :\n\ -n, --name=NAME NAME for name of the container\n\ -k, --kill stop the container after checkpoint\n\ -p, --pause don't unfreeze the container after the checkpoint\n\ - -d, --directory=STATEFILE where to store the statefile\n", + -d, --directory=STATEFILE where to store the statefile (legacy mode)\n\ + -i, --image=FILE where to store the checkpoint-image (USERCR mode)\n", .options = my_longopts, .parser = my_parser, @@ -97,6 +108,7 @@ static int create_statefile(const char *dir) int main(int argc, char *argv[]) { int ret; + const char *image; ret = lxc_arguments_parse(&my_args, argc, argv); if (ret) @@ -107,11 +119,15 @@ int main(int argc, char *argv[]) if (ret) return ret; - ret = create_statefile(my_args.statefile); - if (ret) - return ret; + image = my_args.imagefile; + if (my_args.statefile) { + image = my_args.statefile; + ret = create_statefile(my_args.statefile); + if (ret) + return ret; + } - ret = lxc_checkpoint(my_args.name, my_args.statefile, my_args.flags); + ret = lxc_checkpoint(my_args.name, image, my_args.flags); if (ret) ERROR("failed to checkpoint '%s'", my_args.name); else -- 1.6.6.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers