diff --git a/common/configuration.c b/common/configuration.c index 30580ead..6a0f1dc9 100644 --- a/common/configuration.c +++ b/common/configuration.c @@ -346,6 +346,7 @@ config_init (Configuration *config) g_hash_table_insert (config->priv->lightdm_keys, "greeters-directory", GINT_TO_POINTER (KEY_SUPPORTED)); g_hash_table_insert (config->priv->lightdm_keys, "backup-logs", GINT_TO_POINTER (KEY_SUPPORTED)); g_hash_table_insert (config->priv->lightdm_keys, "dbus-service", GINT_TO_POINTER (KEY_SUPPORTED)); + g_hash_table_insert (config->priv->lightdm_keys, "xsession-errors-path", GINT_TO_POINTER (KEY_SUPPORTED)); g_hash_table_insert (config->priv->lightdm_keys, "logind-load-seats", GINT_TO_POINTER (KEY_DEPRECATED)); g_hash_table_insert (config->priv->seat_keys, "type", GINT_TO_POINTER (KEY_SUPPORTED)); diff --git a/data/lightdm.conf b/data/lightdm.conf index 60e3e8b4..a513833d 100644 --- a/data/lightdm.conf +++ b/data/lightdm.conf @@ -17,6 +17,7 @@ # greeters-directory = Directory to find greeters # backup-logs = True to move add a .old suffix to old log files when opening new ones # dbus-service = True if LightDM provides a D-Bus service to control it +# xsession-errors-path = Log file for X session errors, relative to $HOME. Supports environment expansion. # [LightDM] #start-default-seat=true @@ -35,6 +36,7 @@ #greeters-directory=$XDG_DATA_DIRS/lightdm/greeters:$XDG_DATA_DIRS/xgreeters #backup-logs=true #dbus-service=true +#xsession-errors-path=.xsession-errors # # Seat configuration diff --git a/src/lightdm.c b/src/lightdm.c index 2821a1c9..2f5a3a41 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -773,6 +773,8 @@ main (int argc, char **argv) config_set_boolean (config_get_instance (), "LightDM", "backup-logs", TRUE); if (!config_has_key (config_get_instance (), "LightDM", "dbus-service")) config_set_boolean (config_get_instance (), "LightDM", "dbus-service", TRUE); + if (!config_has_key (config_get_instance (), "LightDM", "xsession-errors-path")) + config_set_string (config_get_instance (), "LightDM", "xsession-errors-path", ".xsession-errors"); if (!config_has_key (config_get_instance (), "Seat:*", "type")) config_set_string (config_get_instance (), "Seat:*", "type", "local"); if (!config_has_key (config_get_instance (), "Seat:*", "pam-service")) diff --git a/src/session.c b/src/session.c index d0d8a235..632fb9a6 100644 --- a/src/session.c +++ b/src/session.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -995,12 +996,41 @@ session_get_is_stopping (Session *session) return priv->stopping; } +static gboolean +expand_cb (const GMatchInfo *info, GString *result, gpointer data) +{ + gchar *match; + const gchar *env_text; + + match = g_match_info_fetch (info, 1); + env_text = g_getenv (match); + if (env_text) + { + g_string_append (result, env_text); + }; + g_free (match); + + return FALSE; +} + +static gchar * +expand_environment (const gchar *text) +{ + GRegex *pattern; + gchar *result; + + pattern = g_regex_new("\\$(?|\\{([a-zA-Z_][a-zA-Z_0-9]*)\\}|([a-zA-Z_][a-zA-Z_0-9]*))", G_REGEX_RAW, G_REGEX_MATCH_DEFAULT, NULL); + result = g_regex_replace_eval (pattern, text, -1, 0, 0, expand_cb, NULL, NULL); + + return result; +} + static void session_init (Session *session) { SessionPrivate *priv = session_get_instance_private (session); - priv->log_filename = g_strdup (".xsession-errors"); + priv->log_filename = expand_environment (config_get_string (config_get_instance(), "LightDM", "xsession-errors-path")); priv->log_mode = LOG_MODE_BACKUP_AND_TRUNCATE; priv->to_child_input = -1; priv->from_child_output = -1;