Index: libvirt-0.7.0/src/remote_internal.c =================================================================== --- libvirt-0.7.0.orig/src/remote_internal.c +++ libvirt-0.7.0/src/remote_internal.c @@ -726,12 +726,29 @@ doRemoteOpen (virConnectPtr conn, cmd_argv[j++] = strdup ("none"); } cmd_argv[j++] = strdup (priv->hostname); - cmd_argv[j++] = strdup (netcat ? netcat : "nc"); - cmd_argv[j++] = strdup ("-U"); - cmd_argv[j++] = strdup (sockname ? sockname : - (flags & VIR_CONNECT_RO - ? LIBVIRTD_PRIV_UNIX_SOCKET_RO - : LIBVIRTD_PRIV_UNIX_SOCKET)); + if (netcat) { + cmd_argv[j++] = strdup (netcat); + cmd_argv[j++] = strdup ("-U"); + cmd_argv[j++] = strdup (sockname ? sockname : + (flags & VIR_CONNECT_RO + ? LIBVIRTD_PRIV_UNIX_SOCKET_RO + : LIBVIRTD_PRIV_UNIX_SOCKET)); + } else { + cmd_argv[j++] = strdup ("socat"); + cmd_argv[j++] = strdup ("-"); + + char *socat_addr = NULL; + if ((asprintf (&socat_addr, "GOPEN:%s", + sockname ? sockname : + (flags & VIR_CONNECT_RO + ? LIBVIRTD_PRIV_UNIX_SOCKET_RO + : LIBVIRTD_PRIV_UNIX_SOCKET))) < 0) { + error (conn, VIR_ERR_SYSTEM_ERROR, strerror (ENOMEM)); + goto failed; + } + cmd_argv[j++] = strdup (socat_addr); + VIR_FREE(socat_addr); + } cmd_argv[j++] = 0; assert (j == nr_args); for (j = 0; j < (nr_args-1); j++)