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 <normand@fr.ibm.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
Michel Normand 2009-05-18 22:11:46 +02:00 committed by Daniel Lezcano
parent 4237c6ca1f
commit 41cfbac9dd
4 changed files with 142 additions and 132 deletions

View File

@ -44,6 +44,15 @@ struct lxc_arguments {
int quiet; int quiet;
const char *rcfile; const char *rcfile;
/* for lxc-checkpoint */
int stop;
/* for lxc-console */
int ttynum;
/* for lxc-wait */
char *states;
/* remaining arguments */ /* remaining arguments */
char *const *argv; char *const *argv;
int argc; int argc;

View File

@ -26,73 +26,74 @@
#include <sys/types.h> #include <sys/types.h>
#include <lxc.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)); if (!args->argc) {
fprintf(stderr, "\t -n <name> : name of the container\n"); lxc_error(args, "missing STATEFILE filename !");
fprintf(stderr, "\t[-o <logfile>] : path of the log file\n"); return -1;
fprintf(stderr, "\t[-l <logpriority>]: log level priority\n"); }
fprintf(stderr, "\t[-q ] : be quiet\n"); return 0;
_exit(1);
} }
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 main(int argc, char *argv[])
{ {
int opt; int ret;
char *name = NULL;
const char *log_file = NULL, *log_priority = NULL;
int stop = 0;
int nbargs = 0;
int ret = 1;
int quiet = 0;
while ((opt = getopt(argc, argv, "sn:o:l:")) != -1) { ret = lxc_arguments_parse(&my_args, argc, argv);
switch (opt) { if (ret)
case 'n': return 1;
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;
}
nbargs++; if (lxc_log_init(my_args.log_file, my_args.log_priority,
} my_args.progname, my_args.quiet))
if (!name)
usage(argv[0]);
if (!argv[1])
usage(argv[0]);
if (lxc_log_init(log_file, log_priority, basename(argv[0]), quiet))
return -1; return -1;
if (lxc_freeze(name)) if (lxc_freeze(my_args.name))
return -1; return -1;
if (lxc_checkpoint(name, argv[1], 0)) if (lxc_checkpoint(my_args.name, my_args.argv[0], 0))
goto out; goto out;
if (stop) { if (my_args.stop) {
if (lxc_stop(name)) if (lxc_stop(my_args.name))
goto out; goto out;
} }
ret = 0; ret = 0;
out: out:
if (lxc_unfreeze(name)) if (lxc_unfreeze(my_args.name))
return 1; return 1;
return ret; return ret;

View File

@ -39,61 +39,52 @@
#include "error.h" #include "error.h"
#include "lxc.h" #include "lxc.h"
#include <lxc/log.h> #include "arguments.h"
lxc_log_define(lxc_console, lxc); 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)); switch (c) {
fprintf(stderr, "\t -n <name> : name of the container\n"); case 't': args->ttynum = atoi(arg); break;
fprintf(stderr, "\t [-t <tty#>] : tty number\n"); }
fprintf(stderr, "\t[-o <logfile>] : path of the log file\n"); return 0;
fprintf(stderr, "\t[-l <logpriority>]: log level priority\n");
fprintf(stderr, "\t[-q ] : be quiet\n");
_exit(1);
} }
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[]) 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 master = -1;
int ttynum = -1;
int wait4q = 0; int wait4q = 0;
int err = LXC_ERROR_INTERNAL; int err;
struct termios tios, oldtios; struct termios tios, oldtios;
while ((opt = getopt(argc, argv, "t:n:o:l:")) != -1) { err = lxc_arguments_parse(&my_args, argc, argv);
switch (opt) { if (err)
case 'n': return 1;
name = optarg;
break;
case 't': if (lxc_log_init(my_args.log_file, my_args.log_priority,
ttynum = atoi(optarg); my_args.progname, my_args.quiet))
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))
return 1; return 1;
/* Get current termios */ /* Get current termios */
@ -120,7 +111,7 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
err = lxc_console(name, ttynum, &master); err = lxc_console(my_args.name, my_args.ttynum, &master);
if (err) if (err)
goto out; goto out;

View File

@ -27,21 +27,49 @@
#include <sys/types.h> #include <sys/types.h>
#include <lxc/lxc.h> #include <lxc/lxc.h>
#include "arguments.h"
lxc_log_define(lxc_wait, lxc); 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)); if (!args->states) {
fprintf(stderr, "\t -n <name> : name of the container\n"); lxc_error(args, "missing state option to wait for.");
fprintf(stderr, "\t -s <states> : ORed states to wait for STOPPED, " \ return -1;
"STARTING, RUNNING, STOPPING, ABORTING, FREEZING, FROZEN\n"); }
fprintf(stderr, "\t[-o <logfile>] : path of the log file\n"); return 0;
fprintf(stderr, "\t[-l <logpriority>]: log level priority\n");
fprintf(stderr, "\t[-q ] : be quiet\n");
_exit(1);
} }
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) static int fillwaitedstates(char *strstates, int *states)
{ {
char *token, *saveptr = NULL; char *token, *saveptr = NULL;
@ -51,8 +79,10 @@ static int fillwaitedstates(char *strstates, int *states)
while (token) { while (token) {
state = lxc_str2state(token); state = lxc_str2state(token);
if (state < 0) if (state < 0) {
ERROR("invalid state %s", token);
return -1; return -1;
}
states[state] = 1; states[state] = 1;
token = strtok_r(NULL, "|", &saveptr); token = strtok_r(NULL, "|", &saveptr);
@ -63,42 +93,21 @@ static int fillwaitedstates(char *strstates, int *states)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char *name = NULL, *states = NULL;
const char *log_file = NULL, *log_priority = NULL;
struct lxc_msg msg; struct lxc_msg msg;
int s[MAX_STATE] = { }, fd, opt; int s[MAX_STATE] = { }, fd;
int quiet = 0; int ret;
while ((opt = getopt(argc, argv, "s:n:o:l:")) != -1) { ret = lxc_arguments_parse(&my_args, argc, argv);
switch (opt) { if (ret)
case 'n': return 1;
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;
}
}
if (!name || !states) if (lxc_log_init(my_args.log_file, my_args.log_priority,
usage(argv[0]); my_args.progname, my_args.quiet))
if (lxc_log_init(log_file, log_priority, basename(argv[0]), quiet))
return -1; return -1;
if (fillwaitedstates(states, s)) { ret = fillwaitedstates(my_args.states, s);
usage(argv[0]); if (ret)
} return 1;
fd = lxc_monitor_open(); fd = lxc_monitor_open();
if (fd < 0) if (fd < 0)
@ -108,7 +117,7 @@ int main(int argc, char *argv[])
if (lxc_monitor_read(fd, &msg) < 0) if (lxc_monitor_read(fd, &msg) < 0)
return -1; return -1;
if (strcmp(name, msg.name)) if (strcmp(my_args.name, msg.name))
continue; continue;
switch (msg.type) { switch (msg.type) {