From 98028c746f08d0e7bf5d8524d6aca85e5a2f4145 Mon Sep 17 00:00:00 2001 From: Jacob Nevins Date: Wed, 6 Oct 2004 22:31:07 +0000 Subject: [PATCH] X forwarding changes: - new function platform_get_x_display() to find a sensible local display. On Unix, the Gtk apps weren't taking account of --display when determining where to send forwarded X traffic. - explicitly document that leaving X display location blank in config tries to do something sensible (and that it's now blank by default) - don't override X11Display setting in plink, since that's more properly done later [originally from svn r4604] --- doc/config.but | 10 +++++----- doc/using.but | 9 +++++---- ssh.h | 2 ++ unix/ux_x11.c | 2 -- unix/uxcons.c | 10 ++++++++++ unix/uxplink.c | 2 -- unix/uxputty.c | 16 ++++++++++++++++ unix/uxsftp.c | 2 -- winmisc.c | 5 +++++ x11fwd.c | 25 ++++++++++++++++++------- 10 files changed, 61 insertions(+), 22 deletions(-) diff --git a/doc/config.but b/doc/config.but index 8a773ef2..4b4271bc 100644 --- a/doc/config.but +++ b/doc/config.but @@ -1,4 +1,4 @@ -\versionid $Id: config.but,v 1.91 2004/10/02 00:33:27 jacob Exp $ +\versionid $Id: config.but,v 1.92 2004/10/06 22:31:07 jacob Exp $ \C{config} Configuring PuTTY @@ -2106,10 +2106,10 @@ forwarding allows you to securely give those applications access to a local X display on your PC. To enable X11 forwarding, check the \q{Enable X11 forwarding} box. -If your X display is not the primary display on your local machine -(which it almost certainly will be unless you have deliberately -arranged otherwise), you need to enter its location in the \q{X -display location} box. +If your X display is somewhere unusual, you will need to enter its +location in the \q{X display location} box; if this is left blank, +PuTTY try to find a sensible default in the environment, or use the +primary local display (\c{:0}) if that fails. See \k{using-x-forwarding} for more information about X11 forwarding. diff --git a/doc/using.but b/doc/using.but index 240f7ceb..575603d8 100644 --- a/doc/using.but +++ b/doc/using.but @@ -1,4 +1,4 @@ -\versionid $Id: using.but,v 1.32 2004/09/22 22:15:25 jacob Exp $ +\versionid $Id: using.but,v 1.33 2004/10/06 22:31:07 jacob Exp $ \C{using} Using PuTTY @@ -304,9 +304,10 @@ does do. You should then tick the \q{Enable X11 forwarding} box in the Tunnels panel (see \k{config-ssh-x11}) before starting your SSH -session. The \q{X display location} box reads \c{localhost:0} by -default, which is the usual display location where your X server -will be installed. If that needs changing, then change it. +session. The \q{X display location} box is blank by default, which +means that PuTTY will try to use a sensible default such as \c{:0}, +which is the usual display location where your X server will be +installed. If that needs changing, then change it. Now you should be able to log in to the SSH server as normal. To check that X forwarding has been successfully negotiated during diff --git a/ssh.h b/ssh.h index 5e41b7ab..687ce6ab 100644 --- a/ssh.h +++ b/ssh.h @@ -298,6 +298,8 @@ 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); /* make up a SockAddr naming the address for displaynum */ +char *platform_get_x_display(void); +/* allocated local X display string, if any */ Bignum copybn(Bignum b); Bignum bn_power_2(int n); diff --git a/unix/ux_x11.c b/unix/ux_x11.c index 1c48b141..e8d71959 100644 --- a/unix/ux_x11.c +++ b/unix/ux_x11.c @@ -119,5 +119,3 @@ void platform_get_x11_auth(char *display, int *protocol, pclose(fp); sfree(localbuf); } - -const char platform_x11_best_transport[] = "unix"; diff --git a/unix/uxcons.c b/unix/uxcons.c index 3c79ad63..3ed7ebf7 100644 --- a/unix/uxcons.c +++ b/unix/uxcons.c @@ -318,3 +318,13 @@ int is_interactive(void) { return isatty(0); } + +/* + * X11-forwarding-related things suitable for console. + */ + +const char platform_x11_best_transport[] = "unix"; + +char *platform_get_x_display(void) { + return dupstr(getenv("DISPLAY")); +} diff --git a/unix/uxplink.c b/unix/uxplink.c index d144cb9f..146fcb30 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -73,8 +73,6 @@ static Config cfg; */ char *platform_default_s(const char *name) { - if (!strcmp(name, "X11Display")) - return dupstr(getenv("DISPLAY")); if (!strcmp(name, "TermType")) return dupstr(getenv("TERM")); if (!strcmp(name, "UserName")) diff --git a/unix/uxputty.c b/unix/uxputty.c index 6b1eabb7..d71d2898 100644 --- a/unix/uxputty.c +++ b/unix/uxputty.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "putty.h" #include "storage.h" @@ -105,6 +106,21 @@ char *make_default_wintitle(char *hostname) return dupcat(hostname, " - PuTTY", NULL); } +/* + * X11-forwarding-related things suitable for Gtk app. + */ + +const char platform_x11_best_transport[] = "unix"; + +char *platform_get_x_display(void) { + const char *display; + /* Try to take account of --display and what have you. */ + if (!(display = gdk_get_display())) + /* fall back to traditional method */ + display = getenv("DISPLAY"); + return dupstr(display); +} + int main(int argc, char **argv) { extern int pt_main(int argc, char **argv); diff --git a/unix/uxsftp.c b/unix/uxsftp.c index 6e1a0edc..c86b8ea7 100644 --- a/unix/uxsftp.c +++ b/unix/uxsftp.c @@ -34,8 +34,6 @@ void platform_get_x11_auth(char *display, int *protocol, /* Do nothing, therefore no auth. */ } -const char platform_x11_best_transport[] = "unix"; - /* * Default settings that are specific to PSFTP. */ diff --git a/winmisc.c b/winmisc.c index 71f09a87..518eb157 100644 --- a/winmisc.c +++ b/winmisc.c @@ -16,6 +16,11 @@ void platform_get_x11_auth(char *display, int *proto, const char platform_x11_best_transport[] = "localhost"; +char *platform_get_x_display(void) { + /* We may as well check for DISPLAY in case it's useful. */ + return dupstr(getenv("DISPLAY")); +} + Filename filename_from_str(const char *str) { Filename ret; diff --git a/x11fwd.c b/x11fwd.c index b0b82698..80362ec0 100644 --- a/x11fwd.c +++ b/x11fwd.c @@ -1,3 +1,7 @@ +/* + * Platform-independent bits of X11 forwarding. + */ + #include #include #include @@ -228,14 +232,21 @@ int x11_get_screen_number(char *display) /* Find the right display, returns an allocated string */ char *x11_display(const char *display) { - if(!display || !*display) - if(!(display = getenv("DISPLAY"))) - display = ":0"; - if(display[0] == ':') { - /* no transport specified, use whatever we think is best */ - return dupcat(platform_x11_best_transport, display, (char *)0); + char *ret; + if(!display || !*display) { + /* try to find platform-specific local display */ + if(!(ret = platform_get_x_display())) + /* plausible default for all platforms */ + ret = dupstr(":0"); } else - return dupstr(display); + ret = dupstr(display); + if(ret[0] == ':') { + /* no transport specified, use whatever we think is best */ + char *s = dupcat(platform_x11_best_transport, display, (char *)0); + sfree(ret); + return s; + } else + return ret; } /*