]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/login1.c
DBus-activate logind
[sojka/lightdm.git] / src / login1.c
index 3ddd2ade11d90478e888221e16614da64e670f2c..60eec45781f41bba46a25f7d4f4a4a0fb18df532 100644 (file)
 
 #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 *
@@ -136,28 +179,49 @@ login1_unlock_session (const gchar *session_path)
         if (error)
             g_warning ("Error unlocking login1 session: %s", error->message);
         g_clear_error (&error);
-
         if (result)
-        {
             g_variant_unref (result);
+    }
+    g_object_unref (bus);
+}
+
+void
+login1_activate_session (const gchar *session_path)
+{
+    GDBusConnection *bus;
+    GError *error = NULL;
+
+    g_return_if_fail (session_path != NULL);
+
+    g_debug ("Activating login1 session %s", session_path);
+
+    bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+    if (error)
+        g_warning ("Failed to get system bus: %s", error->message);
+    g_clear_error (&error);
+    if (!bus)
+        return;
+
+    if (session_path)
+    {
+        GVariant *result;
 
-            result = g_dbus_connection_call_sync (bus,
-                                                  "org.freedesktop.login1",
-                                                  session_path,
-                                                  "org.freedesktop.login1.Session",
-                                                  "Activate",
-                                                  g_variant_new ("()"),
-                                                  G_VARIANT_TYPE ("()"),
-                                                  G_DBUS_CALL_FLAGS_NONE,
-                                                  -1,
-                                                  NULL,
-                                                  &error);
-            if (error)
-                g_warning ("Error activating login1 session: %s", error->message);
-            g_clear_error (&error);
-            if (result)
-                g_variant_unref (result);
-        }
+        result = g_dbus_connection_call_sync (bus,
+                                              "org.freedesktop.login1",
+                                              session_path,
+                                              "org.freedesktop.login1.Session",
+                                              "Activate",
+                                              g_variant_new ("()"),
+                                              G_VARIANT_TYPE ("()"),
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              -1,
+                                              NULL,
+                                              &error);
+        if (error)
+            g_warning ("Error activating login1 session: %s", error->message);
+        g_clear_error (&error);
+        if (result)
+            g_variant_unref (result);
     }
     g_object_unref (bus);
 }