merge latest (4.3.99.16) from XFree86 (vendor) branch
This commit is contained in:
235
os/connection.c
235
os/connection.c
@@ -45,7 +45,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
/* $XFree86: xc/programs/Xserver/os/connection.c,v 3.56 2002/05/31 18:46:05 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/os/connection.c,v 3.65 2003/10/30 21:21:10 herrb Exp $ */
|
||||
/*****************************************************************
|
||||
* Stuff to create connections --- OS dependent
|
||||
*
|
||||
@@ -72,6 +72,7 @@ SOFTWARE.
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#if defined(Lynx)
|
||||
@@ -123,6 +124,7 @@ extern __const__ int _nfiles;
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#ifdef AMTCPCONN
|
||||
@@ -155,6 +157,7 @@ extern __const__ int _nfiles;
|
||||
#include "colormapst.h"
|
||||
#include "propertyst.h"
|
||||
#include "lbxserve.h"
|
||||
#include "osdep.h"
|
||||
#endif
|
||||
|
||||
#ifdef X_NOT_POSIX
|
||||
@@ -185,6 +188,9 @@ Bool RunFromSmartParent; /* send SIGUSR1 to parent process */
|
||||
Bool PartialNetwork; /* continue even if unable to bind all addrs */
|
||||
char *protNoListen; /* don't listen on this protocol */
|
||||
static Pid_t ParentProcess;
|
||||
#ifdef __UNIXOS2__
|
||||
Pid_t GetPPID(Pid_t pid);
|
||||
#endif
|
||||
|
||||
static Bool debug_conns = FALSE;
|
||||
|
||||
@@ -210,32 +216,18 @@ XtransConnInfo *ListenTransConns = NULL;
|
||||
int *ListenTransFds = NULL;
|
||||
int ListenTransCount;
|
||||
|
||||
static void ErrorConnMax(
|
||||
#if NeedFunctionPrototypes
|
||||
XtransConnInfo /* trans_conn */
|
||||
#endif
|
||||
);
|
||||
static void ErrorConnMax(XtransConnInfo /* trans_conn */);
|
||||
|
||||
#ifndef LBX
|
||||
static
|
||||
#endif
|
||||
void CloseDownFileDescriptor(
|
||||
#if NeedFunctionPrototypes
|
||||
#ifdef LBX
|
||||
ClientPtr client
|
||||
#else
|
||||
register OsCommPtr /*oc*/
|
||||
#endif
|
||||
#endif
|
||||
OsCommPtr /*oc*/
|
||||
);
|
||||
#endif
|
||||
|
||||
#ifdef LBX
|
||||
extern int LbxFlushClient();
|
||||
#endif /* LBX */
|
||||
|
||||
static XtransConnInfo
|
||||
lookup_trans_conn (fd)
|
||||
int fd;
|
||||
lookup_trans_conn (int fd)
|
||||
{
|
||||
if (ListenTransFds)
|
||||
{
|
||||
@@ -251,7 +243,7 @@ lookup_trans_conn (fd)
|
||||
/* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */
|
||||
|
||||
void
|
||||
InitConnectionLimits()
|
||||
InitConnectionLimits(void)
|
||||
{
|
||||
lastfdesc = -1;
|
||||
|
||||
@@ -312,11 +304,12 @@ InitConnectionLimits()
|
||||
*****************/
|
||||
|
||||
void
|
||||
CreateWellKnownSockets()
|
||||
CreateWellKnownSockets(void)
|
||||
{
|
||||
int i;
|
||||
int partial;
|
||||
char port[20];
|
||||
OsSigHandlerPtr handler;
|
||||
|
||||
FD_ZERO(&AllSockets);
|
||||
FD_ZERO(&AllClients);
|
||||
@@ -392,9 +385,20 @@ CreateWellKnownSockets()
|
||||
* useful
|
||||
*/
|
||||
#if !defined(WIN32)
|
||||
if (OsSignal (SIGUSR1, SIG_IGN) == SIG_IGN)
|
||||
handler = OsSignal (SIGUSR1, SIG_IGN);
|
||||
if ( handler == SIG_IGN)
|
||||
RunFromSmartParent = TRUE;
|
||||
OsSignal(SIGUSR1, handler);
|
||||
ParentProcess = getppid ();
|
||||
#ifdef __UNIXOS2__
|
||||
/*
|
||||
* fg030505: under OS/2, xinit is not the parent process but
|
||||
* the "grant parent" process of the server because execvpe()
|
||||
* presents us an additional process number;
|
||||
* GetPPID(pid) is part of libemxfix
|
||||
*/
|
||||
ParentProcess = GetPPID (ParentProcess);
|
||||
#endif /* __UNIXOS2__ */
|
||||
if (RunFromSmartParent) {
|
||||
if (ParentProcess > 1) {
|
||||
kill (ParentProcess, SIGUSR1);
|
||||
@@ -407,7 +411,7 @@ CreateWellKnownSockets()
|
||||
}
|
||||
|
||||
void
|
||||
ResetWellKnownSockets ()
|
||||
ResetWellKnownSockets (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -468,7 +472,7 @@ ResetWellKnownSockets ()
|
||||
}
|
||||
|
||||
void
|
||||
CloseWellKnownConnections()
|
||||
CloseWellKnownConnections(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -477,14 +481,9 @@ CloseWellKnownConnections()
|
||||
}
|
||||
|
||||
static void
|
||||
AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
|
||||
ClientPtr client;
|
||||
Bool letin;
|
||||
struct sockaddr *saddr;
|
||||
int len;
|
||||
unsigned short proto_n;
|
||||
char *auth_proto;
|
||||
int auth_id;
|
||||
AuthAudit (ClientPtr client, Bool letin,
|
||||
struct sockaddr *saddr, int len,
|
||||
unsigned int proto_n, char *auth_proto, int auth_id)
|
||||
{
|
||||
char addr[128];
|
||||
char *out = addr;
|
||||
@@ -506,10 +505,18 @@ AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
|
||||
break;
|
||||
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
|
||||
case AF_INET:
|
||||
sprintf(out, "IP %s port %d",
|
||||
inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr),
|
||||
ntohs(((struct sockaddr_in *) saddr)->sin_port));
|
||||
sprintf(out, "IP %s",
|
||||
inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr));
|
||||
break;
|
||||
#if defined(IPv6) && defined(AF_INET6)
|
||||
case AF_INET6: {
|
||||
char ipaddr[INET6_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET6, &((struct sockaddr_in6 *) saddr)->sin6_addr,
|
||||
ipaddr, sizeof(ipaddr));
|
||||
sprintf(out, "IP %s", ipaddr);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef DNETCONN
|
||||
case AF_DECnet:
|
||||
@@ -530,17 +537,18 @@ AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
|
||||
default:
|
||||
strcpy(out, "unknown address");
|
||||
}
|
||||
if (letin)
|
||||
AuditF("client %d connected from %s\n", client->index, addr);
|
||||
else
|
||||
AuditF("client %d rejected from %s\n", client->index, addr);
|
||||
|
||||
if (proto_n)
|
||||
AuditF(" Auth name: %.*s ID: %d\n", proto_n, auth_proto, auth_id);
|
||||
AuditF("client %d %s from %s\n Auth name: %.*s ID: %d\n",
|
||||
client->index, letin ? "connected" : "rejected", addr,
|
||||
(int)proto_n, auth_proto, auth_id);
|
||||
else
|
||||
AuditF("client %d %s from %s\n",
|
||||
client->index, letin ? "connected" : "rejected", addr);
|
||||
}
|
||||
|
||||
XID
|
||||
AuthorizationIDOfClient(client)
|
||||
ClientPtr client;
|
||||
AuthorizationIDOfClient(ClientPtr client)
|
||||
{
|
||||
if (client->osPrivate)
|
||||
return ((OsCommPtr)client->osPrivate)->auth_id;
|
||||
@@ -569,12 +577,11 @@ AuthorizationIDOfClient(client)
|
||||
*****************************************************************/
|
||||
|
||||
char *
|
||||
ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
|
||||
ClientPtr client;
|
||||
char *auth_proto, *auth_string;
|
||||
unsigned int proto_n, string_n;
|
||||
ClientAuthorized(ClientPtr client,
|
||||
unsigned int proto_n, char *auth_proto,
|
||||
unsigned int string_n, char *auth_string)
|
||||
{
|
||||
register OsCommPtr priv;
|
||||
OsCommPtr priv;
|
||||
Xtransaddr *from = NULL;
|
||||
int family;
|
||||
int fromlen;
|
||||
@@ -729,17 +736,15 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
|
||||
|
||||
static ClientPtr
|
||||
#ifdef LBX
|
||||
AllocNewConnection (trans_conn, fd, conn_time, Flush, Close, proxy)
|
||||
AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time,
|
||||
int (*Flush)(
|
||||
ClientPtr /*who*/, OsCommPtr /*oc*/,
|
||||
char */*extraBuf*/, int /*extraCount*/),
|
||||
void (*Close)(
|
||||
ClientPtr /*client*/),
|
||||
LbxProxyPtr proxy)
|
||||
#else
|
||||
AllocNewConnection (trans_conn, fd, conn_time)
|
||||
#endif
|
||||
XtransConnInfo trans_conn;
|
||||
int fd;
|
||||
CARD32 conn_time;
|
||||
#ifdef LBX
|
||||
int (*Flush)();
|
||||
void (*Close)();
|
||||
LbxProxyPtr proxy;
|
||||
AllocNewConnection (XtransConnInfo trans_conn, int fd, CARD32 conn_time)
|
||||
#endif
|
||||
{
|
||||
OsCommPtr oc;
|
||||
@@ -804,8 +809,7 @@ AllocNewConnection (trans_conn, fd, conn_time)
|
||||
#ifdef LBX
|
||||
|
||||
int
|
||||
ClientConnectionNumber (client)
|
||||
ClientPtr client;
|
||||
ClientConnectionNumber (ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||
|
||||
@@ -813,9 +817,7 @@ ClientConnectionNumber (client)
|
||||
}
|
||||
|
||||
ClientPtr
|
||||
AllocLbxClientConnection (client, proxy)
|
||||
ClientPtr client;
|
||||
LbxProxyPtr proxy;
|
||||
AllocLbxClientConnection (ClientPtr client, LbxProxyPtr proxy)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||
|
||||
@@ -824,9 +826,7 @@ AllocLbxClientConnection (client, proxy)
|
||||
}
|
||||
|
||||
void
|
||||
LbxProxyConnection (client, proxy)
|
||||
ClientPtr client;
|
||||
LbxProxyPtr proxy;
|
||||
LbxProxyConnection (ClientPtr client, LbxProxyPtr proxy)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||
|
||||
@@ -848,9 +848,7 @@ LbxProxyConnection (client, proxy)
|
||||
|
||||
/*ARGSUSED*/
|
||||
Bool
|
||||
EstablishNewConnections(clientUnused, closure)
|
||||
ClientPtr clientUnused;
|
||||
pointer closure;
|
||||
EstablishNewConnections(ClientPtr clientUnused, pointer closure)
|
||||
{
|
||||
fd_set readyconnections; /* set of listeners that are ready */
|
||||
int curconn; /* fd of listener that's ready */
|
||||
@@ -940,10 +938,9 @@ EstablishNewConnections(clientUnused, closure)
|
||||
************/
|
||||
|
||||
static void
|
||||
ErrorConnMax(trans_conn)
|
||||
XtransConnInfo trans_conn;
|
||||
ErrorConnMax(XtransConnInfo trans_conn)
|
||||
{
|
||||
register int fd = _XSERVTransGetConnectionNumber (trans_conn);
|
||||
int fd = _XSERVTransGetConnectionNumber (trans_conn);
|
||||
xConnSetupPrefix csp;
|
||||
char pad[3];
|
||||
struct iovec iov[3];
|
||||
@@ -992,16 +989,14 @@ XtransConnInfo trans_conn;
|
||||
|
||||
#ifdef LBX
|
||||
void
|
||||
CloseDownFileDescriptor(client)
|
||||
ClientPtr client;
|
||||
CloseDownFileDescriptor(ClientPtr client)
|
||||
#else
|
||||
static void
|
||||
CloseDownFileDescriptor(oc)
|
||||
register OsCommPtr oc;
|
||||
CloseDownFileDescriptor(OsCommPtr oc)
|
||||
#endif
|
||||
{
|
||||
#ifdef LBX
|
||||
register OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||
OsCommPtr oc = (OsCommPtr) client->osPrivate;
|
||||
#endif
|
||||
int connection = oc->fd;
|
||||
|
||||
@@ -1040,13 +1035,13 @@ CloseDownFileDescriptor(oc)
|
||||
*****************/
|
||||
|
||||
void
|
||||
CheckConnections()
|
||||
CheckConnections(void)
|
||||
{
|
||||
#ifndef WIN32
|
||||
fd_mask mask;
|
||||
#endif
|
||||
fd_set tmask;
|
||||
register int curclient, curoff;
|
||||
int curclient, curoff;
|
||||
int i;
|
||||
struct timeval notime;
|
||||
int r;
|
||||
@@ -1094,8 +1089,7 @@ CheckConnections()
|
||||
*****************/
|
||||
|
||||
void
|
||||
CloseDownConnection(client)
|
||||
ClientPtr client;
|
||||
CloseDownConnection(ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
|
||||
@@ -1117,8 +1111,7 @@ CloseDownConnection(client)
|
||||
}
|
||||
|
||||
void
|
||||
AddEnabledDevice(fd)
|
||||
int fd;
|
||||
AddEnabledDevice(int fd)
|
||||
{
|
||||
FD_SET(fd, &EnabledDevices);
|
||||
FD_SET(fd, &AllSockets);
|
||||
@@ -1127,8 +1120,7 @@ AddEnabledDevice(fd)
|
||||
}
|
||||
|
||||
void
|
||||
RemoveEnabledDevice(fd)
|
||||
int fd;
|
||||
RemoveEnabledDevice(int fd)
|
||||
{
|
||||
FD_CLR(fd, &EnabledDevices);
|
||||
FD_CLR(fd, &AllSockets);
|
||||
@@ -1147,8 +1139,7 @@ RemoveEnabledDevice(fd)
|
||||
*****************/
|
||||
|
||||
void
|
||||
OnlyListenToOneClient(client)
|
||||
ClientPtr client;
|
||||
OnlyListenToOneClient(ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
int connection = oc->fd;
|
||||
@@ -1180,7 +1171,7 @@ OnlyListenToOneClient(client)
|
||||
****************/
|
||||
|
||||
void
|
||||
ListenToAllClients()
|
||||
ListenToAllClients(void)
|
||||
{
|
||||
if (GrabInProgress)
|
||||
{
|
||||
@@ -1198,8 +1189,7 @@ ListenToAllClients()
|
||||
****************/
|
||||
|
||||
void
|
||||
IgnoreClient (client)
|
||||
ClientPtr client;
|
||||
IgnoreClient (ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
int connection = oc->fd;
|
||||
@@ -1243,8 +1233,7 @@ IgnoreClient (client)
|
||||
****************/
|
||||
|
||||
void
|
||||
AttendClient (client)
|
||||
ClientPtr client;
|
||||
AttendClient (ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
int connection = oc->fd;
|
||||
@@ -1277,8 +1266,7 @@ AttendClient (client)
|
||||
/* make client impervious to grabs; assume only executing client calls this */
|
||||
|
||||
void
|
||||
MakeClientGrabImpervious(client)
|
||||
ClientPtr client;
|
||||
MakeClientGrabImpervious(ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
int connection = oc->fd;
|
||||
@@ -1297,8 +1285,7 @@ MakeClientGrabImpervious(client)
|
||||
/* make client pervious to grabs; assume only executing client calls this */
|
||||
|
||||
void
|
||||
MakeClientGrabPervious(client)
|
||||
ClientPtr client;
|
||||
MakeClientGrabPervious(ClientPtr client)
|
||||
{
|
||||
OsCommPtr oc = (OsCommPtr)client->osPrivate;
|
||||
int connection = oc->fd;
|
||||
@@ -1325,61 +1312,3 @@ MakeClientGrabPervious(client)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef AIXV3
|
||||
|
||||
static fd_set pendingActiveClients;
|
||||
static BOOL reallyGrabbed;
|
||||
|
||||
/****************
|
||||
* DontListenToAnybody:
|
||||
* Don't listen to requests from any clients. Continue to handle new
|
||||
* connections, but don't take any protocol requests from anybody.
|
||||
* We have to take care if there is already a grab in progress, though.
|
||||
* Undone by PayAttentionToClientsAgain. We also have to be careful
|
||||
* not to accept any more input from the currently dispatched client.
|
||||
* we do this be telling dispatch it is time to yield.
|
||||
|
||||
* We call this when the server loses access to the glass
|
||||
* (user hot-keys away). This looks like a grab by the
|
||||
* server itself, but gets a little tricky if there is already
|
||||
* a grab in progress.
|
||||
******************/
|
||||
|
||||
void
|
||||
DontListenToAnybody()
|
||||
{
|
||||
if (!GrabInProgress)
|
||||
{
|
||||
XFD_COPYSET(&ClientsWithInput, &SavedClientsWithInput);
|
||||
XFD_COPYSET(&AllSockets, &SavedAllSockets);
|
||||
XFD_COPYSET(&AllClients, &SavedAllClients);
|
||||
GrabInProgress = TRUE;
|
||||
reallyGrabbed = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
XFD_COPYSET(&AllClients, &pendingActiveClients);
|
||||
reallyGrabbed = TRUE;
|
||||
}
|
||||
FD_ZERO(&ClientsWithInput);
|
||||
XFD_UNSET(&AllSockets, &AllClients);
|
||||
FD_ZERO(&AllClients);
|
||||
isItTimeToYield = TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
PayAttentionToClientsAgain()
|
||||
{
|
||||
if (reallyGrabbed)
|
||||
{
|
||||
XFD_ORSET(&AllSockets, &AllSockets, &pendingActiveClients);
|
||||
XFD_ORSET(&AllClients, &AllClients, &pendingActiveClients);
|
||||
}
|
||||
else
|
||||
{
|
||||
ListenToAllClients();
|
||||
}
|
||||
reallyGrabbed = FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user