]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Fix up some failure cases
authorRobert Ancell <robert.ancell@canonical.com>
Tue, 16 Jul 2013 05:35:54 +0000 (17:35 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Tue, 16 Jul 2013 05:35:54 +0000 (17:35 +1200)
src/greeter.c
src/greeter.h
src/seat.c
src/session.c
src/session.h

index 5af735783265266a87d3e2957647db09f7837811..2ef4dcdc4d45a97aba62fdcc5333116376aa32ba 100644 (file)
@@ -55,6 +55,9 @@ struct GreeterPrivate
     /* PAM session being constructed by the greeter */
     Session *authentication_session;
 
+    /* TRUE if a user has been authenticated and the session requested to start */
+    gboolean start_session;
+
     /* TRUE if can log into guest accounts */
     gboolean allow_guest;
 
@@ -568,6 +571,7 @@ handle_start_session (Greeter *greeter, const gchar *session)
             g_debug ("Greeter requests session %s", session);
         else
             g_debug ("Greeter requests default session");
+        greeter->priv->start_session = TRUE;
         g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result);
     }
     else
@@ -807,6 +811,13 @@ greeter_get_authentication_session (Greeter *greeter)
     return greeter->priv->authentication_session;
 }
 
+gboolean
+greeter_get_start_session (Greeter *greeter)
+{
+    g_return_val_if_fail (greeter != NULL, FALSE);
+    return greeter->priv->start_session;
+}
+
 static gboolean
 greeter_start (Session *session)
 {
index 858c4c1d950263940ed96b6c360745599d1bc1c9..aa9fbc8ea1dafa0309d9969d812c49bc185729b6 100644 (file)
@@ -50,6 +50,8 @@ gboolean greeter_get_guest_authenticated (Greeter *greeter);
 
 Session *greeter_get_authentication_session (Greeter *greeter);
 
+gboolean greeter_get_start_session (Greeter *greeter);
+
 G_END_DECLS
 
 #endif /* GREETER_H_ */
index 986d7d278c6789ef0fb6ed518d05123b6a930da7..c0e7f3222a1be0be8967f694dc9c39ddeaf86823 100644 (file)
@@ -308,7 +308,6 @@ static void
 display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
 {
     GList *link;
-    gboolean had_greeter = FALSE;
 
     g_debug ("Display server stopped");
 
@@ -323,28 +322,27 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
     {
         Session *session = link->data;
 
-        if (session_get_display_server (session) == display_server)
-        {
-            if (IS_GREETER (session)) // FIXME: Only if running?
-                had_greeter = TRUE;
+        if (session_get_display_server (session) != display_server)
+            continue;
 
-            g_debug ("Stopping session");
-            session_stop (session);
+        /* Stop seat if this is the only display server and it failed to start a greeter */
+        if (IS_GREETER (session) &&
+            !session_get_is_started (session) &&
+            g_list_length (seat->priv->display_servers) == 0)
+        {
+            g_debug ("Stopping seat, greeter display server failed to start");
+            seat_stop (seat);
         }
+
+        g_debug ("Stopping session");
+        session_stop (session);
     }
 
+    /* Show a greeter if everything fails */
     if (!seat->priv->stopping && g_list_length (seat->priv->display_servers) == 0)
     {
-        if (had_greeter)
-        {
-            g_debug ("Stopping seat, failed to get to a greeter");
-            seat_stop (seat);         
-        }
-        else
-        {
-            g_debug ("All display servers stopped, showing a greeter");
-            seat_switch_to_greeter (seat);
-        }
+        g_debug ("All display servers stopped, showing a greeter");
+        seat_switch_to_greeter (seat);
     }
 }
 
@@ -380,7 +378,7 @@ session_authentication_complete_cb (Session *session, Seat *seat)
         g_debug ("Session authenticated, running command");
         run_session (seat, session);
     }
-    else
+    else if (!IS_GREETER (session))
     {
         Greeter *greeter_session;
 
@@ -394,6 +392,11 @@ session_authentication_complete_cb (Session *session, Seat *seat)
 
         session_start (SESSION (greeter_session));
     }
+    else
+    {
+        g_debug ("Stopping session that failed authentication");
+        session_stop (session);
+    }
 }
 
 static void
@@ -422,24 +425,39 @@ session_stopped_cb (Session *session, Seat *seat)
 
     check_stopped (seat);
   
-    /* If this is the greeter session then re-use this display server */
-    if (!seat->priv->stopping && IS_GREETER (session) && seat->priv->share_display_server)
+    if (!seat->priv->stopping)
     {
-        GList *link;
-
-        for (link = seat->priv->sessions; link; link = link->next)
+        /* If this is the greeter session then re-use this display server */
+        if (IS_GREETER (session) &&
+            seat->priv->share_display_server &&
+            greeter_get_start_session (GREETER (session)))
         {
-            Session *s = link->data;
+            GList *link;
 
-            /* Skip this session */
-            if (s == session)
-                continue;
-
-            if (session_get_display_server (s) == display_server && session_get_is_authenticated (s))
+            for (link = seat->priv->sessions; link; link = link->next)
             {
-                g_debug ("Starting session re-using greeter display server");
-                run_session (seat, s);
-            }
+                Session *s = link->data;
+
+                /* Skip this session */
+                if (s == session)
+                    continue;
+
+                if (session_get_display_server (s) == display_server && session_get_is_authenticated (s))
+                {
+                    g_debug ("Starting session re-using greeter display server");
+                    run_session (seat, s);
+                }
+            }          
+        }
+
+        /* if this is the greeter and nothing else is running then stop the seat */
+        if (IS_GREETER (session) &&
+            !greeter_get_start_session (GREETER (session)) &&
+            g_list_length (seat->priv->display_servers) == 1 &&
+            g_list_nth_data (seat->priv->display_servers, 0) == display_server)
+        {
+            g_debug ("Stopping seat, failed to start a greeter");
+            seat_stop (seat);
         }
     }
 
@@ -717,6 +735,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     {
         /* Run on the same display server after the greeter has stopped */
         session_set_display_server (session, session_get_display_server (SESSION (greeter)));
+
+        g_debug ("Stopping greeter");
         session_stop (SESSION (greeter));
 
         return TRUE;
index 0edd1672a4eca3f7d0c1eeb18f5caaba794fdc10..f09c40fa381975ffe019b7c48017cb562f40c64a 100644 (file)
@@ -448,6 +448,12 @@ session_start (Session *session)
     return SESSION_GET_CLASS (session)->start (session);
 }
 
+gboolean
+session_get_is_started (Session *session)
+{
+    return session->priv->pid != 0;
+}
+
 static gboolean
 session_real_start (Session *session)
 {
index 7b06af1f1890e7ae8df51746d53e97238f98ba6b..dfa689f6d4376bc722730d80a38cda6270e68162 100644 (file)
@@ -93,6 +93,8 @@ User *session_get_user (Session *session);
 
 gboolean session_start (Session *session);
 
+gboolean session_get_is_started (Session *session);
+
 const gchar *session_get_username (Session *session);
 
 const gchar *session_get_console_kit_cookie (Session *session);