diff options
Diffstat (limited to 'xorg-server/os/connection.c')
-rw-r--r-- | xorg-server/os/connection.c | 93 |
1 files changed, 70 insertions, 23 deletions
diff --git a/xorg-server/os/connection.c b/xorg-server/os/connection.c index f915e1295..616c201b5 100644 --- a/xorg-server/os/connection.c +++ b/xorg-server/os/connection.c @@ -66,6 +66,9 @@ SOFTWARE. #ifdef WIN32 #include <X11/Xwinsock.h> +#ifdef _DEBUG +#define DEBUG +#endif #endif #include <X11/X.h> #include <X11/Xproto.h> @@ -108,6 +111,10 @@ SOFTWARE. #include "dixstruct.h" #include "xace.h" +#ifdef _MSC_VER +typedef int pid_t; +#endif + #define Pid_t pid_t #ifdef HAVE_GETPEERUCRED @@ -140,12 +147,15 @@ Bool NewOutputPending; /* not yet attempted to write some new output */ Bool AnyClientsWriteBlocked; /* true if some client blocked on write */ Bool NoListenAll; /* Don't establish any listening sockets */ +#if !defined(_MSC_VER) static Bool RunFromSmartParent; /* send SIGUSR1 to parent process */ +static Pid_t ParentProcess; +#endif Bool RunFromSigStopParent; /* send SIGSTOP to our own process; Upstart (or equivalent) will send SIGCONT back. */ static char dynamic_display[7]; /* display name */ +static int dynamic_display_id; Bool PartialNetwork; /* continue even if unable to bind all addrs */ -static Pid_t ParentProcess; static Bool debug_conns = FALSE; @@ -167,9 +177,9 @@ int *ConnectionTranslation = NULL; */ #undef MAXSOCKS -#define MAXSOCKS 500 +#define MAXSOCKS FD_SETSIZE #undef MAXSELECT -#define MAXSELECT 500 +#define MAXSELECT FD_SETSIZE struct _ct_node { struct _ct_node *next; @@ -270,6 +280,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 @@ -367,6 +394,11 @@ NotifyParentProcess(void) } if (RunFromSigStopParent) raise(SIGSTOP); +#else +/* On windows the displayfd points to shared memory, so write the id to it */ + int *pDisplayfd=(int*)MapViewOfFile((HANDLE)displayfd, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0); + if (pDisplayfd) + *pDisplayfd=dynamic_display_id; #endif } @@ -422,7 +454,7 @@ CreateWellKnownSockets(void) else { /* -displayfd and no explicit display number */ Bool found = 0; for (i = 0; i < 65535 - X_TCP_PORT; i++) { - if (TryCreateSocket(i, &partial) && !partial) { + if (TryCreateSocket(i, &partial) && ListenTransCount >= 1 && (PartialNetwork || !partial)) { found = 1; break; } @@ -431,20 +463,25 @@ CreateWellKnownSockets(void) } if (!found) FatalError("Failed to find a socket to listen on"); + dynamic_display_id=i; snprintf(dynamic_display, sizeof(dynamic_display), "%d", i); display = dynamic_display; } ListenTransFds = malloc(ListenTransCount * sizeof (int)); - for (i = 0; i < ListenTransCount; i++) { - int fd = _XSERVTransGetConnectionNumber(ListenTransConns[i]); + for (i = ListenTransCount; i > 0; i--) { + int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i-1]); - ListenTransFds[i] = fd; + ListenTransFds[i-1] = fd; FD_SET(fd, &WellKnownConnections); - if (!_XSERVTransIsLocal(ListenTransConns[i])) - DefineSelf (fd); + if (!_XSERVTransIsLocal (ListenTransConns[i-1])) { + int protocol = 0; + if (!strcmp("inet", ListenTransConns[i-1]->transptr->TransName)) protocol = 4; + else if (!strcmp("inet6", ListenTransConns[i-1]->transptr->TransName)) protocol = 6; + DefineSelf (fd, protocol); + } } if (!XFD_ANYSET(&WellKnownConnections) && !NoListenAll) @@ -986,15 +1023,17 @@ CheckConnections(void) { #ifndef WIN32 fd_mask mask; + int curoff; #endif fd_set tmask; - int curclient, curoff; + int curclient; int i; struct timeval notime; int r; #ifdef WIN32 - fd_set savedAllClients; + fd_set savedAllSockets; + unsigned j; #endif notime.tv_sec = 0; @@ -1018,17 +1057,21 @@ CheckConnections(void) } } #else - XFD_COPYSET(&AllClients, &savedAllClients); - for (i = 0; i < XFD_SETCOUNT(&savedAllClients); i++) { - curclient = XFD_FD(&savedAllClients, i); - FD_ZERO(&tmask); - FD_SET(curclient, &tmask); - do { - r = Select(curclient + 1, &tmask, NULL, NULL, ¬ime); - } while (r < 0 && (errno == EINTR || errno == EAGAIN)); - if (r < 0) - if (GetConnectionTranslation(curclient) > 0) - CloseDownClient(clients[GetConnectionTranslation(curclient)]); + /* First test AllSockets and then AllClients are valid sockets */ + XFD_COPYSET(&AllSockets, &savedAllSockets); + for (j=0; j<2; j++) { + for (i = 0; i < XFD_SETCOUNT(&savedAllSockets); i++) { + curclient = XFD_FD(&savedAllSockets, i); + FD_ZERO(&tmask); + FD_SET(curclient, &tmask); + do { + r = Select (curclient + 1, &tmask, NULL, NULL, ¬ime); + } while (r == SOCKET_ERROR && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK)); + if (r < 0) + if (GetConnectionTranslation(curclient) > 0) + CloseDownClient(clients[GetConnectionTranslation(curclient)]); + } + XFD_COPYSET(&AllClients, &savedAllSockets); } #endif } @@ -1046,8 +1089,12 @@ CloseDownConnection(ClientPtr client) if (FlushCallback) CallCallbacks(&FlushCallback, NULL); +#ifdef DEBUG + ErrorF("CloseDownConnection: client index = %d, socket fd = %d\n", + client->index, oc->fd); +#endif if (oc->output) - FlushClient(client, oc, (char *) NULL, 0); + FlushClient(client, oc, (char *) NULL, 0); #ifdef XDMCP XdmcpCloseDisplay(oc->fd); #endif |