diff options
author | Jon TURNEY <jon.turney@dronecode.org.uk> | 2010-02-18 23:36:27 -0600 |
---|---|---|
committer | Yaakov Selkowitz <yselkowitz@users.sourceforge.net> | 2010-02-24 16:39:16 -0600 |
commit | 70bf5a5f156ea2657111f54d9004c864196cb58c (patch) | |
tree | b84af25304d270434b9b69b8043de392f8bf93f3 | |
parent | b387a978a9a93250b3e3693862f6322f1b34040c (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>
-rw-r--r-- | hw/xwin/Makefile.am | 1 | ||||
-rw-r--r-- | hw/xwin/win.h | 7 | ||||
-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, 89 insertions, 20 deletions
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am index c01e485a7..6d8f82371 100644 --- a/hw/xwin/Makefile.am +++ b/hw/xwin/Makefile.am @@ -120,6 +120,7 @@ SRCS = InitInput.c \ winpriv.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 9ab8ed976..259ff43d1 100644 --- a/hw/xwin/win.h +++ b/hw/xwin/win.h @@ -1453,6 +1453,13 @@ Bool winInitCursor (ScreenPtr pScreen); /* + * 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 28c7372b8..9788d883b 100644 --- a/hw/xwin/winclipboardthread.c +++ b/hw/xwin/winclipboardthread.c @@ -163,10 +163,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 c4f11ba6f..6c2812c6f 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); @@ -1317,11 +1315,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 93901cac7..14409ecae 100644 --- a/hw/xwin/winprefs.c +++ b/hw/xwin/winprefs.c @@ -69,10 +69,6 @@ extern HICON g_hSmallIconX; /* 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); @@ -780,16 +776,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 453ab82c7..9054eed57 100644 --- a/include/os.h +++ b/include/os.h @@ -114,6 +114,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 3ff93bbb6..5ea55ae4e 100644 --- a/os/connection.c +++ b/os/connection.c @@ -270,6 +270,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 |