summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 16:49:22 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 16:49:22 +0000
commitd568221710959cf7d783e6ff0fb80fb43a231124 (patch)
tree8d6f039393294c6ffac8533639afdebe5d68bfc1 /os
parent9508a382f8a9f241dab097d921b6d290c1c3a776 (diff)
Diffstat (limited to 'os')
-rw-r--r--os/WaitFor.c182
-rw-r--r--os/access.c569
-rw-r--r--os/auth.c189
-rw-r--r--os/connection.c310
-rw-r--r--os/io.c163
-rw-r--r--os/k5auth.c3
-rw-r--r--os/lbxio.c42
-rw-r--r--os/mitauth.c54
-rw-r--r--os/oscolor.c32
-rw-r--r--os/osdep.h189
-rw-r--r--os/osinit.c42
-rw-r--r--os/rpcauth.c41
-rw-r--r--os/secauth.c30
-rw-r--r--os/utils.c1179
-rw-r--r--os/xdmauth.c9
-rw-r--r--os/xdmcp.c377
16 files changed, 2563 insertions, 848 deletions
diff --git a/os/WaitFor.c b/os/WaitFor.c
index fbc05399c..76fa67327 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/Xserver/os/WaitFor.c,v 3.38 2002/05/31 18:46:05 dawes Exp $ */
/***********************************************************
Copyright 1987, 1998 The Open Group
@@ -59,48 +60,42 @@ SOFTWARE.
#include <X11/Xwinsock.h>
#endif
#include "Xos.h" /* for strings, fcntl, time */
-
#include <errno.h>
-#ifdef X_NOT_STDC_ENV
-extern int errno;
-#endif
-
#include <stdio.h>
#include "X.h"
#include "misc.h"
-#include <X11/Xpoll.h>
+#ifdef __UNIXOS2__
+#define select(n,r,w,x,t) os2PseudoSelect(n,r,w,x,t)
+#endif
#include "osdep.h"
+#include <X11/Xpoll.h>
#include "dixstruct.h"
#include "opaque.h"
-
#ifdef DPMSExtension
-#include "dpms.h"
-extern void DPMSSet();
-extern void DPMSGet();
-extern CARD32 DPMSStandbyTime;
-extern CARD32 DPMSSuspendTime;
-extern CARD32 DPMSOffTime;
-extern BOOL DPMSEnabled;
-extern CARD16 DPMSPowerLevel;
+#include "dpmsproc.h"
#endif
-extern fd_set AllSockets;
-extern fd_set AllClients;
-extern fd_set LastSelectMask;
-extern fd_set WellKnownConnections;
-extern fd_set EnabledDevices;
-extern fd_set ClientsWithInput;
-extern fd_set ClientsWriteBlocked;
-extern fd_set OutputPending;
-
-extern int ConnectionTranslation[];
-
-extern Bool NewOutputPending;
-extern Bool AnyClientsWriteBlocked;
+/* modifications by raphael */
+int
+mffs(fd_mask mask)
+{
+ int i;
-extern WorkQueuePtr workQueue;
+ if (!mask) return 0;
+ i = 1;
+ while (!(mask & 1))
+ {
+ i++;
+ mask >>= 1;
+ }
+ return i;
+}
+#ifdef DPMSExtension
+#define DPMS_SERVER
+#include "dpms.h"
+#endif
#ifdef XTESTEXT1
/*
@@ -116,7 +111,7 @@ struct _OsTimerRec {
pointer arg;
};
-static void DoTimer();
+static void DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev);
static OsTimerPtr timers;
/*****************
@@ -144,9 +139,9 @@ WaitForSomething(pClientsReady)
{
int i;
struct timeval waittime, *wt;
- INT32 timeout;
+ INT32 timeout = 0;
#ifdef DPMSExtension
- INT32 standbyTimeout, suspendTimeout, offTimeout;
+ INT32 standbyTimeout = 0, suspendTimeout = 0, offTimeout = 0;
#endif
fd_set clientsReadable;
fd_set clientsWritable;
@@ -154,7 +149,10 @@ WaitForSomething(pClientsReady)
int selecterr;
int nready;
fd_set devicesReadable;
- CARD32 now;
+ CARD32 now = 0;
+#ifdef SMART_SCHEDULE
+ Bool someReady = FALSE;
+#endif
FD_ZERO(&clientsReadable);
@@ -165,12 +163,32 @@ WaitForSomething(pClientsReady)
/* deal with any blocked jobs */
if (workQueue)
ProcessWorkQueue();
-
if (XFD_ANYSET (&ClientsWithInput))
{
- XFD_COPYSET (&ClientsWithInput, &clientsReadable);
- break;
+#ifdef SMART_SCHEDULE
+ if (!SmartScheduleDisable)
+ {
+ someReady = TRUE;
+ waittime.tv_sec = 0;
+ waittime.tv_usec = 0;
+ wt = &waittime;
+ }
+ else
+#endif
+ {
+ XFD_COPYSET (&ClientsWithInput, &clientsReadable);
+ break;
+ }
}
+#ifdef SMART_SCHEDULE
+ if (someReady)
+ {
+ XFD_COPYSET(&AllSockets, &LastSelectMask);
+ XFD_UNSET(&LastSelectMask, &ClientsWithInput);
+ }
+ else
+ {
+#endif
#ifdef DPMSExtension
if (ScreenSaverTime > 0 || DPMSEnabled || timers)
#else
@@ -180,7 +198,7 @@ WaitForSomething(pClientsReady)
wt = NULL;
if (timers)
{
- while (timers && timers->expires <= now)
+ while (timers && (int) (timers->expires - now) <= 0)
DoTimer(timers, now, &timers);
if (timers)
{
@@ -193,8 +211,8 @@ WaitForSomething(pClientsReady)
}
if (ScreenSaverTime > 0
#ifdef DPMSExtension
- || (DPMSEnabled &&
- (DPMSStandbyTime > 0 || DPMSSuspendTime > 0 || DPMSOffTime > 0))
+ || (DPMSEnabled &&
+ (DPMSStandbyTime > 0 || DPMSSuspendTime > 0 || DPMSOffTime > 0))
#endif
) {
#ifdef DPMSExtension
@@ -214,11 +232,12 @@ WaitForSomething(pClientsReady)
(now - lastDeviceEventTime.milliseconds));
#endif /* DPMSExtension */
- if (timeout <= 0
+ if (
+ timeout <= 0
#ifdef DPMSExtension
&& ScreenSaverTime > 0
#endif /* DPMSExtension */
- ) {
+ ) {
INT32 timeSinceSave;
timeSinceSave = -timeout;
@@ -250,15 +269,18 @@ WaitForSomething(pClientsReady)
#ifdef DPMSExtension
if (DPMSEnabled)
{
- if (standbyTimeout > 0 && timeout > standbyTimeout)
+ if (standbyTimeout > 0
+ && (timeout <= 0 || timeout > standbyTimeout))
timeout = standbyTimeout;
- if (suspendTimeout > 0 && timeout > suspendTimeout)
+ if (suspendTimeout > 0
+ && (timeout <= 0 || timeout > suspendTimeout))
timeout = suspendTimeout;
- if (offTimeout > 0 && timeout > offTimeout)
+ if (offTimeout > 0
+ && (timeout <= 0 || timeout > offTimeout))
timeout = offTimeout;
}
#endif
- if (timeout > 0 && (!wt || timeout < (timers->expires - now)))
+ if (timeout > 0 && (!wt || timeout < (int) (timers->expires - now)))
{
waittime.tv_sec = timeout / MILLI_PER_SECOND;
waittime.tv_usec = (timeout % MILLI_PER_SECOND) *
@@ -301,6 +323,10 @@ WaitForSomething(pClientsReady)
#endif
}
XFD_COPYSET(&AllSockets, &LastSelectMask);
+#ifdef SMART_SCHEDULE
+ }
+ SmartScheduleIdle = TRUE;
+#endif
BlockHandler((pointer)&wt, (pointer)&LastSelectMask);
if (NewOutputPending)
FlushAllOutput();
@@ -317,10 +343,12 @@ WaitForSomething(pClientsReady)
else if (AnyClientsWriteBlocked)
{
XFD_COPYSET(&ClientsWriteBlocked, &clientsWritable);
- i = Select (MAXSOCKS, &LastSelectMask, &clientsWritable, NULL, wt);
+ i = Select (MaxClients, &LastSelectMask, &clientsWritable, NULL, wt);
+ }
+ else
+ {
+ i = Select (MaxClients, &LastSelectMask, NULL, NULL, wt);
}
- else
- i = Select (MAXSOCKS, &LastSelectMask, NULL, NULL, wt);
selecterr = errno;
WakeupHandler(i, (pointer)&LastSelectMask);
#ifdef XTESTEXT1
@@ -328,13 +356,21 @@ WaitForSomething(pClientsReady)
i = XTestProcessInputAction (i, &waittime);
}
#endif /* XTESTEXT1 */
+#ifdef SMART_SCHEDULE
+ if (i >= 0)
+ {
+ SmartScheduleIdle = FALSE;
+ SmartScheduleIdleCount = 0;
+ if (SmartScheduleTimerStopped)
+ (void) SmartScheduleStartTimer ();
+ }
+#endif
if (i <= 0) /* An error or timeout occurred */
{
-
if (dispatchException)
return 0;
- FD_ZERO(&clientsWritable);
if (i < 0)
+ {
if (selecterr == EBADF) /* Some client disconnected */
{
CheckConnections ();
@@ -351,10 +387,22 @@ WaitForSomething(pClientsReady)
ErrorF("WaitForSomething(): select: errno=%d\n",
selecterr);
}
+ }
+#ifdef SMART_SCHEDULE
+ else if (someReady)
+ {
+ /*
+ * If no-one else is home, bail quickly
+ */
+ XFD_COPYSET(&ClientsWithInput, &LastSelectMask);
+ XFD_COPYSET(&ClientsWithInput, &clientsReadable);
+ break;
+ }
+#endif
if (timers)
{
now = GetTimeInMillis();
- while (timers && timers->expires <= now)
+ while (timers && (int) (timers->expires - now) <= 0)
DoTimer(timers, now, &timers);
}
if (*checkForInput[0] != *checkForInput[1])
@@ -362,9 +410,11 @@ WaitForSomething(pClientsReady)
}
else
{
-#ifdef WIN32
fd_set tmp_set;
-#endif
+#ifdef SMART_SCHEDULE
+ if (someReady)
+ XFD_ORSET(&LastSelectMask, &ClientsWithInput, &LastSelectMask);
+#endif
if (AnyClientsWriteBlocked && XFD_ANYSET (&clientsWritable))
{
NewOutputPending = TRUE;
@@ -376,12 +426,8 @@ WaitForSomething(pClientsReady)
XFD_ANDSET(&devicesReadable, &LastSelectMask, &EnabledDevices);
XFD_ANDSET(&clientsReadable, &LastSelectMask, &AllClients);
-#ifndef WIN32
- if (LastSelectMask.fds_bits[0] & WellKnownConnections.fds_bits[0])
-#else
XFD_ANDSET(&tmp_set, &LastSelectMask, &WellKnownConnections);
if (XFD_ANYSET(&tmp_set))
-#endif
QueueWorkProc(EstablishNewConnections, NULL,
(pointer)&LastSelectMask);
#ifdef DPMSExtension
@@ -399,16 +445,17 @@ WaitForSomething(pClientsReady)
#ifndef WIN32
for (i=0; i<howmany(XFD_SETSIZE, NFDBITS); i++)
{
- int highest_priority;
+ int highest_priority = 0;
while (clientsReadable.fds_bits[i])
{
int client_priority, client_index;
curclient = ffs (clientsReadable.fds_bits[i]) - 1;
- client_index = ConnectionTranslation[curclient + (i << 5)];
+ client_index = /* raphael: modified */
+ ConnectionTranslation[curclient + (i * (sizeof(fd_mask) * 8))];
#else
- int highest_priority;
+ int highest_priority = 0;
fd_set savedClientsReadable;
XFD_COPYSET(&clientsReadable, &savedClientsReadable);
for (i = 0; i < XFD_SETCOUNT(&savedClientsReadable); i++)
@@ -450,7 +497,7 @@ WaitForSomething(pClientsReady)
pClientsReady[nready++] = client_index;
}
#ifndef WIN32
- clientsReadable.fds_bits[i] &= ~(((fd_mask)1) << curclient);
+ clientsReadable.fds_bits[i] &= ~(((fd_mask)1L) << curclient);
}
#else
FD_CLR(curclient, &clientsReadable);
@@ -476,11 +523,9 @@ ANYSET(src)
}
#endif
+
static void
-DoTimer(timer, now, prev)
- register OsTimerPtr timer;
- CARD32 now;
- OsTimerPtr *prev;
+DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev)
{
CARD32 newTime;
@@ -536,7 +581,7 @@ TimerSet(timer, flags, millis, func, arg)
return timer;
}
for (prev = &timers;
- *prev && millis > (*prev)->expires;
+ *prev && (int) ((*prev)->expires - millis) <= 0;
prev = &(*prev)->next)
;
timer->next = *prev;
@@ -549,7 +594,6 @@ TimerForce(timer)
register OsTimerPtr timer;
{
register OsTimerPtr *prev;
- register CARD32 newTime;
for (prev = &timers; *prev; prev = &(*prev)->next)
{
@@ -596,7 +640,7 @@ TimerCheck()
{
register CARD32 now = GetTimeInMillis();
- while (timers && timers->expires <= now)
+ while (timers && (int) (timers->expires - now) <= 0)
DoTimer(timers, now, &timers);
}
@@ -605,7 +649,7 @@ TimerInit()
{
OsTimerPtr timer;
- while (timer = timers)
+ while ((timer = timers))
{
timers = timer->next;
xfree(timer);
diff --git a/os/access.c b/os/access.c
index abca79e9d..f12c5c081 100644
--- a/os/access.c
+++ b/os/access.c
@@ -45,6 +45,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/
+/* $XFree86: xc/programs/Xserver/os/access.c,v 3.42 2002/07/07 20:11:52 herrb Exp $ */
#ifdef WIN32
#include <X11/Xwinsock.h>
@@ -53,60 +54,111 @@ SOFTWARE.
#include <stdio.h>
#include <X11/Xtrans.h>
#include <X11/Xauth.h>
-#include "X.h"
-#include "Xproto.h"
+#include <X.h>
+#include <Xproto.h>
#include "misc.h"
#include "site.h"
#include <errno.h>
-
+#include <sys/types.h>
#ifndef WIN32
-#ifdef ESIX
-#include <lan/socket.h>
-#else
+#ifndef Lynx
#include <sys/socket.h>
+#else
+#include <socket.h>
#endif
#include <sys/ioctl.h>
#include <ctype.h>
-#if defined(TCPCONN) || defined(STREAMSCONN) || defined(ISC)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(ISC) || defined(SCO)
#include <netinet/in.h>
-#endif /* TCPCONN || STREAMSCONN || ISC */
+#endif /* TCPCONN || STREAMSCONN || ISC || SCO */
#ifdef DNETCONN
#include <netdnet/dn.h>
#include <netdnet/dnetdb.h>
#endif
-#ifdef hpux
+
+#if defined(DGUX)
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <ctype.h>
+#include <sys/utsname.h>
+#include <sys/stream.h>
+#include <sys/stropts.h>
+#include <sys/param.h>
+#include <sys/sockio.h>
+#endif
+
+
+#if defined(hpux) || defined(QNX4)
# include <sys/utsname.h>
# ifdef HAS_IFREQ
# include <net/if.h>
# endif
#else
-#if defined(SVR4) || (defined(SYSV) && defined(i386))
+#if defined(SVR4) || (defined(SYSV) && defined(i386)) || defined(__GNU__)
# include <sys/utsname.h>
#endif
#if defined(SYSV) && defined(i386)
# include <sys/stream.h>
+# ifdef ISC
+# include <sys/stropts.h>
+# include <sys/sioctl.h>
+# endif /* ISC */
#endif
-#ifdef ESIX
-# include <lan/if.h>
-#else
+#ifdef __GNU__
+#undef SIOCGIFCONF
+#include <netdb.h>
+#else /*!__GNU__*/
# include <net/if.h>
-#endif
+#endif /*__GNU__ */
#endif /* hpux */
#ifdef SVR4
+#ifndef SCO
#include <sys/sockio.h>
#endif
+#include <sys/stropts.h>
+#endif
-#ifdef ESIX
-#include <lan/netdb.h>
-#else
#include <netdb.h>
+
+#ifdef CSRG_BASED
+#include <sys/param.h>
+#if (BSD >= 199103)
+#define VARIABLE_IFREQ
+#endif
+#endif
+
+#ifdef BSD44SOCKETS
+#ifndef VARIABLE_IFREQ
+#define VARIABLE_IFREQ
+#endif
+#endif
+
+#ifdef HAS_GETIFADDRS
+#include <ifaddrs.h>
#endif
#endif /* WIN32 */
+#ifndef PATH_MAX
+#ifndef Lynx
+#include <sys/param.h>
+#else
+#include <param.h>
+#endif
+#ifndef PATH_MAX
+#ifdef MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+#endif
+
#define X_INCLUDE_NETDB_H
#include <X11/Xos_r.h>
@@ -127,29 +179,17 @@ Bool defeatAccessControl = FALSE;
(length) == (host)->len &&\
!acmp (address, (host)->addr, length))
-static int ConvertAddr(
-#if NeedFunctionPrototypes
- struct sockaddr */*saddr*/,
- int */*len*/,
- pointer */*addr*/
-#endif
-);
+static int ConvertAddr(struct sockaddr */*saddr*/,
+ int */*len*/,
+ pointer */*addr*/);
-static int CheckAddr(
-#if NeedFunctionPrototypes
- int /*family*/,
- pointer /*pAddr*/,
- unsigned /*length*/
-#endif
-);
+static int CheckAddr(int /*family*/,
+ pointer /*pAddr*/,
+ unsigned /*length*/);
-static Bool NewHost(
-#if NeedFunctionPrototypes
- int /*family*/,
- pointer /*addr*/,
- int /*len*/
-#endif
-);
+static Bool NewHost(int /*family*/,
+ pointer /*addr*/,
+ int /*len*/);
typedef struct _host {
short family;
@@ -175,7 +215,7 @@ static int UsingXdmcp = FALSE;
*/
void
-EnableLocalHost ()
+EnableLocalHost (void)
{
if (!UsingXdmcp)
{
@@ -188,7 +228,7 @@ EnableLocalHost ()
* called when authorization is enabled to keep us secure
*/
void
-DisableLocalHost ()
+DisableLocalHost (void)
{
HOST *self;
@@ -203,13 +243,66 @@ DisableLocalHost ()
*/
void
-AccessUsingXdmcp ()
+AccessUsingXdmcp (void)
{
UsingXdmcp = TRUE;
LocalHostEnabled = FALSE;
}
+#if ((defined(SVR4) && !defined(DGUX) && !defined(SCO325) && !defined(sun) && !defined(NCR)) || defined(ISC)) && defined(SIOCGIFCONF)
+
+/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */
+
+static int
+ifioctl (int fd, int cmd, char *arg)
+{
+ struct strioctl ioc;
+ int ret;
+
+ bzero((char *) &ioc, sizeof(ioc));
+ ioc.ic_cmd = cmd;
+ ioc.ic_timout = 0;
+ if (cmd == SIOCGIFCONF)
+ {
+ ioc.ic_len = ((struct ifconf *) arg)->ifc_len;
+ ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf;
+#ifdef ISC
+ /* SIOCGIFCONF is somewhat brain damaged on ISC. The argument
+ * buffer must contain the ifconf structure as header. Ifc_req
+ * is also not a pointer but a one element array of ifreq
+ * structures. On return this array is extended by enough
+ * ifreq fields to hold all interfaces. The return buffer length
+ * is placed in the buffer header.
+ */
+ ((struct ifconf *) ioc.ic_dp)->ifc_len =
+ ioc.ic_len - sizeof(struct ifconf);
+#endif
+ }
+ else
+ {
+ ioc.ic_len = sizeof(struct ifreq);
+ ioc.ic_dp = arg;
+ }
+ ret = ioctl(fd, I_STR, (char *) &ioc);
+ if (ret >= 0 && cmd == SIOCGIFCONF)
+#ifdef SVR4
+ ((struct ifconf *) arg)->ifc_len = ioc.ic_len;
+#endif
+#ifdef ISC
+ {
+ ((struct ifconf *) arg)->ifc_len =
+ ((struct ifconf *)ioc.ic_dp)->ifc_len;
+ ((struct ifconf *) arg)->ifc_buf =
+ (caddr_t)((struct ifconf *)ioc.ic_dp)->ifc_req;
+ }
+#endif
+ return(ret);
+}
+#else /* Case DGUX, sun, SCO325 NCR and others */
+#define ifioctl ioctl
+#endif /* ((SVR4 && !DGUX !sun !SCO325 !NCR) || ISC) && SIOCGIFCONF */
+
/*
* DefineSelf (fd):
*
@@ -231,8 +324,7 @@ AccessUsingXdmcp ()
#include <netinet/in_var.h>
void
-DefineSelf (fd)
- int fd;
+DefineSelf (int fd)
{
/*
* The Wolongong drivers used by NCR SVR4/MP-RAS don't understand the
@@ -249,7 +341,7 @@ DefineSelf (fd)
int family, len;
if ((fd = open ("/dev/ip", O_RDWR, 0 )) < 0)
- Error ("Getting interface configuration");
+ Error ("Getting interface configuration (1)");
/* Indicate that we want to start at the begining */
ifnet.ib_next = (struct ipb *) 1;
@@ -264,7 +356,7 @@ DefineSelf (fd)
if (ioctl (fd, (int) I_STR, (char *) &str) < 0)
{
close (fd);
- Error ("Getting interface configuration");
+ Error ("Getting interface configuration (2)");
}
ifaddr.ia_next = (struct in_ifaddr *) ifnet.if_addrlist;
@@ -276,7 +368,7 @@ DefineSelf (fd)
if (ioctl (fd, (int) I_STR, (char *) &str) < 0)
{
close (fd);
- Error ("Getting interface configuration");
+ Error ("Getting interface configuration (3)");
}
len = sizeof(struct sockaddr_in);
@@ -354,12 +446,11 @@ DefineSelf (fd)
#else /* WINTCP */
-#if !defined(SIOCGIFCONF) || (defined (hpux) && ! defined (HAS_IFREQ))
+#if !defined(SIOCGIFCONF) || (defined (hpux) && ! defined (HAS_IFREQ)) || defined(QNX4)
void
-DefineSelf (fd)
- int fd;
+DefineSelf (int fd)
{
-#if !defined(TCPCONN) && !defined(UNIXCONN)
+#if !defined(TCPCONN) && !defined(STREAMSCONN) && !defined(UNIXCONN) && !defined(MNX_TCPCONN)
return;
#else
register int n;
@@ -368,12 +459,7 @@ DefineSelf (fd)
int family;
register HOST *host;
-#if defined(__386BSD__) || defined(__NetBSD__) || defined(__FreeBSD__) \
- || defined(WIN32)
- char name[100];
-#else
struct utsname name;
-#endif
register struct hostent *hp;
union {
@@ -383,23 +469,26 @@ DefineSelf (fd)
struct sockaddr_in *inetaddr;
struct sockaddr_in broad_addr;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams;
+#endif
-#if defined(__386BSD__) || defined(__NetBSD__) || defined(__FreeBSD__) \
- || defined(WIN32)
- if (gethostname (name, sizeof name) < 0)
- hp = NULL;
- else
- hp = _XGethostbyname(name, hparams);
-#else
/* Why not use gethostname()? Well, at least on my system, I've had to
* make an ugly kernel patch to get a name longer than 8 characters, and
* uname() lets me access to the whole string (it smashes release, you
* see), whereas gethostname() kindly truncates it for me.
*/
+#ifndef QNX4
uname(&name);
- hp = _XGethostbyname(name.nodename, hparams);
+#else
+ /* QNX4's uname returns node number in name.nodename, not the hostname
+ have to overwrite it */
+ char hname[1024];
+ gethostname(hname, 1024);
+ name.nodename = hname;
#endif
+
+ hp = _XGethostbyname(name.nodename, hparams);
if (hp != NULL)
{
saddr.sa.sa_family = hp->h_addrtype;
@@ -463,22 +552,44 @@ DefineSelf (fd)
selfhosts = host;
}
}
-#endif /* !TCPCONN && !UNIXCONN */
+#endif /* !TCPCONN && !STREAMSCONN && !UNIXCONN && !MNX_TCPCONN */
}
#else
+
+#ifdef VARIABLE_IFREQ
+#define ifr_size(p) (sizeof (struct ifreq) + \
+ (p->ifr_addr.sa_len > sizeof (p->ifr_addr) ? \
+ p->ifr_addr.sa_len - sizeof (p->ifr_addr) : 0))
+#define ifraddr_size(a) (a.sa_len)
+#else
+#ifdef QNX4
+#define ifr_size(p) (p->ifr_addr.sa_len + IFNAMSIZ)
+#define ifraddr_size(a) (a.sa_len)
+#else
+#define ifr_size(p) (sizeof (struct ifreq))
+#define ifraddr_size(a) (sizeof (a))
+#endif
+#endif
+
+#ifdef DEF_SELF_DEBUG
+#include <arpa/inet.h>
+#endif
+
void
-DefineSelf (fd)
- int fd;
+DefineSelf (int fd)
{
- char buf[2048];
+#ifndef HAS_GETIFADDRS
+ char buf[2048], *cp, *cplim;
struct ifconf ifc;
- register int n;
+ register struct ifreq *ifr;
+#else
+ struct ifaddrs * ifap, *ifr;
+#endif
int len;
unsigned char * addr;
int family;
register HOST *host;
- register struct ifreq *ifr;
#ifdef DNETCONN
struct dn_naddr *dnaddr = getnodeadd();
@@ -508,23 +619,25 @@ DefineSelf (fd)
}
}
}
-#endif
+#endif /* DNETCONN */
+#ifndef HAS_GETIFADDRS
ifc.ifc_len = sizeof (buf);
ifc.ifc_buf = buf;
- if (ioctl (fd, (int) SIOCGIFCONF, (pointer) &ifc) < 0)
- Error ("Getting interface configuration");
- for (ifr = ifc.ifc_req
-#ifdef BSD44SOCKETS
- ; (char *)ifr < ifc.ifc_buf + ifc.ifc_len;
- ifr = (struct ifreq *)((char *)ifr + sizeof (struct ifreq) +
- (ifr->ifr_addr.sa_len > sizeof (ifr->ifr_addr) ?
- ifr->ifr_addr.sa_len - sizeof (ifr->ifr_addr) : 0))
+ if (ifioctl (fd, SIOCGIFCONF, (pointer) &ifc) < 0)
+ Error ("Getting interface configuration (4)");
+
+#ifdef ISC
+#define IFC_IFC_REQ (struct ifreq *) ifc.ifc_buf
#else
- , n = ifc.ifc_len / sizeof (struct ifreq); --n >= 0; ifr++
-#endif
- )
+#define IFC_IFC_REQ ifc.ifc_req
+#endif /* ISC */
+
+ cplim = (char *) IFC_IFC_REQ + ifc.ifc_len;
+
+ for (cp = (char *) IFC_IFC_REQ; cp < cplim; cp += ifr_size (ifr))
{
- len = sizeof(ifr->ifr_addr);
+ ifr = (struct ifreq *) cp;
+ len = ifraddr_size (ifr->ifr_addr);
#ifdef DNETCONN
/*
* DECnet was handled up above.
@@ -535,6 +648,11 @@ DefineSelf (fd)
family = ConvertAddr (&ifr->ifr_addr, &len, (pointer *)&addr);
if (family == -1 || family == FamilyLocal)
continue;
+#ifdef DEF_SELF_DEBUG
+ if (family == FamilyInternet)
+ ErrorF("Xserver: DefineSelf(): ifname = %s, addr = %d.%d.%d.%d\n",
+ ifr->ifr_name, addr[0], addr[1], addr[2], addr[3]);
+#endif /* DEF_SELF_DEBUG */
for (host = selfhosts;
host && !addrEqual (family, addr, len, host);
host = host->next)
@@ -578,13 +696,13 @@ DefineSelf (fd)
struct ifreq broad_req;
broad_req = *ifr;
- if (ioctl (fd, SIOCGIFFLAGS, (char *) &broad_req) != -1 &&
+ if (ifioctl (fd, SIOCGIFFLAGS, (char *) &broad_req) != -1 &&
(broad_req.ifr_flags & IFF_BROADCAST) &&
(broad_req.ifr_flags & IFF_UP)
)
{
broad_req = *ifr;
- if (ioctl (fd, SIOCGIFBRDADDR, &broad_req) != -1)
+ if (ifioctl (fd, SIOCGIFBRDADDR, &broad_req) != -1)
broad_addr = broad_req.ifr_addr;
else
continue;
@@ -592,11 +710,84 @@ DefineSelf (fd)
else
continue;
}
-#endif
+#endif /* SIOCGIFBRDADDR */
+#ifdef DEF_SELF_DEBUG
+ ErrorF("Xserver: DefineSelf(): ifname = %s, baddr = %s\n",
+ ifr->ifr_name,
+ inet_ntoa(((struct sockaddr_in *) &broad_addr)->sin_addr));
+#endif /* DEF_SELF_DEBUG */
XdmcpRegisterBroadcastAddress ((struct sockaddr_in *) &broad_addr);
}
-#endif
+#endif /* XDMCP */
+ }
+#else /* HAS_GETIFADDRS */
+ if (getifaddrs(&ifap) < 0) {
+ ErrorF("Warning: getifaddrs returns %s\n", strerror(errno));
+ return;
}
+ for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) {
+#ifdef DNETCONN
+ if (ifr->ifa_addr.sa_family == AF_DECnet)
+ continue;
+#endif /* DNETCONN */
+ family = ConvertAddr(ifr->ifa_addr, &len, (pointer *)&addr);
+ if (family == -1 || family == FamilyLocal)
+ continue;
+#ifdef DEF_SELF_DEBUG
+ if (family == FamilyInternet)
+ ErrorF("Xserver: DefineSelf(): ifname = %s, addr = %d.%d.%d.%d\n",
+ ifr->ifa_name, addr[0], addr[1], addr[2], addr[3]);
+#endif /* DEF_SELF_DEBUG */
+ for (host = selfhosts;
+ host != NULL && !addrEqual(family, addr, len, host);
+ host = host->next)
+ ;
+ if (host != NULL)
+ continue;
+ MakeHost(host, len);
+ if (host != NULL) {
+ host->family = family;
+ host->len = len;
+ acopy(addr, host->addr, len);
+ host->next = selfhosts;
+ selfhosts = host;
+ }
+#ifdef XDMCP
+ {
+ struct sockaddr broad_addr;
+ /*
+ * If this isn't an Internet Address, don't register it.
+ */
+ if (family != FamilyInternet)
+ continue;
+ /*
+ * ignore 'localhost' entries as they're not usefule
+ * on the other end of the wire
+ */
+ if (len == 4 &&
+ addr[0] == 127 && addr[1] == 0 &&
+ addr[2] == 0 && addr[2] == 1)
+ continue;
+ XdmcpRegisterConnection(family, (char *)addr, len);
+ if ((ifr->ifa_flags & IFF_BROADCAST) &&
+ (ifr->ifa_flags & IFF_UP))
+ broad_addr = *ifr->ifa_broadaddr;
+ else
+ continue;
+#ifdef DEF_SELF_DEBUG
+ ErrorF("Xserver: DefineSelf(): ifname = %s, baddr = %s\n",
+ ifr->ifa_name,
+ inet_ntoa(((struct sockaddr_in *) &broad_addr)->sin_addr));
+#endif /* DEF_SELF_DEBUG */
+ XdmcpRegisterBroadcastAddress((struct sockaddr_in *)
+ &broad_addr);
+ }
+#endif /* XDMCP */
+
+ } /* for */
+ freeifaddrs(ifap);
+#endif /* HAS_GETIFADDRS */
+
/*
* add something of FamilyLocalHost
*/
@@ -621,9 +812,7 @@ DefineSelf (fd)
#ifdef XDMCP
void
-AugmentSelf(from, len)
- pointer from;
- int len;
+AugmentSelf(pointer from, int len)
{
int family;
pointer addr;
@@ -649,7 +838,7 @@ AugmentSelf(from, len)
#endif
void
-AddLocalHosts ()
+AddLocalHosts (void)
{
HOST *self;
@@ -657,25 +846,21 @@ AddLocalHosts ()
(void) NewHost (self->family, self->addr, self->len);
}
-static char* etcx_hosts = NULL;
-
/* Reset access control list to initial hosts */
void
-ResetHosts (display)
- char *display;
+ResetHosts (char *display)
{
register HOST *host;
char lhostname[120], ohostname[120];
char *hostname = ohostname;
+ char fname[PATH_MAX + 1];
int fnamelen;
- char* etcstr = "/etc/X";
- char* dothoststr = ".hosts";
FILE *fd;
char *ptr;
int i, hostlen;
union {
struct sockaddr sa;
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
struct sockaddr_in in;
#endif /* TCPCONN || STREAMSCONN */
#ifdef DNETCONN
@@ -690,42 +875,41 @@ ResetHosts (display)
krb5_principal princ;
krb5_data kbuf;
#endif
- int family;
+ int family = 0;
pointer addr;
int len;
register struct hostent *hp;
AccessEnabled = defeatAccessControl ? FALSE : DEFAULT_ACCESS_CONTROL;
LocalHostEnabled = FALSE;
- while (host = validhosts)
+ while ((host = validhosts) != 0)
{
validhosts = host->next;
FreeHost (host);
}
- if (etcx_hosts == NULL) {
- fnamelen = strlen (display);
- fnamelen += strlen (etcstr);
- fnamelen += strlen (dothoststr);
- etcx_hosts = (char*) xalloc (fnamelen + 1); /* A memory leak? No! */
- /* eventually could use snprintf, when more systems have it */
- sprintf (etcx_hosts, "%s%s%s", etcstr, display, dothoststr);
-#ifndef WIN32
-#ifdef PATH_MAX
- if (fnamelen > PATH_MAX) {
- /* punish stupid hackers */
- strcpy (etcx_hosts, "/dev/zero");
- }
-#endif
-#endif
- }
- if (fd = fopen (etcx_hosts, "r"))
+#define ETC_HOST_PREFIX "/etc/X"
+#define ETC_HOST_SUFFIX ".hosts"
+ fnamelen = strlen(ETC_HOST_PREFIX) + strlen(ETC_HOST_SUFFIX) +
+ strlen(display) + 1;
+ if (fnamelen > sizeof(fname))
+ FatalError("Display name `%s' is too long\n", display);
+ sprintf(fname, ETC_HOST_PREFIX "%s" ETC_HOST_SUFFIX, display);
+#ifdef __UNIXOS2__
+ strcpy(fname, (char*)__XOS2RedirRoot(fname));
+#endif /* __UNIXOS2__ */
+
+ if ((fd = fopen (fname, "r")) != 0)
{
while (fgets (ohostname, sizeof (ohostname), fd))
{
if (*ohostname == '#')
continue;
- if (ptr = strchr(ohostname, '\n'))
+ if ((ptr = strchr(ohostname, '\n')) != 0)
+ *ptr = 0;
+#ifdef __UNIXOS2__
+ if ((ptr = strchr(ohostname, '\r')) != 0)
*ptr = 0;
+#endif
hostlen = strlen(ohostname) + 1;
for (i = 0; i < hostlen; i++)
lhostname[i] = tolower(ohostname[i]);
@@ -735,7 +919,7 @@ ResetHosts (display)
family = FamilyLocalHost;
NewHost(family, "", 0);
}
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
else if (!strncmp("inet:", lhostname, 5))
{
family = FamilyInternet;
@@ -807,14 +991,16 @@ ResetHosts (display)
}
else
#endif /* SECURE_RPC */
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
{
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams;
+#endif
/* host name */
- if (family == FamilyInternet &&
- (hp = _XGethostbyname(hostname, hparams)) ||
- (hp = _XGethostbyname(hostname, hparams)))
+ if ((family == FamilyInternet &&
+ ((hp = _XGethostbyname(hostname, hparams)) != 0)) ||
+ ((hp = _XGethostbyname(hostname, hparams)) != 0))
{
saddr.sa.sa_family = hp->h_addrtype;
len = sizeof(saddr.sa);
@@ -840,8 +1026,7 @@ ResetHosts (display)
}
/* Is client on the local host */
-Bool LocalClient(client)
- ClientPtr client;
+Bool LocalClient(ClientPtr client)
{
int alen, family, notused;
Xtransaddr *from = NULL;
@@ -886,9 +1071,57 @@ Bool LocalClient(client)
return FALSE;
}
+/*
+ * Return the uid and gid of a connected local client
+ * or the uid/gid for nobody those ids cannot be determinded
+ *
+ * Used by XShm to test access rights to shared memory segments
+ */
+int
+LocalClientCred(ClientPtr client, int *pUid, int *pGid)
+{
+ int fd;
+ XtransConnInfo ci;
+#ifdef HAS_GETPEEREID
+ uid_t uid;
+ gid_t gid;
+#elif defined(SO_PEERCRED)
+ struct ucred peercred;
+ socklen_t so_len = sizeof(peercred);
+#endif
+
+ if (client == NULL)
+ return -1;
+ ci = ((OsCommPtr)client->osPrivate)->trans_conn;
+ /* We can only determine peer credentials for Unix domain sockets */
+ if (!_XSERVTransIsLocal(ci)) {
+ return -1;
+ }
+ fd = _XSERVTransGetConnectionNumber(ci);
+#ifdef HAS_GETPEEREID
+ if (getpeereid(fd, &uid, &gid) == -1)
+ return -1;
+ if (pUid != NULL)
+ *pUid = uid;
+ if (pGid != NULL)
+ *pGid = gid;
+ return 0;
+#elif defined(SO_PEERCRED)
+ if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) == -1)
+ return -1;
+ if (pUid != NULL)
+ *pUid = peercred.uid;
+ if (pGid != NULL)
+ *pGid = peercred.gid;
+ return 0;
+#else
+ /* No system call available to get the credentials of the peer */
+ return -1;
+#endif
+}
+
static Bool
-AuthorizedClient(client)
- ClientPtr client;
+AuthorizedClient(ClientPtr client)
{
if (!client || defeatAccessControl)
return TRUE;
@@ -899,11 +1132,10 @@ AuthorizedClient(client)
* called from the dispatcher */
int
-AddHost (client, family, length, pAddr)
- ClientPtr client;
- int family;
- unsigned length; /* of bytes in pAddr */
- pointer pAddr;
+AddHost (ClientPtr client,
+ int family,
+ unsigned length, /* of bytes in pAddr */
+ pointer pAddr)
{
int len;
@@ -945,10 +1177,12 @@ AddHost (client, family, length, pAddr)
}
Bool
-ForEachHostInFamily (family, func, closure)
- int family;
- Bool (*func)();
- pointer closure;
+ForEachHostInFamily (int family,
+ Bool (*func)(
+ unsigned char * /* addr */,
+ short /* len */,
+ pointer /* closure */),
+ pointer closure)
{
HOST *host;
@@ -961,10 +1195,9 @@ ForEachHostInFamily (family, func, closure)
/* Add a host to the access control list. This is the internal interface
* called when starting or resetting the server */
static Bool
-NewHost (family, addr, len)
- int family;
- pointer addr;
- int len;
+NewHost (int family,
+ pointer addr,
+ int len)
{
register HOST *host;
@@ -987,11 +1220,11 @@ NewHost (family, addr, len)
/* Remove a host from the access control list */
int
-RemoveHost (client, family, length, pAddr)
- ClientPtr client;
- int family;
- unsigned length; /* of bytes in pAddr */
- pointer pAddr;
+RemoveHost (
+ ClientPtr client,
+ int family,
+ unsigned length, /* of bytes in pAddr */
+ pointer pAddr)
{
int len;
register HOST *host, **prev;
@@ -1041,11 +1274,11 @@ RemoveHost (client, family, length, pAddr)
/* Get all hosts in the access control list */
int
-GetHosts (data, pnHosts, pLen, pEnabled)
- pointer *data;
- int *pnHosts;
- int *pLen;
- BOOL *pEnabled;
+GetHosts (
+ pointer *data,
+ int *pnHosts,
+ int *pLen,
+ BOOL *pEnabled)
{
int len;
register int n = 0;
@@ -1087,16 +1320,16 @@ GetHosts (data, pnHosts, pLen, pEnabled)
/*ARGSUSED*/
static int
-CheckAddr (family, pAddr, length)
- int family;
- pointer pAddr;
- unsigned length;
+CheckAddr (
+ int family,
+ pointer pAddr,
+ unsigned length)
{
int len;
switch (family)
{
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(AMTCPCONN) || defined(MNX_TCPCONN)
case FamilyInternet:
if (length == sizeof (struct in_addr))
len = length;
@@ -1128,9 +1361,10 @@ CheckAddr (family, pAddr, length)
/* Check if a host is not in the access control list.
* Returns 1 if host is invalid, 0 if we've found it. */
-InvalidHost (saddr, len)
- register struct sockaddr *saddr;
- int len;
+int
+InvalidHost (
+ register struct sockaddr *saddr,
+ int len)
{
int family;
pointer addr;
@@ -1171,21 +1405,21 @@ InvalidHost (saddr, len)
}
static int
-ConvertAddr (saddr, len, addr)
- register struct sockaddr *saddr;
- int *len;
- pointer *addr;
+ConvertAddr (
+ register struct sockaddr *saddr,
+ int *len,
+ pointer *addr)
{
if (*len == 0)
return (FamilyLocal);
switch (saddr->sa_family)
{
case AF_UNSPEC:
-#if defined(UNIXCONN) || defined(LOCALCONN)
+#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
case AF_UNIX:
#endif
return FamilyLocal;
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)
case AF_INET:
*len = sizeof (struct in_addr);
*addr = (pointer) &(((struct sockaddr_in *) saddr)->sin_addr);
@@ -1213,9 +1447,9 @@ ConvertAddr (saddr, len, addr)
}
int
-ChangeAccessControl(client, fEnabled)
- ClientPtr client;
- int fEnabled;
+ChangeAccessControl(
+ ClientPtr client,
+ int fEnabled)
{
if (!AuthorizedClient(client))
return BadAccess;
@@ -1225,8 +1459,7 @@ ChangeAccessControl(client, fEnabled)
/* returns FALSE if xhost + in effect, else TRUE */
int
-GetAccessControl()
+GetAccessControl(void)
{
return AccessEnabled;
}
-
diff --git a/os/auth.c b/os/auth.c
index 7b914bb28..b596aed44 100644
--- a/os/auth.c
+++ b/os/auth.c
@@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/auth.c,v 1.12 2002/12/09 02:56:03 dawes Exp $ */
/*
* authorization hooks for the server
@@ -35,9 +36,10 @@ from The Open Group.
#ifdef K5AUTH
# include <krb5/krb5.h>
#endif
-# include "X.h"
-# include "Xauth.h"
+# include <X11/X.h>
+# include <X11/Xauth.h>
# include "misc.h"
+# include "osdep.h"
# include "dixstruct.h"
# include <sys/types.h>
# include <sys/stat.h>
@@ -52,50 +54,17 @@ from The Open Group.
struct protocol {
unsigned short name_length;
char *name;
- int (*Add)(); /* new authorization data */
- XID (*Check)(); /* verify client authorization data */
- int (*Reset)(); /* delete all authorization data entries */
- XID (*ToID)(); /* convert cookie to ID */
- int (*FromID)(); /* convert ID to cookie */
- int (*Remove)(); /* remove a specific cookie */
+ AuthAddCFunc Add; /* new authorization data */
+ AuthCheckFunc Check; /* verify client authorization data */
+ AuthRstCFunc Reset; /* delete all authorization data entries */
+ AuthToIDFunc ToID; /* convert cookie to ID */
+ AuthFromIDFunc FromID; /* convert ID to cookie */
+ AuthRemCFunc Remove; /* remove a specific cookie */
#ifdef XCSECURITY
- XID (*Generate)();
+ AuthGenCFunc Generate;
#endif
};
-extern int MitAddCookie ();
-extern XID MitCheckCookie ();
-extern int MitResetCookie ();
-extern XID MitToID ();
-extern int MitFromID (), MitRemoveCookie ();
-extern XID MitGenerateCookie();
-
-#ifdef HASXDMAUTH
-extern int XdmAddCookie ();
-extern XID XdmCheckCookie ();
-extern int XdmResetCookie ();
-extern XID XdmToID ();
-extern int XdmFromID (), XdmRemoveCookie ();
-#endif
-
-#ifdef SECURE_RPC
-extern int SecureRPCAdd();
-extern XID SecureRPCCheck();
-extern int SecureRPCReset();
-extern XID SecureRPCToID();
-extern int SecureRPCFromID(), SecureRPCRemove();
-#endif
-
-#ifdef K5AUTH
-extern int K5Add();
-extern XID K5Check();
-extern int K5Reset();
-extern XID K5ToID();
-extern int K5FromID(), K5Remove();
-#endif
-
-extern XID AuthSecurityCheck();
-
static struct protocol protocols[] = {
{ (unsigned short) 18, "MIT-MAGIC-COOKIE-1",
MitAddCookie, MitCheckCookie, MitResetCookie,
@@ -154,27 +123,39 @@ static char *authorization_file = (char *)NULL;
static Bool ShouldLoadAuth = TRUE;
void
-InitAuthorization (file_name)
-char *file_name;
+InitAuthorization (char *file_name)
{
authorization_file = file_name;
}
int
-LoadAuthorization ()
+LoadAuthorization (void)
{
FILE *f;
Xauth *auth;
int i;
int count = 0;
+#if !defined(WIN32) && !defined(__UNIXOS2__)
+ char *buf;
+#endif
ShouldLoadAuth = FALSE;
if (!authorization_file)
return 0;
+#if !defined(WIN32) && !defined(__UNIXOS2__)
+ buf = xalloc (strlen(authorization_file) + 5);
+ if (!buf)
+ return -1;
+ sprintf (buf, "cat %s", authorization_file);
+ f = Popen (buf, "r");
+ xfree (buf);
+#else
f = fopen (authorization_file, "r");
+#endif
if (!f)
- return 0;
- while (auth = XauReadAuth (f)) {
+ return -1;
+
+ while ((auth = XauReadAuth (f)) != 0) {
for (i = 0; i < NUM_AUTHORIZATION; i++) {
if (protocols[i].name_length == auth->name_length &&
memcmp (protocols[i].name, auth->name, (int) auth->name_length) == 0 &&
@@ -187,7 +168,13 @@ LoadAuthorization ()
}
XauDisposeAuth (auth);
}
+
+#if !defined(WIN32) && !defined(__UNIXOS2__)
+ if (Pclose (f) != 0)
+ return -1;
+#else
fclose (f);
+#endif
return count;
}
@@ -197,7 +184,7 @@ LoadAuthorization ()
* schemes supported by the display
*/
void
-RegisterAuthorizations ()
+RegisterAuthorizations (void)
{
int i;
@@ -208,17 +195,18 @@ RegisterAuthorizations ()
#endif
XID
-CheckAuthorization (name_length, name, data_length, data, client, reason)
- unsigned int name_length;
- char *name;
- unsigned int data_length;
- char *data;
- ClientPtr client;
- char **reason; /* failure message. NULL for default msg */
+CheckAuthorization (
+ unsigned int name_length,
+ char *name,
+ unsigned int data_length,
+ char *data,
+ ClientPtr client,
+ char **reason) /* failure message. NULL for default msg */
{
int i;
struct stat buf;
static time_t lastmod = 0;
+ static Bool loaded = FALSE;
if (!authorization_file || stat(authorization_file, &buf))
{
@@ -234,24 +222,45 @@ CheckAuthorization (name_length, name, data_length, data, client, reason)
}
if (ShouldLoadAuth)
{
- if (LoadAuthorization())
+ int loadauth = LoadAuthorization();
+
+ /*
+ * If the authorization file has at least one entry for this server,
+ * disable local host access. (loadauth > 0)
+ *
+ * If there are zero entries (either initially or when the
+ * authorization file is later reloaded), or if a valid
+ * authorization file was never loaded, enable local host access.
+ * (loadauth == 0 || !loaded)
+ *
+ * If the authorization file was loaded initially (with valid
+ * entries for this server), and reloading it later fails, don't
+ * change anything. (loadauth == -1 && loaded)
+ */
+
+ if (loadauth > 0)
+ {
DisableLocalHost(); /* got at least one */
- else
+ loaded = TRUE;
+ }
+ else if (loadauth == 0 || !loaded)
EnableLocalHost ();
}
- if (name_length)
+ if (name_length) {
for (i = 0; i < NUM_AUTHORIZATION; i++) {
if (protocols[i].name_length == name_length &&
memcmp (protocols[i].name, name, (int) name_length) == 0)
{
return (*protocols[i].Check) (data_length, data, client, reason);
}
+ *reason = "Protocol not supported by server\n";
}
+ } else *reason = "No protocol specified\n";
return (XID) ~0L;
}
void
-ResetAuthorization ()
+ResetAuthorization (void)
{
int i;
@@ -262,11 +271,11 @@ ResetAuthorization ()
}
XID
-AuthorizationToID (name_length, name, data_length, data)
-unsigned short name_length;
-char *name;
-unsigned short data_length;
-char *data;
+AuthorizationToID (
+ unsigned short name_length,
+ char *name,
+ unsigned short data_length,
+ char *data)
{
int i;
@@ -282,12 +291,12 @@ char *data;
}
int
-AuthorizationFromID (id, name_lenp, namep, data_lenp, datap)
-XID id;
-unsigned short *name_lenp;
-char **namep;
-unsigned short *data_lenp;
-char **datap;
+AuthorizationFromID (
+ XID id,
+ unsigned short *name_lenp,
+ char **namep,
+ unsigned short *data_lenp,
+ char **datap)
{
int i;
@@ -303,11 +312,11 @@ char **datap;
}
int
-RemoveAuthorization (name_length, name, data_length, data)
-unsigned short name_length;
-char *name;
-unsigned short data_length;
-char *data;
+RemoveAuthorization (
+ unsigned short name_length,
+ char *name,
+ unsigned short data_length,
+ char *data)
{
int i;
@@ -323,11 +332,7 @@ char *data;
}
int
-AddAuthorization (name_length, name, data_length, data)
-unsigned int name_length;
-char *name;
-unsigned int data_length;
-char *data;
+AddAuthorization (unsigned name_length, char *name, unsigned data_length, char *data)
{
int i;
@@ -345,14 +350,13 @@ char *data;
#ifdef XCSECURITY
XID
-GenerateAuthorization(name_length, name, data_length, data,
- data_length_return, data_return)
-unsigned int name_length;
-char *name;
-unsigned int data_length;
-char *data;
-unsigned int *data_length_return;
-char **data_return;
+GenerateAuthorization(
+ unsigned name_length,
+ char *name,
+ unsigned data_length,
+ char *data,
+ unsigned *data_length_return,
+ char **data_return)
{
int i;
@@ -375,23 +379,20 @@ char **data_return;
static unsigned long int next = 1;
static int
-xdm_rand()
+xdm_rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
static void
-xdm_srand(seed)
- unsigned int seed;
+xdm_srand(unsigned int seed)
{
next = seed;
}
void
-GenerateRandomData (len, buf)
-int len;
-char *buf;
+GenerateRandomData (int len, char *buf)
{
static int seed;
int value;
diff --git a/os/connection.c b/os/connection.c
index 7c4b9fef3..46cfd4dfb 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -45,6 +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 $ */
/*****************************************************************
* Stuff to create connections --- OS dependent
*
@@ -69,43 +70,78 @@ SOFTWARE.
#include "Xproto.h"
#include <X11/Xtrans.h>
#include <errno.h>
-#ifdef X_NOT_STDC_ENV
-extern int errno;
-#endif
-
#include <signal.h>
#include <stdio.h>
#ifndef WIN32
+#if defined(Lynx)
+#include <socket.h>
+#else
#include <sys/socket.h>
+#endif
#ifdef hpux
#include <sys/utsname.h>
#include <sys/ioctl.h>
#endif
+#if defined(DGUX)
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <sys/param.h>
+#include <unistd.h>
+#endif
+
+
#ifdef AIXV3
#include <sys/ioctl.h>
#endif
+#ifdef __UNIXOS2__
+#define select(n,r,w,x,t) os2PseudoSelect(n,r,w,x,t)
+extern __const__ int _nfiles;
+#endif
+
#if defined(TCPCONN) || defined(STREAMSCONN)
# include <netinet/in.h>
-# ifndef hpux
+# include <arpa/inet.h>
+# if !defined(hpux)
# ifdef apollo
# ifndef NO_TCP_H
# include <netinet/tcp.h>
# endif
# else
-# include <netinet/tcp.h>
+# ifdef CSRG_BASED
+# include <sys/param.h>
+# endif
+# ifndef __UNIXOS2__
+# include <netinet/tcp.h>
+# endif
# endif
# endif
#endif
+#ifdef AMTCPCONN
+#include <server/ip/types.h>
+#include <server/ip/gen/in.h>
+#include <server/ip/gen/inet.h>
+#endif
+
+#if !defined(__UNIXOS2__)
+#ifndef Lynx
#include <sys/uio.h>
+#else
+#include <uio.h>
+#endif
+#endif
#endif /* WIN32 */
#include "misc.h" /* for typedef of pointer */
-#include <X11/Xpoll.h>
#include "osdep.h"
+#include <X11/Xpoll.h>
#include "opaque.h"
#include "dixstruct.h"
#ifdef XAPPGROUP
@@ -116,6 +152,8 @@ extern int errno;
#include "extensions/security.h"
#endif
#ifdef LBX
+#include "colormapst.h"
+#include "propertyst.h"
#include "lbxserve.h"
#endif
@@ -129,7 +167,6 @@ extern int errno;
#include <netdnet/dn.h>
#endif /* DNETCONN */
-extern char *display; /* The display number */
int lastfdesc; /* maximum file descriptor */
fd_set WellKnownConnections; /* Listener mask */
@@ -140,16 +177,13 @@ fd_set LastSelectMask; /* mask returned from last select call */
fd_set ClientsWithInput; /* clients with FULL requests in buffer */
fd_set ClientsWriteBlocked; /* clients who cannot receive output */
fd_set OutputPending; /* clients with reply/event data ready to go */
-#ifndef _SC_OPEN_MAX
-int MaxClients = MAXSOCKS; /* use MAXSOCKS if sysconf(_SC_OPEN_MAX) is not supported */
-#else
int MaxClients = 0;
-#endif
Bool NewOutputPending; /* not yet attempted to write some new output */
Bool AnyClientsWriteBlocked; /* true if some client blocked on write */
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;
static Bool debug_conns = FALSE;
@@ -161,9 +195,8 @@ static fd_set SavedAllSockets;
static fd_set SavedClientsWithInput;
int GrabInProgress = 0;
-#ifndef WIN32
-int ConnectionTranslation[MAXSOCKS];
-#else
+int *ConnectionTranslation = NULL;
+#if defined(WIN32)
/* SPAM ALERT !!!
* On NT fds are not between 0 and MAXSOCKS, they are unrelated, and there is
* not even a known maximum value, so use something quite arbitrary for now.
@@ -171,15 +204,12 @@ int ConnectionTranslation[MAXSOCKS];
* as a direct index should really be implemented for NT.
*/
#define MAXFD 500
-int ConnectionTranslation[MAXFD];
#endif
XtransConnInfo *ListenTransConns = NULL;
int *ListenTransFds = NULL;
int ListenTransCount;
-extern int auditTrailLevel;
-
static void ErrorConnMax(
#if NeedFunctionPrototypes
XtransConnInfo /* trans_conn */
@@ -201,7 +231,6 @@ void CloseDownFileDescriptor(
#ifdef LBX
extern int LbxFlushClient();
-extern void LbxCloseClient();
#endif /* LBX */
static XtransConnInfo
@@ -219,10 +248,64 @@ lookup_trans_conn (fd)
return (NULL);
}
-#ifdef XDMCP
-void XdmcpOpenDisplay(), XdmcpInit(), XdmcpReset(), XdmcpCloseDisplay();
+/* Set MaxClients and lastfdesc, and allocate ConnectionTranslation */
+
+void
+InitConnectionLimits()
+{
+ lastfdesc = -1;
+
+#ifndef __CYGWIN__
+
+#ifndef __UNIXOS2__
+
+#if !defined(XNO_SYSCONF) && defined(_SC_OPEN_MAX)
+ lastfdesc = sysconf(_SC_OPEN_MAX) - 1;
+#endif
+
+#ifdef HAS_GETDTABLESIZE
+ if (lastfdesc < 0)
+ lastfdesc = getdtablesize() - 1;
#endif
+#ifdef _NFILE
+ if (lastfdesc < 0)
+ lastfdesc = _NFILE - 1;
+#endif
+
+#else /* __UNIXOS2__ */
+ lastfdesc = _nfiles - 1;
+#endif
+
+#endif /* __CYGWIN__ */
+
+ /* This is the fallback */
+ if (lastfdesc < 0)
+ lastfdesc = MAXSOCKS;
+
+ if (lastfdesc > MAXSELECT)
+ lastfdesc = MAXSELECT;
+
+ if (lastfdesc > MAXCLIENTS)
+ {
+ lastfdesc = MAXCLIENTS;
+ if (debug_conns)
+ ErrorF( "REACHED MAXIMUM CLIENTS LIMIT %d\n", MAXCLIENTS);
+ }
+ MaxClients = lastfdesc;
+
+#ifdef DEBUG
+ ErrorF("InitConnectionLimits: MaxClients = %d\n", MaxClients);
+#endif
+
+#if !defined(WIN32)
+ ConnectionTranslation = (int *)xnfalloc(sizeof(int)*(lastfdesc + 1));
+#else
+ ConnectionTranslation = (int *)xnfalloc(sizeof(int)*(MAXFD));
+#endif
+}
+
+
/*****************
* CreateWellKnownSockets
* At initialization, create the sockets to listen on for new clients.
@@ -231,7 +314,7 @@ void XdmcpOpenDisplay(), XdmcpInit(), XdmcpReset(), XdmcpCloseDisplay();
void
CreateWellKnownSockets()
{
- int request, i;
+ int i;
int partial;
char port[20];
@@ -240,33 +323,22 @@ CreateWellKnownSockets()
FD_ZERO(&LastSelectMask);
FD_ZERO(&ClientsWithInput);
-#ifndef WIN32
- for (i=0; i<MAXSOCKS; i++) ConnectionTranslation[i] = 0;
+#if !defined(WIN32)
+ for (i=0; i<MaxClients; i++) ConnectionTranslation[i] = 0;
#else
for (i=0; i<MAXFD; i++) ConnectionTranslation[i] = 0;
#endif
-#ifdef XNO_SYSCONF /* should only be on FreeBSD 1.x and NetBSD 0.x */
-#undef _SC_OPEN_MAX
-#endif
-#ifdef _SC_OPEN_MAX
- lastfdesc = sysconf(_SC_OPEN_MAX) - 1;
-#else
-#ifdef hpux
- lastfdesc = _NFILE - 1;
-#else
- lastfdesc = getdtablesize() - 1;
-#endif
-#endif
-
- if (lastfdesc > MAXSOCKS)
- {
- lastfdesc = MAXSOCKS;
- }
FD_ZERO (&WellKnownConnections);
sprintf (port, "%d", atoi (display));
+ if (protNoListen)
+ if (_XSERVTransNoListen(protNoListen))
+ {
+ FatalError ("Failed to disable listen for %s", protNoListen);
+ }
+
if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial,
&ListenTransCount, &ListenTransConns) >= 0) &&
(ListenTransCount >= 1))
@@ -277,7 +349,7 @@ CreateWellKnownSockets()
}
else
{
- ListenTransFds = (int *) malloc (ListenTransCount * sizeof (int));
+ ListenTransFds = (int *) xalloc (ListenTransCount * sizeof (int));
for (i = 0; i < ListenTransCount; i++)
{
@@ -296,7 +368,7 @@ CreateWellKnownSockets()
if (!XFD_ANYSET (&WellKnownConnections))
FatalError ("Cannot establish any listening sockets - Make sure an X server isn't already running");
-#ifndef WIN32
+#if !defined(WIN32)
OsSignal (SIGPIPE, SIG_IGN);
OsSignal (SIGHUP, AutoResetServer);
#endif
@@ -319,12 +391,12 @@ CreateWellKnownSockets()
* in the second case, the signal will be quite
* useful
*/
-#ifndef WIN32
+#if !defined(WIN32)
if (OsSignal (SIGUSR1, SIG_IGN) == SIG_IGN)
RunFromSmartParent = TRUE;
ParentProcess = getppid ();
if (RunFromSmartParent) {
- if (ParentProcess > 0) {
+ if (ParentProcess > 1) {
kill (ParentProcess, SIGUSR1);
}
}
@@ -380,9 +452,9 @@ ResetWellKnownSockets ()
/*
* See above in CreateWellKnownSockets about SIGUSR1
*/
-#ifndef WIN32
+#if !defined(WIN32)
if (RunFromSmartParent) {
- if (ParentProcess > 0) {
+ if (ParentProcess > 1) {
kill (ParentProcess, SIGUSR1);
}
}
@@ -395,6 +467,15 @@ ResetWellKnownSockets ()
#endif
}
+void
+CloseWellKnownConnections()
+{
+ int i;
+
+ for (i = 0; i < ListenTransCount; i++)
+ _XSERVTransClose (ListenTransConns[i]);
+}
+
static void
AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
ClientPtr client;
@@ -418,16 +499,16 @@ AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
switch (saddr->sa_family)
{
case AF_UNSPEC:
-#if defined(UNIXCONN) || defined(LOCALCONN)
+#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
case AF_UNIX:
#endif
strcpy(out, "local host");
break;
-#if defined(TCPCONN) || defined(STREAMSCONN)
+#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),
- ((struct sockaddr_in *) saddr)->sin_port);
+ ntohs(((struct sockaddr_in *) saddr)->sin_port));
break;
#endif
#ifdef DNETCONN
@@ -436,6 +517,16 @@ AuthAudit (client, letin, saddr, len, proto_n, auth_proto, auth_id)
dnet_ntoa(&((struct sockaddr_dn *) saddr)->sdn_add));
break;
#endif
+#ifdef AMRPCCONN
+ case FamilyAmoeba:
+ sprintf(addr, "AM %s", saddr);
+ break;
+#endif
+#if defined(AMTCPCONN) && !(defined(TCPCONN) || defined(STREAMSCONN))
+ case AF_INET:
+ sprintf(addr, "AMIP %s", inet_ntoa(*((ipaddr_t *) saddr)));
+ break;
+#endif
default:
strcpy(out, "unknown address");
}
@@ -491,7 +582,7 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
char *reason = NULL;
XtransConnInfo trans_conn;
int restore_trans_conn = 0;
- ClientPtr lbxpc;
+ ClientPtr lbxpc = NULL;
priv = (OsCommPtr)client->osPrivate;
trans_conn = priv->trans_conn;
@@ -538,24 +629,7 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
string_n, auth_string, client, &reason);
#ifdef LBX
- if (restore_trans_conn) {
- /*
- * Restore client's trans_conn state
- */
- priv = (OsCommPtr)client->osPrivate;
- priv->trans_conn = NULL;
-
- trans_conn = NULL;
- }
-
-#endif
-
-#ifdef LBX
- if (!trans_conn) {
- /*
- * Use the proxy's trans_conn
- */
- trans_conn = ((OsCommPtr)lbxpc->osPrivate)->trans_conn;
+ if (! priv->trans_conn) {
if (auth_id == (XID) ~0L && !GetAccessControl())
auth_id = ((OsCommPtr)lbxpc->osPrivate)->auth_id;
#ifdef XCSECURITY
@@ -576,9 +650,16 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
_XSERVTransGetPeerAddr (trans_conn,
&family, &fromlen, &from) != -1)
{
+#ifdef AMRPCCONN
+ /* Amoeba RPC connections are already checked by the capability. */
+ if (family == FamilyAmoeba) {
+ auth_id = (XID) 0;
+ }
+ else
+#endif
if (
#ifdef LBX
- !priv->trans_conn ||
+ !trans_conn ||
#endif
InvalidHost ((struct sockaddr *) from, fromlen))
AuthAudit(client, FALSE, (struct sockaddr *) from,
@@ -592,14 +673,23 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
proto_n, auth_proto, auth_id);
}
- free ((char *) from);
+ xfree ((char *) from);
}
- if (auth_id == (XID) ~0L)
+ if (auth_id == (XID) ~0L) {
+#ifdef LBX
+ /*
+ * Restore client's trans_conn state
+ */
+ if (restore_trans_conn) {
+ priv->trans_conn = NULL;
+ }
+#endif
if (reason)
return reason;
else
return "Client is not authorized to connect to Server";
+ }
}
else if (auditTrailLevel > 1)
{
@@ -609,7 +699,7 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
AuthAudit(client, TRUE, (struct sockaddr *) from, fromlen,
proto_n, auth_proto, auth_id);
- free ((char *) from);
+ xfree ((char *) from);
}
}
priv->auth_id = auth_id;
@@ -629,6 +719,11 @@ ClientAuthorized(client, proto_n, auth_proto, string_n, auth_string)
* true purpose of the selfhosts list is to see who may change the
* access control list.
*/
+#ifdef LBX
+ if (restore_trans_conn) {
+ priv->trans_conn = NULL;
+ }
+#endif
return((char *)NULL);
}
@@ -697,6 +792,12 @@ AllocNewConnection (trans_conn, fd, conn_time)
FD_SET(fd, &AllSockets);
}
}
+
+#ifdef DEBUG
+ ErrorF("AllocNewConnection: client index = %d, socket fd = %d\n",
+ client->index, fd);
+#endif
+
return client;
}
@@ -751,11 +852,7 @@ EstablishNewConnections(clientUnused, closure)
ClientPtr clientUnused;
pointer closure;
{
-#ifndef WIN32
- fd_mask readyconnections; /* mask of listeners that are ready */
-#else
fd_set readyconnections; /* set of listeners that are ready */
-#endif
int curconn; /* fd of listener that's ready */
register int newconn; /* fd of new client */
CARD32 connect_time;
@@ -765,40 +862,37 @@ EstablishNewConnections(clientUnused, closure)
fd_set tmask;
XFD_ANDSET (&tmask, (fd_set*)closure, &WellKnownConnections);
-#ifndef WIN32
- readyconnections = tmask.fds_bits[0];
- if (!readyconnections)
- return TRUE;
-#else
XFD_COPYSET(&tmask, &readyconnections);
if (!XFD_ANYSET(&readyconnections))
return TRUE;
-#endif
connect_time = GetTimeInMillis();
/* kill off stragglers */
for (i=1; i<currentMaxClients; i++)
{
- if (client = clients[i])
+ if ((client = clients[i]))
{
oc = (OsCommPtr)(client->osPrivate);
- if (oc && (oc->conn_time != 0) &&
- (connect_time - oc->conn_time) >= TimeOutValue ||
- client->noClientException != Success && !client->clientGone)
+ if ((oc && (oc->conn_time != 0) &&
+ (connect_time - oc->conn_time) >= TimeOutValue) ||
+ (client->noClientException != Success && !client->clientGone))
CloseDownClient(client);
}
}
#ifndef WIN32
- while (readyconnections)
+ for (i = 0; i < howmany(XFD_SETSIZE, NFDBITS); i++)
+ {
+ while (readyconnections.fds_bits[i])
#else
- for (i = 0; i < XFD_SETCOUNT(&readyconnections); i++)
+ for (i = 0; i < XFD_SETCOUNT(&readyconnections); i++)
#endif
- {
+ {
XtransConnInfo trans_conn, new_trans_conn;
int status;
#ifndef WIN32
- curconn = ffs (readyconnections) - 1;
- readyconnections &= ~(1 << curconn);
+ curconn = ffs (readyconnections.fds_bits[i]) - 1;
+ readyconnections.fds_bits[i] &= ~((fd_mask)1 << curconn);
+ curconn += (i * (sizeof(fd_mask)*8));
#else
curconn = XFD_FD(&readyconnections, i);
#endif
@@ -831,7 +925,10 @@ EstablishNewConnections(clientUnused, closure)
ErrorConnMax(new_trans_conn);
_XSERVTransClose(new_trans_conn);
}
+ }
+#ifndef WIN32
}
+#endif
return TRUE;
}
@@ -912,11 +1009,11 @@ CloseDownFileDescriptor(oc)
_XSERVTransDisconnect(oc->trans_conn);
_XSERVTransClose(oc->trans_conn);
}
-#ifdef LBX
- ConnectionTranslation[connection] = 0;
-#else
+#ifndef LBX
FreeOsBuffers(oc);
+ xfree(oc);
#endif
+ ConnectionTranslation[connection] = 0;
FD_CLR(connection, &AllSockets);
FD_CLR(connection, &AllClients);
FD_CLR(connection, &ClientsWithInput);
@@ -931,13 +1028,10 @@ CloseDownFileDescriptor(oc)
if (!XFD_ANYSET(&ClientsWriteBlocked))
AnyClientsWriteBlocked = FALSE;
FD_CLR(connection, &OutputPending);
-#ifndef LBX
- xfree(oc);
-#endif
}
/*****************
- * CheckConections
+ * CheckConnections
* Some connection has died, go find which one and shut it down
* The file descriptor has been closed, but is still in AllClients.
* If would truly be wonderful if select() would put the bogus
@@ -970,13 +1064,13 @@ CheckConnections()
while (mask)
{
curoff = ffs (mask) - 1;
- curclient = curoff + (i << 5);
+ curclient = curoff + (i * (sizeof(fd_mask)*8));
FD_ZERO(&tmask);
FD_SET(curclient, &tmask);
r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
if (r < 0)
CloseDownClient(clients[ConnectionTranslation[curclient]]);
- mask &= ~(1 << curoff);
+ mask &= ~((fd_mask)1 << curoff);
}
}
#else
@@ -1022,20 +1116,24 @@ CloseDownConnection(client)
AuditF("client %d disconnected\n", client->index);
}
-
+void
AddEnabledDevice(fd)
int fd;
{
FD_SET(fd, &EnabledDevices);
FD_SET(fd, &AllSockets);
+ if (GrabInProgress)
+ FD_SET(fd, &SavedAllSockets);
}
-
+void
RemoveEnabledDevice(fd)
int fd;
{
FD_CLR(fd, &EnabledDevices);
FD_CLR(fd, &AllSockets);
+ if (GrabInProgress)
+ FD_CLR(fd, &SavedAllSockets);
}
/*****************
@@ -1048,6 +1146,7 @@ RemoveEnabledDevice(fd)
* This routine is "undone" by ListenToAllClients()
*****************/
+void
OnlyListenToOneClient(client)
ClientPtr client;
{
@@ -1080,6 +1179,7 @@ OnlyListenToOneClient(client)
* Undoes OnlyListentToOneClient()
****************/
+void
ListenToAllClients()
{
if (GrabInProgress)
@@ -1097,6 +1197,7 @@ ListenToAllClients()
* Must have cooresponding call to AttendClient.
****************/
+void
IgnoreClient (client)
ClientPtr client;
{
@@ -1141,6 +1242,7 @@ IgnoreClient (client)
* Adds one client back into the input masks.
****************/
+void
AttendClient (client)
ClientPtr client;
{
@@ -1174,6 +1276,7 @@ AttendClient (client)
/* make client impervious to grabs; assume only executing client calls this */
+void
MakeClientGrabImpervious(client)
ClientPtr client;
{
@@ -1193,6 +1296,7 @@ MakeClientGrabImpervious(client)
/* make client pervious to grabs; assume only executing client calls this */
+void
MakeClientGrabPervious(client)
ClientPtr client;
{
diff --git a/os/io.c b/os/io.c
index 96bfd6885..e97c5dab7 100644
--- a/os/io.c
+++ b/os/io.c
@@ -43,6 +43,7 @@ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
+
******************************************************************/
/* $Xorg: io.c,v 1.6 2001/02/09 02:05:23 xorgcvs Exp $ */
/*****************************************************************
@@ -52,30 +53,37 @@ SOFTWARE.
* InsertFakeRequest, ResetCurrentRequest
*
*****************************************************************/
+/* $XFree86: xc/programs/Xserver/os/io.c,v 3.34 2002/05/31 18:46:05 dawes Exp $ */
+#if 0
+#define DEBUG_COMMUNICATION
+#endif
#ifdef WIN32
#include <X11/Xwinsock.h>
#endif
#include <stdio.h>
#include <X11/Xtrans.h>
-#ifdef X_NOT_STDC_ENV
-extern int errno;
-#endif
#include "Xmd.h"
#include <errno.h>
-#ifndef WIN32
+#if !defined(__UNIXOS2__) && !defined(WIN32)
+#ifndef Lynx
#include <sys/uio.h>
+#else
+#include <uio.h>
+#endif
#endif
#include "X.h"
#define NEED_REPLIES
#include "Xproto.h"
#include "os.h"
-#include "Xpoll.h"
#include "osdep.h"
+#include "Xpoll.h"
#include "opaque.h"
#include "dixstruct.h"
#include "misc.h"
#ifdef LBX
+#include "colormapst.h"
+#include "propertyst.h"
#include "lbxserve.h"
#endif
@@ -85,6 +93,7 @@ CallbackListPtr FlushCallback;
/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX
* systems are broken and return EWOULDBLOCK when they should return EAGAIN
*/
+#ifndef __UNIXOS2__
#if defined(EAGAIN) && defined(EWOULDBLOCK)
#define ETEST(err) (err == EAGAIN || err == EWOULDBLOCK)
#else
@@ -94,13 +103,9 @@ CallbackListPtr FlushCallback;
#define ETEST(err) (err == EWOULDBLOCK)
#endif
#endif
-
-extern fd_set ClientsWithInput, IgnoredClientsWithInput, AllClients;
-extern fd_set ClientsWriteBlocked;
-extern fd_set OutputPending;
-extern int ConnectionTranslation[];
-extern Bool NewOutputPending;
-extern Bool AnyClientsWriteBlocked;
+#else /* __UNIXOS2__ Writing to full pipes may return ENOSPC */
+#define ETEST(err) (err == EAGAIN || err == EWOULDBLOCK || err == ENOSPC)
+#endif
Bool CriticalOutputPending;
int timesThisConnection = 0;
@@ -251,7 +256,7 @@ ReadRequestFromClient(client)
if (!oci)
{
- if (oci = FreeInputs)
+ if ((oci = FreeInputs))
{
FreeInputs = oci->next;
}
@@ -371,8 +376,23 @@ ReadRequestFromClient(client)
{
if ((result < 0) && ETEST(errno))
{
- YieldControlNoInput();
- return 0;
+#if defined(SVR4) && defined(i386) && !defined(sun)
+#if defined(LBX) && 0
+ /*
+ * For LBX connections, we can get a valid EWOULDBLOCK
+ * There is probably a better way of distinguishing LBX
+ * connections, but this works. (DHD)
+ */
+ extern int LbxRead();
+ if (oc->Read == LbxRead)
+#else
+ if (0)
+#endif
+#endif
+ {
+ YieldControlNoInput();
+ return 0;
+ }
}
YieldControlDeath();
return -1;
@@ -451,14 +471,29 @@ ReadRequestFromClient(client)
)
FD_SET(fd, &ClientsWithInput);
else
- YieldControlNoInput();
+ {
+#ifdef SMART_SCHEDULE
+ if (!SmartScheduleDisable)
+ FD_CLR(fd, &ClientsWithInput);
+ else
+#endif
+ YieldControlNoInput();
+ }
}
else
{
if (!gotnow)
AvailableInput = oc;
- YieldControlNoInput();
+#ifdef SMART_SCHEDULE
+ if (!SmartScheduleDisable)
+ FD_CLR(fd, &ClientsWithInput);
+ else
+#endif
+ YieldControlNoInput();
}
+#ifdef SMART_SCHEDULE
+ if (SmartScheduleDisable)
+#endif
if (++timesThisConnection >= MAX_TIMES_PER)
YieldControl();
#ifdef BIGREQS
@@ -472,6 +507,13 @@ ReadRequestFromClient(client)
}
#endif
client->requestBuffer = (pointer)oci->bufptr;
+#ifdef DEBUG_COMMUNICATION
+ {
+ xReq *req = client->requestBuffer;
+ ErrorF("REQUEST: ClientIDX: %i, type: 0x%x data: 0x%x len: %i\n",
+ client->index,req->reqType,req->data,req->length);
+ }
+#endif
return needed;
}
@@ -513,7 +555,7 @@ InsertFakeRequest(client, data, count)
}
if (!oci)
{
- if (oci = FreeInputs)
+ if ((oci = FreeInputs))
FreeInputs = oci->next;
else if (!(oci = AllocateInputBuffer()))
return FALSE;
@@ -558,6 +600,7 @@ InsertFakeRequest(client, data, count)
*
**********************/
+void
ResetCurrentRequest(client)
ClientPtr client;
{
@@ -567,7 +610,6 @@ ResetCurrentRequest(client)
register xReq *request;
int gotnow, needed;
#ifdef LBX
- Bool part;
LbxClientPtr lbxClient = LbxClient(client);
if (lbxClient) {
@@ -769,11 +811,12 @@ static int padlength[4] = {0, 3, 2, 1};
void
FlushAllOutput()
{
- register int index, base, mask;
+ register int index, base;
+ register fd_mask mask; /* raphael */
OsCommPtr oc;
register ClientPtr client;
Bool newoutput = NewOutputPending;
-#ifdef WIN32
+#if defined(WIN32)
fd_set newOutputPending;
#endif
@@ -800,7 +843,7 @@ FlushAllOutput()
{
index = ffs(mask) - 1;
mask &= ~lowbit(mask);
- if ((index = ConnectionTranslation[(base << 5) + index]) == 0)
+ if ((index = ConnectionTranslation[(base * (sizeof(fd_mask)*8)) + index]) == 0)
continue;
client = clients[index];
if (client->clientGone)
@@ -879,13 +922,54 @@ WriteToClient (who, count, buf)
OsCommPtr oc = (OsCommPtr)who->osPrivate;
register ConnectionOutputPtr oco = oc->output;
int padBytes;
-
+#ifdef DEBUG_COMMUNICATION
+ Bool multicount = FALSE;
+#endif
if (!count)
return(0);
+#ifdef DEBUG_COMMUNICATION
+ {
+ char info[128];
+ xError *err;
+ xGenericReply *rep;
+ xEvent *ev;
+
+ if (!who->replyBytesRemaining) {
+ switch(buf[0]) {
+ case X_Reply:
+ rep = (xGenericReply*)buf;
+ if (rep->sequenceNumber == who->sequence) {
+ snprintf(info,127,"Xreply: type: 0x%x data: 0x%x "
+ "len: %i seq#: 0x%x", rep->type, rep->data1,
+ rep->length, rep->sequenceNumber);
+ multicount = TRUE;
+ }
+ break;
+ case X_Error:
+ err = (xError*)buf;
+ snprintf(info,127,"Xerror: Code: 0x%x resID: 0x%x maj: 0x%x "
+ "min: %x", err->errorCode,err->resourceID,
+ err->minorCode,err->majorCode);
+ break;
+ default:
+ if ((buf[0] & 0x7f) == KeymapNotify)
+ snprintf(info,127,"KeymapNotifyEvent: %i",buf[0]);
+ else {
+ ev = (xEvent*)buf;
+ snprintf(info,127,"XEvent: type: 0x%x detail: 0x%x "
+ "seq#: 0x%x", ev->u.u.type, ev->u.u.detail,
+ ev->u.u.sequenceNumber);
+ }
+ }
+ ErrorF("REPLY: ClientIDX: %i %s\n",who->index, info);
+ } else
+ multicount = TRUE;
+ }
+#endif
if (!oco)
{
- if (oco = FreeOutputs)
+ if ((oco = FreeOutputs))
{
FreeOutputs = oco->next;
}
@@ -933,14 +1017,25 @@ WriteToClient (who, count, buf)
replyinfo.bytesRemaining = who->replyBytesRemaining = bytesleft;
CallCallbacks((&ReplyCallback), (pointer)&replyinfo);
}
- }
-
+ }
+#ifdef DEBUG_COMMUNICATION
+ else if (multicount) {
+ if (who->replyBytesRemaining) {
+ who->replyBytesRemaining -= (count + padBytes);
+ } else {
+ CARD32 replylen;
+ replylen = ((xGenericReply *)buf)->length;
+ who->replyBytesRemaining =
+ (replylen * 4) + SIZEOF(xReply) - count - padBytes;
+ }
+ }
+#endif
if (oco->count + count + padBytes > oco->size)
{
FD_CLR(oc->fd, &OutputPending);
if(!XFD_ANYSET(&OutputPending)) {
- CriticalOutputPending = FALSE;
- NewOutputPending = FALSE;
+ CriticalOutputPending = FALSE;
+ NewOutputPending = FALSE;
}
return FlushClient(who, oc, buf, count);
}
@@ -1007,7 +1102,7 @@ FlushClient(who, oc, extraBuf, extraCount)
long remain = todo; /* amount to try this time, <= notWritten */
int i = 0;
long len;
-
+
/* You could be very general here and have "in" and "out" iovecs
* and write a loop without using a macro, but what the heck. This
* translates to:
@@ -1203,7 +1298,7 @@ FreeOsBuffers(oc)
if (AvailableInput == oc)
AvailableInput = (OsCommPtr)NULL;
- if (oci = oc->input)
+ if ((oci = oc->input))
{
if (FreeInputs)
{
@@ -1219,7 +1314,7 @@ FreeOsBuffers(oc)
oci->lenLastReq = 0;
}
}
- if (oco = oc->output)
+ if ((oco = oc->output))
{
if (FreeOutputs)
{
@@ -1234,7 +1329,7 @@ FreeOsBuffers(oc)
}
}
#ifdef LBX
- if (oci = oc->largereq) {
+ if ((oci = oc->largereq)) {
xfree(oci->buffer);
xfree(oci);
}
@@ -1247,13 +1342,13 @@ ResetOsBuffers()
register ConnectionInputPtr oci;
register ConnectionOutputPtr oco;
- while (oci = FreeInputs)
+ while ((oci = FreeInputs))
{
FreeInputs = oci->next;
xfree(oci->buffer);
xfree(oci);
}
- while (oco = FreeOutputs)
+ while ((oco = FreeOutputs))
{
FreeOutputs = oco->next;
xfree(oco->buf);
diff --git a/os/k5auth.c b/os/k5auth.c
index c6a2e3cc9..8c59fe8ab 100644
--- a/os/k5auth.c
+++ b/os/k5auth.c
@@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/k5auth.c,v 3.5 2001/12/14 20:00:34 dawes Exp $ */
/*
* Kerberos V5 authentication scheme
@@ -303,7 +304,7 @@ int k5_stage1(client)
return(SendConnSetup(client, "Krb5 stage1: getpeername failed"));
}
if (cli_net_addr.sa_family == AF_UNSPEC
-#if defined(UNIXCONN) || defined(LOCALCONN)
+#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
|| cli_net_addr.sa_family == AF_UNIX
#endif
) /* assume local host */
diff --git a/os/lbxio.c b/os/lbxio.c
index c72ac2c05..2991681de 100644
--- a/os/lbxio.c
+++ b/os/lbxio.c
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/Xserver/os/lbxio.c,v 3.17 2002/05/31 18:46:06 dawes Exp $ */
/*
Copyright 1996, 1998 The Open Group
@@ -50,13 +51,16 @@ SOFTWARE.
#include <stdio.h>
#include <X11/Xtrans.h>
-#ifdef X_NOT_STDC_ENV
-extern int errno;
-#endif
#include "Xmd.h"
#include <errno.h>
+#ifndef Lynx
#include <sys/param.h>
+#ifndef __UNIXOS2__
#include <sys/uio.h>
+#endif
+#else
+#include <uio.h>
+#endif
#include "X.h"
#include "Xproto.h"
#include "os.h"
@@ -65,6 +69,8 @@ extern int errno;
#include "opaque.h"
#include "dixstruct.h"
#include "misc.h"
+#include "colormapst.h"
+#include "propertyst.h"
#include "lbxserve.h"
/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX
@@ -80,19 +86,6 @@ extern int errno;
#endif
#endif
-extern fd_set ClientsWithInput, IgnoredClientsWithInput;
-extern fd_set AllClients, AllSockets;
-extern fd_set ClientsWriteBlocked;
-extern fd_set OutputPending;
-extern int ConnectionTranslation[];
-extern Bool NewOutputPending;
-extern Bool AnyClientsWriteBlocked;
-extern Bool CriticalOutputPending;
-extern int timesThisConnection;
-extern ConnectionInputPtr FreeInputs;
-extern ConnectionOutputPtr FreeOutputs;
-extern OsCommPtr AvailableInput;
-
#define get_req_len(req,cli) ((cli)->swapped ? \
lswaps((req)->length) : (req)->length)
@@ -166,7 +159,7 @@ AppendFakeRequest (client, data, count)
if (!oci)
{
- if (oci = FreeInputs)
+ if ((oci = FreeInputs))
FreeInputs = oci->next;
else if (!(oci = AllocateInputBuffer()))
return FALSE;
@@ -288,7 +281,7 @@ LbxAppendOutput(proxy, client, oco)
int n;
if (!noco || (noco->size - noco->count) < sz_xLbxSwitchEvent) {
- if (noco = FreeOutputs)
+ if ((noco = FreeOutputs))
FreeOutputs = noco->next;
else
noco = AllocateOutputBuffer();
@@ -334,7 +327,7 @@ LbxClientOutput(client, oc, extraBuf, extraCount, nocompress)
ConnectionOutputPtr oco;
int len;
- if (oco = oc->output) {
+ if ((oco = oc->output)) {
oc->output = NULL;
if (!LbxAppendOutput(oc->proxy, client, oco))
return -1;
@@ -387,7 +380,7 @@ LbxForceOutput(proxy)
if (!lbxClient)
continue;
coc = (OsCommPtr)lbxClient->client->osPrivate;
- if (oco = coc->output) {
+ if ((oco = coc->output)) {
coc->output = NULL;
LbxAppendOutput(proxy, lbxClient->client, oco);
}
@@ -404,7 +397,7 @@ LbxFlushClient(who, oc, extraBuf, extraCount)
LbxProxyPtr proxy;
ConnectionOutputPtr oco;
int n;
- XtransConnInfo trans_conn;
+ XtransConnInfo trans_conn = NULL;
if (extraBuf)
return LbxClientOutput(who, oc, extraBuf, extraCount, FALSE);
@@ -414,7 +407,7 @@ LbxFlushClient(who, oc, extraBuf, extraCount)
LbxForceOutput(proxy);
if (!proxy->compHandle)
trans_conn = ((OsCommPtr)LbxProxyClient(proxy)->osPrivate)->trans_conn;
- while (oco = proxy->ofirst) {
+ while ((oco = proxy->ofirst)) {
/* XXX bundle up into writev someday */
if (proxy->compHandle) {
if (oco->nocompress)
@@ -474,12 +467,13 @@ UncompressedWriteToClient (who, count, buf)
return LbxClientOutput(who, (OsCommPtr)who->osPrivate, buf, count, TRUE);
}
+void
LbxFreeOsBuffers(proxy)
LbxProxyPtr proxy;
{
ConnectionOutputPtr oco;
- while (oco = proxy->ofirst) {
+ while ((oco = proxy->ofirst)) {
proxy->ofirst = oco->next;
xfree(oco->buf);
xfree(oco);
@@ -495,7 +489,7 @@ AllocateLargeReqBuffer(client, size)
register ConnectionInputPtr oci;
if (!(oci = oc->largereq)) {
- if (oci = FreeInputs)
+ if ((oci = FreeInputs))
FreeInputs = oci->next;
else {
oci = (ConnectionInputPtr)xalloc(sizeof(ConnectionInput));
diff --git a/os/mitauth.c b/os/mitauth.c
index 274ab5829..bddbdf1d6 100644
--- a/os/mitauth.c
+++ b/os/mitauth.c
@@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/mitauth.c,v 1.5 2001/12/14 20:00:34 dawes Exp $ */
/*
* MIT-MAGIC-COOKIE-1 authorization scheme
@@ -34,6 +35,7 @@ from The Open Group.
#include "X.h"
#include "os.h"
+#include "osdep.h"
#include "dixstruct.h"
static struct auth {
@@ -44,10 +46,10 @@ static struct auth {
} *mit_auth;
int
-MitAddCookie (data_length, data, id)
-unsigned short data_length;
-char *data;
-XID id;
+MitAddCookie (
+ unsigned short data_length,
+ char *data,
+ XID id)
{
struct auth *new;
@@ -68,11 +70,11 @@ XID id;
}
XID
-MitCheckCookie (data_length, data, client, reason)
- unsigned short data_length;
- char *data;
- ClientPtr client;
- char **reason;
+MitCheckCookie (
+ unsigned short data_length,
+ char *data,
+ ClientPtr client,
+ char **reason)
{
struct auth *auth;
@@ -86,7 +88,7 @@ MitCheckCookie (data_length, data, client, reason)
}
int
-MitResetCookie ()
+MitResetCookie (void)
{
struct auth *auth, *next;
@@ -100,9 +102,9 @@ MitResetCookie ()
}
XID
-MitToID (data_length, data)
-unsigned short data_length;
-char *data;
+MitToID (
+ unsigned short data_length,
+ char *data)
{
struct auth *auth;
@@ -115,10 +117,10 @@ char *data;
}
int
-MitFromID (id, data_lenp, datap)
-XID id;
-unsigned short *data_lenp;
-char **datap;
+MitFromID (
+ XID id,
+ unsigned short *data_lenp,
+ char **datap)
{
struct auth *auth;
@@ -133,9 +135,9 @@ char **datap;
}
int
-MitRemoveCookie (data_length, data)
-unsigned short data_length;
-char *data;
+MitRemoveCookie (
+ unsigned short data_length,
+ char *data)
{
struct auth *auth, *prev;
@@ -161,12 +163,12 @@ char *data;
static char cookie[16]; /* 128 bits */
XID
-MitGenerateCookie (data_length, data, id, data_length_return, data_return)
- unsigned int data_length;
- char *data;
- XID id;
- unsigned int *data_length_return;
- char **data_return;
+MitGenerateCookie (
+ unsigned data_length,
+ char *data,
+ XID id,
+ unsigned *data_length_return,
+ char **data_return)
{
int i = 0;
int status;
diff --git a/os/oscolor.c b/os/oscolor.c
index f5fd61bc5..62676f84b 100644
--- a/os/oscolor.c
+++ b/os/oscolor.c
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/Xserver/os/oscolor.c,v 3.8 2002/05/31 18:46:06 dawes Exp $ */
/***********************************************************
Copyright 1987, 1998 The Open Group
@@ -107,11 +108,11 @@ OsLookupColor(screen, name, len, pred, pgreen, pblue)
if(!rgb_dbm)
return(0);
- /* we use Xalloc here so that we can compile with cc without alloca
+ /* we use xalloc here so that we can compile with cc without alloca
* when otherwise using gcc */
if (len < sizeof(buf))
lowername = buf;
- else if (!(lowername = (char *)Xalloc(len + 1)))
+ else if (!(lowername = (char *)xalloc(len + 1)))
return(0);
CopyISOLatin1Lowered ((unsigned char *) lowername, (unsigned char *) name,
(int)len);
@@ -125,7 +126,7 @@ OsLookupColor(screen, name, len, pred, pgreen, pblue)
#endif
if (len >= sizeof(buf))
- Xfree(lowername);
+ xfree(lowername);
if(dbent.dptr)
{
@@ -175,7 +176,7 @@ lookup(name, len, create)
Bool create;
{
unsigned int h = 0, g;
- dbEntryPtr entry, *prev;
+ dbEntryPtr entry, *prev = NULL;
char *str = name;
if (!(name = (char*)ALLOCATE_LOCAL(len +1))) return NULL;
@@ -189,7 +190,7 @@ lookup(name, len, create)
}
h %= HASHSIZE;
- if ( entry = hashTab[h] )
+ if ( (entry = hashTab[h]) )
{
for( ; entry; prev = (dbEntryPtr*)entry, entry = entry->link )
if (! strcmp(name, entry->name) ) break;
@@ -197,7 +198,7 @@ lookup(name, len, create)
else
prev = &(hashTab[h]);
- if (!entry && create && (entry = (dbEntryPtr)Xalloc(sizeof(dbEntry) +len)))
+ if (!entry && create && (entry = (dbEntryPtr)xalloc(sizeof(dbEntry) +len)))
{
*prev = entry;
entry->link = NULL;
@@ -224,10 +225,16 @@ OsInitColors()
if (!was_here)
{
+#ifndef __UNIXOS2__
path = (char*)ALLOCATE_LOCAL(strlen(rgbPath) +5);
strcpy(path, rgbPath);
strcat(path, ".txt");
-
+#else
+ char *tmp = (char*)__XOS2RedirRoot(rgbPath);
+ path = (char*)ALLOCATE_LOCAL(strlen(tmp) +5);
+ strcpy(path, tmp);
+ strcat(path, ".txt");
+#endif
if (!(rgb = fopen(path, "r")))
{
ErrorF( "Couldn't open RGB_DB '%s'\n", rgbPath );
@@ -238,13 +245,17 @@ OsInitColors()
while(fgets(line, sizeof(line), rgb))
{
lineno++;
+#ifndef __UNIXOS2__
if (sscanf(line,"%d %d %d %[^\n]\n", &red, &green, &blue, name) == 4)
+#else
+ if (sscanf(line,"%d %d %d %[^\n\r]\n", &red, &green, &blue, name) == 4)
+#endif
{
if (red >= 0 && red <= 0xff &&
green >= 0 && green <= 0xff &&
blue >= 0 && blue <= 0xff)
{
- if (entry = lookup(name, strlen(name), TRUE))
+ if ((entry = lookup(name, strlen(name), TRUE)))
{
entry->red = (red * 65535) / 255;
entry->green = (green * 65535) / 255;
@@ -252,8 +263,7 @@ OsInitColors()
}
}
else
- ErrorF("Value for \"%s\" out of range: %s:%d\n",
- name, path, lineno);
+ ErrorF("Value out of range: %s:%d\n", path, lineno);
}
else if (*line && *line != '#' && *line != '!')
ErrorF("Syntax Error: %s:%d\n", path, lineno);
@@ -280,7 +290,7 @@ OsLookupColor(screen, name, len, pred, pgreen, pblue)
{
dbEntryPtr entry;
- if (entry = lookup(name, len, FALSE))
+ if ((entry = lookup(name, len, FALSE)))
{
*pred = entry->red;
*pgreen = entry->green;
diff --git a/os/osdep.h b/os/osdep.h
index c7c730740..a1fe2bfed 100644
--- a/os/osdep.h
+++ b/os/osdep.h
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/Xserver/os/osdep.h,v 3.17 2002/05/31 18:46:06 dawes Exp $ */
/***********************************************************
Copyright 1987, 1998 The Open Group
@@ -46,10 +47,17 @@ SOFTWARE.
******************************************************************/
/* $Xorg: osdep.h,v 1.5 2001/02/09 02:05:23 xorgcvs Exp $ */
+#ifndef _OSDEP_H_
+#define _OSDEP_H_ 1
+
#define BOTIMEOUT 200 /* in milliseconds */
#define BUFSIZE 4096
#define BUFWATERMARK 8192
+#ifndef MAXBUFSIZE
#define MAXBUFSIZE (1 << 22)
+#endif
+
+#include <X11/Xdmcp.h>
#ifndef sgi /* SGI defines OPEN_MAX in a useless way */
#ifndef X_NOT_POSIX
@@ -69,6 +77,9 @@ SOFTWARE.
#endif /* X_NOT_POSIX */
#endif
+#ifdef __QNX__
+#define NOFILES_MAX 256
+#endif
#ifndef OPEN_MAX
#ifdef SVR4
#define OPEN_MAX 256
@@ -78,11 +89,22 @@ SOFTWARE.
#if defined(NOFILE) && !defined(NOFILES_MAX)
#define OPEN_MAX NOFILE
#else
+#ifndef __UNIXOS2__
#define OPEN_MAX NOFILES_MAX
+#else
+#define OPEN_MAX 256
#endif
#endif
#endif
#endif
+#endif
+
+#include <X11/Xpoll.h>
+
+/*
+ * MAXSOCKS is used only for initialising MaxClients when no other method
+ * like sysconf(_SC_OPEN_MAX) is not supported.
+ */
#if OPEN_MAX <= 256
#define MAXSOCKS (OPEN_MAX - 1)
@@ -90,10 +112,19 @@ SOFTWARE.
#define MAXSOCKS 256
#endif
-#ifndef NULL
-#define NULL 0
+/* MAXSELECT is the number of fds that select() can handle */
+#define MAXSELECT (sizeof(fd_set) * NBBY)
+
+#if !defined(hpux) && !defined(SVR4) && !defined(SYSV)
+#define HAS_GETDTABLESIZE
#endif
+#include <stddef.h>
+
+typedef Bool (*ValidatorFunc)(ARRAY8Ptr Auth, ARRAY8Ptr Data, int packet_type);
+typedef Bool (*GeneratorFunc)(ARRAY8Ptr Auth, ARRAY8Ptr Data, int packet_type);
+typedef Bool (*AddAuthorFunc)(unsigned name_length, char *name, unsigned data_length, char *data);
+
typedef struct _connectionInput {
struct _connectionInput *next;
char *buffer; /* contains current client input */
@@ -127,6 +158,36 @@ typedef struct _k5_state {
typedef struct _LbxProxy *OsProxyPtr;
#endif
+struct _osComm;
+
+#define AuthInitArgs void
+typedef void (*AuthInitFunc) (AuthInitArgs);
+
+#define AuthAddCArgs unsigned short data_length, char *data, XID id
+typedef int (*AuthAddCFunc) (AuthAddCArgs);
+
+#define AuthCheckArgs unsigned short data_length, char *data, ClientPtr client, char **reason
+typedef XID (*AuthCheckFunc) (AuthCheckArgs);
+
+#define AuthFromIDArgs XID id, unsigned short *data_lenp, char **datap
+typedef int (*AuthFromIDFunc) (AuthFromIDArgs);
+
+#define AuthGenCArgs unsigned data_length, char *data, XID id, unsigned *data_length_return, char **data_return
+typedef XID (*AuthGenCFunc) (AuthGenCArgs);
+
+#define AuthRemCArgs unsigned short data_length, char *data
+typedef int (*AuthRemCFunc) (AuthRemCArgs);
+
+#define AuthRstCArgs void
+typedef int (*AuthRstCFunc) (AuthRstCArgs);
+
+#define AuthToIDArgs unsigned short data_length, char *data
+typedef XID (*AuthToIDFunc) (AuthToIDArgs);
+
+typedef void (*OsCloseFunc)(ClientPtr);
+
+typedef int (*OsFlushFunc)(ClientPtr who, struct _osComm * oc, char* extraBuf, int extraCount);
+
typedef struct _osComm {
int fd;
ConnectionInputPtr input;
@@ -140,8 +201,8 @@ typedef struct _osComm {
#ifdef LBX
OsProxyPtr proxy;
ConnectionInputPtr largereq;
- void (*Close) ();
- int (*Flush) ();
+ OsCloseFunc Close;
+ OsFlushFunc Flush;
#endif
} OsCommRec, *OsCommPtr;
@@ -149,38 +210,130 @@ typedef struct _osComm {
#define FlushClient(who, oc, extraBuf, extraCount) \
(*(oc)->Flush)(who, oc, extraBuf, extraCount)
extern int StandardFlushClient(
-#if NeedFunctionPrototypes
ClientPtr /*who*/,
OsCommPtr /*oc*/,
char* /*extraBuf*/,
int /*extraCount*/
-#endif
);
#else
extern int FlushClient(
-#if NeedFunctionPrototypes
ClientPtr /*who*/,
OsCommPtr /*oc*/,
char* /*extraBuf*/,
int /*extraCount*/
-#endif
);
#endif
extern void FreeOsBuffers(
-#if NeedFunctionPrototypes
OsCommPtr /*oc*/
-#endif
);
-extern ConnectionInputPtr AllocateInputBuffer(
-#if NeedFunctionPrototypes
- void
+#include "dix.h"
+
+extern ConnectionInputPtr AllocateInputBuffer(void);
+
+extern ConnectionOutputPtr AllocateOutputBuffer(void);
+
+extern fd_set AllSockets;
+extern fd_set AllClients;
+extern fd_set LastSelectMask;
+extern fd_set WellKnownConnections;
+extern fd_set EnabledDevices;
+extern fd_set ClientsWithInput;
+extern fd_set ClientsWriteBlocked;
+extern fd_set OutputPending;
+extern fd_set IgnoredClientsWithInput;
+
+extern int *ConnectionTranslation;
+
+extern Bool NewOutputPending;
+extern Bool AnyClientsWriteBlocked;
+extern Bool CriticalOutputPending;
+
+extern int timesThisConnection;
+extern ConnectionInputPtr FreeInputs;
+extern ConnectionOutputPtr FreeOutputs;
+extern OsCommPtr AvailableInput;
+
+extern WorkQueuePtr workQueue;
+
+/* added by raphael */
+#define ffs mffs
+extern int mffs(fd_mask);
+
+/* in auth.c */
+extern void GenerateRandomData (int len, char *buf);
+
+/* in mitauth.c */
+extern XID MitCheckCookie (AuthCheckArgs);
+extern XID MitGenerateCookie (AuthGenCArgs);
+extern XID MitToID (AuthToIDArgs);
+extern int MitAddCookie (AuthAddCArgs);
+extern int MitFromID (AuthFromIDArgs);
+extern int MitRemoveCookie (AuthRemCArgs);
+extern int MitResetCookie (AuthRstCArgs);
+
+/* in xdmauth.c */
+#ifdef HASXDMAUTH
+extern XID XdmCheckCookie (AuthCheckArgs);
+extern XID XdmToID (AuthToIDArgs);
+extern int XdmAddCookie (AuthAddCArgs);
+extern int XdmFromID (AuthFromIDArgs);
+extern int XdmRemoveCookie (AuthRemCArgs);
+extern int XdmResetCookie (AuthRstCArgs);
#endif
-);
-extern ConnectionOutputPtr AllocateOutputBuffer(
-#if NeedFunctionPrototypes
- void
+/* in rpcauth.c */
+#ifdef SECURE_RPC
+extern void SecureRPCInit (AuthInitArgs);
+extern XID SecureRPCCheck (AuthCheckArgs);
+extern XID SecureRPCToID (AuthToIDArgs);
+extern int SecureRPCAdd (AuthAddCArgs);
+extern int SecureRPCFromID (AuthFromIDArgs);
+extern int SecureRPCRemove (AuthRemCArgs);
+extern int SecureRPCReset (AuthRstCArgs);
#endif
-);
+
+/* in k5auth.c */
+#ifdef K5AUTH
+extern XID K5Check (AuthCheckArgs);
+extern XID K5ToID (AuthToIDArgs);
+extern int K5Add (AuthAddCArgs);
+extern int K5FromID (AuthFromIDArgs);
+extern int K5Remove (AuthRemCArgs);
+extern int K5Reset (AuthRstCArgs);
+#endif
+
+/* in secauth.c */
+extern XID AuthSecurityCheck (AuthCheckArgs);
+
+/* in xdmcp.c */
+extern void XdmcpUseMsg (void);
+extern int XdmcpOptions(int argc, char **argv, int i);
+extern void XdmcpSetAuthentication (ARRAY8Ptr name);
+extern void XdmcpRegisterConnection (
+ int type,
+ char *address,
+ int addrlen);
+extern void XdmcpRegisterAuthorizations (void);
+extern void XdmcpRegisterAuthorization (char *name, int namelen);
+extern void XdmcpRegisterDisplayClass (char *name, int length);
+extern void XdmcpInit (void);
+extern void XdmcpReset (void);
+extern void XdmcpOpenDisplay(int sock);
+extern void XdmcpCloseDisplay(int sock);
+extern void XdmcpRegisterAuthentication (
+ char *name,
+ int namelen,
+ char *data,
+ int datalen,
+ ValidatorFunc Validator,
+ GeneratorFunc Generator,
+ AddAuthorFunc AddAuth);
+extern int XdmcpCheckAuthentication (ARRAY8Ptr Name, ARRAY8Ptr Data, int packet_type);
+extern int XdmcpAddAuthorization (ARRAY8Ptr name, ARRAY8Ptr data);
+
+struct sockaddr_in;
+extern void XdmcpRegisterBroadcastAddress (struct sockaddr_in *addr);
+
+#endif /* _OSDEP_H_ */
diff --git a/os/osinit.c b/os/osinit.c
index f240ea42c..9d9fcda4e 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -1,3 +1,4 @@
+/* $XFree86: xc/programs/Xserver/os/osinit.c,v 3.27 2002/06/17 08:04:18 alanh Exp $ */
/***********************************************************
Copyright 1987, 1998 The Open Group
@@ -52,6 +53,10 @@ SOFTWARE.
#include "osdep.h"
#include "Xos.h"
+#ifdef SMART_SCHEDULE
+#include "dixstruct.h"
+#endif
+
#ifndef PATH_MAX
#ifdef MAXPATHLEN
#define PATH_MAX MAXPATHLEN
@@ -60,10 +65,12 @@ SOFTWARE.
#endif
#endif
-#ifndef WIN32
-#ifndef SYSV
-#include <sys/resource.h>
+#if defined(Lynx) || defined(SCO) || defined(SCO325)
+#include <sys/wait.h>
#endif
+
+#if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4)
+#include <sys/resource.h>
#endif
#ifndef ADMPATH
@@ -83,6 +90,10 @@ int limitNoFile = -1;
Bool OsDelayInitColors = FALSE;
+#ifdef XFree86LOADER
+extern void xf86WrapperInit(void);
+#endif
+
void
OsInit()
{
@@ -96,8 +107,13 @@ OsInit()
#endif
if (!been_here) {
+#ifdef XFree86LOADER
+ xf86WrapperInit();
+#endif
+#if !defined(SCO) && !defined(__CYGWIN__)
fclose(stdin);
fclose(stdout);
+#endif
/*
* If a write of zero bytes to stderr returns non-zero, i.e. -1,
* then writing to stderr failed, and we'll write somewhere else
@@ -122,7 +138,7 @@ OsInit()
dup2 (fileno (err), 2);
fclose (err);
}
-#if defined(SYSV) || defined(SVR4) || defined(WIN32)
+#if defined(SYSV) || defined(SVR4) || defined(__UNIXOS2__) || defined(WIN32) || defined(__CYGWIN__)
{
static char buf[BUFSIZ];
setvbuf (stderr, buf, _IOLBF, BUFSIZ);
@@ -183,18 +199,36 @@ OsInit()
rlim.rlim_cur = limitNoFile;
else
rlim.rlim_cur = rlim.rlim_max;
+#if 0
if (rlim.rlim_cur > MAXSOCKS)
rlim.rlim_cur = MAXSOCKS;
+#endif
(void)setrlimit(RLIMIT_NOFILE, &rlim);
}
}
#endif
+#ifdef SERVER_LOCK
+ LockServer();
+#endif
been_here = TRUE;
}
TimerInit();
#ifdef DDXOSINIT
OsVendorInit();
#endif
+#ifdef SMART_SCHEDULE
+ if (!SmartScheduleDisable)
+ if (!SmartScheduleInit ())
+ SmartScheduleDisable = TRUE;
+#endif
OsInitAllocator();
if (!OsDelayInitColors) OsInitColors();
}
+
+void
+OsCleanup()
+{
+#ifdef SERVER_LOCK
+ UnlockServer();
+#endif
+}
diff --git a/os/rpcauth.c b/os/rpcauth.c
index 15111921f..7ee53b52d 100644
--- a/os/rpcauth.c
+++ b/os/rpcauth.c
@@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/rpcauth.c,v 3.7 2001/12/14 20:00:35 dawes Exp $ */
/*
* SUN-DES-1 authentication mechanism
@@ -43,6 +44,16 @@ from The Open Group.
#include <rpc/rpc.h>
+#ifdef sun
+/* <rpc/auth.h> only includes this if _KERNEL is #defined... */
+extern bool_t xdr_opaque_auth(XDR *, struct opaque_auth *);
+#endif
+
+#if defined(DGUX)
+#include <time.h>
+#include <rpc/auth_des.h>
+#endif /* DGUX */
+
#ifdef ultrix
#include <time.h>
#include <rpc/auth_des.h>
@@ -104,7 +115,7 @@ int len;
return (((struct authdes_cred *) r.rq_clntcred)->adc_fullname.name);
bad2:
- Xfree(r.rq_clntcred);
+ xfree(r.rq_clntcred);
bad1:
return ((char *)0); /* ((struct authdes_cred *) NULL); */
}
@@ -112,10 +123,11 @@ bad1:
static XID rpc_id = (XID) ~0L;
static Bool
-CheckNetName (addr, len, closure)
- unsigned char *addr;
- int len;
- pointer closure;
+CheckNetName (
+ unsigned char *addr,
+ short len,
+ pointer closure
+)
{
return (len == strlen ((char *) closure) &&
strncmp ((char *) addr, (char *) closure, len) == 0);
@@ -140,21 +152,18 @@ SecureRPCCheck (data_length, data, client, reason)
sprintf(rpc_error, "Unable to authenticate secure RPC client (why=%d)", why);
*reason = rpc_error;
} else {
- if (ForEachHostInFamily (FamilyNetname, CheckNetName,
- (pointer) fullname))
+ if (ForEachHostInFamily (FamilyNetname, CheckNetName, fullname))
return rpc_id;
- else {
- sprintf(rpc_error, "Principal \"%s\" is not authorized to connect",
+ sprintf(rpc_error, "Principal \"%s\" is not authorized to connect",
fullname);
- *reason = rpc_error;
- }
+ *reason = rpc_error;
}
}
return (XID) ~0L;
}
-
-SecureRPCInit ()
+void
+SecureRPCInit (void)
{
if (rpc_id == ~0L)
AddAuthorization (9, "SUN-DES-1", 0, (char *) 0);
@@ -169,12 +178,14 @@ XID id;
if (data_length)
AddHost ((pointer) 0, FamilyNetname, data_length, data);
rpc_id = id;
+ return 1;
}
int
-SecureRPCReset ()
+SecureRPCReset (void)
{
rpc_id = (XID) ~0L;
+ return 1;
}
XID
@@ -185,6 +196,7 @@ SecureRPCToID (data_length, data)
return rpc_id;
}
+int
SecureRPCFromID (id, data_lenp, datap)
XID id;
unsigned short *data_lenp;
@@ -193,6 +205,7 @@ SecureRPCFromID (id, data_lenp, datap)
return 0;
}
+int
SecureRPCRemove (data_length, data)
unsigned short data_length;
char *data;
diff --git a/os/secauth.c b/os/secauth.c
index a73f4e718..4f90fe9a9 100644
--- a/os/secauth.c
+++ b/os/secauth.c
@@ -1,6 +1,6 @@
-/* $Xorg: secauth.c,v 1.5 2001/02/15 02:06:01 coskrey Exp $ */
+/* $Xorg: secauth.c,v 1.4 2001/02/09 02:05:23 xorgcvs Exp $ */
/*
-Copyright 1996, 1998, 2001 The Open Group
+Copyright 1996, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
@@ -24,11 +24,13 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/secauth.c,v 1.11 2001/12/14 20:00:35 dawes Exp $ */
#include "X.h"
#include "os.h"
#include "osdep.h"
#include "dixstruct.h"
+#include "swaprep.h"
#ifdef XCSECURITY
#define _SECURITY_SERVER
@@ -39,11 +41,11 @@ static char InvalidPolicyReason[] = "invalid policy specification";
static char PolicyViolationReason[] = "policy violation";
static Bool
-AuthCheckSitePolicy(data_lengthP, dataP, client, reason)
- unsigned short *data_lengthP;
- char **dataP;
- ClientPtr client;
- char **reason;
+AuthCheckSitePolicy(
+ unsigned short *data_lengthP,
+ char **dataP,
+ ClientPtr client,
+ char **reason)
{
CARD8 *policy = *(CARD8 **)dataP;
int length;
@@ -65,7 +67,7 @@ AuthCheckSitePolicy(data_lengthP, dataP, client, reason)
sitePolicies = SecurityGetSitePolicyStrings(&nSitePolicies);
- while (nPolicies > 0) {
+ while (nPolicies) {
int strLen, sitePolicy;
if (length == 0) {
@@ -110,15 +112,13 @@ AuthCheckSitePolicy(data_lengthP, dataP, client, reason)
}
XID
-AuthSecurityCheck (data_length, data, client, reason)
- unsigned short data_length;
- char *data;
- ClientPtr client;
- char **reason;
+AuthSecurityCheck (
+ unsigned short data_length,
+ char *data,
+ ClientPtr client,
+ char **reason)
{
#ifdef XCSECURITY
- OsCommPtr oc = (OsCommPtr)client->osPrivate;
- register ConnectionInputPtr oci = oc->input;
xConnSetupPrefix csp;
xReq freq;
diff --git a/os/utils.c b/os/utils.c
index 2c3d0ba63..4bbe9eb8c 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -49,8 +49,14 @@ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
OR PERFORMANCE OF THIS SOFTWARE.
*/
+/* $XFree86: xc/programs/Xserver/os/utils.c,v 3.85 2002/12/24 17:43:00 tsi Exp $ */
-#ifdef WIN32
+#ifdef __CYGWIN__
+#include <stdlib.h>
+#include <signal.h>
+#endif
+
+#if defined(WIN32) && !defined(__CYGWIN__)
#include <X11/Xwinsock.h>
#endif
#include "Xos.h"
@@ -58,7 +64,8 @@ OR PERFORMANCE OF THIS SOFTWARE.
#include "misc.h"
#include "X.h"
#include "input.h"
-#include "opaque.h"
+#include "dixfont.h"
+#include "osdep.h"
#ifdef X_POSIX_C_SOURCE
#define _POSIX_C_SOURCE X_POSIX_C_SOURCE
#include <signal.h>
@@ -72,74 +79,69 @@ OR PERFORMANCE OF THIS SOFTWARE.
#undef _POSIX_SOURCE
#endif
#endif
-#ifndef WIN32
-#ifndef SYSV
+#include <sys/wait.h>
+#if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4)
#include <sys/resource.h>
#endif
-#endif
#include <time.h>
#include <sys/stat.h>
#include <ctype.h> /* for isspace */
-#if NeedVarargsPrototypes
#include <stdarg.h>
+
+#if defined(DGUX)
+#include <sys/resource.h>
+#include <netdb.h>
#endif
+
+#include <stdlib.h> /* for malloc() */
+
#if defined(TCPCONN) || defined(STREAMSCONN)
# ifndef WIN32
# include <netdb.h>
# endif
#endif
-#define X_INCLUDE_NETDB_H
-#include <X11/Xos_r.h>
-
-extern char *display;
+#include "opaque.h"
-extern CARD32 defaultScreenSaverTime; /* for parsing command line */
-extern CARD32 defaultScreenSaverInterval;
-extern int defaultScreenSaverBlanking;
-extern int defaultBackingStore;
-extern Bool disableBackingStore;
-extern Bool disableSaveUnders;
-extern Bool PartialNetwork;
-#ifndef NOLOGOHACK
-extern int logoScreenSaver;
-#endif
-#ifdef RLIMIT_DATA
-extern int limitDataSpace;
+#ifdef SMART_SCHEDULE
+#include "dixstruct.h"
#endif
-#ifdef RLIMIT_STACK
-extern int limitStackSpace;
+
+#ifdef XKB
+#include "XKBsrv.h"
#endif
-#ifdef RLIMIT_NOFILE
-extern int limitNoFile;
+#ifdef XCSECURITY
+#define _SECURITY_SERVER
+#include "security.h"
#endif
-extern int defaultColorVisualClass;
-extern Bool permitOldBugs;
-extern int monitorResolution;
-extern Bool defeatAccessControl;
-#ifdef DPMSExtension
-extern BOOL DPMSEnabledSwitch;
-extern BOOL DPMSDisabledSwitch;
+#ifdef RENDER
+#include "picture.h"
#endif
+#define X_INCLUDE_NETDB_H
+#include <X11/Xos_r.h>
+
+#include <errno.h>
+
Bool CoreDump;
Bool noTestExtensions;
-Bool noPanoramiXExtension = TRUE;
#ifdef PANORAMIX
+Bool noPanoramiXExtension = TRUE;
Bool PanoramiXVisibilityNotifySent = FALSE;
Bool PanoramiXMapped = FALSE;
Bool PanoramiXWindowExposureSent = FALSE;
Bool PanoramiXOneExposeRequest = FALSE;
#endif
+#ifdef DDXOSVERRORF
+void (*OsVendorVErrorFProc)(const char *, va_list args) = NULL;
+#endif
+
int auditTrailLevel = 1;
-void ddxUseMsg();
-#if NeedVarargsPrototypes
-void VErrorF(char*, va_list);
-#endif
+Bool Must_have_memory = FALSE;
#ifdef AIXV3
int SyncOn = 0;
@@ -155,15 +157,13 @@ extern int SelectWaitTime;
#ifdef MEMBUG
#define MEM_FAIL_SCALE 100000
long Memory_fail = 0;
-
+#include <stdlib.h> /* for random() */
#endif
#ifdef sgi
int userdefinedfontpath = 0;
#endif /* sgi */
-Bool Must_have_memory = FALSE;
-
char *dev_tty_from_init = NULL; /* since we need to parse it anyway */
OsSigHandlerPtr
@@ -185,6 +185,206 @@ OsSignal(sig, handler)
return oact.sa_handler;
#endif
}
+
+#ifdef SERVER_LOCK
+/*
+ * Explicit support for a server lock file like the ones used for UUCP.
+ * For architectures with virtual terminals that can run more than one
+ * server at a time. This keeps the servers from stomping on each other
+ * if the user forgets to give them different display numbers.
+ */
+#ifndef __UNIXOS2__
+#define LOCK_DIR "/tmp"
+#endif
+#define LOCK_TMP_PREFIX "/.tX"
+#define LOCK_PREFIX "/.X"
+#define LOCK_SUFFIX "-lock"
+
+#if defined(DGUX)
+#include <limits.h>
+#include <sys/param.h>
+#endif
+
+#ifdef __UNIXOS2__
+#define link rename
+#endif
+
+#ifndef PATH_MAX
+#ifndef Lynx
+#include <sys/param.h>
+#else
+#include <param.h>
+#endif
+#ifndef PATH_MAX
+#ifdef MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+#endif
+
+static Bool StillLocking = FALSE;
+static char LockFile[PATH_MAX];
+static Bool nolock = FALSE;
+
+/*
+ * LockServer --
+ * Check if the server lock file exists. If so, check if the PID
+ * contained inside is valid. If so, then die. Otherwise, create
+ * the lock file containing the PID.
+ */
+void
+LockServer()
+{
+ char tmp[PATH_MAX], pid_str[12];
+ int lfd, i, haslock, l_pid, t;
+ char *tmppath = NULL;
+ int len;
+
+ if (nolock) return;
+ /*
+ * Path names
+ */
+#ifndef __UNIXOS2__
+ tmppath = LOCK_DIR;
+#else
+ /* OS/2 uses TMP directory, must also prepare for 8.3 names */
+ tmppath = getenv("TMP");
+ if (!tmppath)
+ FatalError("No TMP dir found\n");
+#endif
+
+ len = strlen(LOCK_PREFIX) > strlen(LOCK_TMP_PREFIX) ? strlen(LOCK_PREFIX) :
+ strlen(LOCK_TMP_PREFIX);
+ len += strlen(tmppath) + strlen(display) + strlen(LOCK_SUFFIX) + 1;
+ if (len > sizeof(LockFile))
+ FatalError("Display name `%s' is too long\n");
+ (void)sprintf(tmp, "%s" LOCK_TMP_PREFIX "%s" LOCK_SUFFIX, tmppath, display);
+ (void)sprintf(LockFile, "%s" LOCK_PREFIX "%s" LOCK_SUFFIX, tmppath, display);
+
+ /*
+ * Create a temporary file containing our PID. Attempt three times
+ * to create the file.
+ */
+ StillLocking = TRUE;
+ i = 0;
+ do {
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
+ } while (i < 3);
+ if (lfd < 0) {
+ unlink(tmp);
+ i = 0;
+ do {
+ i++;
+ lfd = open(tmp, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (lfd < 0)
+ sleep(2);
+ else
+ break;
+ } while (i < 3);
+ }
+ if (lfd < 0)
+ FatalError("Could not create lock file in %s\n", tmp);
+ (void) sprintf(pid_str, "%10ld\n", (long)getpid());
+ (void) write(lfd, pid_str, 11);
+#ifndef __UNIXOS2__
+#ifndef USE_CHMOD
+ (void) fchmod(lfd, 0444);
+#else
+ (void) chmod(tmp, 0444);
+#endif
+#endif
+ (void) close(lfd);
+
+ /*
+ * OK. Now the tmp file exists. Try three times to move it in place
+ * for the lock.
+ */
+ i = 0;
+ haslock = 0;
+ while ((!haslock) && (i++ < 3)) {
+ haslock = (link(tmp,LockFile) == 0);
+ if (haslock) {
+ /*
+ * We're done.
+ */
+ break;
+ }
+ else {
+ /*
+ * Read the pid from the existing file
+ */
+ lfd = open(LockFile, O_RDONLY);
+ if (lfd < 0) {
+ unlink(tmp);
+ FatalError("Can't read lock file %s\n", LockFile);
+ }
+ pid_str[0] = '\0';
+ if (read(lfd, pid_str, 11) != 11) {
+ /*
+ * Bogus lock file.
+ */
+ unlink(LockFile);
+ close(lfd);
+ continue;
+ }
+ pid_str[11] = '\0';
+ sscanf(pid_str, "%d", &l_pid);
+ close(lfd);
+
+ /*
+ * Now try to kill the PID to see if it exists.
+ */
+ errno = 0;
+ t = kill(l_pid, 0);
+ if ((t< 0) && (errno == ESRCH)) {
+ /*
+ * Stale lock file.
+ */
+ unlink(LockFile);
+ continue;
+ }
+ else if (((t < 0) && (errno == EPERM)) || (t == 0)) {
+ /*
+ * Process is still active.
+ */
+ unlink(tmp);
+ FatalError("Server is already active for display %s\n%s %s\n%s\n",
+ display, "\tIf this server is no longer running, remove",
+ LockFile, "\tand start again.");
+ }
+ }
+ }
+ unlink(tmp);
+ if (!haslock)
+ FatalError("Could not create server lock file: %s\n", LockFile);
+ StillLocking = FALSE;
+}
+
+/*
+ * UnlockServer --
+ * Remove the server lock file.
+ */
+void
+UnlockServer()
+{
+ if (nolock) return;
+
+ if (!StillLocking){
+
+#ifdef __UNIXOS2__
+ (void) chmod(LockFile,S_IREAD|S_IWRITE);
+#endif /* __UNIXOS2__ */
+ (void) unlink(LockFile);
+ }
+}
+#endif /* SERVER_LOCK */
/* Force connections to close on SIGHUP from init */
@@ -193,6 +393,8 @@ SIGVAL
AutoResetServer (sig)
int sig;
{
+ int olderrno = errno;
+
dispatchException |= DE_RESET;
isItTimeToYield = TRUE;
#ifdef GPROF
@@ -202,6 +404,7 @@ AutoResetServer (sig)
#if defined(SYSV) && defined(X_NOT_POSIX)
OsSignal (SIGHUP, AutoResetServer);
#endif
+ errno = olderrno;
}
/* Force connections to close and then exit on SIGTERM, SIGINT */
@@ -211,20 +414,25 @@ SIGVAL
GiveUp(sig)
int sig;
{
+ int olderrno = errno;
+
dispatchException |= DE_TERMINATE;
isItTimeToYield = TRUE;
#if defined(SYSV) && defined(X_NOT_POSIX)
if (sig)
OsSignal(sig, SIG_IGN);
#endif
+ errno = olderrno;
}
+#ifdef __GNUC__
+static void AbortServer() __attribute__((noreturn));
+#endif
static void
AbortServer()
{
- extern void AbortDDX();
-
+ OsCleanup();
AbortDDX();
fflush(stderr);
if (CoreDump)
@@ -250,6 +458,7 @@ GetTimeInMillis()
}
#endif
+void
AdjustWaitForDelay (waitTime, newdelay)
pointer waitTime;
unsigned long newdelay;
@@ -287,6 +496,8 @@ void UseMsg()
ErrorF("-audit int set audit trail level\n");
ErrorF("-auth file select authorization file\n");
ErrorF("bc enable bug compatibility\n");
+ ErrorF("-br create root window with black background\n");
+ ErrorF("+bs enable any backing store support\n");
ErrorF("-bs disable any backing store support\n");
ErrorF("-c turns off key-click\n");
ErrorF("c # key-click volume (0-100)\n");
@@ -317,14 +528,22 @@ void UseMsg()
#ifdef RLIMIT_STACK
ErrorF("-ls int limit stack space to N Kb\n");
#endif
+#ifdef SERVER_LOCK
+ ErrorF("-nolock disable the locking mechanism\n");
+#endif
#ifndef NOLOGOHACK
ErrorF("-logo enable logo in screen saver\n");
ErrorF("nologo disable logo in screen saver\n");
#endif
+ ErrorF("-nolisten string don't listen on protocol\n");
ErrorF("-p # screen-saver pattern duration (minutes)\n");
ErrorF("-pn accept failure to listen on all ports\n");
+ ErrorF("-nopn reject failure to listen on all ports\n");
ErrorF("-r turns off auto-repeat\n");
ErrorF("r turns on auto-repeat \n");
+#ifdef RENDER
+ ErrorF("-render [default|mono|gray|color] set render color alloc policy\n");
+#endif
ErrorF("-s # screen-saver timeout (minutes)\n");
#ifdef XCSECURITY
ErrorF("-sp file security policy file\n");
@@ -338,11 +557,11 @@ void UseMsg()
ErrorF("v video blanking for screen-saver\n");
ErrorF("-v screen-saver without video blanking\n");
ErrorF("-wm WhenMapped default backing-store\n");
+ ErrorF("-x string loads named extension at init time \n");
#ifdef PANORAMIX
ErrorF("+xinerama Enable XINERAMA extension\n");
ErrorF("-xinerama Disable XINERAMA extension\n");
#endif
- ErrorF("-x string loads named extension at init time \n");
#ifdef XDMCP
XdmcpUseMsg();
#endif
@@ -353,6 +572,24 @@ void UseMsg()
ddxUseMsg();
}
+/* This function performs a rudimentary sanity check
+ * on the display name passed in on the command-line,
+ * since this string is used to generate filenames.
+ * It is especially important that the display name
+ * not contain a "/" and not start with a "-".
+ * --kvajk
+ */
+int VerifyDisplayName( d )
+char *d;
+{
+ if ( d == (char *)0 ) return( 0 ); /* null */
+ if ( *d == '\0' ) return( 0 ); /* empty */
+ if ( *d == '-' ) return( 0 ); /* could be confused for an option */
+ if ( *d == '.' ) return( 0 ); /* must not equal "." or ".." */
+ if ( strchr(d, '/') != (char *)0 ) return( 0 ); /* very important!!! */
+ return( 1 );
+}
+
/*
* This function parses the command line. Handles device-independent fields
* and allows ddx to handle additional fields. It is not allowed to modify
@@ -368,10 +605,14 @@ char *argv[];
defaultKeyboardControl.autoRepeat = TRUE;
+#ifdef PART_NET
+ PartialNetwork = TRUE;
+#endif
+
for ( i = 1; i < argc; i++ )
{
/* call ddx first, so it can peek/override if it wants */
- if(skip = ddxProcessArgument(argc, argv, i))
+ if((skip = ddxProcessArgument(argc, argv, i)))
{
i += (skip - 1);
}
@@ -380,6 +621,11 @@ char *argv[];
/* initialize display */
display = argv[i];
display++;
+ if( ! VerifyDisplayName( display ) ) {
+ ErrorF("Bad display name: %s\n", display);
+ UseMsg();
+ exit(1);
+ }
}
else if ( strcmp( argv[i], "-a") == 0)
{
@@ -417,6 +663,10 @@ char *argv[];
}
else if ( strcmp( argv[i], "bc") == 0)
permitOldBugs = TRUE;
+ else if ( strcmp( argv[i], "-br") == 0)
+ blackRoot = TRUE;
+ else if ( strcmp( argv[i], "+bs") == 0)
+ enableBackingStore = TRUE;
else if ( strcmp( argv[i], "-bs") == 0)
disableBackingStore = TRUE;
else if ( strcmp( argv[i], "c") == 0)
@@ -544,6 +794,17 @@ char *argv[];
UseMsg();
}
#endif
+#ifdef SERVER_LOCK
+ else if ( strcmp ( argv[i], "-nolock") == 0)
+ {
+#if !defined(WIN32) && !defined(__UNIXOS2__) && !defined(__CYGWIN__)
+ if (getuid() != 0)
+ ErrorF("Warning: the -nolock option can only be used by root\n");
+ else
+#endif
+ nolock = TRUE;
+ }
+#endif
#ifndef NOLOGOHACK
else if ( strcmp( argv[i], "-logo") == 0)
{
@@ -554,6 +815,19 @@ char *argv[];
logoScreenSaver = 0;
}
#endif
+ else if ( strcmp( argv[i], "-nolisten") == 0)
+ {
+ if(++i < argc)
+ protNoListen = argv[i];
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-noreset") == 0)
+ {
+ extern char dispatchExceptionAtReset;
+
+ dispatchExceptionAtReset = 0;
+ }
else if ( strcmp( argv[i], "-p") == 0)
{
if(++i < argc)
@@ -564,6 +838,8 @@ char *argv[];
}
else if ( strcmp( argv[i], "-pn") == 0)
PartialNetwork = TRUE;
+ else if ( strcmp( argv[i], "-nopn") == 0)
+ PartialNetwork = FALSE;
else if ( strcmp( argv[i], "r") == 0)
defaultKeyboardControl.autoRepeat = TRUE;
else if ( strcmp( argv[i], "-r") == 0)
@@ -587,9 +863,9 @@ char *argv[];
}
else if ( strcmp( argv[i], "-terminate") == 0)
{
- extern Bool terminateAtReset;
+ extern char dispatchExceptionAtReset;
- terminateAtReset = TRUE;
+ dispatchExceptionAtReset = DE_TERMINATE;
}
else if ( strcmp( argv[i], "-to") == 0)
{
@@ -665,8 +941,50 @@ char *argv[];
SyncOn++;
}
#endif
+#ifdef SMART_SCHEDULE
+ else if ( strcmp( argv[i], "-dumbSched") == 0)
+ {
+ SmartScheduleDisable = TRUE;
+ }
+ else if ( strcmp( argv[i], "-schedInterval") == 0)
+ {
+ if (++i < argc)
+ {
+ SmartScheduleInterval = atoi(argv[i]);
+ SmartScheduleSlice = SmartScheduleInterval;
+ }
+ else
+ UseMsg();
+ }
+ else if ( strcmp( argv[i], "-schedMax") == 0)
+ {
+ if (++i < argc)
+ {
+ SmartScheduleMaxSlice = atoi(argv[i]);
+ }
+ else
+ UseMsg();
+ }
+#endif
+#ifdef RENDER
+ else if ( strcmp( argv[i], "-render" ) == 0)
+ {
+ if (++i < argc)
+ {
+ int policy = PictureParseCmapPolicy (argv[i]);
+
+ if (policy != PictureCmapPolicyInvalid)
+ PictureCmapPolicy = policy;
+ else
+ UseMsg ();
+ }
+ else
+ UseMsg ();
+ }
+#endif
else
{
+ ErrorF("Unrecognized option: %s\n", argv[i]);
UseMsg();
exit (1);
}
@@ -771,6 +1089,12 @@ ExpandCommandLine(pargc, pargv)
char ***pargv;
{
int i;
+
+#if !defined(WIN32) && !defined(__UNIXOS2__) && !defined(__CYGWIN__)
+ if (getuid() != geteuid())
+ return;
+#endif
+
for (i = 1; i < *pargc; i++)
{
if ( (0 == strcmp((*pargv)[i], "-config")) && (i < (*pargc - 1)) )
@@ -803,7 +1127,9 @@ pointer client;
char hname[1024], *hnameptr;
struct hostent *host;
int len;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams;
+#endif
gethostname(hname, 1024);
host = _XGethostbyname(hname, hparams);
@@ -843,15 +1169,17 @@ pointer client;
* expectations of malloc, but this makes lint happier.
*/
-unsigned long *
+#ifndef INTERNAL_MALLOC
+
+void *
Xalloc (amount)
unsigned long amount;
{
- char *malloc();
register pointer ptr;
- if ((long)amount <= 0)
+ if ((long)amount <= 0) {
return (unsigned long *)NULL;
+ }
/* aligned extra on long word boundary */
amount = (amount + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
#ifdef MEMBUG
@@ -859,8 +1187,9 @@ Xalloc (amount)
((random() % MEM_FAIL_SCALE) < Memory_fail))
return (unsigned long *)NULL;
#endif
- if (ptr = (pointer)malloc(amount))
+ if ((ptr = (pointer)malloc(amount))) {
return (unsigned long *)ptr;
+ }
if (Must_have_memory)
FatalError("Out of memory");
return (unsigned long *)NULL;
@@ -871,11 +1200,10 @@ Xalloc (amount)
* "no failure" realloc, alternate interface to Xalloc w/o Must_have_memory
*****************/
-unsigned long *
+void *
XNFalloc (amount)
unsigned long amount;
{
- char *malloc();
register pointer ptr;
if ((long)amount <= 0)
@@ -896,7 +1224,7 @@ XNFalloc (amount)
* Xcalloc
*****************/
-unsigned long *
+void *
Xcalloc (amount)
unsigned long amount;
{
@@ -909,17 +1237,32 @@ Xcalloc (amount)
}
/*****************
+ * XNFcalloc
+ *****************/
+
+void *
+XNFcalloc (amount)
+ unsigned long amount;
+{
+ unsigned long *ret;
+
+ ret = Xalloc (amount);
+ if (ret)
+ bzero ((char *) ret, (int) amount);
+ else if ((long)amount > 0)
+ FatalError("Out of memory");
+ return ret;
+}
+
+/*****************
* Xrealloc
*****************/
-unsigned long *
+void *
Xrealloc (ptr, amount)
register pointer ptr;
unsigned long amount;
{
- char *malloc();
- char *realloc();
-
#ifdef MEMBUG
if (!Must_have_memory && Memory_fail &&
((random() % MEM_FAIL_SCALE) < Memory_fail))
@@ -948,14 +1291,15 @@ Xrealloc (ptr, amount)
* "no failure" realloc, alternate interface to Xrealloc w/o Must_have_memory
*****************/
-unsigned long *
+void *
XNFrealloc (ptr, amount)
register pointer ptr;
unsigned long amount;
{
if (( ptr = (pointer)Xrealloc( ptr, amount ) ) == NULL)
{
- FatalError( "Out of memory" );
+ if ((long)amount > 0)
+ FatalError( "Out of memory" );
}
return ((unsigned long *)ptr);
}
@@ -973,6 +1317,7 @@ Xfree(ptr)
free((char *)ptr);
}
+void
OsInitAllocator ()
{
#ifdef MEMBUG
@@ -985,24 +1330,51 @@ OsInitAllocator ()
been_here = 1;
#endif
}
+#endif /* !INTERNAL_MALLOC */
+
+
+char *
+Xstrdup(const char *s)
+{
+ char *sd;
+
+ if (s == NULL)
+ return NULL;
+
+ sd = (char *)Xalloc(strlen(s) + 1);
+ if (sd != NULL)
+ strcpy(sd, s);
+ return sd;
+}
+
+
+char *
+XNFstrdup(const char *s)
+{
+ char *sd;
+
+ if (s == NULL)
+ return NULL;
+
+ sd = (char *)XNFalloc(strlen(s) + 1);
+ strcpy(sd, s);
+ return sd;
+}
+
void
AuditPrefix(f)
- char *f;
+ const char *f;
{
-#ifdef X_NOT_STDC_ENV
- long tm;
-#else
time_t tm;
-#endif
char *autime, *s;
if (*f != ' ')
{
time(&tm);
autime = ctime(&tm);
- if (s = strchr(autime, '\n'))
+ if ((s = strchr(autime, '\n')))
*s = '\0';
- if (s = strrchr(argvGlobal[0], '/'))
+ if ((s = strrchr(argvGlobal[0], '/')))
s++;
else
s = argvGlobal[0];
@@ -1010,96 +1382,669 @@ AuditPrefix(f)
}
}
-/*VARARGS1*/
void
-AuditF(
-#if NeedVarargsPrototypes
- char * f, ...)
-#else
- f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) /* limit of ten args */
- char *f;
- char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
-#endif
+AuditF(const char * f, ...)
{
-#if NeedVarargsPrototypes
va_list args;
-#endif
AuditPrefix(f);
-#if NeedVarargsPrototypes
va_start(args, f);
VErrorF(f, args);
va_end(args);
-#else
- ErrorF(f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-#endif
}
-/*VARARGS1*/
void
-FatalError(
-#if NeedVarargsPrototypes
- char *f, ...)
-#else
-f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) /* limit of ten args */
- char *f;
- char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
-#endif
+FatalError(const char *f, ...)
{
-#if NeedVarargsPrototypes
va_list args;
-#endif
- ErrorF("\nFatal server error:\n");
-#if NeedVarargsPrototypes
+ static Bool beenhere = FALSE;
+
+ if (beenhere)
+ ErrorF("\nFatalError re-entered, aborting\n");
+ else
+ ErrorF("\nFatal server error:\n");
+
va_start(args, f);
VErrorF(f, args);
va_end(args);
-#else
- ErrorF(f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-#endif
ErrorF("\n");
- AbortServer();
+#ifdef DDXOSFATALERROR
+ if (!beenhere)
+ OsVendorFatalError();
+#endif
+#ifdef ABORTONFATALERROR
+ abort();
+#endif
+ if (!beenhere) {
+ beenhere = TRUE;
+ AbortServer();
+ } else
+ abort();
/*NOTREACHED*/
}
-#if NeedVarargsPrototypes
void
VErrorF(f, args)
- char *f;
+ const char *f;
va_list args;
{
#ifdef AIXV3
if (SyncOn)
sync();
#else
+#ifdef DDXOSVERRORF
+ if (OsVendorVErrorFProc)
+ OsVendorVErrorFProc(f, args);
+ else
+ vfprintf(stderr, f, args);
+#else
vfprintf(stderr, f, args);
+#endif
#endif /* AIXV3 */
}
-#endif
-/*VARARGS1*/
void
-ErrorF(
-#if NeedVarargsPrototypes
- char * f, ...)
-#else
- f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) /* limit of ten args */
- char *f;
- char *s0, *s1, *s2, *s3, *s4, *s5, *s6, *s7, *s8, *s9;
+VFatalError(const char *msg, va_list args)
+{
+ VErrorF(msg, args);
+ ErrorF("\n");
+#ifdef DDXOSFATALERROR
+ OsVendorFatalError();
#endif
+ AbortServer();
+ /*NOTREACHED*/
+}
+
+void
+ErrorF(const char * f, ...)
{
-#if NeedVarargsPrototypes
va_list args;
va_start(args, f);
VErrorF(f, args);
va_end(args);
+}
+
+#ifdef SMART_SCHEDULE
+
+unsigned long SmartScheduleIdleCount;
+Bool SmartScheduleIdle;
+Bool SmartScheduleTimerStopped;
+
+#ifdef SIGVTALRM
+#define SMART_SCHEDULE_POSSIBLE
+#endif
+
+#ifdef SMART_SCHEDULE_POSSIBLE
+#define SMART_SCHEDULE_SIGNAL SIGALRM
+#define SMART_SCHEDULE_TIMER ITIMER_REAL
+#endif
+
+void
+SmartScheduleStopTimer (void)
+{
+#ifdef SMART_SCHEDULE_POSSIBLE
+ struct itimerval timer;
+
+ timer.it_interval.tv_sec = 0;
+ timer.it_interval.tv_usec = 0;
+ timer.it_value.tv_sec = 0;
+ timer.it_value.tv_usec = 0;
+ (void) setitimer (ITIMER_REAL, &timer, 0);
+ SmartScheduleTimerStopped = TRUE;
+#endif
+}
+
+Bool
+SmartScheduleStartTimer (void)
+{
+#ifdef SMART_SCHEDULE_POSSIBLE
+ struct itimerval timer;
+
+ SmartScheduleTimerStopped = FALSE;
+ timer.it_interval.tv_sec = 0;
+ timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
+ timer.it_value.tv_sec = 0;
+ timer.it_value.tv_usec = SmartScheduleInterval * 1000;
+ return setitimer (ITIMER_REAL, &timer, 0) >= 0;
+#endif
+ return FALSE;
+}
+
+#ifdef SMART_SCHEDULE_POSSIBLE
+void
+SmartScheduleTimer (int sig)
+{
+ int olderrno = errno;
+
+ SmartScheduleTime += SmartScheduleInterval;
+ if (SmartScheduleIdle)
+ {
+ SmartScheduleStopTimer ();
+ }
+ errno = olderrno;
+}
+#endif
+
+Bool
+SmartScheduleInit (void)
+{
+#ifdef SMART_SCHEDULE_POSSIBLE
+ struct sigaction act;
+
+ if (SmartScheduleDisable)
+ return TRUE;
+
+ bzero ((char *) &act, sizeof(struct sigaction));
+
+ /* Set up the timer signal function */
+ act.sa_handler = SmartScheduleTimer;
+ sigemptyset (&act.sa_mask);
+ sigaddset (&act.sa_mask, SMART_SCHEDULE_SIGNAL);
+ if (sigaction (SMART_SCHEDULE_SIGNAL, &act, 0) < 0)
+ {
+ perror ("sigaction for smart scheduler");
+ return FALSE;
+ }
+ /* Set up the virtual timer */
+ if (!SmartScheduleStartTimer ())
+ {
+ perror ("scheduling timer");
+ return FALSE;
+ }
+ /* stop the timer and wait for WaitForSomething to start it */
+ SmartScheduleStopTimer ();
+ return TRUE;
#else
-#ifdef AIXV3
- if (SyncOn)
- sync();
-#else /* not AIXV3 */
- fprintf( stderr, f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-#endif /* AIXV3 */
+ return FALSE;
+#endif
+}
+#endif
+
+#ifdef SIG_BLOCK
+static sigset_t PreviousSignalMask;
+static int BlockedSignalCount;
+#endif
+
+void
+OsBlockSignals (void)
+{
+#ifdef SIG_BLOCK
+ if (BlockedSignalCount++ == 0)
+ {
+ sigset_t set;
+
+ sigemptyset (&set);
+#ifdef SIGALRM
+ sigaddset (&set, SIGALRM);
+#endif
+#ifdef SIGVTALRM
+ sigaddset (&set, SIGVTALRM);
+#endif
+#ifdef SIGWINCH
+ sigaddset (&set, SIGWINCH);
+#endif
+#ifdef SIGIO
+ sigaddset (&set, SIGIO);
+#endif
+#ifdef SIGTSTP
+ sigaddset (&set, SIGTSTP);
+#endif
+#ifdef SIGTTIN
+ sigaddset (&set, SIGTTIN);
+#endif
+#ifdef SIGTTOU
+ sigaddset (&set, SIGTTOU);
+#endif
+ sigprocmask (SIG_BLOCK, &set, &PreviousSignalMask);
+ }
+#endif
+}
+
+void
+OsReleaseSignals (void)
+{
+#ifdef SIG_BLOCK
+ if (--BlockedSignalCount == 0)
+ {
+ sigprocmask (SIG_SETMASK, &PreviousSignalMask, 0);
+ }
+#endif
+}
+
+#if !defined(WIN32) && !defined(__UNIXOS2__)
+/*
+ * "safer" versions of system(3), popen(3) and pclose(3) which give up
+ * all privs before running a command.
+ *
+ * This is based on the code in FreeBSD 2.2 libc.
+ *
+ * XXX It'd be good to redirect stderr so that it ends up in the log file
+ * as well. As it is now, xkbcomp messages don't end up in the log file.
+ */
+
+int
+System(command)
+ char *command;
+{
+ int pid, p;
+#ifdef SIGCHLD
+ void (*csig)(int);
+#endif
+ int status;
+
+ if (!command)
+ return(1);
+
+#ifdef SIGCHLD
+ csig = signal(SIGCHLD, SIG_DFL);
+#endif
+
+#ifdef DEBUG
+ ErrorF("System: `%s'\n", command);
+#endif
+
+ switch (pid = fork()) {
+ case -1: /* error */
+ p = -1;
+ case 0: /* child */
+ setgid(getgid());
+ setuid(getuid());
+ execl("/bin/sh", "sh", "-c", command, (char *)NULL);
+ _exit(127);
+ default: /* parent */
+ do {
+ p = waitpid(pid, &status, 0);
+ } while (p == -1 && errno == EINTR);
+
+ }
+
+#ifdef SIGCHLD
+ signal(SIGCHLD, csig);
+#endif
+
+ return p == -1 ? -1 : status;
+}
+
+static struct pid {
+ struct pid *next;
+ FILE *fp;
+ int pid;
+} *pidlist;
+
+pointer
+Popen(command, type)
+ char *command;
+ char *type;
+{
+ struct pid *cur;
+ FILE *iop;
+ int pdes[2], pid;
+
+ if (command == NULL || type == NULL)
+ return NULL;
+
+ if ((*type != 'r' && *type != 'w') || type[1])
+ return NULL;
+
+ if ((cur = (struct pid *)xalloc(sizeof(struct pid))) == NULL)
+ return NULL;
+
+ if (pipe(pdes) < 0) {
+ xfree(cur);
+ return NULL;
+ }
+
+ switch (pid = fork()) {
+ case -1: /* error */
+ close(pdes[0]);
+ close(pdes[1]);
+ xfree(cur);
+ return NULL;
+ case 0: /* child */
+ setgid(getgid());
+ setuid(getuid());
+ if (*type == 'r') {
+ if (pdes[1] != 1) {
+ /* stdout */
+ dup2(pdes[1], 1);
+ close(pdes[1]);
+ }
+ close(pdes[0]);
+ } else {
+ if (pdes[0] != 0) {
+ /* stdin */
+ dup2(pdes[0], 0);
+ close(pdes[0]);
+ }
+ close(pdes[1]);
+ }
+ execl("/bin/sh", "sh", "-c", command, (char *)NULL);
+ _exit(127);
+ }
+
+ /* Avoid EINTR during stdio calls */
+ OsBlockSignals ();
+
+ /* parent */
+ if (*type == 'r') {
+ iop = fdopen(pdes[0], type);
+ close(pdes[1]);
+ } else {
+ iop = fdopen(pdes[1], type);
+ close(pdes[0]);
+ }
+
+ cur->fp = iop;
+ cur->pid = pid;
+ cur->next = pidlist;
+ pidlist = cur;
+
+#ifdef DEBUG
+ ErrorF("Popen: `%s', fp = %p\n", command, iop);
+#endif
+
+ return iop;
+}
+
+int
+Pclose(iop)
+ pointer iop;
+{
+ struct pid *cur, *last;
+ int pstat;
+ int pid;
+
+#ifdef DEBUG
+ ErrorF("Pclose: fp = %p\n", iop);
+#endif
+
+ fclose(iop);
+
+ for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
+ if (cur->fp == iop)
+ break;
+ if (cur == NULL)
+ return -1;
+
+ do {
+ pid = waitpid(cur->pid, &pstat, 0);
+ } while (pid == -1 && errno == EINTR);
+
+ if (last == NULL)
+ pidlist = cur->next;
+ else
+ last->next = cur->next;
+ xfree(cur);
+
+ /* allow EINTR again */
+ OsReleaseSignals ();
+
+ return pid == -1 ? -1 : pstat;
+}
+#endif /* !WIN32 && !__UNIXOS2__ */
+
+
+/*
+ * CheckUserParameters: check for long command line arguments and long
+ * environment variables. By default, these checks are only done when
+ * the server's euid != ruid. In 3.3.x, these checks were done in an
+ * external wrapper utility.
+ */
+
+/* Consider LD* variables insecure? */
+#ifndef REMOVE_ENV_LD
+#define REMOVE_ENV_LD 1
+#endif
+
+/* Remove long environment variables? */
+#ifndef REMOVE_LONG_ENV
+#define REMOVE_LONG_ENV 1
+#endif
+
+/*
+ * Disallow stdout or stderr as pipes? It's possible to block the X server
+ * when piping stdout+stderr to a pipe.
+ *
+ * Don't enable this because it looks like it's going to cause problems.
+ */
+#ifndef NO_OUTPUT_PIPES
+#define NO_OUTPUT_PIPES 0
+#endif
+
+
+/* Check args and env only if running setuid (euid == 0 && euid != uid) ? */
+#ifndef CHECK_EUID
+#define CHECK_EUID 1
+#endif
+
+/*
+ * Maybe the locale can be faked to make isprint(3) report that everything
+ * is printable? Avoid it by default.
+ */
+#ifndef USE_ISPRINT
+#define USE_ISPRINT 0
+#endif
+
+#define MAX_ARG_LENGTH 128
+#define MAX_ENV_LENGTH 256
+#define MAX_ENV_PATH_LENGTH 2048 /* Limit for *PATH and TERMCAP */
+
+#if USE_ISPRINT
+#include <ctype.h>
+#define checkPrintable(c) isprint(c)
+#else
+#define checkPrintable(c) (((c) & 0x7f) >= 0x20 && ((c) & 0x7f) != 0x7f)
+#endif
+
+enum BadCode {
+ NotBad = 0,
+ UnsafeArg,
+ ArgTooLong,
+ UnprintableArg,
+ EnvTooLong,
+ OutputIsPipe,
+ InternalError
+};
+
+#define ARGMSG \
+ "\nIf the arguments used are valid, and have been rejected incorrectly\n" \
+ "please send details of the arguments and why they are valid to\n" \
+ "XFree86@XFree86.org. In the meantime, you can start the Xserver as\n" \
+ "the \"super user\" (root).\n"
+
+#define ENVMSG \
+ "\nIf the environment is valid, and have been rejected incorrectly\n" \
+ "please send details of the environment and why it is valid to\n" \
+ "XFree86@XFree86.org. In the meantime, you can start the Xserver as\n" \
+ "the \"super user\" (root).\n"
+
+void
+CheckUserParameters(int argc, char **argv, char **envp)
+{
+ enum BadCode bad = NotBad;
+ int i = 0, j;
+ char *a, *e = NULL;
+#if defined(__QNX__) && !defined(__QNXNTO__)
+ char cmd_name[64];
+#endif
+
+#if CHECK_EUID
+ if (geteuid() == 0 && getuid() != geteuid())
+#endif
+ {
+ /* Check each argv[] */
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) > MAX_ARG_LENGTH) {
+ bad = ArgTooLong;
+ break;
+ }
+ a = argv[i];
+ while (*a) {
+ if (checkPrintable(*a) == 0) {
+ bad = UnprintableArg;
+ break;
+ }
+ a++;
+ }
+ if (bad)
+ break;
+ }
+ if (!bad) {
+ /* Check each envp[] */
+ for (i = 0; envp[i]; i++) {
+
+ /* Check for bad environment variables and values */
+#if REMOVE_ENV_LD
+ while (envp[i] && (strncmp(envp[i], "LD", 2) == 0)) {
+#ifdef ENVDEBUG
+ ErrorF("CheckUserParameters: removing %s from the "
+ "environment\n", strtok(envp[i], "="));
+#endif
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j+1];
+ }
+ }
+#endif
+ if (envp[i] && (strlen(envp[i]) > MAX_ENV_LENGTH)) {
+#if REMOVE_LONG_ENV
+#ifdef ENVDEBUG
+ ErrorF("CheckUserParameters: removing %s from the "
+ "environment\n", strtok(envp[i], "="));
+#endif
+ for (j = i; envp[j]; j++) {
+ envp[j] = envp[j+1];
+ }
+ i--;
+#else
+ char *eq;
+ int len;
+
+ eq = strchr(envp[i], '=');
+ if (!eq)
+ continue;
+ len = eq - envp[i];
+ e = malloc(len + 1);
+ if (!e) {
+ bad = InternalError;
+ break;
+ }
+ strncpy(e, envp[i], len);
+ e[len] = 0;
+ if (len >= 4 &&
+ (strcmp(e + len - 4, "PATH") == 0 ||
+ strcmp(e, "TERMCAP") == 0)) {
+ if (strlen(envp[i]) > MAX_ENV_PATH_LENGTH) {
+ bad = EnvTooLong;
+ break;
+ } else {
+ free(e);
+ }
+ } else {
+ bad = EnvTooLong;
+ break;
+ }
+#endif
+ }
+ }
+ }
+#if NO_OUTPUT_PIPES
+ if (!bad) {
+ struct stat buf;
+
+ if (fstat(fileno(stdout), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ if (fstat(fileno(stderr), &buf) == 0 && S_ISFIFO(buf.st_mode))
+ bad = OutputIsPipe;
+ }
+#endif
+ }
+ switch (bad) {
+ case NotBad:
+ return;
+ case UnsafeArg:
+ ErrorF("Command line argument number %d is unsafe\n", i);
+ ErrorF(ARGMSG);
+ break;
+ case ArgTooLong:
+ ErrorF("Command line argument number %d is too long\n", i);
+ ErrorF(ARGMSG);
+ break;
+ case UnprintableArg:
+ ErrorF("Command line argument number %d contains unprintable"
+ " characters\n", i);
+ ErrorF(ARGMSG);
+ break;
+ case EnvTooLong:
+ ErrorF("Environment variable `%s' is too long\n", e);
+ ErrorF(ENVMSG);
+ break;
+ case OutputIsPipe:
+ ErrorF("Stdout and/or stderr is a pipe\n");
+ break;
+ case InternalError:
+ ErrorF("Internal Error\n");
+ break;
+ default:
+ ErrorF("Unknown error\n");
+ ErrorF(ARGMSG);
+ ErrorF(ENVMSG);
+ break;
+ }
+ FatalError("X server aborted because of unsafe environment\n");
+}
+
+/*
+ * CheckUserAuthorization: check if the user is allowed to start the
+ * X server. This usually means some sort of PAM checking, and it is
+ * usually only done for setuid servers (uid != euid).
+ */
+
+#ifdef USE_PAM
+#include <security/pam_appl.h>
+#include <security/pam_misc.h>
+#include <pwd.h>
+#endif /* USE_PAM */
+
+void
+CheckUserAuthorization()
+{
+#ifdef USE_PAM
+ static struct pam_conv conv = {
+ misc_conv,
+ NULL
+ };
+
+ pam_handle_t *pamh = NULL;
+ struct passwd *pw;
+ int retval;
+
+ if (getuid() != geteuid()) {
+ pw = getpwuid(getuid());
+ if (pw == NULL)
+ FatalError("getpwuid() failed for uid %d\n", getuid());
+
+ retval = pam_start("xserver", pw->pw_name, &conv, &pamh);
+ if (retval != PAM_SUCCESS)
+ FatalError("pam_start() failed.\n"
+ "\tMissing or mangled PAM config file or module?\n");
+
+ retval = pam_authenticate(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ retval = pam_acct_mgmt(pamh, 0);
+ if (retval != PAM_SUCCESS) {
+ pam_end(pamh, retval);
+ FatalError("PAM authentication failed, cannot start X server.\n"
+ "\tPerhaps you do not have console ownership?\n");
+ }
+
+ /* this is not a session, so do not do session management */
+ pam_end(pamh, PAM_SUCCESS);
+ }
#endif
}
diff --git a/os/xdmauth.c b/os/xdmauth.c
index d6abd6a14..eb1385408 100644
--- a/os/xdmauth.c
+++ b/os/xdmauth.c
@@ -26,6 +26,7 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/programs/Xserver/os/xdmauth.c,v 1.7 2002/11/05 05:50:34 keithp Exp $ */
/*
* XDM-AUTHENTICATION-1 (XDMCP authentication) and
@@ -348,6 +349,7 @@ XID id;
switch (data_length)
{
case 16: /* auth from files is 16 bytes long */
+#ifdef XDMCP
if (authFromXDMCP)
{
/* R5 xdm sent bogus authorization data in the accept packet,
@@ -357,15 +359,18 @@ XID id;
key_bits[0] = '\0';
}
else
+#endif
{
rho_bits = (unsigned char *) data;
key_bits = (unsigned char *) (data + 8);
}
break;
+#ifdef XDMCP
case 8: /* auth from XDMCP is 8 bytes long */
rho_bits = rho.data;
key_bits = (unsigned char *) data;
break;
+#endif
default:
return 0;
}
@@ -415,7 +420,7 @@ XdmCheckCookie (cookie_length, cookie, xclient, reason)
}
int
-XdmResetCookie ()
+XdmResetCookie (void)
{
XdmAuthorizationPtr auth, next_auth;
XdmClientAuthPtr client, next_client;
@@ -493,10 +498,12 @@ char *data;
rho_bits = (XdmAuthKeyPtr) data;
key_bits = (XdmAuthKeyPtr) (data + 8);
break;
+#ifdef XDMCP
case 8:
rho_bits = &rho;
key_bits = (XdmAuthKeyPtr) data;
break;
+#endif
default:
return 0;
}
diff --git a/os/xdmcp.c b/os/xdmcp.c
index 6d683b66d..b6a5db35f 100644
--- a/os/xdmcp.c
+++ b/os/xdmcp.c
@@ -13,6 +13,7 @@
* without express or implied warranty.
*
*/
+/* $XFree86: xc/programs/Xserver/os/xdmcp.c,v 3.21 2002/03/11 16:22:28 keithp Exp $ */
#ifdef WIN32
/* avoid conflicting definitions */
@@ -27,13 +28,20 @@
#undef RT_FONT
#undef RT_CURSOR
#endif
+
#include "Xos.h"
-#ifndef WIN32
+
+#if !defined(WIN32)
+#ifndef Lynx
#include <sys/param.h>
#include <sys/socket.h>
+#else
+#include <socket.h>
+#endif
#include <netinet/in.h>
#include <netdb.h>
#endif
+
#include <stdio.h>
#include "X.h"
#include "Xmd.h"
@@ -44,6 +52,11 @@
#include "dixstruct.h"
#include "opaque.h"
+#if defined(DGUX)
+#include <net/net_ioctl.h>
+#include <sys/ioctl.h>
+#endif
+
#ifdef STREAMSCONN
#include <tiuser.h>
#include <netconfig.h>
@@ -52,14 +65,11 @@
#ifdef XDMCP
#undef REQUEST
-#include "Xdmcp.h"
+#include <X11/Xdmcp.h>
#define X_INCLUDE_NETDB_H
#include <X11/Xos_r.h>
-extern char *display;
-extern fd_set EnabledDevices;
-extern fd_set AllClients;
extern char *defaultDisplayClass;
static int xdmcpSocket, sessionSocket;
@@ -80,6 +90,19 @@ static char *xdmAuthCookie;
static XdmcpBuffer buffer;
static struct sockaddr_in ManagerAddress;
+static struct sockaddr_in FromAddress;
+
+static void XdmcpAddHost(
+ struct sockaddr_in *from,
+ int fromlen,
+ ARRAY8Ptr AuthenticationName,
+ ARRAY8Ptr hostname,
+ ARRAY8Ptr status);
+
+static void XdmcpSelectHost(
+ struct sockaddr_in *host_sockaddr,
+ int host_len,
+ ARRAY8Ptr AuthenticationName);
static void get_xdmcp_sock(
#if NeedFunctionPrototypes
@@ -149,20 +172,20 @@ static void recv_alive_msg(
#endif
);
-static XdmcpFatal(
+static void XdmcpFatal(
#if NeedFunctionPrototypes
char */*type*/,
ARRAY8Ptr /*status*/
#endif
);
-static XdmcpWarning(
+static void XdmcpWarning(
#if NeedFunctionPrototypes
char */*str*/
#endif
);
-static get_manager_by_name(
+static void get_manager_by_name(
#if NeedFunctionPrototypes
int /*argc*/,
char **/*argv*/,
@@ -170,19 +193,21 @@ static get_manager_by_name(
#endif
);
+static void get_fromaddr_by_name(int /*argc*/, char **/*argv*/, int /*i*/);
+
static void receive_packet(
#if NeedFunctionPrototypes
void
#endif
);
-static send_packet(
+static void send_packet(
#if NeedFunctionPrototypes
void
#endif
);
-extern int XdmcpDeadSession(
+extern void XdmcpDeadSession(
#if NeedFunctionPrototypes
char */*reason*/
#endif
@@ -194,7 +219,7 @@ static void timeout(
#endif
);
-static restart(
+static void restart(
#if NeedFunctionPrototypes
void
#endif
@@ -223,15 +248,19 @@ void XdmcpRegisterManufacturerDisplayID(
#endif
);
+
static short xdm_udp_port = XDM_UDP_PORT;
static Bool OneSession = FALSE;
+static const char *xdm_from = NULL;
-XdmcpUseMsg ()
+void
+XdmcpUseMsg (void)
{
ErrorF("-query host-name contact named host for XDMCP\n");
ErrorF("-broadcast broadcast for XDMCP\n");
ErrorF("-indirect host-name contact named host for indirect XDMCP\n");
ErrorF("-port port-num UDP port number to send messages to\n");
+ ErrorF("-from local-address specify the local address to connect from\n");
ErrorF("-once Terminate server after one session\n");
ErrorF("-class display-class specify display class to send in manage\n");
#ifdef HASXDMAUTH
@@ -241,9 +270,7 @@ XdmcpUseMsg ()
}
int
-XdmcpOptions(argc, argv, i)
- int argc, i;
- char **argv;
+XdmcpOptions(int argc, char **argv, int i)
{
if (strcmp(argv[i], "-query") == 0) {
get_manager_by_name(argc, argv, ++i);
@@ -263,28 +290,44 @@ XdmcpOptions(argc, argv, i)
return (i + 1);
}
if (strcmp(argv[i], "-port") == 0) {
- ++i;
+ if (++i == argc) {
+ ErrorF("Xserver: missing port number in command line\n");
+ exit(1);
+ }
xdm_udp_port = atoi(argv[i]);
return (i + 1);
}
+ if (strcmp(argv[i], "-from") == 0) {
+ get_fromaddr_by_name(argc, argv, ++i);
+ return (i + 1);
+ }
if (strcmp(argv[i], "-once") == 0) {
OneSession = TRUE;
return (i + 1);
}
if (strcmp(argv[i], "-class") == 0) {
- ++i;
+ if (++i == argc) {
+ ErrorF("Xserver: missing class name in command line\n");
+ exit(1);
+ }
defaultDisplayClass = argv[i];
return (i + 1);
}
#ifdef HASXDMAUTH
if (strcmp(argv[i], "-cookie") == 0) {
- ++i;
+ if (++i == argc) {
+ ErrorF("Xserver: missing cookie data in command line\n");
+ exit(1);
+ }
xdmAuthCookie = argv[i];
return (i + 1);
}
#endif
if (strcmp(argv[i], "-displayID") == 0) {
- ++i;
+ if (++i == argc) {
+ ErrorF("Xserver: missing displayID in command line\n");
+ exit(1);
+ }
XdmcpRegisterManufacturerDisplayID (argv[i], strlen (argv[i]));
return (i + 1);
}
@@ -309,8 +352,7 @@ static struct sockaddr_in BroadcastAddresses[MAX_BROADCAST];
static int NumBroadcastAddresses;
void
-XdmcpRegisterBroadcastAddress (addr)
- struct sockaddr_in *addr;
+XdmcpRegisterBroadcastAddress (struct sockaddr_in *addr)
{
struct sockaddr_in *bcast;
if (NumBroadcastAddresses >= MAX_BROADCAST)
@@ -333,22 +375,22 @@ XdmcpRegisterBroadcastAddress (addr)
static ARRAYofARRAY8 AuthenticationNames, AuthenticationDatas;
typedef struct _AuthenticationFuncs {
- Bool (*Validator)();
- Bool (*Generator)();
- Bool (*AddAuth)();
+ ValidatorFunc Validator;
+ GeneratorFunc Generator;
+ AddAuthorFunc AddAuth;
} AuthenticationFuncsRec, *AuthenticationFuncsPtr;
static AuthenticationFuncsPtr AuthenticationFuncsList;
void
-XdmcpRegisterAuthentication (name, namelen, data, datalen, Validator, Generator, AddAuth)
- char *name;
- int namelen;
- char *data;
- int datalen;
- Bool (*Validator)();
- Bool (*Generator)();
- Bool (*AddAuth)();
+XdmcpRegisterAuthentication (
+ char *name,
+ int namelen,
+ char *data,
+ int datalen,
+ ValidatorFunc Validator,
+ GeneratorFunc Generator,
+ AddAuthorFunc AddAuth)
{
int i;
ARRAY8 AuthenticationName, AuthenticationData;
@@ -399,8 +441,7 @@ ARRAY8Ptr AuthenticationData = &noAuthenticationData;
AuthenticationFuncsPtr AuthenticationFuncs;
void
-XdmcpSetAuthentication (name)
- ARRAY8Ptr name;
+XdmcpSetAuthentication (ARRAY8Ptr name)
{
int i;
@@ -423,10 +464,10 @@ static ARRAYofARRAY8 ConnectionAddresses;
static long xdmcpGeneration;
void
-XdmcpRegisterConnection (type, address, addrlen)
- int type;
- char *address;
- int addrlen;
+XdmcpRegisterConnection (
+ int type,
+ char *address,
+ int addrlen)
{
int i;
CARD8 *newAddress;
@@ -437,6 +478,13 @@ XdmcpRegisterConnection (type, address, addrlen)
XdmcpDisposeARRAYofARRAY8 (&ConnectionAddresses);
xdmcpGeneration = serverGeneration;
}
+ if (addrlen == sizeof(struct in_addr) && xdm_from != NULL)
+ {
+ /* Only register the requested address */
+ if (memcmp(address, &FromAddress.sin_addr, addrlen) != 0) {
+ return;
+ }
+ }
newAddress = (CARD8 *) xalloc (addrlen * sizeof (CARD8));
if (!newAddress)
return;
@@ -466,16 +514,14 @@ XdmcpRegisterConnection (type, address, addrlen)
static ARRAYofARRAY8 AuthorizationNames;
void
-XdmcpRegisterAuthorizations ()
+XdmcpRegisterAuthorizations (void)
{
XdmcpDisposeARRAYofARRAY8 (&AuthorizationNames);
RegisterAuthorizations ();
}
void
-XdmcpRegisterAuthorization (name, namelen)
- char *name;
- int namelen;
+XdmcpRegisterAuthorization (char *name, int namelen)
{
ARRAY8 authName;
int i;
@@ -501,9 +547,7 @@ XdmcpRegisterAuthorization (name, namelen)
ARRAY8 DisplayClass;
void
-XdmcpRegisterDisplayClass (name, length)
- char *name;
- int length;
+XdmcpRegisterDisplayClass (char *name, int length)
{
int i;
@@ -521,9 +565,7 @@ XdmcpRegisterDisplayClass (name, length)
ARRAY8 ManufacturerDisplayID;
void
-XdmcpRegisterManufacturerDisplayID (name, length)
- char *name;
- int length;
+XdmcpRegisterManufacturerDisplayID (char *name, int length)
{
int i;
@@ -540,7 +582,7 @@ XdmcpRegisterManufacturerDisplayID (name, length)
*/
void
-XdmcpInit()
+XdmcpInit(void)
{
state = XDM_INIT_STATE;
#ifdef HASXDMAUTH
@@ -562,7 +604,7 @@ XdmcpInit()
}
void
-XdmcpReset ()
+XdmcpReset (void)
{
state = XDM_INIT_STATE;
if (state != XDM_OFF)
@@ -581,8 +623,7 @@ XdmcpReset ()
*/
void
-XdmcpOpenDisplay(sock)
- int sock;
+XdmcpOpenDisplay(int sock)
{
if (state != XDM_AWAIT_MANAGE_RESPONSE)
return;
@@ -591,8 +632,7 @@ XdmcpOpenDisplay(sock)
}
void
-XdmcpCloseDisplay(sock)
- int sock;
+XdmcpCloseDisplay(int sock)
{
if ((state != XDM_RUN_SESSION && state != XDM_AWAIT_ALIVE_RESPONSE)
|| sessionSocket != sock)
@@ -614,40 +654,23 @@ XdmcpCloseDisplay(sock)
/*ARGSUSED*/
static void
-XdmcpBlockHandler(data, wt, pReadmask)
- pointer data; /* unused */
- struct timeval **wt;
- pointer pReadmask;
+XdmcpBlockHandler(
+ pointer data, /* unused */
+ struct timeval **wt,
+ pointer pReadmask)
{
fd_set *LastSelectMask = (fd_set*)pReadmask;
- CARD32 millisToGo, wtMillis;
- static struct timeval waittime;
+ CARD32 millisToGo;
if (state == XDM_OFF)
return;
FD_SET(xdmcpSocket, LastSelectMask);
if (timeOutTime == 0)
return;
- millisToGo = GetTimeInMillis();
- if (millisToGo < timeOutTime)
- millisToGo = timeOutTime - millisToGo;
- else
+ millisToGo = timeOutTime - GetTimeInMillis();
+ if ((int) millisToGo < 0)
millisToGo = 0;
- if (*wt == NULL)
- {
- waittime.tv_sec = (millisToGo) / 1000;
- waittime.tv_usec = 1000 * (millisToGo % 1000);
- *wt = &waittime;
- }
- else
- {
- wtMillis = (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000;
- if (millisToGo < wtMillis)
- {
- (*wt)->tv_sec = (millisToGo) / 1000;
- (*wt)->tv_usec = 1000 * (millisToGo % 1000);
- }
- }
+ AdjustWaitForDelay (wt, millisToGo);
}
/*
@@ -658,10 +681,10 @@ XdmcpBlockHandler(data, wt, pReadmask)
/*ARGSUSED*/
static void
-XdmcpWakeupHandler(data, i, pReadmask)
- pointer data; /* unused */
- int i;
- pointer pReadmask;
+XdmcpWakeupHandler(
+ pointer data, /* unused */
+ int i,
+ pointer pReadmask)
{
fd_set* LastSelectMask = (fd_set*)pReadmask;
fd_set devicesReadable;
@@ -686,7 +709,7 @@ XdmcpWakeupHandler(data, i, pReadmask)
if (XFD_ANYSET(&AllClients) && state == XDM_RUN_SESSION)
timeOutTime = GetTimeInMillis() + keepaliveDormancy * 1000;
}
- else if (timeOutTime && GetTimeInMillis() >= timeOutTime)
+ else if (timeOutTime && (int) (GetTimeInMillis() - timeOutTime) >= 0)
{
if (state == XDM_RUN_SESSION)
{
@@ -703,10 +726,11 @@ XdmcpWakeupHandler(data, i, pReadmask)
* user's host menu when the user selects a host
*/
-XdmcpSelectHost(host_sockaddr, host_len, AuthenticationName)
- struct sockaddr_in *host_sockaddr;
- int host_len;
- ARRAY8Ptr AuthenticationName;
+static void
+XdmcpSelectHost(
+ struct sockaddr_in *host_sockaddr,
+ int host_len,
+ ARRAY8Ptr AuthenticationName)
{
state = XDM_START_CONNECTION;
memmove(&req_sockaddr, host_sockaddr, host_len);
@@ -722,9 +746,13 @@ XdmcpSelectHost(host_sockaddr, host_len, AuthenticationName)
*/
/*ARGSUSED*/
-XdmcpAddHost(from, fromlen, AuthenticationName, hostname, status)
- struct sockaddr_in *from;
- ARRAY8Ptr AuthenticationName, hostname, status;
+static void
+XdmcpAddHost(
+ struct sockaddr_in *from,
+ int fromlen,
+ ARRAY8Ptr AuthenticationName,
+ ARRAY8Ptr hostname,
+ ARRAY8Ptr status)
{
XdmcpSelectHost(from, fromlen, AuthenticationName);
}
@@ -737,14 +765,14 @@ XdmcpAddHost(from, fromlen, AuthenticationName, hostname, status)
ARRAY8 UnwillingMessage = { (CARD8) 14, (CARD8 *) "Host unwilling" };
static void
-receive_packet()
+receive_packet(void)
{
struct sockaddr_in from;
int fromlen = sizeof(struct sockaddr_in);
XdmcpHeader header;
/* read message off socket */
- if (!XdmcpFill (xdmcpSocket, &buffer, (struct sockaddr *) &from, &fromlen))
+ if (!XdmcpFill (xdmcpSocket, &buffer, (XdmcpNetaddr) &from, &fromlen))
return;
/* reset retransmission backoff */
@@ -785,8 +813,8 @@ receive_packet()
* send the appropriate message given the current state
*/
-static
-send_packet()
+static void
+send_packet(void)
{
int rtx;
switch (state) {
@@ -804,6 +832,8 @@ send_packet()
case XDM_KEEPALIVE:
send_keepalive_msg();
break;
+ default:
+ break;
}
rtx = (XDM_MIN_RTX << timeOutRtx);
if (rtx > XDM_MAX_RTX)
@@ -816,8 +846,8 @@ send_packet()
* timeouts, or Keepalive failure.
*/
-XdmcpDeadSession (reason)
- char *reason;
+void
+XdmcpDeadSession (char *reason)
{
ErrorF ("XDM: %s, declaring session dead\n", reason);
state = XDM_INIT_STATE;
@@ -833,7 +863,7 @@ XdmcpDeadSession (reason)
*/
static void
-timeout()
+timeout(void)
{
timeOutRtx++;
if (state == XDM_AWAIT_ALIVE_RESPONSE && timeOutRtx >= XDM_KA_RTX_LIMIT )
@@ -869,31 +899,37 @@ timeout()
case XDM_AWAIT_ALIVE_RESPONSE:
state = XDM_KEEPALIVE;
break;
+ default:
+ break;
}
send_packet();
}
-static
-restart()
+static void
+restart(void)
{
state = XDM_INIT_STATE;
timeOutRtx = 0;
send_packet();
}
-XdmcpCheckAuthentication (Name, Data, packet_type)
- ARRAY8Ptr Name, Data;
- int packet_type;
+int
+XdmcpCheckAuthentication (
+ ARRAY8Ptr Name,
+ ARRAY8Ptr Data,
+ int packet_type)
{
return (XdmcpARRAY8Equal (Name, AuthenticationName) &&
(AuthenticationName->length == 0 ||
(*AuthenticationFuncs->Validator) (AuthenticationData, Data, packet_type)));
}
-XdmcpAddAuthorization (name, data)
- ARRAY8Ptr name, data;
+int
+XdmcpAddAuthorization (
+ ARRAY8Ptr name,
+ ARRAY8Ptr data)
{
- Bool (*AddAuth)(), AddAuthorization();
+ AddAuthorFunc AddAuth;
if (AuthenticationFuncs && AuthenticationFuncs->AddAuth)
AddAuth = AuthenticationFuncs->AddAuth;
@@ -911,10 +947,8 @@ XdmcpAddAuthorization (name, data)
*/
static void
-get_xdmcp_sock()
+get_xdmcp_sock(void)
{
- int soopts = 1;
-
#ifdef STREAMSCONN
struct netconfig *nconf;
@@ -952,6 +986,8 @@ get_xdmcp_sock()
freenetconfigent(nconf);
#else
+ int soopts = 1;
+
if ((xdmcpSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
XdmcpWarning("UDP socket creation failed");
#ifdef SO_BROADCAST
@@ -959,11 +995,18 @@ get_xdmcp_sock()
sizeof(soopts)) < 0)
XdmcpWarning("UDP set broadcast socket-option failed");
#endif /* SO_BROADCAST */
+ if (xdmcpSocket >= 0 && xdm_from != NULL) {
+ if (bind(xdmcpSocket, (struct sockaddr *)&FromAddress,
+ sizeof(FromAddress)) < 0) {
+ ErrorF("Xserver: failed to bind to -from address: %s\n", xdm_from);
+ exit(1);
+ }
+ }
#endif /* STREAMSCONN */
}
static void
-send_query_msg()
+send_query_msg(void)
{
XdmcpHeader header;
Bool broadcast = FALSE;
@@ -984,6 +1027,8 @@ send_query_msg()
header.opcode = (CARD16) INDIRECT_QUERY;
state = XDM_COLLECT_INDIRECT_QUERY;
break;
+ default:
+ break;
}
header.length = 1;
for (i = 0; i < AuthenticationNames.length; i++)
@@ -996,21 +1041,21 @@ send_query_msg()
int i;
for (i = 0; i < NumBroadcastAddresses; i++)
- XdmcpFlush (xdmcpSocket, &buffer, &BroadcastAddresses[i],
+ XdmcpFlush (xdmcpSocket, &buffer, (XdmcpNetaddr) &BroadcastAddresses[i],
sizeof (struct sockaddr_in));
}
else
{
- XdmcpFlush (xdmcpSocket, &buffer, &ManagerAddress,
+ XdmcpFlush (xdmcpSocket, &buffer, (XdmcpNetaddr) &ManagerAddress,
sizeof (ManagerAddress));
}
}
static void
-recv_willing_msg(from, fromlen, length)
- struct sockaddr_in *from;
- int fromlen;
- unsigned length;
+recv_willing_msg(
+ struct sockaddr_in *from,
+ int fromlen,
+ unsigned length)
{
ARRAY8 authenticationName;
ARRAY8 hostname;
@@ -1035,6 +1080,8 @@ recv_willing_msg(from, fromlen, length)
case XDM_COLLECT_INDIRECT_QUERY:
XdmcpAddHost(from, fromlen, &authenticationName, &hostname, &status);
break;
+ default:
+ break;
}
}
}
@@ -1044,7 +1091,7 @@ recv_willing_msg(from, fromlen, length)
}
static void
-send_request_msg()
+send_request_msg(void)
{
XdmcpHeader header;
int length;
@@ -1089,13 +1136,12 @@ send_request_msg()
XdmcpDisposeARRAY8 (&authenticationData);
XdmcpWriteARRAYofARRAY8 (&buffer, &AuthorizationNames);
XdmcpWriteARRAY8 (&buffer, &ManufacturerDisplayID);
- if (XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen))
+ if (XdmcpFlush (xdmcpSocket, &buffer, (XdmcpNetaddr) &req_sockaddr, req_socklen))
state = XDM_AWAIT_REQUEST_RESPONSE;
}
static void
-recv_accept_msg(length)
- unsigned length;
+recv_accept_msg(unsigned length)
{
CARD32 AcceptSessionID;
ARRAY8 AcceptAuthenticationName, AcceptAuthenticationData;
@@ -1145,8 +1191,7 @@ recv_accept_msg(length)
}
static void
-recv_decline_msg(length)
- unsigned length;
+recv_decline_msg(unsigned length)
{
ARRAY8 status, DeclineAuthenticationName, DeclineAuthenticationData;
@@ -1172,7 +1217,7 @@ recv_decline_msg(length)
}
static void
-send_manage_msg()
+send_manage_msg(void)
{
XdmcpHeader header;
@@ -1186,12 +1231,11 @@ send_manage_msg()
XdmcpWriteCARD16 (&buffer, DisplayNumber);
XdmcpWriteARRAY8 (&buffer, &DisplayClass);
state = XDM_AWAIT_MANAGE_RESPONSE;
- XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen);
+ XdmcpFlush (xdmcpSocket, &buffer, (XdmcpNetaddr) &req_sockaddr, req_socklen);
}
static void
-recv_refuse_msg(length)
- unsigned length;
+recv_refuse_msg(unsigned length)
{
CARD32 RefusedSessionID;
@@ -1210,8 +1254,7 @@ recv_refuse_msg(length)
}
static void
-recv_failed_msg(length)
- unsigned length;
+recv_failed_msg(unsigned length)
{
CARD32 FailedSessionID;
ARRAY8 status;
@@ -1232,7 +1275,7 @@ recv_failed_msg(length)
}
static void
-send_keepalive_msg()
+send_keepalive_msg(void)
{
XdmcpHeader header;
@@ -1245,16 +1288,14 @@ send_keepalive_msg()
XdmcpWriteCARD32 (&buffer, SessionID);
state = XDM_AWAIT_ALIVE_RESPONSE;
- XdmcpFlush (xdmcpSocket, &buffer, &req_sockaddr, req_socklen);
+ XdmcpFlush (xdmcpSocket, &buffer, (XdmcpNetaddr) &req_sockaddr, req_socklen);
}
static void
-recv_alive_msg (length)
- unsigned length;
+recv_alive_msg (unsigned length)
{
CARD8 SessionRunning;
CARD32 AliveSessionID;
- int dormancy;
if (state != XDM_AWAIT_ALIVE_RESPONSE)
return;
@@ -1283,33 +1324,31 @@ recv_alive_msg (length)
}
}
-static
-XdmcpFatal (type, status)
- char *type;
- ARRAY8Ptr status;
+static void
+XdmcpFatal (
+ char *type,
+ ARRAY8Ptr status)
{
- extern void AbortDDX();
-
- ErrorF ("XDMCP fatal error: %s %*.*s\n", type,
+ FatalError ("XDMCP fatal error: %s %*.*s\n", type,
status->length, status->length, status->data);
- AbortDDX ();
- exit (1);
}
-static
-XdmcpWarning(str)
- char *str;
+static void
+XdmcpWarning(char *str)
{
ErrorF("XDMCP warning: %s\n", str);
}
-static
-get_manager_by_name(argc, argv, i)
- int argc, i;
- char **argv;
+static void
+get_manager_by_name(
+ int argc,
+ char **argv,
+ int i)
{
struct hostent *hep;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams;
+#endif
if (i == argc)
{
@@ -1336,6 +1375,46 @@ get_manager_by_name(argc, argv, i)
exit (1);
}
}
+
+static void
+get_fromaddr_by_name(
+ int argc,
+ char **argv,
+ int i)
+{
+ struct hostent *hep;
+#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
+ _Xgethostbynameparams hparams;
+#endif
+
+ if (i == argc)
+ {
+ ErrorF("Xserver: missing -from host name in command line\n");
+ exit(1);
+ }
+ if (!(hep = _XGethostbyname(argv[i], hparams)))
+ {
+ ErrorF("Xserver: unknown host: %s\n", argv[i]);
+ exit(1);
+ }
+ if (hep->h_length == sizeof (struct in_addr))
+ {
+ memset(&FromAddress, 0, sizeof(FromAddress));
+ memmove(&FromAddress.sin_addr, hep->h_addr, hep->h_length);
+#ifdef BSD44SOCKETS
+ FromAddress.sin_len = sizeof(FromAddress);
+#endif
+ FromAddress.sin_family = AF_INET;
+ FromAddress.sin_port = 0;
+ }
+ else
+ {
+ ErrorF ("Xserver: -from host on strange network %s\n", argv[i]);
+ exit (1);
+ }
+ xdm_from = argv[i];
+}
+
#else
static int xdmcp_non_empty; /* avoid complaint by ranlib */
#endif /* XDMCP */