From ab5126f1424828d96190b336cd91976f8a8489f2 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 14 May 2014 14:27:06 -0400 Subject: DBus-activate logind --- src/login1.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/login1.c b/src/login1.c index 7f858d63..60eec457 100644 --- a/src/login1.c +++ b/src/login1.c @@ -14,10 +14,53 @@ #include "login1.h" +static gboolean +start_login1 (void) +{ + GDBusConnection *bus; + GVariant *result; + guint32 success; + + bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); + if (!bus) + return FALSE; + + result = g_dbus_connection_call_sync (bus, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "StartServiceByName", + g_variant_new ("(su)", + "org.freedesktop.login1", + 0), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + NULL); + g_object_unref (bus); + if (!result) + return FALSE; + + g_variant_get (result, "(u)", &success); + g_variant_unref (result); + + return success == 1 || success == 2; // started or already existed +} + gboolean login1_is_running (void) { - return access ("/run/systemd/seats/", F_OK) >= 0; + static gboolean have_checked = FALSE; + static gboolean is_running = FALSE; + + if (!have_checked) + { + have_checked = TRUE; + is_running = start_login1(); + } + + return is_running; } gchar * -- cgit v1.2.1 From eeac8a385a234aa7ee2efda786a101dfc9c59a63 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 14 May 2014 16:19:00 -0400 Subject: Just create proxy and ask for owner rather than manually calling StartServiceByName, to account for versions of login1 that don't have an autostart file, like our test version --- src/login1.c | 47 ++++++++++++++++++++--------------------------- tests/src/libsystem.c | 4 ---- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/login1.c b/src/login1.c index 60eec457..cd780c58 100644 --- a/src/login1.c +++ b/src/login1.c @@ -15,37 +15,30 @@ #include "login1.h" static gboolean -start_login1 (void) +check_login1 (void) { - GDBusConnection *bus; - GVariant *result; - guint32 success; - - bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); - if (!bus) + GDBusProxy *proxy; + gchar *owner; + gboolean success; + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + NULL); + if (!proxy) return FALSE; - result = g_dbus_connection_call_sync (bus, - "org.freedesktop.DBus", - "/org/freedesktop/DBus", - "org.freedesktop.DBus", - "StartServiceByName", - g_variant_new ("(su)", - "org.freedesktop.login1", - 0), - G_VARIANT_TYPE ("(u)"), - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - NULL); - g_object_unref (bus); - if (!result) - return FALSE; + owner = g_dbus_proxy_get_name_owner (proxy); + g_object_unref (proxy); - g_variant_get (result, "(u)", &success); - g_variant_unref (result); + success = (owner != NULL); + g_free (owner); - return success == 1 || success == 2; // started or already existed + return success; } gboolean @@ -57,7 +50,7 @@ login1_is_running (void) if (!have_checked) { have_checked = TRUE; - is_running = start_login1(); + is_running = check_login1(); } return is_running; diff --git a/tests/src/libsystem.c b/tests/src/libsystem.c index 0c25b8c4..83f2467d 100644 --- a/tests/src/libsystem.c +++ b/tests/src/libsystem.c @@ -331,10 +331,6 @@ access (const char *pathname, int mode) gchar *new_path = NULL; int ret; - /* Look like systemd is always running */ - if (strcmp (pathname, "/run/systemd/seats/") == 0) - return 1; - _access = (int (*)(const char *pathname, int mode)) dlsym (RTLD_NEXT, "access"); new_path = redirect_path (pathname); -- cgit v1.2.1