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;
#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;
#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 */
return 1;
}
- err = lxc_console(name, ttynum, &master);
+ err = lxc_console(my_args.name, my_args.ttynum, &master);
if (err)
goto out;
#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;
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);
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;
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) {