summaryrefslogtreecommitdiffstats
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:29:29 +1100
commit6f14de011f0d1586c607ef94270651722d0b4cb2 (patch)
treeb320662b3fedb7f8354c02b87e38375de7a9589c
parentfc1fca18547cf2bc50229d356ad512e08895f95d (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@
-rw-r--r--channels.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/channels.c b/channels.c
index bef8ad6a..6ca7afb1 100644
--- a/channels.c
+++ b/channels.c
@@ -4354,6 +4354,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)
{
@@ -4375,15 +4402,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
/*