rpc: don't try to spawn non-existant daemon

If libvirt is built in client only mode, the libvirtd/virtqemud/etc
daemons won't exist. If the client is told to connect to a local
hypervisor, it'll see the socket doesn't exist, try to spawn the
daemon and then re-try connecting to the socket for a few seconds.
Ultimately this will fail because the daemon doesn't exist and the
user gets an error message

  error: Failed to connect socket to '/run/user/1000/libvirt/virtqemud-sock': No such file or directory

technically this is accurate, but it doesn't help identify the root
cause. With this change it will now report

  error: binary 'virtqemud' does not exist in $PATH: No such file or directory

and will skip all the socket connect retries

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2023-01-25 14:23:48 +00:00
parent da1057c8eb
commit 3b45fcd6b6

View File

@ -123,9 +123,19 @@ VIR_ONCE_GLOBAL_INIT(virNetSocket);
#ifndef WIN32 #ifndef WIN32
static int virNetSocketForkDaemon(const char *binary) static int virNetSocketForkDaemon(const char *binary)
{ {
g_autoptr(virCommand) cmd = virCommandNewArgList(binary, g_autofree char *binarypath = virFindFileInPath(binary);
"--timeout=120", g_autoptr(virCommand) cmd = NULL;
NULL);
if (!binarypath) {
virReportSystemError(ENOENT,
_("binary '%1$s' does not exist in $PATH"),
binary);
return -1;
}
cmd = virCommandNewArgList(binarypath,
"--timeout=120",
NULL);
virCommandAddEnvPassCommon(cmd); virCommandAddEnvPassCommon(cmd);
virCommandAddEnvPass(cmd, "XDG_CACHE_HOME"); virCommandAddEnvPass(cmd, "XDG_CACHE_HOME");