#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdio.h>
#include <X11/X.h>
#include "os.h"
#include "osdep.h"
#include <X11/Xos.h>
#ifdef SMART_SCHEDULE
#include "dixstruct.h"
#endif
#ifndef PATH_MAX
#ifdef MAXPATHLEN
#define PATH_MAX MAXPATHLEN
#else
#define PATH_MAX 1024
#endif
#endif
#if defined(Lynx) || defined(__SCO__)
#include <sys/wait.h>
#endif
#if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4)
#include <sys/resource.h>
#endif
#ifndef ADMPATH
#define ADMPATH "/usr/adm/X%smsgs"
#endif
extern char *display;
#ifdef RLIMIT_DATA
int limitDataSpace = -1;
#endif
#ifdef RLIMIT_STACK
int limitStackSpace = -1;
#endif
#ifdef RLIMIT_NOFILE
int limitNoFile = -1;
#endif
Bool OsDelayInitColors = FALSE;
void
OsInit(void)
{
static Bool been_here = FALSE;
static char* admpath = ADMPATH;
static char* devnull = "/dev/null";
char fname[PATH_MAX];
#ifdef macII
set42sig();
#endif
if (!been_here) {
#if !defined(__SCO__) && !defined(__CYGWIN__) && !defined(__UNIXWARE__)
fclose(stdin);
fclose(stdout);
#endif
if (write (2, fname, 0) == -1)
{
FILE *err;
if (strlen (display) + strlen (admpath) + 1 < sizeof fname)
sprintf (fname, admpath, display);
else
strcpy (fname, devnull);
if (!(err = fopen (fname, "a+")))
err = fopen (devnull, "w");
if (err && (fileno(err) != 2)) {
dup2 (fileno (err), 2);
fclose (err);
}
#if defined(SYSV) || defined(SVR4) || defined(__UNIXOS2__) || defined(WIN32) || defined(__CYGWIN__)
{
static char buf[BUFSIZ];
setvbuf (stderr, buf, _IOLBF, BUFSIZ);
}
#else
setlinebuf(stderr);
#endif
}
#ifndef X_NOT_POSIX
if (getpgrp () == 0)
setpgid (0, 0);
#else
#if !defined(SYSV) && !defined(WIN32)
if (getpgrp (0) == 0)
setpgrp (0, getpid ());
#endif
#endif
#ifdef RLIMIT_DATA
if (limitDataSpace >= 0)
{
struct rlimit rlim;
if (!getrlimit(RLIMIT_DATA, &rlim))
{
if ((limitDataSpace > 0) && (limitDataSpace < rlim.rlim_max))
rlim.rlim_cur = limitDataSpace;
else
rlim.rlim_cur = rlim.rlim_max;
(void)setrlimit(RLIMIT_DATA, &rlim);
}
}
#endif
#ifdef RLIMIT_STACK
if (limitStackSpace >= 0)
{
struct rlimit rlim;
if (!getrlimit(RLIMIT_STACK, &rlim))
{
if ((limitStackSpace > 0) && (limitStackSpace < rlim.rlim_max))
rlim.rlim_cur = limitStackSpace;
else
rlim.rlim_cur = rlim.rlim_max;
(void)setrlimit(RLIMIT_STACK, &rlim);
}
}
#endif
#ifdef RLIMIT_NOFILE
if (limitNoFile >= 0)
{
struct rlimit rlim;
if (!getrlimit(RLIMIT_NOFILE, &rlim))
{
if ((limitNoFile > 0) && (limitNoFile < rlim.rlim_max))
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
LogInit(NULL, NULL);
#ifdef SMART_SCHEDULE
if (!SmartScheduleDisable)
if (!SmartScheduleInit ())
SmartScheduleDisable = TRUE;
#endif
OsInitAllocator();
if (!OsDelayInitColors) OsInitColors();
}
void
OsCleanup(Bool terminating)
{
#ifdef SERVER_LOCK
if (terminating)
{
UnlockServer();
}
#endif
}