diff --git a/libfwupd/fwupd-client.c b/libfwupd/fwupd-client.c index 7d5515f3c..a7b7feb9e 100644 --- a/libfwupd/fwupd-client.c +++ b/libfwupd/fwupd-client.c @@ -804,6 +804,7 @@ fwupd_client_connect_async(FwupdClient *self, { FwupdClientPrivate *priv = GET_PRIVATE(self); const gchar *socket_filename = g_getenv("FWUPD_DBUS_SOCKET"); + g_autofree gchar *socket_address = NULL; g_autoptr(GTask) task = g_task_new(self, cancellable, callback, callback_data); g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&priv->proxy_mutex); @@ -818,10 +819,18 @@ fwupd_client_connect_async(FwupdClient *self, return; } - /* use peer-to-peer only if the env variable is set */ + /* convert from filename to address, if required */ if (socket_filename != NULL) { - g_autofree gchar *address = g_strdup_printf("unix:path=%s", socket_filename); - g_dbus_connection_new_for_address(address, + if (g_strrstr(socket_filename, "=") == NULL) { + socket_address = g_strdup_printf("unix:path=%s", socket_filename); + } else { + socket_address = g_strdup(socket_filename); + } + } + + /* use peer-to-peer only if the env variable is set */ + if (socket_address != NULL) { + g_dbus_connection_new_for_address(socket_address, G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, NULL, cancellable, diff --git a/src/fu-main.c b/src/fu-main.c index fca8c96d1..fcb8c2877 100644 --- a/src/fu-main.c +++ b/src/fu-main.c @@ -2247,6 +2247,7 @@ main(int argc, char *argv[]) N_("Exit after the engine has loaded"), NULL}, {NULL}}; + g_autofree gchar *socket_address = NULL; g_autoptr(FuMainPrivate) priv = NULL; g_autoptr(GError) error = NULL; g_autoptr(GFile) argv0_file = g_file_new_for_path(argv[0]); @@ -2368,17 +2369,26 @@ main(int argc, char *argv[]) } #endif - /* own the object */ + /* convert from filename to address, if required */ if (socket_filename != NULL) { - g_autofree gchar *address = g_strdup_printf("unix:path=%s", socket_filename); + if (g_strrstr(socket_filename, "=") == NULL) { +#ifndef HAVE_SYSTEMD + /* this must be owned by root */ + if (g_file_test(socket_filename, G_FILE_TEST_EXISTS)) + g_unlink(socket_filename); +#endif + socket_address = g_strdup_printf("unix:path=%s", socket_filename); + } else { + socket_address = g_strdup(socket_filename); + } + } + + /* own the object */ + if (socket_address != NULL) { g_autofree gchar *guid = g_dbus_generate_guid(); g_autoptr(GDBusServer) server = NULL; - /* this must be owned by root */ -#ifndef HAVE_SYSTEMD - g_unlink(socket_filename); -#endif - server = g_dbus_server_new_sync(address, + server = g_dbus_server_new_sync(socket_address, G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS, guid, NULL,