diff options
author | Darren Tucker <dtucker@zip.com.au> | 2017-03-10 13:22:32 +1100 |
---|---|---|
committer | Darren Tucker <dtucker@zip.com.au> | 2017-03-10 13:22:32 +1100 |
commit | da39b09d43b137a5a3d071b51589e3efb3701238 (patch) | |
tree | 8e78d302fe7ba24d43e01113dcc8cd107ac8ecec /channels.c | |
parent | 8fb15311a011517eb2394bb95a467c209b8b336c (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.c | 48 |
1 files changed, 41 insertions, 7 deletions
@@ -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 /* |