addressing X displays. Update PuTTY's display-name-to-Unix-socket-
path translation code to cope with it, thus causing X forwarding to
start working again on Leopard.
git-svn-id: svn://svn.tartarus.org/sgt/putty@8020
cda61777-01e9-0310-a592-
d414129be87e
return 0;
}
-SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname)
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname)
{
return NULL;
}
unsigned char *data, int *datalen);
extern const char platform_x11_best_transport[];
/* best X11 hostname for this platform if none specified */
-SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname);
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname);
/* make up a SockAddr naming the address for displaynum */
char *platform_get_x_display(void);
/* allocated local X display string, if any */
return 0;
}
-SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname)
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname)
{
SockAddr ret = snew(struct SockAddr_tag);
int n;
memset(ret, 0, sizeof *ret);
ret->family = AF_UNIX;
- n = snprintf(ret->hostname, sizeof ret->hostname,
- "%s%d", X11_UNIX_PATH, displaynum);
+ /*
+ * Mac OS X Leopard uses an innovative X display naming
+ * convention in which the entire display name is the path to
+ * the Unix socket, including the trailing :0 which only
+ * _looks_ like a display number. Heuristically, I think
+ * detecting this by means of a leading slash ought to be
+ * adequate.
+ */
+ if (display[0] == '/') {
+ n = snprintf(ret->hostname, sizeof ret->hostname,
+ "%s", display);
+ } else {
+ n = snprintf(ret->hostname, sizeof ret->hostname,
+ "%s%d", X11_UNIX_PATH, displaynum);
+ }
if(n < 0)
ret->error = "snprintf failed";
else if(n >= sizeof ret->hostname)
return 0;
}
-SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname)
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname)
{
SockAddr ret = snew(struct SockAddr_tag);
memset(ret, 0, sizeof(struct SockAddr_tag));
host[n] = '\0';
sfree(display);
- if(!strcmp(host, "unix")) {
+ if(!strcmp(host, "unix") || host[0] == '/') {
/* use AF_UNIX sockets (doesn't make sense on all platforms) */
- addr = platform_get_x11_unix_address(displaynum,
+ addr = platform_get_x11_unix_address(display, displaynum,
&dummy_realhost);
port = 0; /* to show we are not confused */
} else {