]> git.proxmox.com Git - mirror_lxc.git/commitdiff
add long options step4
authorMichel Normand <normand@fr.ibm.com>
Mon, 18 May 2009 20:11:46 +0000 (22:11 +0200)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Mon, 18 May 2009 20:11:46 +0000 (22:11 +0200)
add the long options to the remaining lxc_*.c files
that need changes in struct lxc_arguments.

Signed-off-by: Michel Normand <normand@fr.ibm.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/arguments.h
src/lxc/lxc_checkpoint.c
src/lxc/lxc_console.c
src/lxc/lxc_wait.c

index 262355fa146010b5eb73b81d2ca81533ef9762c1..e406215c5b057c2768ddb110249c8c88e5de0710 100644 (file)
@@ -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;
index e8d7d606d8a34ee7f43cb1cc0e6663ca3a32cef0..e0be048ddfb5fda9aec620da3e128f863c2507c1 100644 (file)
 #include <sys/types.h>
 
 #include <lxc.h>
+#include "arguments.h"
 
-void usage(char *cmd)
+static int my_checker(const struct lxc_arguments* args)
 {
-       fprintf(stderr, "%s <statefile>\n", basename(cmd));
-       fprintf(stderr, "\t -n <name>   : name of the container\n");
-       fprintf(stderr, "\t[-o <logfile>]    : path of the log file\n");
-       fprintf(stderr, "\t[-l <logpriority>]: 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;
 }
 
-int main(int argc, char *argv[])
+static int my_parser(struct lxc_arguments* args, int c, char* arg)
 {
-       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;
+       switch (c) {
+       case 's': args->stop = 1; break;
+       }
+       return 0;
+}
 
-       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;
-               }
+static const struct option my_longopts[] = {
+       {"stop", no_argument, 0, 's'},
+       LXC_COMMON_OPTIONS
+};
 
-               nbargs++;
-       }
+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,
 
-       if (!name)
-               usage(argv[0]);
+       .rcfile   = NULL,
+};
 
-       if (!argv[1])
-               usage(argv[0]);
+int main(int argc, char *argv[])
+{
+       int ret;
+
+       ret = lxc_arguments_parse(&my_args, argc, argv);
+       if (ret)
+               return 1;
 
-       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;
index 8d2541b0256f0dde1906e880809b273cb094e69a..21e1d96871cdf80e843bec1057e2c3d0a191f33c 100644 (file)
 
 #include "error.h"
 #include "lxc.h"
-#include <lxc/log.h>
+#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 <command>\n", basename(cmd));
-       fprintf(stderr, "\t -n <name>   : name of the container\n");
-       fprintf(stderr, "\t [-t <tty#>] : tty number\n");
-       fprintf(stderr, "\t[-o <logfile>]    : path of the log file\n");
-       fprintf(stderr, "\t[-l <logpriority>]: 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;
-
-               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]);
+       err = lxc_arguments_parse(&my_args, argc, argv);
+       if (err)
+               return 1;
 
-       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;
 
index 0b723e8854153e557e4f47194af03acc870cff7e..6581dc263f3e60808502462f226b4fb90e68f0a6 100644 (file)
 #include <sys/types.h>
 
 #include <lxc/lxc.h>
+#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 <command>\n", basename(cmd));
-       fprintf(stderr, "\t -n <name>   : name of the container\n");
-       fprintf(stderr, "\t -s <states> : ORed states to wait for STOPPED, " \
-               "STARTING, RUNNING, STOPPING, ABORTING, FREEZING, FROZEN\n");
-       fprintf(stderr, "\t[-o <logfile>]    : path of the log file\n");
-       fprintf(stderr, "\t[-l <logpriority>]: 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) {