[libvirt] [PATCH 19/23] util: replace gethostname() with g_get_hostname()

Daniel P. Berrangé berrange at redhat.com
Thu Jan 2 14:53:53 UTC 2020


Note the glib function returns a const string because it
caches the hostname using a one time thread initializer
function.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/util/virlog.c  | 17 ++++-------------
 src/util/virutil.c | 12 +++---------
 2 files changed, 7 insertions(+), 22 deletions(-)

diff --git a/src/util/virlog.c b/src/util/virlog.c
index aa98024e1c..e46ae69471 100644
--- a/src/util/virlog.c
+++ b/src/util/virlog.c
@@ -60,7 +60,6 @@
 VIR_LOG_INIT("util.log");
 
 static GRegex *virLogRegex;
-static char virLogHostname[HOST_NAME_MAX+1];
 
 
 #define VIR_LOG_DATE_REGEX "[0-9]{4}-[0-9]{2}-[0-9]{2}"
@@ -253,8 +252,6 @@ virLogPriorityString(virLogPriority lvl)
 static int
 virLogOnceInit(void)
 {
-    int r;
-
     if (virMutexInit(&virLogMutex) < 0)
         return -1;
 
@@ -263,19 +260,13 @@ virLogOnceInit(void)
 
     virLogRegex = g_regex_new(VIR_LOG_REGEX, G_REGEX_OPTIMIZE, 0, NULL);
 
-    /* We get and remember the hostname early, because at later time
+    /* GLib caches the hostname using a one time thread initializer.
+     * We want to prime this cache early though, because at later time
      * it might not be possible to load NSS modules via getaddrinfo()
      * (e.g. at container startup the host filesystem will not be
      * accessible anymore.
-     * Must not use virGetHostname though as that causes re-entrancy
-     * problems if it triggers logging codepaths
      */
-    r = gethostname(virLogHostname, sizeof(virLogHostname));
-    if (r == -1) {
-        ignore_value(virStrcpyStatic(virLogHostname, "(unknown)"));
-    } else {
-        NUL_TERMINATE(virLogHostname);
-    }
+    (void)g_get_host_name();
 
     virLogUnlock();
     return 0;
@@ -471,7 +462,7 @@ virLogHostnameString(char **rawmsg,
 {
     char *hoststr;
 
-    hoststr = g_strdup_printf("hostname: %s", virLogHostname);
+    hoststr = g_strdup_printf("hostname: %s", g_get_host_name());
 
     virLogFormatString(msg, 0, NULL, VIR_LOG_INFO, hoststr);
     *rawmsg = hoststr;
diff --git a/src/util/virutil.c b/src/util/virutil.c
index 9620ff204d..a0fd7618ee 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -503,17 +503,11 @@ static char *
 virGetHostnameImpl(bool quiet)
 {
     int r;
-    char hostname[HOST_NAME_MAX+1], *result = NULL;
+    const char *hostname;
+    char *result = NULL;
     struct addrinfo hints, *info;
 
-    r = gethostname(hostname, sizeof(hostname));
-    if (r == -1) {
-        if (!quiet)
-            virReportSystemError(errno,
-                                 "%s", _("failed to determine host name"));
-        return NULL;
-    }
-    NUL_TERMINATE(hostname);
+    hostname = g_get_host_name();
 
     if (STRPREFIX(hostname, "localhost") || strchr(hostname, '.')) {
         /* in this case, gethostname returned localhost (meaning we can't
-- 
2.24.1




More information about the libvir-list mailing list