diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2015-10-14 17:00:30 +0100 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2015-10-14 17:00:30 +0100 |
commit | 2bd4dab1a29df610e4cd07c9d89cdc8d6cd43fc9 (patch) | |
tree | 445f924570f61311b2a98f8779c48e4ec900ed37 /src | |
parent | 819a37da75251b5fee553721e25cf30d07fc950a (diff) | |
download | lightdm-2bd4dab1a29df610e4cd07c9d89cdc8d6cd43fc9.tar.gz |
Check the version of the X server we are running so we correctly pass -listen tcp when required.
Also add tests for xserver-allow-tcp function and check in all cases we are listening on tcp/unix only when appropriate.
Diffstat (limited to 'src')
-rw-r--r-- | src/x-server-local.c | 64 | ||||
-rw-r--r-- | src/x-server-local.h | 4 |
2 files changed, 67 insertions, 1 deletions
diff --git a/src/x-server-local.c b/src/x-server-local.c index caff9b46..d9b03982 100644 --- a/src/x-server-local.c +++ b/src/x-server-local.c @@ -74,8 +74,65 @@ struct XServerLocalPrivate G_DEFINE_TYPE (XServerLocal, x_server_local, X_SERVER_TYPE); +static gchar *version = NULL; +static guint version_major = 0, version_minor = 0; static GList *display_numbers = NULL; +#define XORG_VERSION_PREFIX "X.Org X Server " + +static gchar * +find_version (const gchar *line) +{ + if (!g_str_has_prefix (line, XORG_VERSION_PREFIX)) + return NULL; + + return g_strdup (line + strlen (XORG_VERSION_PREFIX)); +} + +const gchar * +x_server_local_get_version (void) +{ + gchar *stderr_text; + gint exit_status; + gchar **tokens; + guint n_tokens; + + if (version) + return version; + + if (!g_spawn_command_line_sync ("X -version", NULL, &stderr_text, &exit_status, NULL)) + return NULL; + if (exit_status == EXIT_SUCCESS) + { + gchar **lines; + int i; + + lines = g_strsplit (stderr_text, "\n", -1); + for (i = 0; lines[i] && !version; i++) + version = find_version (lines[i]); + g_strfreev (lines); + } + g_free (stderr_text); + + tokens = g_strsplit (version, ".", 3); + n_tokens = g_strv_length (tokens); + version_major = n_tokens > 0 ? atoi (tokens[0]) : 0; + version_minor = n_tokens > 1 ? atoi (tokens[1]) : 0; + g_strfreev (tokens); + + return version; +} + +gint +x_server_local_version_compare (guint major, guint minor) +{ + x_server_local_get_version (); + if (major == version_major) + return version_minor - minor; + else + return version_major - major; +} + static gboolean display_number_in_use (guint display_number) { @@ -483,7 +540,12 @@ x_server_local_start (DisplayServer *display_server) if (server->priv->xdmcp_key) g_string_append_printf (command, " -cookie %s", server->priv->xdmcp_key); } - else if (!server->priv->allow_tcp) + else if (server->priv->allow_tcp) + { + if (x_server_local_version_compare (1, 17) >= 0) + g_string_append (command, " -listen tcp"); + } + else g_string_append (command, " -nolisten tcp"); if (server->priv->vt >= 0) diff --git a/src/x-server-local.h b/src/x-server-local.h index 7ed5732c..e20a86cd 100644 --- a/src/x-server-local.h +++ b/src/x-server-local.h @@ -33,6 +33,10 @@ typedef struct XServerClass parent_class; } XServerLocalClass; +const gchar *x_server_local_get_version (void); + +gint x_server_local_version_compare (guint major, guint minor); + guint x_server_local_get_unused_display_number (void); void x_server_local_release_display_number (guint display_number); |