log_init (void)
{
gchar *log_dir, *path;
+ gboolean backup_logs;
log_timer = g_timer_new ();
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);
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
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)
{
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
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;
/* 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"))
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");
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)
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);
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 */
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)
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;
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);
};
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);
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"))
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"))
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)
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;
}