[lxc-devel] [lxc/master] tools: add default log priority & cleanups
2xsec on Github
lxc-bot at linuxcontainers.org
Fri Aug 17 16:44:56 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 380 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180817/e2233ddd/attachment.bin>
-------------- next part --------------
From 81b4606580f1269a9fbe0abbb848da99126bf555 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:30:52 +0900
Subject: [PATCH 01/12] tools: lxc-attach: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_attach.c | 220 +++++++++++++++++++------------------
1 file changed, 113 insertions(+), 107 deletions(-)
diff --git a/src/lxc/tools/lxc_attach.c b/src/lxc/tools/lxc_attach.c
index d33d9c440..e98f0a056 100644
--- a/src/lxc/tools/lxc_attach.c
+++ b/src/lxc/tools/lxc_attach.c
@@ -45,6 +45,21 @@
lxc_log_define(lxc_attach, lxc);
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static int add_to_simple_array(char ***array, ssize_t *capacity, char *value);
+static bool stdfd_is_pty(void);
+static int lxc_attach_create_log_file(const char *log_file);
+
+static int elevated_privileges;
+static signed long new_personality = -1;
+static int namespace_flags = -1;
+static int remount_sys_proc;
+static lxc_attach_env_policy_t env_policy = LXC_ATTACH_KEEP_ENV;
+static char **extra_env;
+static ssize_t extra_env_size;
+static char **extra_keep;
+static ssize_t extra_keep_size;
+
static const struct option my_longopts[] = {
{"elevated-privileges", optional_argument, 0, 'e'},
{"arch", required_argument, 0, 'a'},
@@ -60,43 +75,60 @@ static const struct option my_longopts[] = {
LXC_COMMON_OPTIONS
};
-static int elevated_privileges = 0;
-static signed long new_personality = -1;
-static int namespace_flags = -1;
-static int remount_sys_proc = 0;
-static lxc_attach_env_policy_t env_policy = LXC_ATTACH_KEEP_ENV;
-static char **extra_env = NULL;
-static ssize_t extra_env_size = 0;
-static char **extra_keep = NULL;
-static ssize_t extra_keep_size = 0;
-
-static int add_to_simple_array(char ***array, ssize_t *capacity, char *value)
-{
- ssize_t count = 0;
-
- if (!array)
- return -1;
-
- if (*array)
- for (; (*array)[count]; count++);
-
- /* we have to reallocate */
- if (count >= *capacity - 1) {
- ssize_t new_capacity = ((count + 1) / 32 + 1) * 32;
- char **new_array = realloc((void*)*array, sizeof(char *) * new_capacity);
- if (!new_array)
- return -1;
- memset(&new_array[count], 0, sizeof(char*)*(new_capacity - count));
- *array = new_array;
- *capacity = new_capacity;
- }
-
- if (!(*array))
- return -1;
-
- (*array)[count] = value;
- return 0;
-}
+static struct lxc_arguments my_args = {
+ .progname = "lxc-attach",
+ .help = "\
+--name=NAME [-- COMMAND]\n\
+\n\
+Execute the specified COMMAND - enter the container NAME\n\
+\n\
+Options :\n\
+ -n, --name=NAME NAME of the container\n\
+ -e, --elevated-privileges=PRIVILEGES\n\
+ Use elevated privileges instead of those of the\n\
+ container. If you don't specify privileges to be\n\
+ elevated as OR'd list: CAP, CGROUP and LSM (capabilities,\n\
+ cgroup and restrictions, respectively) then all of them\n\
+ will be elevated.\n\
+ WARNING: This may leak privileges into the container.\n\
+ Use with care.\n\
+ -a, --arch=ARCH Use ARCH for program instead of container's own\n\
+ architecture.\n\
+ -s, --namespaces=FLAGS\n\
+ Don't attach to all the namespaces of the container\n\
+ but just to the following OR'd list of flags:\n\
+ MOUNT, PID, UTSNAME, IPC, USER or NETWORK.\n\
+ WARNING: Using -s implies -e with all privileges\n\
+ elevated, it may therefore leak privileges into the\n\
+ container. Use with care.\n\
+ -R, --remount-sys-proc\n\
+ Remount /sys and /proc if not attaching to the\n\
+ mount namespace when using -s in order to properly\n\
+ reflect the correct namespace context. See the\n\
+ lxc-attach(1) manual page for details.\n\
+ --clear-env Clear all environment variables before attaching.\n\
+ The attached shell/program will start with only\n\
+ container=lxc set.\n\
+ --keep-env Keep all current environment variables. This\n\
+ is the current default behaviour, but is likely to\n\
+ change in the future.\n\
+ -L, --pty-log=FILE\n\
+ Log pty output to FILE\n\
+ -v, --set-var Set an additional variable that is seen by the\n\
+ attached program in the container. May be specified\n\
+ multiple times.\n\
+ --keep-var Keep an additional environment variable. Only\n\
+ applicable if --clear-env is specified. May be used\n\
+ multiple times.\n\
+ -f, --rcfile=FILE\n\
+ Load configuration file FILE\n\
+",
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
+};
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
@@ -160,65 +192,45 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
return 0;
}
-static struct lxc_arguments my_args = {
- .progname = "lxc-attach",
- .help = "\
---name=NAME [-- COMMAND]\n\
-\n\
-Execute the specified COMMAND - enter the container NAME\n\
-\n\
-Options :\n\
- -n, --name=NAME NAME of the container\n\
- -e, --elevated-privileges=PRIVILEGES\n\
- Use elevated privileges instead of those of the\n\
- container. If you don't specify privileges to be\n\
- elevated as OR'd list: CAP, CGROUP and LSM (capabilities,\n\
- cgroup and restrictions, respectively) then all of them\n\
- will be elevated.\n\
- WARNING: This may leak privileges into the container.\n\
- Use with care.\n\
- -a, --arch=ARCH Use ARCH for program instead of container's own\n\
- architecture.\n\
- -s, --namespaces=FLAGS\n\
- Don't attach to all the namespaces of the container\n\
- but just to the following OR'd list of flags:\n\
- MOUNT, PID, UTSNAME, IPC, USER or NETWORK.\n\
- WARNING: Using -s implies -e with all privileges\n\
- elevated, it may therefore leak privileges into the\n\
- container. Use with care.\n\
- -R, --remount-sys-proc\n\
- Remount /sys and /proc if not attaching to the\n\
- mount namespace when using -s in order to properly\n\
- reflect the correct namespace context. See the\n\
- lxc-attach(1) manual page for details.\n\
- --clear-env Clear all environment variables before attaching.\n\
- The attached shell/program will start with only\n\
- container=lxc set.\n\
- --keep-env Keep all current environment variables. This\n\
- is the current default behaviour, but is likely to\n\
- change in the future.\n\
- -L, --pty-log=FILE\n\
- Log pty output to FILE\n\
- -v, --set-var Set an additional variable that is seen by the\n\
- attached program in the container. May be specified\n\
- multiple times.\n\
- --keep-var Keep an additional environment variable. Only\n\
- applicable if --clear-env is specified. May be used\n\
- multiple times.\n\
- -f, --rcfile=FILE\n\
- Load configuration file FILE\n\
-",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
-};
+static int add_to_simple_array(char ***array, ssize_t *capacity, char *value)
+{
+ ssize_t count = 0;
+
+ if (!array)
+ return -1;
+
+ if (*array)
+ for (; (*array)[count]; count++);
+
+ /* we have to reallocate */
+ if (count >= *capacity - 1) {
+ ssize_t new_capacity = ((count + 1) / 32 + 1) * 32;
+
+ char **new_array = realloc((void*)*array, sizeof(char *) * new_capacity);
+ if (!new_array)
+ return -1;
+
+ memset(&new_array[count], 0, sizeof(char*)*(new_capacity - count));
+
+ *array = new_array;
+ *capacity = new_capacity;
+ }
+
+ if (!(*array))
+ return -1;
+
+ (*array)[count] = value;
+ return 0;
+}
static bool stdfd_is_pty(void)
{
if (isatty(STDIN_FILENO))
return true;
+
if (isatty(STDOUT_FILENO))
return true;
+
if (isatty(STDERR_FILENO))
return true;
@@ -240,40 +252,34 @@ static int lxc_attach_create_log_file(const char *log_file)
int main(int argc, char *argv[])
{
- int ret = -1, r;
+ int ret = -1;
int wexit = 0;
struct lxc_log log;
pid_t pid;
lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
lxc_attach_command_t command = (lxc_attach_command_t){.program = NULL};
- r = lxc_caps_init();
- if (r)
+ if (lxc_caps_init())
exit(EXIT_FAILURE);
- r = lxc_arguments_parse(&my_args, argc, argv);
- if (r)
+ if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
- if (geteuid()) {
+ if (geteuid())
if (access(my_args.lxcpath[0], O_RDONLY) < 0) {
ERROR("You lack access to %s", my_args.lxcpath[0]);
exit(EXIT_FAILURE);
}
- }
struct lxc_container *c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c)
From 62ebeb04effdb2a76a89dcd00beed7442db29579 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:31:54 +0900
Subject: [PATCH 02/12] tools: lxc-cgroup: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_cgroup.c | 52 ++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/src/lxc/tools/lxc_cgroup.c b/src/lxc/tools/lxc_cgroup.c
index 06706c84e..069da365f 100644
--- a/src/lxc/tools/lxc_cgroup.c
+++ b/src/lxc/tools/lxc_cgroup.c
@@ -36,23 +36,15 @@
lxc_log_define(lxc_cgroup, lxc);
-static int my_checker(const struct lxc_arguments* args)
-{
- if (!args->argc) {
- ERROR("Missing state object");
- return -1;
- }
-
- return 0;
-}
+static int my_checker(const struct lxc_arguments *args);
static const struct option my_longopts[] = {
LXC_COMMON_OPTIONS
};
static struct lxc_arguments my_args = {
- .progname = "lxc-cgroup",
- .help = "\
+ .progname = "lxc-cgroup",
+ .help = "\
--name=NAME state-object [value]\n\
\n\
Get or set the value of a state object (for example, 'cpuset.cpus')\n\
@@ -61,11 +53,23 @@ in the container's cgroup for the corresponding subsystem.\n\
Options :\n\
-n, --name=NAME NAME of the container\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = NULL,
- .checker = my_checker,
+ .options = my_longopts,
+ .parser = NULL,
+ .checker = my_checker,
+ .log_priority = "ERROR",
+ .log_file = "none",
};
+static int my_checker(const struct lxc_arguments *args)
+{
+ if (!args->argc) {
+ ERROR("Missing state object");
+ return -1;
+ }
+
+ return 0;
+}
+
int main(int argc, char *argv[])
{
char *state_object = NULL, *value = NULL;
@@ -75,18 +79,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
state_object = my_args.argv[0];
@@ -143,6 +144,7 @@ int main(int argc, char *argv[])
lxc_container_put(c);
exit(EXIT_FAILURE);
}
+
INFO("%*s", ret, buffer);
}
From c03b298128fbab4c5d0a6c27b21c3a35318fe74a Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:33:37 +0900
Subject: [PATCH 03/12] tools: lxc-checkpoint: add default log priority &
cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_checkpoint.c | 159 +++++++++++++++++----------------
1 file changed, 82 insertions(+), 77 deletions(-)
diff --git a/src/lxc/tools/lxc_checkpoint.c b/src/lxc/tools/lxc_checkpoint.c
index 5bdc523c9..de6cc9453 100644
--- a/src/lxc/tools/lxc_checkpoint.c
+++ b/src/lxc/tools/lxc_checkpoint.c
@@ -30,16 +30,24 @@
#include "log.h"
#include "utils.h"
-static char *checkpoint_dir = NULL;
-static bool stop = false;
-static bool verbose = false;
-static bool do_restore = false;
-static bool daemonize_set = false;
-static bool pre_dump = false;
-static char *predump_dir = NULL;
-static char *actionscript_path = NULL;
+#define OPT_PREDUMP_DIR (OPT_USAGE + 1)
-#define OPT_PREDUMP_DIR OPT_USAGE + 1
+lxc_log_define(lxc_checkpoint, lxc);
+
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static int my_checker(const struct lxc_arguments *args);
+static bool checkpoint(struct lxc_container *c);
+static bool restore_finalize(struct lxc_container *c);
+static bool restore(struct lxc_container *c);
+
+static char *checkpoint_dir;
+static bool stop;
+static bool verbose;
+static bool do_restore;
+static bool daemonize_set;
+static bool pre_dump;
+static char *predump_dir;
+static char *actionscript_path;
static const struct option my_longopts[] = {
{"checkpoint-dir", required_argument, 0, 'D'},
@@ -54,31 +62,39 @@ static const struct option my_longopts[] = {
LXC_COMMON_OPTIONS
};
-lxc_log_define(lxc_checkpoint, lxc);
-
-static int my_checker(const struct lxc_arguments *args)
-{
- if (do_restore && stop) {
- ERROR("-s not compatible with -r");
- return -1;
-
- } else if (!do_restore && daemonize_set) {
- ERROR("-d/-F not compatible with -r");
- return -1;
- }
-
- if (!checkpoint_dir) {
- ERROR("-D is required");
- return -1;
- }
-
- if (pre_dump && do_restore) {
- ERROR("-p not compatible with -r");
- return -1;
- }
-
- return 0;
-}
+static struct lxc_arguments my_args = {
+ .progname = "lxc-checkpoint",
+ .help = "\
+--name=NAME\n\
+\n\
+lxc-checkpoint checkpoints and restores a container\n\
+ Serializes a container's running state to disk to allow restoring it in\n\
+ its running state at a later time.\n\
+\n\
+Options :\n\
+ -n, --name=NAME NAME of the container\n\
+ -r, --restore Restore container\n\
+ -D, --checkpoint-dir=DIR directory to save the checkpoint in\n\
+ -v, --verbose Enable verbose criu logs\n\
+ -A, --action-script=PATH Path to criu action script\n\
+ Checkpoint options:\n\
+ -s, --stop Stop the container after checkpointing.\n\
+ -p, --pre-dump Only pre-dump the memory of the container.\n\
+ Container keeps on running and following\n\
+ checkpoints will only dump the changes.\n\
+ --predump-dir=DIR path to images from previous dump (relative to -D)\n\
+ Restore options:\n\
+ -d, --daemon Daemonize the container (default)\n\
+ -F, --foreground Start with the current tty attached to /dev/console\n\
+ --rcfile=FILE Load configuration file FILE\n\
+",
+ .options = my_longopts,
+ .parser = my_parser,
+ .daemonize = 1,
+ .checker = my_checker,
+ .log_priority = "ERROR",
+ .log_file = "none",
+};
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
@@ -88,7 +104,7 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
if (!checkpoint_dir)
return -1;
break;
- case 'A':
+ case 'A':
actionscript_path = strdup(arg);
if (!actionscript_path)
return -1;
@@ -123,37 +139,29 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
return 0;
}
-static struct lxc_arguments my_args = {
- .progname = "lxc-checkpoint",
- .help = "\
---name=NAME\n\
-\n\
-lxc-checkpoint checkpoints and restores a container\n\
- Serializes a container's running state to disk to allow restoring it in\n\
- its running state at a later time.\n\
-\n\
-Options :\n\
- -n, --name=NAME NAME of the container\n\
- -r, --restore Restore container\n\
- -D, --checkpoint-dir=DIR directory to save the checkpoint in\n\
- -v, --verbose Enable verbose criu logs\n\
- -A, --action-script=PATH Path to criu action script\n\
- Checkpoint options:\n\
- -s, --stop Stop the container after checkpointing.\n\
- -p, --pre-dump Only pre-dump the memory of the container.\n\
- Container keeps on running and following\n\
- checkpoints will only dump the changes.\n\
- --predump-dir=DIR path to images from previous dump (relative to -D)\n\
- Restore options:\n\
- -d, --daemon Daemonize the container (default)\n\
- -F, --foreground Start with the current tty attached to /dev/console\n\
- --rcfile=FILE Load configuration file FILE\n\
-",
- .options = my_longopts,
- .parser = my_parser,
- .daemonize = 1,
- .checker = my_checker,
-};
+static int my_checker(const struct lxc_arguments *args)
+{
+ if (do_restore && stop) {
+ ERROR("-s not compatible with -r");
+ return -1;
+
+ } else if (!do_restore && daemonize_set) {
+ ERROR("-d/-F not compatible with -r");
+ return -1;
+ }
+
+ if (!checkpoint_dir) {
+ ERROR("-D is required");
+ return -1;
+ }
+
+ if (pre_dump && do_restore) {
+ ERROR("-p not compatible with -r");
+ return -1;
+ }
+
+ return 0;
+}
static bool checkpoint(struct lxc_container *c)
{
@@ -262,18 +270,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
From a291ab7859914980ef9dbd586f8aa0106a8d1b50 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:34:28 +0900
Subject: [PATCH 04/12] tools: lxc-console: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_console.c | 85 +++++++++++++++++++------------------
1 file changed, 43 insertions(+), 42 deletions(-)
diff --git a/src/lxc/tools/lxc_console.c b/src/lxc/tools/lxc_console.c
index 11cddd5fe..c1f99069d 100644
--- a/src/lxc/tools/lxc_console.c
+++ b/src/lxc/tools/lxc_console.c
@@ -44,28 +44,8 @@
lxc_log_define(lxc_console, lxc);
-static char etoc(const char *expr)
-{
- /* returns "control code" of given expression */
- char c = expr[0] == '^' ? expr[1] : expr[0];
-
- return 1 + ((c > 'Z') ? (c - 'a') : (c - 'Z'));
-}
-
-static int my_parser(struct lxc_arguments *args, int c, char *arg)
-{
- switch (c) {
- case 't':
- if (lxc_safe_uint(arg, &args->ttynum) < 0)
- return -1;
- break;
- case 'e':
- args->escape = etoc(arg);
- break;
- }
-
- return 0;
-}
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static char etoc(const char *expr);
static const struct option my_longopts[] = {
{"tty", required_argument, 0, 't'},
@@ -74,8 +54,8 @@ static const struct option my_longopts[] = {
};
static struct lxc_arguments my_args = {
- .progname = "lxc-console",
- .help = "\
+ .progname = "lxc-console",
+ .help = "\
--name=NAME [--tty NUMBER]\n\
\n\
lxc-console logs on the container with the identifier NAME\n\
@@ -85,35 +65,56 @@ Options :\n\
-t, --tty=NUMBER console tty number\n\
-e, --escape=PREFIX prefix for escape command\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
- .ttynum = -1,
- .escape = 1,
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
+ .ttynum = -1,
+ .escape = 1,
};
+static int my_parser(struct lxc_arguments *args, int c, char *arg)
+{
+ switch (c) {
+ case 't':
+ if (lxc_safe_uint(arg, &args->ttynum) < 0)
+ return -1;
+ break;
+ case 'e':
+ args->escape = etoc(arg);
+ break;
+ }
+
+ return 0;
+}
+
+static char etoc(const char *expr)
+{
+ /* returns "control code" of given expression */
+ char c = expr[0] == '^' ? expr[1] : expr[0];
+
+ return 1 + ((c > 'Z') ? (c - 'a') : (c - 'Z'));
+}
+
int main(int argc, char *argv[])
{
int ret;
struct lxc_container *c;
struct lxc_log log;
- ret = lxc_arguments_parse(&my_args, argc, argv);
- if (ret)
+ if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
From 0e9dc035ddc43f247c2688d72c1ba9e66f2b50de Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:35:57 +0900
Subject: [PATCH 05/12] tools: lxc-create: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_create.c | 277 +++++++++++++++++++------------------
1 file changed, 140 insertions(+), 137 deletions(-)
diff --git a/src/lxc/tools/lxc_create.c b/src/lxc/tools/lxc_create.c
index f704d1740..8423ff30d 100644
--- a/src/lxc/tools/lxc_create.c
+++ b/src/lxc/tools/lxc_create.c
@@ -31,64 +31,15 @@
#include "arguments.h"
#include "log.h"
+#include "storage_utils.h"
#include "utils.h"
lxc_log_define(lxc_create, lxc);
-static uint64_t get_fssize(char *s)
-{
- uint64_t ret;
- char *end;
-
- ret = strtoull(s, &end, 0);
- if (end == s)
- {
- ERROR("Invalid blockdev size '%s', using default size", s);
- return 0;
- }
-
- while (isblank(*end))
- end++;
-
- if (*end == '\0')
- ret *= 1024ULL * 1024ULL; /* MB by default */
- else if (*end == 'b' || *end == 'B')
- ret *= 1ULL;
- else if (*end == 'k' || *end == 'K')
- ret *= 1024ULL;
- else if (*end == 'm' || *end == 'M')
- ret *= 1024ULL * 1024ULL;
- else if (*end == 'g' || *end == 'G')
- ret *= 1024ULL * 1024ULL * 1024ULL;
- else if (*end == 't' || *end == 'T')
- ret *= 1024ULL * 1024ULL * 1024ULL * 1024ULL;
- else
- {
- ERROR("Invalid blockdev unit size '%c' in '%s', using default size", *end, s);
- return 0;
- }
-
- return ret;
-}
-
-static int my_parser(struct lxc_arguments *args, int c, char *arg)
-{
- switch (c) {
- case 'B': args->bdevtype = arg; break;
- case 'f': args->configfile = arg; break;
- case 't': args->template = arg; break;
- case '0': args->lvname = arg; break;
- case '1': args->vgname = arg; break;
- case '2': args->thinpool = arg; break;
- case '3': args->fstype = arg; break;
- case '4': args->fssize = get_fssize(arg); break;
- case '5': args->zfsroot = arg; break;
- case '6': args->dir = arg; break;
- case '7': args->rbdname = arg; break;
- case '8': args->rbdpool = arg; break;
- }
- return 0;
-}
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static uint64_t get_fssize(char *s);
+static void create_helpfn(const struct lxc_arguments *args);
+static bool validate_bdev_args(struct lxc_arguments *args);
static const struct option my_longopts[] = {
{"bdev", required_argument, 0, 'B'},
@@ -106,35 +57,10 @@ static const struct option my_longopts[] = {
LXC_COMMON_OPTIONS
};
-static void create_helpfn(const struct lxc_arguments *args)
-{
- char *argv[3], *path;
- pid_t pid;
-
- if (!args->template)
- return;
-
- pid = fork();
- if (pid) {
- (void)wait_for_pid(pid);
- return;
- }
-
- path = get_template_path(args->template);
-
- argv[0] = path;
- argv[1] = "-h";
- argv[2] = NULL;
-
- execv(path, argv);
- ERROR("Error executing %s -h", path);
- _exit(EXIT_FAILURE);
-}
-
static struct lxc_arguments my_args = {
- .progname = "lxc-create",
- .helpfn = create_helpfn,
- .help = "\
+ .progname = "lxc-create",
+ .helpfn = create_helpfn,
+ .help = "\
--name=NAME --template=TEMPLATE [OPTION...]\n\
\n\
lxc-create creates a container\n\
@@ -170,64 +96,148 @@ Options :\n\
--fssize=SIZE[U] Create filesystem of\n\
size SIZE * unit U (bBkKmMgGtT)\n\
(Default: 1G, default unit: M)\n",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
};
-static bool validate_bdev_args(struct lxc_arguments *a)
+static int my_parser(struct lxc_arguments *args, int c, char *arg)
+{
+ switch (c) {
+ case 'B':
+ args->bdevtype = arg;
+ break;
+ case 'f':
+ args->configfile = arg;
+ break;
+ case 't':
+ args->template = arg;
+ break;
+ case '0':
+ args->lvname = arg;
+ break;
+ case '1':
+ args->vgname = arg;
+ break;
+ case '2':
+ args->thinpool = arg;
+ break;
+ case '3':
+ args->fstype = arg;
+ break;
+ case '4':
+ args->fssize = get_fssize(arg);
+ break;
+ case '5':
+ args->zfsroot = arg;
+ break;
+ case '6':
+ args->dir = arg;
+ break;
+ case '7':
+ args->rbdname = arg;
+ break;
+ case '8':
+ args->rbdpool = arg;
+ break;
+ }
+ return 0;
+}
+
+static uint64_t get_fssize(char *s)
+{
+ uint64_t ret;
+ char *end;
+
+ ret = strtoull(s, &end, 0);
+ if (end == s) {
+ ERROR("Invalid blockdev size '%s', using default size", s);
+ return 0;
+ }
+
+ while (isblank(*end))
+ end++;
+
+ if (*end == '\0') {
+ ret *= 1024ULL * 1024ULL; /* MB by default */
+ } else if (*end == 'b' || *end == 'B') {
+ ret *= 1ULL;
+ } else if (*end == 'k' || *end == 'K') {
+ ret *= 1024ULL;
+ } else if (*end == 'm' || *end == 'M') {
+ ret *= 1024ULL * 1024ULL;
+ } else if (*end == 'g' || *end == 'G') {
+ ret *= 1024ULL * 1024ULL * 1024ULL;
+ } else if (*end == 't' || *end == 'T') {
+ ret *= 1024ULL * 1024ULL * 1024ULL * 1024ULL;
+ } else {
+ ERROR("Invalid blockdev unit size '%c' in '%s', using default size", *end, s);
+ return 0;
+ }
+
+ return ret;
+}
+
+static void create_helpfn(const struct lxc_arguments *args)
+{
+ char *argv[3], *path;
+ pid_t pid;
+
+ if (!args->template)
+ return;
+
+ pid = fork();
+ if (pid) {
+ (void)wait_for_pid(pid);
+ return;
+ }
+
+ path = get_template_path(args->template);
+
+ argv[0] = path;
+ argv[1] = "-h";
+ argv[2] = NULL;
+
+ execv(path, argv);
+ ERROR("Error executing %s -h", path);
+ _exit(EXIT_FAILURE);
+}
+
+static bool validate_bdev_args(struct lxc_arguments *args)
{
- if (strncmp(a->bdevtype, "best", strlen(a->bdevtype)) != 0) {
- if (a->fstype || a->fssize) {
- if (strncmp(a->bdevtype, "lvm", strlen(a->bdevtype)) != 0 &&
- strncmp(a->bdevtype, "loop", strlen(a->bdevtype)) != 0 &&
- strncmp(a->bdevtype, "rbd", strlen(a->bdevtype)) != 0) {
+ if (strncmp(args->bdevtype, "best", strlen(args->bdevtype)) != 0) {
+ if (args->fstype || args->fssize)
+ if (strncmp(args->bdevtype, "lvm", strlen(args->bdevtype)) != 0 &&
+ strncmp(args->bdevtype, "loop", strlen(args->bdevtype)) != 0 &&
+ strncmp(args->bdevtype, "rbd", strlen(args->bdevtype)) != 0) {
ERROR("Filesystem type and size are only valid with block devices");
return false;
}
- }
- if (strncmp(a->bdevtype, "lvm", strlen(a->bdevtype)) != 0) {
- if (a->lvname || a->vgname || a->thinpool) {
+ if (strncmp(args->bdevtype, "lvm", strlen(args->bdevtype)) != 0)
+ if (args->lvname || args->vgname || args->thinpool) {
ERROR("--lvname, --vgname and --thinpool are only valid with -B lvm");
return false;
}
- }
- if (strncmp(a->bdevtype, "rbd", strlen(a->bdevtype)) != 0) {
- if (a->rbdname || a->rbdpool) {
+ if (strncmp(args->bdevtype, "rbd", strlen(args->bdevtype)) != 0)
+ if (args->rbdname || args->rbdpool) {
ERROR("--rbdname and --rbdpool are only valid with -B rbd");
return false;
}
- }
- if (strncmp(a->bdevtype, "zfs", strlen(a->bdevtype)) != 0) {
- if (a->zfsroot) {
+ if (strncmp(args->bdevtype, "zfs", strlen(args->bdevtype)) != 0)
+ if (args->zfsroot) {
ERROR("zfsroot is only valid with -B zfs");
return false;
}
- }
}
return true;
}
-static bool is_valid_storage_type(const char *type)
-{
- if (strcmp(type, "dir") == 0 ||
- strcmp(type, "btrfs") == 0 ||
- strcmp(type, "loop") == 0 ||
- strcmp(type, "lvm") == 0 ||
- strcmp(type, "nbd") == 0 ||
- strcmp(type, "overlay") == 0 ||
- strcmp(type, "overlayfs") == 0 ||
- strcmp(type, "rbd") == 0 ||
- strcmp(type, "zfs") == 0)
- return true;
-
- return false;
-}
-
int main(int argc, char *argv[])
{
struct lxc_container *c;
@@ -238,21 +248,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- if (!my_args.log_file)
- log.file = "none";
- else
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
-
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
+
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
if (!my_args.template) {
ERROR("A template must be specified");
@@ -318,13 +322,12 @@ int main(int argc, char *argv[])
spec.fssize = my_args.fssize;
if ((strncmp(my_args.bdevtype, "zfs", strlen(my_args.bdevtype)) == 0) ||
- (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0)) {
+ (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0))
if (my_args.zfsroot)
spec.zfs.zfsroot = my_args.zfsroot;
- }
if ((strncmp(my_args.bdevtype, "lvm", strlen(my_args.bdevtype)) == 0) ||
- (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0)) {
+ (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0)) {
if (my_args.lvname)
spec.lvm.lv = my_args.lvname;
@@ -336,7 +339,7 @@ int main(int argc, char *argv[])
}
if ((strncmp(my_args.bdevtype, "rbd", strlen(my_args.bdevtype)) == 0) ||
- (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0)) {
+ (strncmp(my_args.bdevtype, "best", strlen(my_args.bdevtype)) == 0)) {
if (my_args.rbdname)
spec.rbd.rbdname = my_args.rbdname;
@@ -354,7 +357,7 @@ int main(int argc, char *argv[])
flags = LXC_CREATE_QUIET;
if (!c->create(c, my_args.template, my_args.bdevtype, &spec, flags, &argv[optind])) {
- fprintf(stderr, "Error creating container %s\n", c->name);
+ ERROR("Failed to create container %s", c->name);
lxc_container_put(c);
exit(EXIT_FAILURE);
}
From a53759568ac01bd4c3f196f02f1ce0e8c8677f5b Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:36:58 +0900
Subject: [PATCH 06/12] tools: lxc-destroy: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_destroy.c | 180 ++++++++++++++++++------------------
1 file changed, 91 insertions(+), 89 deletions(-)
diff --git a/src/lxc/tools/lxc_destroy.c b/src/lxc/tools/lxc_destroy.c
index 90e53daa7..7e7809893 100644
--- a/src/lxc/tools/lxc_destroy.c
+++ b/src/lxc/tools/lxc_destroy.c
@@ -35,6 +35,8 @@
lxc_log_define(lxc_destroy, lxc);
static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static bool do_destroy(struct lxc_container *c);
+static bool do_destroy_with_snapshots(struct lxc_container *c);
static const struct option my_longopts[] = {
{"force", no_argument, 0, 'f'},
@@ -43,8 +45,8 @@ static const struct option my_longopts[] = {
};
static struct lxc_arguments my_args = {
- .progname = "lxc-destroy",
- .help = "\
+ .progname = "lxc-destroy",
+ .help = "\
--name=NAME [-f] [-P lxcpath]\n\
\n\
lxc-destroy destroys a container with the identifier NAME\n\
@@ -54,106 +56,35 @@ Options :\n\
-s, --snapshots destroy including all snapshots\n\
-f, --force wait for the container to shut down\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
- .task = DESTROY,
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
+ .task = DESTROY,
};
-static bool do_destroy(struct lxc_container *c);
-static bool do_destroy_with_snapshots(struct lxc_container *c);
-
-int main(int argc, char *argv[])
-{
- struct lxc_container *c;
- struct lxc_log log;
- bool bret;
-
- if (lxc_arguments_parse(&my_args, argc, argv))
- exit(EXIT_FAILURE);
-
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
-
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
-
- c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
- if (!c) {
- ERROR("System error loading container");
- exit(EXIT_FAILURE);
- }
-
- if (my_args.rcfile) {
- c->clear_config(c);
-
- if (!c->load_config(c, my_args.rcfile)) {
- ERROR("Failed to load rcfile");
- lxc_container_put(c);
- exit(EXIT_FAILURE);
- }
-
- c->configfile = strdup(my_args.rcfile);
- if (!c->configfile) {
- ERROR("Out of memory setting new config filename");
- lxc_container_put(c);
- exit(EXIT_FAILURE);
- }
- }
-
- if (!c->may_control(c)) {
- ERROR("Insufficent privileges to control %s", my_args.name);
- lxc_container_put(c);
- exit(EXIT_FAILURE);
- }
-
- if (!c->is_defined(c)) {
- ERROR("Container is not defined");
- lxc_container_put(c);
- exit(EXIT_FAILURE);
- }
-
- if (my_args.task == SNAP) {
- bret = do_destroy_with_snapshots(c);
- if (bret)
- ERROR("Destroyed container %s including snapshots", my_args.name);
- } else {
- bret = do_destroy(c);
- if (bret)
- ERROR("Destroyed container %s", my_args.name);
- }
-
- lxc_container_put(c);
-
- if (bret)
- exit(EXIT_SUCCESS);
-
- exit(EXIT_FAILURE);
-}
-
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
switch (c) {
- case 'f': args->force = 1; break;
- case 's': args->task = SNAP; break;
+ case 'f':
+ args->force = 1;
+ break;
+ case 's':
+ args->task = SNAP;
+ break;
}
return 0;
}
static bool do_destroy(struct lxc_container *c)
{
+ int ret;
bool bret = true;
char path[MAXPATHLEN];
/* First check whether the container has dependent clones or snapshots. */
- int ret = snprintf(path, MAXPATHLEN, "%s/%s/lxc_snapshots", c->config_path, c->name);
+ ret = snprintf(path, MAXPATHLEN, "%s/%s/lxc_snapshots", c->config_path, c->name);
if (ret < 0 || ret >= MAXPATHLEN)
return false;
@@ -187,9 +118,8 @@ static bool do_destroy(struct lxc_container *c)
char buf[256];
ret = c->get_config_item(c, "lxc.ephemeral", buf, 256);
- if (ret > 0 && strcmp(buf, "0") == 0) {
+ if (ret > 0 && strcmp(buf, "0") == 0)
bret = c->destroy(c);
- }
}
if (!bret) {
@@ -273,3 +203,75 @@ static bool do_destroy_with_snapshots(struct lxc_container *c)
return bret;
}
+
+int main(int argc, char *argv[])
+{
+ struct lxc_container *c;
+ struct lxc_log log;
+ bool bret;
+
+ if (lxc_arguments_parse(&my_args, argc, argv))
+ exit(EXIT_FAILURE);
+
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
+
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
+
+ c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
+ if (!c) {
+ ERROR("System error loading container");
+ exit(EXIT_FAILURE);
+ }
+
+ if (my_args.rcfile) {
+ c->clear_config(c);
+
+ if (!c->load_config(c, my_args.rcfile)) {
+ ERROR("Failed to load rcfile");
+ lxc_container_put(c);
+ exit(EXIT_FAILURE);
+ }
+
+ c->configfile = strdup(my_args.rcfile);
+ if (!c->configfile) {
+ ERROR("Out of memory setting new config filename");
+ lxc_container_put(c);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (!c->may_control(c)) {
+ ERROR("Insufficent privileges to control %s", my_args.name);
+ lxc_container_put(c);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!c->is_defined(c)) {
+ ERROR("Container is not defined");
+ lxc_container_put(c);
+ exit(EXIT_FAILURE);
+ }
+
+ if (my_args.task == SNAP) {
+ bret = do_destroy_with_snapshots(c);
+ if (bret)
+ ERROR("Destroyed container %s including snapshots", my_args.name);
+ } else {
+ bret = do_destroy(c);
+ if (bret)
+ ERROR("Destroyed container %s", my_args.name);
+ }
+
+ lxc_container_put(c);
+
+ if (bret)
+ exit(EXIT_SUCCESS);
+
+ exit(EXIT_FAILURE);
+}
From 9fe163874276f1035a0428d2be90b2456bf0e82e Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:38:13 +0900
Subject: [PATCH 07/12] tools: lxc-device: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_device.c | 74 ++++++++++++++++++--------------------
1 file changed, 35 insertions(+), 39 deletions(-)
diff --git a/src/lxc/tools/lxc_device.c b/src/lxc/tools/lxc_device.c
index 4ac0187eb..a854a2ea3 100644
--- a/src/lxc/tools/lxc_device.c
+++ b/src/lxc/tools/lxc_device.c
@@ -33,21 +33,23 @@
#include "log.h"
#include "utils.h"
-lxc_log_define(lxc_device, lxc);
-
#if HAVE_IFADDRS_H
#include <ifaddrs.h>
#else
#include "include/ifaddrs.h"
#endif
+lxc_log_define(lxc_device, lxc);
+
+static bool is_interface(const char *dev_name, pid_t pid);
+
static const struct option my_longopts[] = {
LXC_COMMON_OPTIONS
};
static struct lxc_arguments my_args = {
- .progname = "lxc-device",
- .help = "\
+ .progname = "lxc-device",
+ .help = "\
--name=NAME -- add|del DEV\n\
\n\
lxc-device attach or detach DEV to or from container.\n\
@@ -55,9 +57,11 @@ lxc-device attach or detach DEV to or from container.\n\
Options :\n\
-n, --name=NAME NAME of the container\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = NULL,
- .checker = NULL,
+ .options = my_longopts,
+ .parser = NULL,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
};
static bool is_interface(const char *dev_name, pid_t pid)
@@ -110,25 +114,22 @@ int main(int argc, char *argv[])
}
if (lxc_arguments_parse(&my_args, argc, argv))
- goto err;
+ exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
-
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
+
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
ERROR("%s doesn't exist", my_args.name);
- goto err;
+ exit(EXIT_FAILURE);
}
if (my_args.rcfile) {
@@ -136,65 +137,60 @@ int main(int argc, char *argv[])
if (!c->load_config(c, my_args.rcfile)) {
ERROR("Failed to load rcfile");
- goto err1;
+ goto err;
}
c->configfile = strdup(my_args.rcfile);
if (!c->configfile) {
ERROR("Out of memory setting new config filename");
- goto err1;
+ goto err;
}
}
if (!c->is_running(c)) {
ERROR("Container %s is not running", c->name);
- goto err1;
+ goto err;
}
if (my_args.argc < 2) {
ERROR("Error: no command given (Please see --help output)");
- goto err1;
+ goto err;
}
cmd = my_args.argv[0];
dev_name = my_args.argv[1];
+
if (my_args.argc < 3)
dst_name = dev_name;
else
dst_name = my_args.argv[2];
if (strncmp(cmd, "add", strlen(cmd)) == 0) {
- if (is_interface(dev_name, 1)) {
+ if (is_interface(dev_name, 1))
ret = c->attach_interface(c, dev_name, dst_name);
- } else {
+ else
ret = c->add_device_node(c, dev_name, dst_name);
- }
-
if (ret != true) {
ERROR("Failed to add %s to %s", dev_name, c->name);
- goto err1;
+ goto err;
}
} else if (strncmp(cmd, "del", strlen(cmd)) == 0) {
- if (is_interface(dev_name, c->init_pid(c))) {
+ if (is_interface(dev_name, c->init_pid(c)))
ret = c->detach_interface(c, dev_name, dst_name);
- } else {
+ else
ret = c->remove_device_node(c, dev_name, dst_name);
- }
-
if (ret != true) {
ERROR("Failed to del %s from %s", dev_name, c->name);
- goto err1;
+ goto err;
}
} else {
ERROR("Error: Please use add or del (Please see --help output)");
- goto err1;
+ goto err;
}
exit(EXIT_SUCCESS);
-err1:
- lxc_container_put(c);
-
err:
+ lxc_container_put(c);
exit(EXIT_FAILURE);
}
From e8c0bb81d3a292bc02cb8ccd7e71bdffb741e846 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:39:20 +0900
Subject: [PATCH 08/12] tools: lxc-execute: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_execute.c | 102 ++++++++++++++++++------------------
1 file changed, 51 insertions(+), 51 deletions(-)
diff --git a/src/lxc/tools/lxc_execute.c b/src/lxc/tools/lxc_execute.c
index 2f79b74a9..32911b7fc 100644
--- a/src/lxc/tools/lxc_execute.c
+++ b/src/lxc/tools/lxc_execute.c
@@ -43,8 +43,46 @@
lxc_log_define(lxc_execute, lxc);
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static bool set_argv(struct lxc_container *c, struct lxc_arguments *args);
+
static struct lxc_list defines;
+static const struct option my_longopts[] = {
+ {"daemon", no_argument, 0, 'd'},
+ {"rcfile", required_argument, 0, 'f'},
+ {"define", required_argument, 0, 's'},
+ {"uid", required_argument, 0, 'u'},
+ {"gid", required_argument, 0, 'g'},
+ {"share-net", required_argument, 0, OPT_SHARE_NET},
+ {"share-ipc", required_argument, 0, OPT_SHARE_IPC},
+ {"share-uts", required_argument, 0, OPT_SHARE_UTS},
+ {"share-pid", required_argument, 0, OPT_SHARE_PID},
+ LXC_COMMON_OPTIONS
+};
+
+static struct lxc_arguments my_args = {
+ .progname = "lxc-execute",
+ .help = "\
+--name=NAME -- COMMAND\n\
+\n\
+lxc-execute creates a container with the identifier NAME\n\
+and execs COMMAND into this container.\n\
+\n\
+Options :\n\
+ -n, --name=NAME NAME of the container\n\
+ -d, --daemon Daemonize the container\n\
+ -f, --rcfile=FILE Load configuration file FILE\n\
+ -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\
+ -u, --uid=UID Execute COMMAND with UID inside the container\n\
+ -g, --gid=GID Execute COMMAND with GID inside the container\n",
+ .options = my_longopts,
+ .parser = my_parser,
+ .log_priority = "ERROR",
+ .log_file = "none",
+ .daemonize = 0,
+};
+
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
int ret;
@@ -82,43 +120,9 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
args->share_ns[LXC_NS_PID] = arg;
break;
}
-
return 0;
}
-static const struct option my_longopts[] = {
- {"daemon", no_argument, 0, 'd'},
- {"rcfile", required_argument, 0, 'f'},
- {"define", required_argument, 0, 's'},
- {"uid", required_argument, 0, 'u'},
- {"gid", required_argument, 0, 'g'},
- {"share-net", required_argument, 0, OPT_SHARE_NET},
- {"share-ipc", required_argument, 0, OPT_SHARE_IPC},
- {"share-uts", required_argument, 0, OPT_SHARE_UTS},
- {"share-pid", required_argument, 0, OPT_SHARE_PID},
- LXC_COMMON_OPTIONS
-};
-
-static struct lxc_arguments my_args = {
- .progname = "lxc-execute",
- .help = "\
---name=NAME -- COMMAND\n\
-\n\
-lxc-execute creates a container with the identifier NAME\n\
-and execs COMMAND into this container.\n\
-\n\
-Options :\n\
- -n, --name=NAME NAME of the container\n\
- -d, --daemon Daemonize the container\n\
- -f, --rcfile=FILE Load configuration file FILE\n\
- -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\
- -u, --uid=UID Execute COMMAND with UID inside the container\n\
- -g, --gid=GID Execute COMMAND with GID inside the container\n",
- .options = my_longopts,
- .parser = my_parser,
- .daemonize = 0,
-};
-
static bool set_argv(struct lxc_container *c, struct lxc_arguments *args)
{
int ret;
@@ -134,6 +138,7 @@ static bool set_argv(struct lxc_container *c, struct lxc_arguments *args)
return false;
args->argv = components;
+
for (p = components; *p; p++)
args->argc++;
@@ -156,18 +161,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(err);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
-
- if (lxc_log_init(&log))
- exit(err);
- }
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
+
+ if (lxc_log_init(&log))
+ exit(err);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
@@ -195,12 +197,11 @@ int main(int argc, char *argv[])
goto out;
}
- if (my_args.argc == 0) {
+ if (my_args.argc == 0)
if (!set_argv(c, &my_args)) {
ERROR("Missing command to execute!");
goto out;
}
- }
bret = lxc_config_define_load(&defines, c);
if (!bret)
@@ -244,12 +245,11 @@ int main(int argc, char *argv[])
if (c->daemonize) {
err = EXIT_SUCCESS;
} else {
- if (WIFEXITED(c->error_num)) {
+ if (WIFEXITED(c->error_num))
err = WEXITSTATUS(c->error_num);
- } else {
+ else
/* Try to die with the same signal the task did. */
kill(0, WTERMSIG(c->error_num));
- }
}
out:
From c7013c13035b601ea69bd440aa18e7a1a03301b5 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:40:29 +0900
Subject: [PATCH 09/12] tools: lxc-start: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_start.c | 171 +++++++++++++++++++-------------------
1 file changed, 84 insertions(+), 87 deletions(-)
diff --git a/src/lxc/tools/lxc_start.c b/src/lxc/tools/lxc_start.c
index 398b56341..1815991e4 100644
--- a/src/lxc/tools/lxc_start.c
+++ b/src/lxc/tools/lxc_start.c
@@ -46,41 +46,58 @@
#include "confile.h"
#include "log.h"
-static struct lxc_list defines;
-
lxc_log_define(lxc_start, lxc);
-static int ensure_path(struct lxc_arguments *args, char **confpath, const char *path)
-{
- int err = -1, fd;
- char *fullpath = NULL;
-
- if (path) {
- if (access(path, W_OK)) {
- fd = creat(path, 0600);
- if (fd < 0 && errno != EEXIST) {
- ERROR("Failed to create '%s'", path);
- goto err;
- }
-
- if (fd >= 0)
- close(fd);
- }
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
+static int ensure_path(struct lxc_arguments *args, char **confpath, const char *path);
- fullpath = realpath(path, NULL);
- if (!fullpath) {
- ERROR("Failed to get the real path of '%s'", path);
- goto err;
- }
-
- *confpath = fullpath;
- }
+static struct lxc_list defines;
- err = EXIT_SUCCESS;
+static const struct option my_longopts[] = {
+ {"daemon", no_argument, 0, 'd'},
+ {"foreground", no_argument, 0, 'F'},
+ {"rcfile", required_argument, 0, 'f'},
+ {"define", required_argument, 0, 's'},
+ {"console", required_argument, 0, 'c'},
+ {"console-log", required_argument, 0, 'L'},
+ {"close-all-fds", no_argument, 0, 'C'},
+ {"pidfile", required_argument, 0, 'p'},
+ {"share-net", required_argument, 0, OPT_SHARE_NET},
+ {"share-ipc", required_argument, 0, OPT_SHARE_IPC},
+ {"share-uts", required_argument, 0, OPT_SHARE_UTS},
+ {"share-pid", required_argument, 0, OPT_SHARE_PID},
+ LXC_COMMON_OPTIONS
+};
-err:
- return err;
-}
+static struct lxc_arguments my_args = {
+ .progname = "lxc-start",
+ .help = "\
+--name=NAME -- COMMAND\n\
+\n\
+lxc-start start COMMAND in specified container NAME\n\
+\n\
+Options :\n\
+ -n, --name=NAME NAME of the container\n\
+ -d, --daemon Daemonize the container (default)\n\
+ -F, --foreground Start with the current tty attached to /dev/console\n\
+ -p, --pidfile=FILE Create a file with the process id\n\
+ -f, --rcfile=FILE Load configuration file FILE\n\
+ -c, --console=FILE Use specified FILE for the container console\n\
+ -L, --console-log=FILE Log container console output to FILE\n\
+ -C, --close-all-fds If any fds are inherited, close them\n\
+ If not specified, exit with failure instead\n\
+ Note: --daemon implies --close-all-fds\n\
+ -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\
+ --share-[net|ipc|uts|pid]=NAME Share a namespace with another container or pid\n\
+",
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
+ .daemonize = 1,
+ .pidfile = NULL,
+};
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
@@ -124,49 +141,34 @@ static int my_parser(struct lxc_arguments *args, int c, char *arg)
return 0;
}
-static const struct option my_longopts[] = {
- {"daemon", no_argument, 0, 'd'},
- {"foreground", no_argument, 0, 'F'},
- {"rcfile", required_argument, 0, 'f'},
- {"define", required_argument, 0, 's'},
- {"console", required_argument, 0, 'c'},
- {"console-log", required_argument, 0, 'L'},
- {"close-all-fds", no_argument, 0, 'C'},
- {"pidfile", required_argument, 0, 'p'},
- {"share-net", required_argument, 0, OPT_SHARE_NET},
- {"share-ipc", required_argument, 0, OPT_SHARE_IPC},
- {"share-uts", required_argument, 0, OPT_SHARE_UTS},
- {"share-pid", required_argument, 0, OPT_SHARE_PID},
- LXC_COMMON_OPTIONS
-};
+static int ensure_path(struct lxc_arguments *args, char **confpath, const char *path)
+{
+ int fd;
+ char *fullpath = NULL;
-static struct lxc_arguments my_args = {
- .progname = "lxc-start",
- .help = "\
---name=NAME -- COMMAND\n\
-\n\
-lxc-start start COMMAND in specified container NAME\n\
-\n\
-Options :\n\
- -n, --name=NAME NAME of the container\n\
- -d, --daemon Daemonize the container (default)\n\
- -F, --foreground Start with the current tty attached to /dev/console\n\
- -p, --pidfile=FILE Create a file with the process id\n\
- -f, --rcfile=FILE Load configuration file FILE\n\
- -c, --console=FILE Use specified FILE for the container console\n\
- -L, --console-log=FILE Log container console output to FILE\n\
- -C, --close-all-fds If any fds are inherited, close them\n\
- If not specified, exit with failure instead\n\
- Note: --daemon implies --close-all-fds\n\
- -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\
- --share-[net|ipc|uts|pid]=NAME Share a namespace with another container or pid\n\
-",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
- .daemonize = 1,
- .pidfile = NULL,
-};
+ if (path) {
+ if (access(path, W_OK)) {
+ fd = creat(path, 0600);
+ if (fd < 0 && errno != EEXIST) {
+ ERROR("Failed to create '%s'", path);
+ return -1;
+ }
+
+ if (fd >= 0)
+ close(fd);
+ }
+
+ fullpath = realpath(path, NULL);
+ if (!fullpath) {
+ ERROR("Failed to get the real path of '%s'", path);
+ return -1;
+ }
+
+ *confpath = fullpath;
+ }
+
+ return 0;
+}
int main(int argc, char *argv[])
{
@@ -194,18 +196,15 @@ int main(int argc, char *argv[])
else
args = my_args.argv;
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(err);
- }
+ if (lxc_log_init(&log))
+ exit(err);
lxcpath = my_args.lxcpath[0];
if (access(lxcpath, O_RDONLY) < 0) {
@@ -297,12 +296,11 @@ int main(int argc, char *argv[])
goto out;
}
- if (my_args.pidfile != NULL) {
+ if (my_args.pidfile)
if (ensure_path(&my_args, &c->pidfile, my_args.pidfile) < 0) {
ERROR("Failed to ensure pidfile '%s'", my_args.pidfile);
goto out;
}
- }
if (my_args.console)
if (!c->set_config_item(c, "lxc.console.path", my_args.console))
@@ -315,9 +313,8 @@ int main(int argc, char *argv[])
if (!lxc_setup_shared_ns(&my_args, c))
goto out;
- if (!my_args.daemonize) {
+ if (!my_args.daemonize)
c->want_daemonize(c, false);
- }
if (my_args.close_all_fds)
c->want_close_all_fds(c, true);
From c2a23ef6e4cf9a18a4001f447601f46d59887a51 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:41:06 +0900
Subject: [PATCH 10/12] tools: lxc-stop: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_stop.c | 91 ++++++++++++++++++++--------------------
1 file changed, 46 insertions(+), 45 deletions(-)
diff --git a/src/lxc/tools/lxc_stop.c b/src/lxc/tools/lxc_stop.c
index c1b6a4763..76c759d0c 100644
--- a/src/lxc/tools/lxc_stop.c
+++ b/src/lxc/tools/lxc_stop.c
@@ -34,36 +34,12 @@
#include "log.h"
#include "utils.h"
-#define OPT_NO_LOCK OPT_USAGE + 1
-#define OPT_NO_KILL OPT_USAGE + 2
+#define OPT_NO_LOCK (OPT_USAGE + 1)
+#define OPT_NO_KILL (OPT_USAGE + 2)
lxc_log_define(lxc_stop, lxc);
-static int my_parser(struct lxc_arguments *args, int c, char *arg)
-{
- switch (c) {
- case 'r':
- args->reboot = 1;
- break;
- case 'W':
- args->nowait = 1;
- break;
- case 't':
- if (lxc_safe_long(arg, &args->timeout) < 0)
- return -1;
- break;
- case 'k':
- args->hardstop = 1;
- break;
- case OPT_NO_LOCK:
- args->nolock = 1;
- break;
- case OPT_NO_KILL:
- args->nokill = 1;
- break;
- }
- return 0;
-}
+static int my_parser(struct lxc_arguments *args, int c, char *arg);
static const struct option my_longopts[] = {
{"reboot", no_argument, 0, 'r'},
@@ -76,8 +52,8 @@ static const struct option my_longopts[] = {
};
static struct lxc_arguments my_args = {
- .progname = "lxc-stop",
- .help = "\
+ .progname = "lxc-stop",
+ .help = "\
--name=NAME\n\
\n\
lxc-stop stops a container with the identifier NAME\n\
@@ -91,12 +67,40 @@ Options :\n\
--nolock Avoid using API locks\n\
--nokill Only request clean shutdown, don't force kill after timeout\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = my_parser,
- .checker = NULL,
- .timeout = -2,
+ .options = my_longopts,
+ .parser = my_parser,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
+ .timeout = -2,
};
+static int my_parser(struct lxc_arguments *args, int c, char *arg)
+{
+ switch (c) {
+ case 'r':
+ args->reboot = 1;
+ break;
+ case 'W':
+ args->nowait = 1;
+ break;
+ case 't':
+ if (lxc_safe_long(arg, &args->timeout) < 0)
+ return -1;
+ break;
+ case 'k':
+ args->hardstop = 1;
+ break;
+ case OPT_NO_LOCK:
+ args->nolock = 1;
+ break;
+ case OPT_NO_KILL:
+ args->nokill = 1;
+ break;
+ }
+ return 0;
+}
+
int main(int argc, char *argv[])
{
struct lxc_container *c;
@@ -107,18 +111,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(ret);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
-
- if (lxc_log_init(&log))
- exit(ret);
- }
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
+
+ if (lxc_log_init(&log))
+ exit(ret);
/* Set default timeout */
if (my_args.timeout == -2) {
From fe8c37efdbddfdf7ed2b780683c551362db42fb6 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:41:51 +0900
Subject: [PATCH 11/12] tools: lxc-freeze: add default log priority & cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_freeze.c | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/src/lxc/tools/lxc_freeze.c b/src/lxc/tools/lxc_freeze.c
index 88e1f38b8..16b4064d8 100644
--- a/src/lxc/tools/lxc_freeze.c
+++ b/src/lxc/tools/lxc_freeze.c
@@ -41,8 +41,8 @@ static const struct option my_longopts[] = {
};
static struct lxc_arguments my_args = {
- .progname = "lxc-freeze",
- .help = "\
+ .progname = "lxc-freeze",
+ .help = "\
--name=NAME\n\
\n\
lxc-freeze freezes a container with the identifier NAME\n\
@@ -50,9 +50,11 @@ lxc-freeze freezes a container with the identifier NAME\n\
Options :\n\
-n, --name=NAME NAME of the container\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = NULL,
- .checker = NULL,
+ .options = my_longopts,
+ .parser = NULL,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
};
int main(int argc, char *argv[])
@@ -63,18 +65,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
From 34a10bfa348a559aa38d7ed6ab8c85d8baef4bda Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 18 Aug 2018 01:42:15 +0900
Subject: [PATCH 12/12] tools: lxc-unfreeze: add default log priority &
cleanups
Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
src/lxc/tools/lxc_unfreeze.c | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/src/lxc/tools/lxc_unfreeze.c b/src/lxc/tools/lxc_unfreeze.c
index a0b56900f..7a9972c4c 100644
--- a/src/lxc/tools/lxc_unfreeze.c
+++ b/src/lxc/tools/lxc_unfreeze.c
@@ -40,8 +40,8 @@ static const struct option my_longopts[] = {
};
static struct lxc_arguments my_args = {
- .progname = "lxc-unfreeze",
- .help = "\
+ .progname = "lxc-unfreeze",
+ .help = "\
--name=NAME\n\
\n\
lxc-unfreeze unfreezes a container with the identifier NAME\n\
@@ -49,9 +49,11 @@ lxc-unfreeze unfreezes a container with the identifier NAME\n\
Options :\n\
-n, --name=NAME NAME of the container\n\
--rcfile=FILE Load configuration file FILE\n",
- .options = my_longopts,
- .parser = NULL,
- .checker = NULL,
+ .options = my_longopts,
+ .parser = NULL,
+ .checker = NULL,
+ .log_priority = "ERROR",
+ .log_file = "none",
};
int main(int argc, char *argv[])
@@ -62,18 +64,15 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE);
- /* Only create log if explicitly instructed */
- if (my_args.log_file || my_args.log_priority) {
- log.name = my_args.name;
- log.file = my_args.log_file;
- log.level = my_args.log_priority;
- log.prefix = my_args.progname;
- log.quiet = my_args.quiet;
- log.lxcpath = my_args.lxcpath[0];
+ log.name = my_args.name;
+ log.file = my_args.log_file;
+ log.level = my_args.log_priority;
+ log.prefix = my_args.progname;
+ log.quiet = my_args.quiet;
+ log.lxcpath = my_args.lxcpath[0];
- if (lxc_log_init(&log))
- exit(EXIT_FAILURE);
- }
+ if (lxc_log_init(&log))
+ exit(EXIT_FAILURE);
c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) {
More information about the lxc-devel
mailing list