[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