The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2434

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Hello,

Currently, a quiet option of tools is not working because of using fprintf directly.

So, we change fprintf or print to lxc_error log with some cleanups.

And lxc_sys_error is added to print errno string additionally.

Thanks.

Signed-off-by: 2xsec <dh48.je...@samsung.com>
From a13daf8e7d0bf19e535ea2930ce4a4f6281788d5 Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.je...@samsung.com>
Date: Wed, 27 Jun 2018 16:44:06 +0900
Subject: [PATCH] tools: fix quiet option is not working

Signed-off-by: 2xsec <dh48.je...@samsung.com>
---
 src/lxc/tools/arguments.h  | 48 +++++++++++++++++++++++++++++++++++++-----
 src/lxc/tools/lxc_attach.c | 21 +++++++++++--------
 src/lxc/tools/lxc_start.c  | 52 ++++++++++++++++++++++++++--------------------
 src/lxc/tools/lxc_stop.c   | 24 ++++++++++++---------
 4 files changed, 99 insertions(+), 46 deletions(-)

diff --git a/src/lxc/tools/arguments.h b/src/lxc/tools/arguments.h
index 788f056e3..04cf3278b 100644
--- a/src/lxc/tools/arguments.h
+++ b/src/lxc/tools/arguments.h
@@ -29,6 +29,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <sys/types.h>
+#include <sys/param.h>
 #include <lxc/lxccontainer.h>
 
 struct lxc_arguments;
@@ -146,7 +147,7 @@ struct lxc_arguments {
 
 #define LXC_COMMON_OPTIONS                                                     
\
            { "name",        required_argument, 0, 'n'         },              \
-            { "help",        no_argument,       0, 'h'         },              
\
+           { "help",        no_argument,       0, 'h'         },              \
            { "usage",       no_argument,       0, OPT_USAGE   },              \
            { "version",     no_argument,       0, OPT_VERSION },              \
            { "quiet",       no_argument,       0, 'q'         },              \
@@ -171,10 +172,47 @@ extern int lxc_arguments_parse(struct lxc_arguments 
*args, int argc,
 extern int lxc_arguments_str_to_int(struct lxc_arguments *args,
                                    const char *str);
 
-#define lxc_error(arg, fmt, args...)                                           
\
-       if (!(arg)->quiet)                                                     \
-       fprintf(stderr, "%s: " fmt "\n", (arg)->progname, ##args)
-
 extern bool lxc_setup_shared_ns(struct lxc_arguments *args, struct 
lxc_container *c);
 
+/* Helper macro to define errno string. */
+#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && 
!defined(_GNU_SOURCE) || IS_BIONIC
+#define lxc_log_strerror_r                                              \
+       char errno_buf[MAXPATHLEN / 2] = {"Failed to get errno string"}; \
+       char *ptr = errno_buf;                                           \
+       {                                                                \
+               (void)strerror_r(errno, errno_buf, sizeof(errno_buf));   \
+       }
+#else
+#define lxc_log_strerror_r                                              \
+       char errno_buf[MAXPATHLEN / 2] = {"Failed to get errno string"}; \
+       char *ptr;                                                       \
+       {                                                                \
+               ptr = strerror_r(errno, errno_buf, sizeof(errno_buf));   \
+               if (!ptr)                                                \
+                       ptr = errno_buf;                                 \
+       }
+#endif
+
+#define lxc_info(arg, fmt, args...)                                            
    \
+       do {                                                                    
   \
+               if (!(arg)->quiet) {                                            
   \
+                       fprintf(stdout, "%s: " fmt "\n", (arg)->progname, 
##args); \
+               }                                                               
   \
+       } while (0)
+
+#define lxc_error(arg, fmt, args...)                                           
    \
+       do {                                                                    
   \
+               if (!(arg)->quiet) {                                            
   \
+                       fprintf(stderr, "%s: " fmt "\n", (arg)->progname, 
##args); \
+               }                                                               
   \
+       } while (0)
+
+#define lxc_sys_error(arg, fmt, args...)                                       
              \
+       do {                                                                    
             \
+               if (!(arg)->quiet) {                                            
             \
+                       lxc_log_strerror_r                                      
             \
+                       fprintf(stderr, "%s: %s - " fmt "\n", (arg)->progname, 
ptr, ##args); \
+               }                                                               
             \
+       } while (0)
+
 #endif /* __LXC_ARGUMENTS_H */
diff --git a/src/lxc/tools/lxc_attach.c b/src/lxc/tools/lxc_attach.c
index afd9a57f6..56c225d80 100644
--- a/src/lxc/tools/lxc_attach.c
+++ b/src/lxc/tools/lxc_attach.c
@@ -92,7 +92,7 @@ static int add_to_simple_array(char ***array, ssize_t 
*capacity, char *value)
        return 0;
 }
 
-static int my_parser(struct lxc_arguments* args, int c, char* arg)
+static int my_parser(struct lxc_arguments *args, int c, char *arg)
 {
        char **it;
        char *del;
@@ -240,13 +240,13 @@ static bool stdfd_is_pty(void)
        return false;
 }
 
-int lxc_attach_create_log_file(const char *log_file)
+static int lxc_attach_create_log_file(const char *log_file)
 {
        int fd;
 
        fd = open(log_file, O_CLOEXEC | O_RDWR | O_CREAT | O_APPEND, 0600);
        if (fd < 0) {
-               fprintf(stderr, "Failed to open log file \"%s\"\n", log_file);
+               lxc_error(&my_args, "Failed to open log file \"%s\"", log_file);
                return -1;
        }
 
@@ -285,8 +285,7 @@ int main(int argc, char *argv[])
 
        if (geteuid()) {
                if (access(my_args.lxcpath[0], O_RDONLY) < 0) {
-                       if (!my_args.quiet)
-                               fprintf(stderr, "You lack access to %s\n", 
my_args.lxcpath[0]);
+                       lxc_error(&my_args, "You lack access to %s", 
my_args.lxcpath[0]);
                        exit(EXIT_FAILURE);
                }
        }
@@ -298,30 +297,34 @@ int main(int argc, char *argv[])
        if (my_args.rcfile) {
                c->clear_config(c);
                if (!c->load_config(c, my_args.rcfile)) {
-                       fprintf(stderr, "Failed to load rcfile\n");
+                       lxc_error(&my_args, "Failed to load rcfile");
                        lxc_container_put(c);
                        exit(EXIT_FAILURE);
                }
+
                c->configfile = strdup(my_args.rcfile);
                if (!c->configfile) {
-                       fprintf(stderr, "Out of memory setting new config 
filename\n");
+                       lxc_error(&my_args, "Out of memory setting new config 
filename");
                        lxc_container_put(c);
                        exit(EXIT_FAILURE);
                }
        }
 
        if (!c->may_control(c)) {
-               fprintf(stderr, "Insufficent privileges to control %s\n", 
c->name);
+               lxc_error(&my_args, "Insufficent privileges to control %s", 
c->name);
                lxc_container_put(c);
                exit(EXIT_FAILURE);
        }
 
        if (remount_sys_proc)
                attach_options.attach_flags |= LXC_ATTACH_REMOUNT_PROC_SYS;
+
        if (elevated_privileges)
                attach_options.attach_flags &= ~(elevated_privileges);
+
        if (stdfd_is_pty())
                attach_options.attach_flags |= LXC_ATTACH_TERMINAL;
+
        attach_options.namespaces = namespace_flags;
        attach_options.personality = new_personality;
        attach_options.env_policy = env_policy;
@@ -343,7 +346,6 @@ int main(int argc, char *argv[])
                ret = c->attach(c, lxc_attach_run_command, &command, 
&attach_options, &pid);
        else
                ret = c->attach(c, lxc_attach_run_shell, NULL, &attach_options, 
&pid);
-
        if (ret < 0)
                goto out;
 
@@ -357,5 +359,6 @@ int main(int argc, char *argv[])
        lxc_container_put(c);
        if (ret >= 0)
                exit(wexit);
+
        exit(EXIT_FAILURE);
 }
diff --git a/src/lxc/tools/lxc_start.c b/src/lxc/tools/lxc_start.c
index a4217736e..57af91bb5 100644
--- a/src/lxc/tools/lxc_start.c
+++ b/src/lxc/tools/lxc_start.c
@@ -47,7 +47,7 @@
 
 static struct lxc_list defines;
 
-static int ensure_path(char **confpath, const char *path)
+static int ensure_path(struct lxc_arguments *args, char **confpath, const char 
*path)
 {
        int err = -1, fd;
        char *fullpath = NULL;
@@ -56,21 +56,23 @@ static int ensure_path(char **confpath, const char *path)
                if (access(path, W_OK)) {
                        fd = creat(path, 0600);
                        if (fd < 0 && errno != EEXIST) {
-                               fprintf(stderr, "failed to create '%s'\n", 
path);
+                               lxc_error(args, "Failed to create '%s'", path);
                                goto err;
                        }
+
                        if (fd >= 0)
                                close(fd);
                }
 
                fullpath = realpath(path, NULL);
                if (!fullpath) {
-                       fprintf(stderr, "failed to get the real path of 
'%s'\n", path);
+                       lxc_error(args, "Failed to get the real path of '%s'", 
path);
                        goto err;
                }
 
                *confpath = fullpath;
        }
+
        err = EXIT_SUCCESS;
 
 err:
@@ -204,8 +206,7 @@ int main(int argc, char *argv[])
 
        lxcpath = my_args.lxcpath[0];
        if (access(lxcpath, O_RDONLY) < 0) {
-               if (!my_args.quiet)
-                       fprintf(stderr, "You lack access to %s\n", lxcpath);
+               lxc_error(&my_args, "You lack access to %s", lxcpath);
                exit(err);
        }
 
@@ -218,20 +219,24 @@ int main(int argc, char *argv[])
        /* rcfile is specified in the cli option */
        if (my_args.rcfile) {
                rcfile = (char *)my_args.rcfile;
+
                c = lxc_container_new(my_args.name, lxcpath);
                if (!c) {
-                       fprintf(stderr, "Failed to create lxc_container\n");
+                       lxc_error(&my_args, "Failed to create lxc_container");
                        exit(err);
                }
+
                c->clear_config(c);
+
                if (!c->load_config(c, rcfile)) {
-                       fprintf(stderr, "Failed to load rcfile\n");
+                       lxc_error(&my_args, "Failed to load rcfile");
                        lxc_container_put(c);
                        exit(err);
                }
+
                c->configfile = strdup(my_args.rcfile);
                if (!c->configfile) {
-                       fprintf(stderr, "Out of memory setting new config 
filename\n");
+                       lxc_error(&my_args, "Out of memory setting new config 
filename");
                        goto out;
                }
        } else {
@@ -239,7 +244,7 @@ int main(int argc, char *argv[])
 
                rc = asprintf(&rcfile, "%s/%s/config", lxcpath, my_args.name);
                if (rc == -1) {
-                       fprintf(stderr, "failed to allocate memory\n");
+                       lxc_error(&my_args, "Failed to allocate memory");
                        exit(err);
                }
 
@@ -248,9 +253,10 @@ int main(int argc, char *argv[])
                        free(rcfile);
                        rcfile = NULL;
                }
+
                c = lxc_container_new(my_args.name, lxcpath);
                if (!c) {
-                       fprintf(stderr, "Failed to create lxc_container\n");
+                       lxc_error(&my_args, "Failed to create lxc_container");
                        exit(err);
                }
        }
@@ -260,23 +266,23 @@ int main(int argc, char *argv[])
         * to be created for it to be started. You can just pass a configuration
         * file as argument and start the container right away.
         */
-
        if (!c->may_control(c)) {
-               fprintf(stderr, "Insufficent privileges to control %s\n", 
c->name);
+               lxc_error(&my_args, "Insufficent privileges to control %s", 
c->name);
                goto out;
        }
 
        if (c->is_running(c)) {
-               fprintf(stderr, "Container is already running.\n");
+               lxc_error(&my_args, "Container is already running.");
                err = EXIT_SUCCESS;
                goto out;
        }
+
        /*
         * We should use set_config_item() over &defines, which would handle
         * unset c->lxc_conf for us and let us not use lxc_config_define_load()
         */
        if (!c->lxc_conf) {
-               fprintf(stderr, "No container config specified\n");
+               lxc_error(&my_args, "No container config specified");
                goto out;
        }
 
@@ -284,13 +290,13 @@ int main(int argc, char *argv[])
                goto out;
 
        if (!rcfile && !strcmp("/sbin/init", args[0])) {
-               fprintf(stderr, "Executing '/sbin/init' with no configuration 
file may crash the host\n");
+               lxc_error(&my_args, "Executing '/sbin/init' with no 
configuration file may crash the host");
                goto out;
        }
 
        if (my_args.pidfile != NULL) {
-               if (ensure_path(&c->pidfile, my_args.pidfile) < 0) {
-                       fprintf(stderr, "failed to ensure pidfile '%s'\n", 
my_args.pidfile);
+               if (ensure_path(&my_args, &c->pidfile, my_args.pidfile) < 0) {
+                       lxc_error(&my_args, "Failed to ensure pidfile '%s'", 
my_args.pidfile);
                        goto out;
                }
        }
@@ -317,13 +323,15 @@ int main(int argc, char *argv[])
                err = c->start(c, 0, NULL) ? EXIT_SUCCESS : EXIT_FAILURE;
        else
                err = c->start(c, 0, args) ? EXIT_SUCCESS : EXIT_FAILURE;
-
        if (err) {
-               fprintf(stderr, "The container failed to start.\n");
+               lxc_error(&my_args, "The container failed to start.");
+
                if (my_args.daemonize)
-                       fprintf(stderr, "To get more details, run the container 
in foreground mode.\n");
-               fprintf(stderr, "Additional information can be obtained by 
setting the "
-                     "--logfile and --logpriority options.\n");
+                       lxc_error(&my_args, "To get more details, run the 
container in foreground mode.");
+
+               lxc_error(&my_args, "Additional information can be obtained by 
setting the "
+                         "--logfile and --logpriority options.\n");
+
                err = c->error_num;
                lxc_container_put(c);
                exit(err);
diff --git a/src/lxc/tools/lxc_stop.c b/src/lxc/tools/lxc_stop.c
index fad7064e1..7416116d6 100644
--- a/src/lxc/tools/lxc_stop.c
+++ b/src/lxc/tools/lxc_stop.c
@@ -130,56 +130,59 @@ int main(int argc, char *argv[])
 
        /* some checks */
        if (!my_args.hardstop && my_args.timeout < -1) {
-               fprintf(stderr, "invalid timeout\n");
+               lxc_error(&my_args, "Invalid timeout");
                exit(ret);
        }
 
        if (my_args.hardstop && my_args.nokill) {
-               fprintf(stderr, "-k can't be used with --nokill\n");
+               lxc_error(&my_args, "-k can't be used with --nokill");
                exit(ret);
        }
 
        if (my_args.hardstop && my_args.reboot) {
-               fprintf(stderr, "-k can't be used with -r\n");
+               lxc_error(&my_args, "-k can't be used with -r");
                exit(ret);
        }
 
        if (my_args.hardstop && my_args.timeout) {
-               fprintf(stderr, "-k doesn't allow timeouts\n");
+               lxc_error(&my_args, "-k doesn't allow timeouts");
                exit(ret);
        }
 
        if (my_args.nolock && !my_args.hardstop) {
-               fprintf(stderr, "--nolock may only be used with -k\n");
+               lxc_error(&my_args, "--nolock may only be used with -k");
                exit(ret);
        }
 
        c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
        if (!c) {
-               fprintf(stderr, "Error opening container\n");
+               lxc_error(&my_args, "Error opening container");
                goto out;
        }
 
        if (my_args.rcfile) {
                c->clear_config(c);
+
                if (!c->load_config(c, my_args.rcfile)) {
-                       fprintf(stderr, "Failed to load rcfile\n");
+                       lxc_error(&my_args, "Failed to load rcfile");
                        goto out;
                }
+
                c->configfile = strdup(my_args.rcfile);
                if (!c->configfile) {
-                       fprintf(stderr, "Out of memory setting new config 
filename\n");
+                       lxc_error(&my_args, "Out of memory setting new config 
filename");
                        goto out;
                }
        }
 
        if (!c->may_control(c)) {
-               fprintf(stderr, "Insufficent privileges to control %s\n", 
c->name);
+               lxc_error(&my_args, "Insufficent privileges to control %s", 
c->name);
                goto out;
        }
 
        if (!c->is_running(c)) {
-               fprintf(stderr, "%s is not running\n", c->name);
+               lxc_error(&my_args, "%s is not running", c->name);
+
                /* Per our manpage we need to exit with exit code:
                 * 2: The specified container exists but was not running.
                 */
@@ -200,6 +203,7 @@ int main(int argc, char *argv[])
                        ret = EXIT_FAILURE;
                else
                        ret = EXIT_SUCCESS;
+
                goto out;
        }
 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to