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;
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;

View File

@ -26,73 +26,74 @@
#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;
}
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;

View File

@ -39,61 +39,52 @@
#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;
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;

View File

@ -27,21 +27,49 @@
#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) {