]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
remote: change socket helper to return full daemon path
authorDaniel P. Berrangé <berrange@redhat.com>
Mon, 24 May 2021 13:08:44 +0000 (14:08 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 4 Jun 2021 10:42:59 +0000 (11:42 +0100)
The remoteGetUNIXSocket method currently just returns the daemon name
and the caller then converts this to a path. Except the SSH helper
didn't do this, so it was relying on later code expanding $PATH, and
this doesn't allow for build root overrides.

Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/remote/remote_driver.c
src/remote/remote_sockets.c
src/remote/remote_sockets.h
src/remote/remote_ssh_helper.c

index eb6fae4e9af4309b283777611923924d7b5d8989..1ba66c1f81b58c8682f250e3a33c139d1987bbc4 100644 (file)
@@ -700,23 +700,6 @@ remoteConnectSupportsFeatureUnlocked(virConnectPtr conn,
     }
 
 
-#ifndef WIN32
-static const char *
-remoteGetDaemonPathEnv(void)
-{
-    /* We prefer a VIRTD_PATH env var to use for all daemons,
-     * but if it is not set we will fallback to LIBVIRTD_PATH
-     * for previous behaviour
-     */
-    if (getenv("VIRTD_PATH") != NULL) {
-        return "VIRTD_PATH";
-    } else {
-        return "LIBVIRTD_PATH";
-    }
-}
-#endif /* WIN32 */
-
-
 /*
  * URIs that this driver needs to handle:
  *
@@ -763,7 +746,7 @@ doRemoteOpen(virConnectPtr conn,
     g_autofree char *knownHostsVerify = NULL;
     g_autofree char *knownHosts = NULL;
     g_autofree char *mode_str = NULL;
-    g_autofree char *daemon_name = NULL;
+    g_autofree char *daemon_path = NULL;
     g_autofree char *proxy_str = NULL;
     bool sanity = true;
     bool verify = true;
@@ -942,7 +925,7 @@ doRemoteOpen(virConnectPtr conn,
     case REMOTE_DRIVER_TRANSPORT_LIBSSH2:
         if (!sockname &&
             !(sockname = remoteGetUNIXSocket(transport, mode, driver_str,
-                                             flags, &daemon_name)))
+                                             flags, &daemon_path)))
             goto failed;
         break;
 
@@ -1038,19 +1021,9 @@ doRemoteOpen(virConnectPtr conn,
 
 #ifndef WIN32
     case REMOTE_DRIVER_TRANSPORT_UNIX:
-        if (flags & REMOTE_DRIVER_OPEN_AUTOSTART) {
-            const char *env_name = remoteGetDaemonPathEnv();
-            if (!(daemonPath = virFileFindResourceFull(daemon_name,
-                                                       NULL, NULL,
-                                                       abs_top_builddir "/src",
-                                                       SBINDIR,
-                                                       env_name)))
-                goto failed;
-        }
-
         if (!(priv->client = virNetClientNewUNIX(sockname,
                                                  flags & REMOTE_DRIVER_OPEN_AUTOSTART,
-                                                 daemonPath)))
+                                                 daemon_path)))
             goto failed;
 
         priv->is_secure = 1;
index 06315fe9c0e590fd1559d87e9dc7dc1a7d9fa275..6d33b69467192d83e845f359b39e91555e8654f1 100644 (file)
@@ -47,6 +47,22 @@ VIR_ENUM_IMPL(remoteDriverMode,
               "legacy",
               "direct");
 
+#ifndef WIN32
+static const char *
+remoteGetDaemonPathEnv(void)
+{
+    /* We prefer a VIRTD_PATH env var to use for all daemons,
+     * but if it is not set we will fallback to LIBVIRTD_PATH
+     * for previous behaviour
+     */
+    if (getenv("VIRTD_PATH") != NULL) {
+        return "VIRTD_PATH";
+    } else {
+        return "LIBVIRTD_PATH";
+    }
+}
+#endif /* WIN32 */
+
 
 int
 remoteSplitURIScheme(virURI *uri,
@@ -136,13 +152,19 @@ remoteGetUNIXSocket(remoteDriverTransport transport,
                     remoteDriverMode mode,
                     const char *driver,
                     unsigned int flags,
-                    char **daemon)
+                    char **daemon_path)
 {
     char *sock_name = NULL;
     g_autofree char *direct_daemon = NULL;
     g_autofree char *legacy_daemon = NULL;
+    g_autofree char *daemon_name = NULL;
     g_autofree char *direct_sock_name = NULL;
     g_autofree char *legacy_sock_name = NULL;
+#ifndef WIN32
+    const char *env_name = remoteGetDaemonPathEnv();
+#else
+    const char *env_path = NULL;
+#endif
 
     VIR_DEBUG("Choosing remote socket for transport=%s mode=%s driver=%s flags=0x%x",
               remoteDriverTransportTypeToString(transport),
@@ -182,7 +204,7 @@ remoteGetUNIXSocket(remoteDriverTransport transport,
     switch ((remoteDriverMode)mode) {
     case REMOTE_DRIVER_MODE_LEGACY:
         sock_name = g_steal_pointer(&legacy_sock_name);
-        *daemon = g_steal_pointer(&legacy_daemon);
+        daemon_name = g_steal_pointer(&legacy_daemon);
         break;
 
     case REMOTE_DRIVER_MODE_DIRECT:
@@ -200,7 +222,7 @@ remoteGetUNIXSocket(remoteDriverTransport transport,
         }
 
         sock_name = g_steal_pointer(&direct_sock_name);
-        *daemon = g_steal_pointer(&direct_daemon);
+        daemon_name = g_steal_pointer(&direct_daemon);
         break;
 
     case REMOTE_DRIVER_MODE_AUTO:
@@ -210,8 +232,15 @@ remoteGetUNIXSocket(remoteDriverTransport transport,
         return NULL;
     }
 
-    VIR_DEBUG("Chosen UNIX sockname=%s daemon=%s with mode=%s",
-              sock_name, NULLSTR(*daemon),
+    if (!(*daemon_path = virFileFindResourceFull(daemon_name,
+                                                 NULL, NULL,
+                                                 abs_top_builddir "/src",
+                                                 SBINDIR,
+                                                 env_name)))
+        return NULL;
+
+    VIR_DEBUG("Chosen UNIX sockname=%s daemon_path=%s with mode=%s",
+              sock_name, NULLSTR(*daemon_path),
               remoteDriverModeTypeToString(mode));
     return sock_name;
 }
index 2331f8142526aba4584fc2e2efe885de20dbd507..11934dbf7055ea2670bec5e731a599eeda644c05 100644 (file)
@@ -67,7 +67,7 @@ remoteGetUNIXSocket(remoteDriverTransport transport,
                     remoteDriverMode mode,
                     const char *driver,
                     unsigned int flags, /* remoteDriverOpenFlags */
-                    char **daemon);
+                    char **daemon_path);
 
 void
 remoteGetURIDaemonInfo(virURI *uri,
index 7123fc6d006a896d220a94bc0c647bbcb7109b44..2a24f2df96a5848757010379dbef4842c73440e9 100644 (file)
@@ -358,7 +358,7 @@ int main(int argc, char **argv)
     gboolean version = false;
     gboolean readonly = false;
     g_autofree char *sock_path = NULL;
-    g_autofree char *daemon_name = NULL;
+    g_autofree char *daemon_path = NULL;
     g_autoptr(virNetSocket) sock = NULL;
     GError *error = NULL;
     g_autoptr(GOptionContext) context = NULL;
@@ -429,10 +429,10 @@ int main(int argc, char **argv)
                                     REMOTE_DRIVER_MODE_AUTO,
                                     driver,
                                     flags,
-                                    &daemon_name);
+                                    &daemon_path);
 
     if (virNetSocketNewConnectUNIX(sock_path, flags & REMOTE_DRIVER_OPEN_AUTOSTART,
-                                   daemon_name, &sock) < 0) {
+                                   daemon_path, &sock) < 0) {
         g_printerr(_("%s: cannot connect to '%s': %s\n"),
                    argv[0], sock_path, virGetLastErrorMessage());
         exit(EXIT_FAILURE);