]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/lightdm.c
Re-enable SIGPIPE for children so they have default behaviour
[sojka/lightdm.git] / src / lightdm.c
index 3246b6ab9da13e15f8ce0abbe3f9fe4a43232087..fd62314cfe406d44aa2a164e1ba0e974bd7a02f0 100644 (file)
@@ -126,6 +126,7 @@ static void
 log_init (void)
 {
     gchar *log_dir, *path;
+    gboolean backup_logs;
 
     log_timer = g_timer_new ();
 
@@ -134,7 +135,8 @@ log_init (void)
     path = g_build_filename (log_dir, "lightdm.log", NULL);
     g_free (log_dir);
 
-    log_fd = log_file_open (path, LOG_MODE_APPEND);
+    backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs");
+    log_fd = log_file_open (path, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND);
     fcntl (log_fd, F_SETFD, FD_CLOEXEC);
     g_log_set_default_handler (log_cb, NULL);
 
@@ -194,9 +196,19 @@ set_seat_properties (Seat *seat, const gchar *seat_name)
 static void
 signal_cb (Process *process, int signum)
 {
-    g_debug ("Caught %s signal, shutting down", g_strsignal (signum));
-    display_manager_stop (display_manager);
-    // FIXME: Stop XDMCP server
+    switch (signum)
+    {
+    case SIGINT:
+    case SIGTERM:
+        g_debug ("Caught %s signal, shutting down", g_strsignal (signum));
+        display_manager_stop (display_manager);
+        // FIXME: Stop XDMCP server
+        break;
+    case SIGUSR1:
+    case SIGUSR2:
+    case SIGHUP:
+        break;
+    }
 }
 
 static void
@@ -206,6 +218,17 @@ display_manager_stopped_cb (DisplayManager *display_manager)
     g_main_loop_quit (loop);
 }
 
+static Seat *
+create_seat (const gchar *module_name, const gchar *name)
+{
+    if (strcmp (module_name, "xlocal") == 0) {
+        g_warning ("Seat type 'xlocal' is deprecated, use 'type=local' instead");
+        return seat_new ("local", name);
+    }
+    else
+        return seat_new (module_name, name);
+}
+
 static void
 display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat)
 {
@@ -225,7 +248,7 @@ display_manager_seat_removed_cb (DisplayManager *display_manager, Seat *seat)
 
         if (!next_seat)
         {
-            next_seat = seat_new (*iter, seat_get_name (seat));
+            next_seat = create_seat (*iter, seat_get_name (seat));
             g_string_assign (next_types, *iter);
         }
         else
@@ -342,7 +365,7 @@ handle_display_manager_call (GDBusConnection       *connection,
 
         g_debug ("Adding local X seat :%d", display_number);
 
-        seat = seat_new ("xremote", "xremote0"); // FIXME: What to use for a name?
+        seat = create_seat ("xremote", "xremote0"); // FIXME: What to use for a name?
         if (seat)
         {
             gchar *display_number_string;
@@ -877,7 +900,7 @@ bus_acquired_cb (GDBusConnection *connection,
     /* Start the XDMCP server */
     if (config_get_boolean (config_get_instance (), "XDMCPServer", "enabled"))
     {
-        gchar *key_name, *key = NULL, *listen_address;
+        gchar *key_name, *key = NULL, *listen_address, *hostname;
 
         xdmcp_server = xdmcp_server_new ();
         if (config_has_key (config_get_instance (), "XDMCPServer", "port"))
@@ -890,6 +913,9 @@ bus_acquired_cb (GDBusConnection *connection,
         listen_address = config_get_string (config_get_instance (), "XDMCPServer", "listen-address");
         xdmcp_server_set_listen_address (xdmcp_server, listen_address);
         g_free (listen_address);
+        hostname = config_get_string (config_get_instance (), "XDMCPServer", "hostname");
+        xdmcp_server_set_hostname (xdmcp_server, hostname);
+        g_free (hostname);
         g_signal_connect (xdmcp_server, XDMCP_SERVER_SIGNAL_NEW_SESSION, G_CALLBACK (xdmcp_session_cb), NULL);
 
         key_name = config_get_string (config_get_instance (), "XDMCPServer", "key");
@@ -905,7 +931,7 @@ bus_acquired_cb (GDBusConnection *connection,
             keys = g_key_file_new ();
             result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
             if (error)
-                g_debug ("Error getting key %s", error->message);
+                g_warning ("Unable to load keys from %s: %s", path, error->message);
             g_clear_error (&error);
 
             if (result)
@@ -913,7 +939,7 @@ bus_acquired_cb (GDBusConnection *connection,
                 if (g_key_file_has_key (keys, "keyring", key_name, NULL))
                     key = g_key_file_get_string (keys, "keyring", key_name, NULL);
                 else
-                    g_debug ("Key %s not defined", key_name);
+                    g_warning ("Key %s not defined", key_name);
             }
             g_free (path);
             g_key_file_free (keys);
@@ -922,9 +948,18 @@ bus_acquired_cb (GDBusConnection *connection,
             xdmcp_server_set_key (xdmcp_server, key);
         g_free (key_name);
         g_free (key);
-
-        g_debug ("Starting XDMCP server on UDP/IP port %d", xdmcp_server_get_port (xdmcp_server));
-        xdmcp_server_start (xdmcp_server);
+      
+        if (key_name && !key)
+        {
+            exit_code = EXIT_FAILURE;
+            display_manager_stop (display_manager);
+            return;
+        }
+        else
+        {
+            g_debug ("Starting XDMCP server on UDP/IP port %d", xdmcp_server_get_port (xdmcp_server));
+            xdmcp_server_start (xdmcp_server);
+        }
     }
 
     /* Start the VNC server */
@@ -996,7 +1031,7 @@ add_login1_seat (Login1Seat *login1_seat)
     g_list_free_full (config_sections, g_free);
 
     for (type = types; !seat && type && *type; type++)
-        seat = seat_new (*type, seat_name);
+        seat = create_seat (*type, seat_name);
     g_strfreev (types);
 
     if (seat)
@@ -1014,15 +1049,14 @@ add_login1_seat (Login1Seat *login1_seat)
             seat_set_property (seat, "exit-on-failure", "true");
     }
     else
-        g_debug ("Unable to create seat: %s", seat_name);
-
-    if (seat)
     {
-        started = display_manager_add_seat (display_manager, seat);
-        if (!started)
-            g_debug ("Failed to start seat: %s", seat_name);
+        g_debug ("Unable to create seat: %s", seat_name);
+        return FALSE;
     }
 
+    started = display_manager_add_seat (display_manager, seat);
+    if (!started)
+        g_debug ("Failed to start seat: %s", seat_name);
     g_object_unref (seat);
 
     return started;
@@ -1089,9 +1123,10 @@ login1_active_session_changed_cb (Login1Seat *login1_seat, const gchar *login1_s
     if (seat)
     {
         Session *active_session;
-        active_session = seat_get_expected_active_session (seat);
 
-        if (g_strcmp0 (login1_session_id, session_get_login1_session_id (active_session)) == 0)
+        active_session = seat_get_expected_active_session (seat);
+        if (active_session != NULL &&
+            g_strcmp0 (login1_session_id, session_get_login1_session_id (active_session)) == 0)
         {
             // Session is already active
             g_debug ("Session %s is already active", login1_session_id);
@@ -1190,6 +1225,12 @@ main (int argc, char **argv)
     };
     GError *error = NULL;
 
+    /* Disable the SIGPIPE handler - this is a stupid Unix hangover behaviour.
+     * We will handle piples / sockets being closed instead of having the whole daemon be killed...
+     * http://stackoverflow.com/questions/8369506/why-does-sigpipe-exist
+     */
+    signal (SIGPIPE, SIG_IGN);
+
     /* When lightdm starts sessions it needs to run itself in a new mode */
     if (argc >= 2 && strcmp (argv[1], "--session-child") == 0)
         return session_child_run (argc, argv);
@@ -1371,8 +1412,10 @@ main (int argc, char **argv)
         config_set_string (config_get_instance (), "LightDM", "greeter-user", GREETER_USER);
     if (!config_has_key (config_get_instance (), "LightDM", "lock-memory"))
         config_set_boolean (config_get_instance (), "LightDM", "lock-memory", TRUE);
+    if (!config_has_key (config_get_instance (), "LightDM", "backup-logs"))
+        config_set_boolean (config_get_instance (), "LightDM", "backup-logs", TRUE);
     if (!config_has_key (config_get_instance (), "Seat:*", "type"))
-        config_set_string (config_get_instance (), "Seat:*", "type", "xlocal");
+        config_set_string (config_get_instance (), "Seat:*", "type", "local");
     if (!config_has_key (config_get_instance (), "Seat:*", "pam-service"))
         config_set_string (config_get_instance (), "Seat:*", "pam-service", "lightdm");
     if (!config_has_key (config_get_instance (), "Seat:*", "pam-autologin-service"))
@@ -1398,9 +1441,9 @@ main (int argc, char **argv)
     if (!config_has_key (config_get_instance (), "Seat:*", "greeter-show-remote-login"))
         config_set_boolean (config_get_instance (), "Seat:*", "greeter-show-remote-login", TRUE);
     if (!config_has_key (config_get_instance (), "Seat:*", "greeter-session"))
-        config_set_string (config_get_instance (), "Seat:*", "greeter-session", GREETER_SESSION);
+        config_set_string (config_get_instance (), "Seat:*", "greeter-session", DEFAULT_GREETER_SESSION);
     if (!config_has_key (config_get_instance (), "Seat:*", "user-session"))
-        config_set_string (config_get_instance (), "Seat:*", "user-session", USER_SESSION);
+        config_set_string (config_get_instance (), "Seat:*", "user-session", DEFAULT_USER_SESSION);
     if (!config_has_key (config_get_instance (), "Seat:*", "session-wrapper"))
         config_set_string (config_get_instance (), "Seat:*", "session-wrapper", "lightdm-session");
     if (!config_has_key (config_get_instance (), "LightDM", "log-directory"))
@@ -1418,6 +1461,8 @@ main (int argc, char **argv)
         config_set_string (config_get_instance (), "LightDM", "remote-sessions-directory", REMOTE_SESSIONS_DIR);
     if (!config_has_key (config_get_instance (), "LightDM", "greeters-directory"))
         config_set_string (config_get_instance (), "LightDM", "greeters-directory", GREETERS_DIR);
+    if (!config_has_key (config_get_instance (), "XDMCPServer", "hostname"))
+        config_set_string (config_get_instance (), "XDMCPServer", "hostname", g_get_host_name ());
 
     /* Override defaults */
     if (log_dir)
@@ -1504,7 +1549,7 @@ main (int argc, char **argv)
             types = config_get_string_list (config_get_instance (), "Seat:*", "type");
             for (type = types; type && *type; type++)
             {
-                seat = seat_new (*type, "seat0");
+                seat = create_seat (*type, "seat0");
                 if (seat)
                     break;
             }