/* Skip authentication process for kdbus transport */
if (connection->kdbus_worker)
{
+ if (!_g_kdbus_can_connect (connection->kdbus_worker,
+ &connection->initialization_error))
+ goto out;
+
/* kdbus connection always supports exchanging UNIX file descriptors with the remote peer */
connection->capabilities |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING;
goto authenticated;
{
GObject parent_instance;
+ const gchar *address;
gint fd;
GMainContext *context;
g_return_val_if_fail (G_IS_KDBUS_WORKER (worker), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-#ifdef LIBDBUSPOLICY
- worker->dbuspolicy = dbuspolicy1_init (address);
- if (worker->dbuspolicy == NULL)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot load dbus policy for kdbus transport or access to bus denied by security policy"));
- return FALSE;
- }
-#endif
-
worker->fd = g_open(address, O_RDWR|O_NOCTTY|O_CLOEXEC, 0);
if (worker->fd<0)
{
-#ifdef LIBDBUSPOLICY
- dbuspolicy1_free (worker->dbuspolicy);
- worker->dbuspolicy = NULL;
-#endif
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot open kdbus endpoint"));
return FALSE;
}
+ worker->address = g_strdup(address);
worker->closed = FALSE;
return TRUE;
}
return FALSE;
}
+gboolean
+_g_kdbus_can_connect (GKDBusWorker *worker,
+ GError **error)
+{
+#ifdef LIBDBUSPOLICY
+ worker->dbuspolicy = dbuspolicy1_init (worker->address);
+ if (worker->dbuspolicy == NULL)
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot load dbus policy for kdbus transport or access to bus denied by security policy"));
+ return FALSE;
+ }
+#endif
+ return TRUE;
+}
+
/*
* _g_kdbus_close
*/
worker->thread = NULL;
+ g_free (worker->address);
+
close (worker->fd);
worker->fd = -1;
const gchar *address,
GError **error);
+gboolean _g_kdbus_can_connect (GKDBusWorker *worker,
+ GError **error);
+
gboolean _g_kdbus_close (GKDBusWorker *worker);
gboolean _g_kdbus_is_closed (GKDBusWorker *worker);