diff options
author | Jon TURNEY <jon.turney@dronecode.org.uk> | 2010-02-18 23:36:27 -0600 |
---|---|---|
committer | Jon TURNEY <jon.turney@dronecode.org.uk> | 2011-10-05 15:12:01 +0100 |
commit | 81992ba3cf4f9415a44bc801dd827511f2bd47ac (patch) | |
tree | 561da4b3b5a59971e2b33318a3595adc0cea3b0f | |
parent | e05649c8da16dda8545a5218e12ef96b4bc30a4c (diff) |
Cygwin/X: Improve choice of display name used by internal clients
Choose display name used to connect internal clients and exported into
environment of processes started by traymenu so that it uses a transport
we know is working
This should mean the server can start correctly with -multiwindow
and/or -clipboard and any two of -nolisten inet6 -nolisten inet
and -nolisten unix (the server will correctly refuse to start if all 3
are used, as it must be listening on at least one socket)
Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
-rw-r--r-- | hw/xwin/Makefile.am | 1 | ||||
-rw-r--r-- | hw/xwin/win.h | 6 | ||||
-rw-r--r-- | hw/xwin/winclipboardthread.c | 5 | ||||
-rw-r--r-- | hw/xwin/windisplay.c | 56 | ||||
-rw-r--r-- | hw/xwin/winmultiwindowwm.c | 10 | ||||
-rw-r--r-- | hw/xwin/winprefs.c | 11 | ||||
-rw-r--r-- | include/os.h | 2 | ||||
-rw-r--r-- | os/connection.c | 17 |
8 files changed, 88 insertions, 20 deletions
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am index 256af0bb1..70f6cf7a6 100644 --- a/hw/xwin/Makefile.am +++ b/hw/xwin/Makefile.am @@ -120,6 +120,7 @@ SRCS = InitInput.c \ winprefs.h \ winresource.h \ winwindow.h \ + windisplay.c \ XWin.rc \ $(top_srcdir)/Xext/dpmsstubs.c \ $(top_srcdir)/Xi/stubs.c \ diff --git a/hw/xwin/win.h b/hw/xwin/win.h index 9bee9b64f..5b2c8a24f 100644 --- a/hw/xwin/win.h +++ b/hw/xwin/win.h @@ -1481,6 +1481,12 @@ winDoRandRScreenSetSize (ScreenPtr pScreen, CARD16 height, CARD32 mmWidth, CARD32 mmHeight); +/* + * windisplay.c + */ + +void +winGetDisplayName(char *szDisplay, unsigned int screen); /* * END DDX and DIX Function Prototypes diff --git a/hw/xwin/winclipboardthread.c b/hw/xwin/winclipboardthread.c index 71e6921d2..524efe592 100644 --- a/hw/xwin/winclipboardthread.c +++ b/hw/xwin/winclipboardthread.c @@ -168,10 +168,7 @@ winClipboardProc (void *pvNotUsed) * for all screens on the display. That is why there is only * one clipboard client thread. */ - snprintf (szDisplay, - 512, - "127.0.0.1:%s.0", - display); + winGetDisplayName(szDisplay, 0); /* Print the display connection string */ ErrorF ("winClipboardProc - DISPLAY=%s\n", szDisplay); diff --git a/hw/xwin/windisplay.c b/hw/xwin/windisplay.c new file mode 100644 index 000000000..ce111abda --- /dev/null +++ b/hw/xwin/windisplay.c @@ -0,0 +1,56 @@ +/* + * Copyright (C) Jon TURNEY 2009 + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include <opaque.h> // for display +#include "win.h" + +/* + Generate a display name string referring to the display of this server, + using a transport we know is enabled +*/ + +void +winGetDisplayName(char *szDisplay, unsigned int screen) +{ + if (TransIsListening("local")) + { + snprintf(szDisplay, 512, ":%s.%d", display, screen); + } + else if (TransIsListening("inet")) + { + snprintf(szDisplay, 512, "127.0.0.1:%s.%d", display, screen); + } + else if (TransIsListening("inet6")) + { + snprintf(szDisplay, 512, "::1:%s.%d", display, screen); + } + else + { + // this can't happen! + ErrorF ("winGetDisplay: Don't know what to use for DISPLAY\n"); + snprintf(szDisplay, 512, "localhost:%s.%d", display, screen); + } + + ErrorF ("winGetDisplay: DISPLAY=%s\n", szDisplay); +} diff --git a/hw/xwin/winmultiwindowwm.c b/hw/xwin/winmultiwindowwm.c index b156a0f5a..8be720ae7 100644 --- a/hw/xwin/winmultiwindowwm.c +++ b/hw/xwin/winmultiwindowwm.c @@ -136,7 +136,6 @@ typedef struct _XMsgProcArgRec { * References to external symbols */ -extern char *display; extern void ErrorF (const char* /*f*/, ...); /* @@ -934,8 +933,7 @@ winMultiWindowXMsgProc (void *pArg) XSetIOErrorHandler (winMultiWindowXMsgProcIOErrorHandler); /* Setup the display connection string x */ - snprintf (pszDisplay, - 512, "127.0.0.1:%s.%d", display, (int)pProcArg->dwScreen); + winGetDisplayName(pszDisplay, (int)pProcArg->dwScreen); /* Print the display connection string */ ErrorF ("winMultiWindowXMsgProc - DISPLAY=%s\n", pszDisplay); @@ -1341,11 +1339,7 @@ winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg) XSetIOErrorHandler (winMultiWindowWMIOErrorHandler); /* Setup the display connection string x */ - snprintf (pszDisplay, - 512, - "127.0.0.1:%s.%d", - display, - (int) pProcArg->dwScreen); + winGetDisplayName(pszDisplay, (int)pProcArg->dwScreen); /* Print the display connection string */ ErrorF ("winInitMultiWindowWM - DISPLAY=%s\n", pszDisplay); diff --git a/hw/xwin/winprefs.c b/hw/xwin/winprefs.c index d941c5169..75674687f 100644 --- a/hw/xwin/winprefs.c +++ b/hw/xwin/winprefs.c @@ -58,10 +58,6 @@ extern void parse_file (FILE *fp); /* Currently in use command ID, incremented each new menu item created */ static int g_cmdid = STARTMENUID; - -/* Defined in DIX */ -extern char *display; - /* Local function to handle comma-ified icon names */ static HICON LoadImageComma (char *fname, int sx, int sy, int flags); @@ -767,16 +763,15 @@ LoadPreferences (void) /* Setup a DISPLAY environment variable, need to allocate on heap */ /* because putenv doesn't copy the argument... */ - snprintf (szDisplay, 512, "DISPLAY=127.0.0.1:%s.0", display); - szEnvDisplay = (char *)(malloc (strlen(szDisplay)+1)); + winGetDisplayName(szDisplay, 0); + szEnvDisplay = (char *)(malloc(strlen(szDisplay)+strlen("DISPLAY=")+1)); if (szEnvDisplay) { - strcpy (szEnvDisplay, szDisplay); + snprintf(szEnvDisplay, 512, "DISPLAY=%s", szDisplay); putenv (szEnvDisplay); } /* Replace any "%display%" in menu commands with display string */ - snprintf (szDisplay, 512, "127.0.0.1:%s.0", display); for (i=0; i<pref.menuItems; i++) { for (j=0; j<pref.menu[i].menuItems; j++) diff --git a/include/os.h b/include/os.h index a553f5783..6b2e2baad 100644 --- a/include/os.h +++ b/include/os.h @@ -115,6 +115,8 @@ extern _X_EXPORT int WriteToClient(ClientPtr /*who*/, int /*count*/, const void* extern _X_EXPORT void ResetOsBuffers(void); +extern _X_EXPORT int TransIsListening(char *protocol); + extern _X_EXPORT void InitConnectionLimits(void); extern _X_EXPORT void NotifyParentProcess(void); diff --git a/os/connection.c b/os/connection.c index 0c580ab5e..33a6ce534 100644 --- a/os/connection.c +++ b/os/connection.c @@ -269,6 +269,23 @@ lookup_trans_conn (int fd) return NULL; } +int +TransIsListening(char *protocol) +{ + /* look for this transport in the list of listeners */ + int i; + for (i = 0; i < ListenTransCount; i++) + { + if (!strcmp(protocol, ListenTransConns[i]->transptr->TransName)) + { + return 1; + } + } + + return 0; +} + + /* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */ void |