From 41cfbac9dd3e449dfda6fd908f8e13cc4ec40990 Mon Sep 17 00:00:00 2001 From: Michel Normand Date: Mon, 18 May 2009 22:11:46 +0200 Subject: [PATCH] add long options step4 add the long options to the remaining lxc_*.c files that need changes in struct lxc_arguments. Signed-off-by: Michel Normand Signed-off-by: Daniel Lezcano --- src/lxc/arguments.h | 9 ++++ src/lxc/lxc_checkpoint.c | 95 ++++++++++++++++++++-------------------- src/lxc/lxc_console.c | 77 ++++++++++++++------------------ src/lxc/lxc_wait.c | 93 +++++++++++++++++++++------------------ 4 files changed, 142 insertions(+), 132 deletions(-) diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h index 262355fa1..e406215c5 100644 --- a/src/lxc/arguments.h +++ b/src/lxc/arguments.h @@ -44,6 +44,15 @@ struct lxc_arguments { int quiet; const char *rcfile; + /* for lxc-checkpoint */ + int stop; + + /* for lxc-console */ + int ttynum; + + /* for lxc-wait */ + char *states; + /* remaining arguments */ char *const *argv; int argc; diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c index e8d7d606d..e0be048dd 100644 --- a/src/lxc/lxc_checkpoint.c +++ b/src/lxc/lxc_checkpoint.c @@ -26,73 +26,74 @@ #include #include +#include "arguments.h" -void usage(char *cmd) +static int my_checker(const struct lxc_arguments* args) { - fprintf(stderr, "%s \n", basename(cmd)); - fprintf(stderr, "\t -n : name of the container\n"); - fprintf(stderr, "\t[-o ] : path of the log file\n"); - fprintf(stderr, "\t[-l ]: log level priority\n"); - fprintf(stderr, "\t[-q ] : be quiet\n"); - _exit(1); + if (!args->argc) { + lxc_error(args, "missing STATEFILE filename !"); + return -1; + } + return 0; } +static int my_parser(struct lxc_arguments* args, int c, char* arg) +{ + switch (c) { + case 's': args->stop = 1; break; + } + return 0; +} + +static const struct option my_longopts[] = { + {"stop", no_argument, 0, 's'}, + LXC_COMMON_OPTIONS +}; + +static struct lxc_arguments my_args = { + .progname = "lxc-checkpoint", + .help = "\ +--name=NAME STATEFILE\n\ +\n\ +lxc-checkpoint checkpoints in STATEFILE file the NAME container\n\ +\n\ +Options :\n\ + -n, --name=NAME NAME for name of the container\n\ + -s, --stop stop the container after checkpoint\n", + .options = my_longopts, + .parser = my_parser, + .checker = my_checker, + + .rcfile = NULL, +}; + int main(int argc, char *argv[]) { - int opt; - char *name = NULL; - const char *log_file = NULL, *log_priority = NULL; - int stop = 0; - int nbargs = 0; - int ret = 1; - int quiet = 0; + int ret; - while ((opt = getopt(argc, argv, "sn:o:l:")) != -1) { - switch (opt) { - case 'n': - name = optarg; - break; - case 's': - stop = 1; - break; - case 'o': - log_file = optarg; - break; - case 'l': - log_priority = optarg; - break; - case 'q': - quiet = 1; - break; - } + ret = lxc_arguments_parse(&my_args, argc, argv); + if (ret) + return 1; - nbargs++; - } - - if (!name) - usage(argv[0]); - - if (!argv[1]) - usage(argv[0]); - - if (lxc_log_init(log_file, log_priority, basename(argv[0]), quiet)) + if (lxc_log_init(my_args.log_file, my_args.log_priority, + my_args.progname, my_args.quiet)) return -1; - if (lxc_freeze(name)) + if (lxc_freeze(my_args.name)) return -1; - if (lxc_checkpoint(name, argv[1], 0)) + if (lxc_checkpoint(my_args.name, my_args.argv[0], 0)) goto out; - if (stop) { - if (lxc_stop(name)) + if (my_args.stop) { + if (lxc_stop(my_args.name)) goto out; } ret = 0; out: - if (lxc_unfreeze(name)) + if (lxc_unfreeze(my_args.name)) return 1; return ret; diff --git a/src/lxc/lxc_console.c b/src/lxc/lxc_console.c index 8d2541b02..21e1d9687 100644 --- a/src/lxc/lxc_console.c +++ b/src/lxc/lxc_console.c @@ -39,61 +39,52 @@ #include "error.h" #include "lxc.h" -#include +#include "arguments.h" lxc_log_define(lxc_console, lxc); -void usage(char *cmd) +static int my_parser(struct lxc_arguments* args, int c, char* arg) { - fprintf(stderr, "%s \n", basename(cmd)); - fprintf(stderr, "\t -n : name of the container\n"); - fprintf(stderr, "\t [-t ] : tty number\n"); - fprintf(stderr, "\t[-o ] : path of the log file\n"); - fprintf(stderr, "\t[-l ]: log level priority\n"); - fprintf(stderr, "\t[-q ] : be quiet\n"); - _exit(1); + switch (c) { + case 't': args->ttynum = atoi(arg); break; + } + return 0; } +static const struct option my_longopts[] = { + {"tty", required_argument, 0, 't'}, + LXC_COMMON_OPTIONS +}; + +static struct lxc_arguments my_args = { + .progname = "lxc-console", + .help = "\ +--name=NAME [--tty NUMBER]\n\ +\n\ +lxc-console logs on the container with the identifier NAME\n\ +\n\ +Options :\n\ + -n, --name=NAME NAME for name of the container\n\ + -t, --tty=NUMBER console tty number\n", + .options = my_longopts, + .parser = my_parser, + .checker = NULL, + .ttynum = -1, +}; + int main(int argc, char *argv[]) { - char *name = NULL; - const char *log_file = NULL, *log_priority = NULL; - int quiet = 0; - int opt; - int nbargs = 0; int master = -1; - int ttynum = -1; int wait4q = 0; - int err = LXC_ERROR_INTERNAL; + int err; struct termios tios, oldtios; - while ((opt = getopt(argc, argv, "t:n:o:l:")) != -1) { - switch (opt) { - case 'n': - name = optarg; - break; + err = lxc_arguments_parse(&my_args, argc, argv); + if (err) + return 1; - case 't': - ttynum = atoi(optarg); - break; - case 'o': - log_file = optarg; - break; - case 'l': - log_priority = optarg; - break; - case 'q': - quiet = 1; - break; - } - - nbargs++; - } - - if (!name) - usage(argv[0]); - - if (lxc_log_init(log_file, log_priority, basename(argv[0]), quiet)) + if (lxc_log_init(my_args.log_file, my_args.log_priority, + my_args.progname, my_args.quiet)) return 1; /* Get current termios */ @@ -120,7 +111,7 @@ int main(int argc, char *argv[]) return 1; } - err = lxc_console(name, ttynum, &master); + err = lxc_console(my_args.name, my_args.ttynum, &master); if (err) goto out; diff --git a/src/lxc/lxc_wait.c b/src/lxc/lxc_wait.c index 0b723e885..6581dc263 100644 --- a/src/lxc/lxc_wait.c +++ b/src/lxc/lxc_wait.c @@ -27,21 +27,49 @@ #include #include +#include "arguments.h" lxc_log_define(lxc_wait, lxc); -void usage(char *cmd) +static int my_checker(const struct lxc_arguments* args) { - fprintf(stderr, "%s \n", basename(cmd)); - fprintf(stderr, "\t -n : name of the container\n"); - fprintf(stderr, "\t -s : ORed states to wait for STOPPED, " \ - "STARTING, RUNNING, STOPPING, ABORTING, FREEZING, FROZEN\n"); - fprintf(stderr, "\t[-o ] : path of the log file\n"); - fprintf(stderr, "\t[-l ]: log level priority\n"); - fprintf(stderr, "\t[-q ] : be quiet\n"); - _exit(1); + if (!args->states) { + lxc_error(args, "missing state option to wait for."); + return -1; + } + return 0; } +static int my_parser(struct lxc_arguments* args, int c, char* arg) +{ + switch (c) { + case 's': args->states = optarg; break; + } + return 0; +} + +static const struct option my_longopts[] = { + {"state", required_argument, 0, 's'}, + LXC_COMMON_OPTIONS +}; + +static struct lxc_arguments my_args = { + .progname = "lxc-wait", + .help = "\ +--name=NAME --state=STATE\n\ +\n\ +lxc-wait waits for NAME container state to reach STATE\n\ +\n\ +Options :\n\ + -n, --name=NAME NAME for name of the container\n\ + -s, --state=STATE ORed states to wait for\n\ + STOPPED, STARTING, RUNNING, STOPPING,\n\ + ABORTING, FREEZING, FROZEN\n", + .options = my_longopts, + .parser = my_parser, + .checker = my_checker, +}; + static int fillwaitedstates(char *strstates, int *states) { char *token, *saveptr = NULL; @@ -51,8 +79,10 @@ static int fillwaitedstates(char *strstates, int *states) while (token) { state = lxc_str2state(token); - if (state < 0) + if (state < 0) { + ERROR("invalid state %s", token); return -1; + } states[state] = 1; token = strtok_r(NULL, "|", &saveptr); @@ -63,43 +93,22 @@ static int fillwaitedstates(char *strstates, int *states) int main(int argc, char *argv[]) { - char *name = NULL, *states = NULL; - const char *log_file = NULL, *log_priority = NULL; struct lxc_msg msg; - int s[MAX_STATE] = { }, fd, opt; - int quiet = 0; + int s[MAX_STATE] = { }, fd; + int ret; - while ((opt = getopt(argc, argv, "s:n:o:l:")) != -1) { - switch (opt) { - case 'n': - name = optarg; - break; - case 's': - states = optarg; - break; - case 'o': - log_file = optarg; - break; - case 'l': - log_priority = optarg; - break; - case 'q': - quiet = 1; - break; - } - } + ret = lxc_arguments_parse(&my_args, argc, argv); + if (ret) + return 1; - if (!name || !states) - usage(argv[0]); - - if (lxc_log_init(log_file, log_priority, basename(argv[0]), quiet)) + if (lxc_log_init(my_args.log_file, my_args.log_priority, + my_args.progname, my_args.quiet)) return -1; - if (fillwaitedstates(states, s)) { - usage(argv[0]); - } + ret = fillwaitedstates(my_args.states, s); + if (ret) + return 1; - fd = lxc_monitor_open(); if (fd < 0) return -1; @@ -108,7 +117,7 @@ int main(int argc, char *argv[]) if (lxc_monitor_read(fd, &msg) < 0) return -1; - if (strcmp(name, msg.name)) + if (strcmp(my_args.name, msg.name)) continue; switch (msg.type) {