aboutsummaryrefslogtreecommitdiff
path: root/debian/patches/1600_nxcomp-handle-launchd-socket-in-Auth.full+lite.patch
blob: d9726dc39338aa600c17df3fd5f504b70633089c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
From bd25453bd41957079c7516adf407b8785ef22f1f Mon Sep 17 00:00:00 2001
From: Mihai Moldovan <ionic@ionic.de>
Date: Fri, 3 Nov 2017 12:30:12 +0100
Subject: [PATCH] nxcomp/src/Auth.cpp: handle launchd sockets in DISPLAY
 variable correctly when fetching X cookie.

Backported from Arctica GH 3.6.x branch.

v2: backport to nx-libs 3.5.0.x (Mihai Moldovan)
---
 nxcomp/src/Auth.cpp | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

--- a/nxcomp/Auth.cpp
+++ b/nxcomp/Auth.cpp
@@ -267,11 +267,33 @@ int Auth::getCookie()
   //
   
   char line[DEFAULT_STRING_LIMIT];
+  FILE *data = NULL;
+  int result = -1;
 
   if (strncmp(display_, "localhost:", 10) == 0)
   {
     snprintf(line, DEFAULT_STRING_LIMIT, "unix:%s", display_ + 10);
   }
+  else if ((0 == strncasecmp(display_, "/tmp/launch", 11)) || (0 == strncasecmp(display_, "/private/tmp/com.apple.launchd", 30)))
+  {
+    /*
+     * Launchd socket support, mostly for OS X, but maybe also other BSD derivates.
+     */
+    const char *separator = strrchr(display_, ':');
+
+    if ((NULL == separator) || (!isdigit(*(separator + 1))))
+    {
+      #ifdef PANIC
+      *logofs << "Auth: PANIC! Unable to find separating colon character '"
+              << "in launchd socket path '" << display_
+              << "'.\n" << logofs_flush;
+      #endif
+
+      goto AuthGetCookieResult;
+    }
+
+    snprintf(line, DEFAULT_STRING_LIMIT, "unix:%s", separator + 1);
+  }
   else
   {
     snprintf(line, DEFAULT_STRING_LIMIT, "%.200s", display_);
@@ -304,9 +326,7 @@ int Auth::getCookie()
   // implementation.
   //
 
-  FILE *data = Popen((char *const *) parameters, "r");
-
-  int result = -1;
+  data = Popen((char *const *) parameters, "r");
 
   if (data == NULL)
   {