mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 08:16:20 +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;
|
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user