Blob Blame History Raw
From 25ae7dad87e5b44a6fa6e5da11a85ab1baba5af8 Mon Sep 17 00:00:00 2001
Message-Id: <25ae7dad87e5b44a6fa6e5da11a85ab1baba5af8@dist-git>
From: Erik Skultety <eskultet@redhat.com>
Date: Tue, 2 Aug 2016 09:55:53 +0200
Subject: [PATCH] tools: Make use of the correct environment variables

Since commit 834c5720 which extracted the generic functionality out of virsh
and made it available for other clients like virt-admin to make use of it, it
also introduced a bug when it renamed the original VIRSH_ environment variables
to VSH_ variables. Virt-admin of course suffers from the same bug, so this
patch modifies the generic module vsh.c to construct the correct name for
environment variables of each client from information it has.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1357363

Signed-off-by: Erik Skultety <eskultet@redhat.com>
(cherry picked from commit d02ef33451a0d84692f32fe0877d621bfe243f50)
Signed-off-by: Erik Skultety <eskultet@redhat.com>

 Conflicts:
	tools/vsh.c - variable in upstream virsh/virt-admin auto-completion
                      support caused this fix to be inapplicable
---
 tools/virsh.c      |  1 +
 tools/virt-admin.c |  1 +
 tools/vsh.c        | 23 ++++++++++++-----------
 tools/vsh.h        |  1 +
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 5dc482d..f74698f 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -935,6 +935,7 @@ main(int argc, char **argv)
     memset(ctl, 0, sizeof(vshControl));
     memset(&virshCtl, 0, sizeof(virshControl));
     ctl->name = "virsh";        /* hardcoded name of the binary */
+    ctl->env_prefix = "VIRSH";
     ctl->log_fd = -1;           /* Initialize log file descriptor */
     ctl->debug = VSH_DEBUG_DEFAULT;
     ctl->hooks = &hooks;
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index a59c4c7..2ae05da 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -1340,6 +1340,7 @@ main(int argc, char **argv)
     memset(ctl, 0, sizeof(vshControl));
     memset(&virtAdminCtl, 0, sizeof(vshAdmControl));
     ctl->name = "virt-admin";        /* hardcoded name of the binary */
+    ctl->env_prefix = "VIRT_ADMIN";
     ctl->log_fd = -1;                /* Initialize log file descriptor */
     ctl->debug = VSH_DEBUG_DEFAULT;
     ctl->hooks = &hooks;
diff --git a/tools/vsh.c b/tools/vsh.c
index 2f564e6..79709ab 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -2611,16 +2611,10 @@ static int
 vshReadlineInit(vshControl *ctl)
 {
     char *userdir = NULL;
-    char *name_capitalized = NULL;
     int max_history = 500;
     int ret = -1;
     char *histsize_env = NULL;
     const char *histsize_str = NULL;
-    const char *strings[] = {
-        name_capitalized,
-        "HISTSIZE",
-        NULL
-    };
 
     /* Allow conditional parsing of the ~/.inputrc file.
      * Work around ancient readline 4.1 (hello Mac OS X),
@@ -2631,8 +2625,7 @@ vshReadlineInit(vshControl *ctl)
     /* Tell the completer that we want a crack first. */
     rl_attempted_completion_function = vshReadlineCompletion;
 
-    if (virStringToUpper(&name_capitalized, ctl->name) < 0 ||
-        !(histsize_env = virStringJoin(strings, "_")))
+    if (virAsprintf(&histsize_env, "%s_HISTSIZE", ctl->env_prefix) < 0)
         goto cleanup;
 
     /* Limit the total size of the history buffer */
@@ -2674,7 +2667,6 @@ vshReadlineInit(vshControl *ctl)
 
  cleanup:
     VIR_FREE(userdir);
-    VIR_FREE(name_capitalized);
     VIR_FREE(histsize_env);
     return ret;
 }
@@ -2746,10 +2738,14 @@ static int
 vshInitDebug(vshControl *ctl)
 {
     const char *debugEnv;
+    char *env = NULL;
 
     if (ctl->debug == VSH_DEBUG_DEFAULT) {
+        if (virAsprintf(&env, "%s_DEBUG", ctl->env_prefix) < 0)
+            return -1;
+
         /* log level not set from commandline, check env variable */
-        debugEnv = virGetEnvAllowSUID("VSH_DEBUG");
+        debugEnv = virGetEnvAllowSUID(env);
         if (debugEnv) {
             int debug;
             if (virStrToLong_i(debugEnv, NULL, 10, &debug) < 0 ||
@@ -2760,15 +2756,20 @@ vshInitDebug(vshControl *ctl)
                 ctl->debug = debug;
             }
         }
+        VIR_FREE(env);
     }
 
     if (ctl->logfile == NULL) {
+        if (virAsprintf(&env, "%s_LOG_FILE", ctl->env_prefix) < 0)
+            return -1;
+
         /* log file not set from cmdline */
-        debugEnv = virGetEnvBlockSUID("VSH_LOG_FILE");
+        debugEnv = virGetEnvBlockSUID(env);
         if (debugEnv && *debugEnv) {
             ctl->logfile = vshStrdup(ctl, debugEnv);
             vshOpenLogFile(ctl);
         }
+        VIR_FREE(env);
     }
 
     return 0;
diff --git a/tools/vsh.h b/tools/vsh.h
index 8d67397..7f43055 100644
--- a/tools/vsh.h
+++ b/tools/vsh.h
@@ -197,6 +197,7 @@ struct _vshControl {
     const char *name;           /* hardcoded name of the binary that cannot
                                  * be changed without recompilation compared
                                  * to program name */
+    const char *env_prefix;     /* hardcoded environment variable prefix */
     char *connname;             /* connection name */
     char *progname;             /* program name */
     vshCmd *cmd;                /* the current command */
-- 
2.9.2