mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-06 07:11:51 +00:00
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:
parent
4237c6ca1f
commit
41cfbac9dd
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user