static gboolean discover_other_daemon (DiscoverFunc callback, gboolean acquire) { const gchar *control_env; gchar *control = NULL; gboolean acquired = FALSE; gboolean ret; /* A pre-specified directory to control at, don't try anything else */ if (control_directory) return (callback) (control_directory); /* An environment variable from an already running daemon */ control_env = g_getenv (GKD_UTIL_ENV_CONTROL); if (control_env && control_env[0]) { if ((callback)(control_env)) return TRUE; } /* Or the default location when no evironment variable */ control_env = g_getenv ("XDG_RUNTIME_DIR"); if (control_env) { control = g_build_filename (control_env, "keyring", NULL); ret = (callback) (control); g_free (control); if (ret == TRUE) return TRUE; } /* See if we can contact a daemon running, that didn't set an env variable */ if (acquire && !gkd_dbus_singleton_acquire (&acquired)) return FALSE; /* We're the main daemon */ if (acquired) return FALSE; control = gkd_dbus_singleton_control (); if (control) { ret = (callback) (control); g_free (control); if (ret == TRUE) return TRUE; } return FALSE; }
gboolean gkd_dbus_setup (void) { gboolean unused; if (!connect_to_session_bus ()) return FALSE; /* Our singleton, and internal service API */ gkd_dbus_singleton_acquire (&unused); /* Session stuff */ gkd_dbus_environment_init (dbus_conn); gkd_dbus_session_init (dbus_conn); /* Secrets API */ gkd_dbus_secrets_init (dbus_conn); egg_cleanup_register (dbus_cleanup, NULL); return TRUE; }