X-Git-Url: http://rtime.felk.cvut.cz/gitweb/sojka/lightdm.git/blobdiff_plain/0218dd231dfa3e35b39906279cee40d2590df8a0..c730fa74f5b201a2997734330b3598c706179d74:/src/lightdm.c diff --git a/src/lightdm.c b/src/lightdm.c index f2c300f2..fd62314c 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -33,6 +33,7 @@ #include "shared-data-manager.h" #include "user-list.h" #include "login1.h" +#include "log-file.h" static gchar *config_path = NULL; static GMainLoop *loop = NULL; @@ -124,7 +125,8 @@ log_cb (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, static void log_init (void) { - gchar *log_dir, *path, *old_path; + gchar *log_dir, *path; + gboolean backup_logs; log_timer = g_timer_new (); @@ -133,13 +135,8 @@ log_init (void) path = g_build_filename (log_dir, "lightdm.log", NULL); g_free (log_dir); - /* Move old file out of the way */ - old_path = g_strdup_printf ("%s.old", path); - rename (path, old_path); - g_free (old_path); - - /* Create new file and log to it */ - log_fd = open (path, O_WRONLY | O_CREAT | O_TRUNC, 0600); + 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); @@ -153,9 +150,8 @@ get_config_sections (const gchar *seat_name) gchar **groups, **i; GList *config_sections = NULL; - /* Load seat defaults first and support old method of [SeatDefaults] */ + /* Load seat defaults first */ config_sections = g_list_append (config_sections, g_strdup ("Seat:*")); - config_sections = g_list_append (config_sections, g_strdup ("SeatDefaults")); groups = config_get_groups (config_get_instance ()); for (i = groups; *i; i++) @@ -200,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 @@ -212,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) { @@ -231,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 @@ -348,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; @@ -883,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; + gchar *key_name, *key = NULL, *listen_address, *hostname; xdmcp_server = xdmcp_server_new (); if (config_has_key (config_get_instance (), "XDMCPServer", "port")) @@ -893,6 +910,12 @@ bus_acquired_cb (GDBusConnection *connection, if (port > 0) xdmcp_server_set_port (xdmcp_server, port); } + 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"); @@ -908,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) @@ -916,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); @@ -925,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 */ @@ -938,6 +970,8 @@ bus_acquired_cb (GDBusConnection *connection, path = g_find_program_in_path ("Xvnc"); if (path) { + gchar *listen_address; + vnc_server = vnc_server_new (); if (config_has_key (config_get_instance (), "VNCServer", "port")) { @@ -946,6 +980,9 @@ bus_acquired_cb (GDBusConnection *connection, if (port > 0) vnc_server_set_port (vnc_server, port); } + listen_address = config_get_string (config_get_instance (), "VNCServer", "listen-address"); + vnc_server_set_listen_address (vnc_server, listen_address); + g_free (listen_address); g_signal_connect (vnc_server, VNC_SERVER_SIGNAL_NEW_CONNECTION, G_CALLBACK (vnc_connection_cb), NULL); g_debug ("Starting VNC server on TCP/IP port %d", vnc_server_get_port (vnc_server)); @@ -994,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) @@ -1012,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; @@ -1087,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); @@ -1188,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); @@ -1369,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")) @@ -1396,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")) @@ -1416,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) @@ -1502,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; } @@ -1532,8 +1579,7 @@ main (int argc, char **argv) common_user_list_cleanup (); /* Clean up display manager */ - g_object_unref (display_manager); - display_manager = NULL; + g_clear_object (&display_manager); /* Remove D-Bus interface */ g_dbus_connection_unregister_object (bus, reg_id);