summaryrefslogtreecommitdiffstats
path: root/channels.c
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@zip.com.au>2017-03-10 13:22:32 +1100
committerDarren Tucker <dtucker@zip.com.au>2017-03-10 13:22:32 +1100
commitda39b09d43b137a5a3d071b51589e3efb3701238 (patch)
tree8e78d302fe7ba24d43e01113dcc8cd107ac8ecec /channels.c
parent8fb15311a011517eb2394bb95a467c209b8b336c (diff)
If OSX is using launchd, remove screen no.
Check for socket with and without screen number. From Apple and Jakob Schlyter via bz#2341, with contributions from Ron Frederick, ok djm@
Diffstat (limited to 'channels.c')
-rw-r--r--channels.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/channels.c b/channels.c
index 398da9a8..d030fcdd 100644
--- a/channels.c
+++ b/channels.c
@@ -4373,6 +4373,33 @@ connect_local_xsocket(u_int dnr)
return connect_local_xsocket_path(buf);
}
+#ifdef __APPLE__
+static int
+is_path_to_xsocket(const char *display, char *path, size_t pathlen)
+{
+ struct stat sbuf;
+
+ if (strlcpy(path, display, pathlen) >= pathlen) {
+ error("%s: display path too long", __func__);
+ return 0;
+ }
+ if (display[0] != '/')
+ return 0;
+ if (stat(path, &sbuf) == 0) {
+ return 1;
+ } else {
+ char *dot = strrchr(path, '.');
+ if (dot != NULL) {
+ *dot = '\0';
+ if (stat(path, &sbuf) == 0) {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+#endif
+
int
x11_connect_display(void)
{
@@ -4394,15 +4421,22 @@ x11_connect_display(void)
* connection to the real X server.
*/
- /* Check if the display is from launchd. */
#ifdef __APPLE__
- if (strncmp(display, "/tmp/launch", 11) == 0) {
- sock = connect_local_xsocket_path(display);
- if (sock < 0)
- return -1;
+ /* Check if display is a path to a socket (as set by launchd). */
+ {
+ char path[PATH_MAX];
- /* OK, we now have a connection to the display. */
- return sock;
+ if (is_path_to_xsocket(display, path, sizeof(path))) {
+ debug("x11_connect_display: $DISPLAY is launchd");
+
+ /* Create a socket. */
+ sock = connect_local_xsocket_path(path);
+ if (sock < 0)
+ return -1;
+
+ /* OK, we now have a connection to the display. */
+ return sock;
+ }
}
#endif
/*