summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2015-10-14 17:00:30 +0100
committerRobert Ancell <robert.ancell@canonical.com>2015-10-14 17:00:30 +0100
commit2bd4dab1a29df610e4cd07c9d89cdc8d6cd43fc9 (patch)
tree445f924570f61311b2a98f8779c48e4ec900ed37 /src
parent819a37da75251b5fee553721e25cf30d07fc950a (diff)
downloadlightdm-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.c64
-rw-r--r--src/x-server-local.h4
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);