#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "FS.h"
#include "FSproto.h"
#include "clientstr.h"
#include "fsresource.h"
#include "misc.h"
#include "globals.h"
#include "servermd.h"
#include "cache.h"
#include "site.h"
#include "dispatch.h"
#include "extentst.h"
#include "difs.h"
char *ConnectionInfo;
int ConnInfoLen;
Cache serverCache;
#ifndef DEFAULT_CONFIG_FILE
#define DEFAULT_CONFIG_FILE "/usr/lib/X11/fs/config"
#endif
#define SERVER_CACHE_SIZE 10000
static Bool create_connection_block(void);
char *configfilename;
extern Bool drone_server;
extern OldListenRec *OldListen;
extern int OldListenCount;
int
main(int argc, char *argv[])
{
int i, oldumask;
argcGlobal = argc;
argvGlobal = argv;
configfilename = DEFAULT_CONFIG_FILE;
ProcessCmdLine(argc, argv);
InitErrors();
if (ReadConfigFile(configfilename) != FSSuccess) {
FatalError("couldn't read config file\n");
}
if (((oldumask = umask(022)) & 002) == 002)
(void)umask(oldumask);
SetDaemonState();
SetUserId();
while (1) {
serverGeneration++;
OsInit();
if (serverGeneration == 1) {
serverCache = CacheInit(SERVER_CACHE_SIZE);
CreateSockets(OldListenCount, OldListen);
InitProcVectors();
clients = (ClientPtr *) fsalloc(MAXCLIENTS * sizeof(ClientPtr));
if (!clients)
FatalError("couldn't create client array\n");
for (i = MINCLIENT; i < MAXCLIENTS; i++)
clients[i] = NullClient;
serverClient = (ClientPtr) fsalloc(sizeof(ClientRec));
if (!serverClient)
FatalError("couldn't create server client\n");
}
ResetSockets();
InitClient(serverClient, SERVER_CLIENT, (pointer) 0);
clients[SERVER_CLIENT] = serverClient;
currentMaxClients = MINCLIENT;
currentClient = serverClient;
if (!InitClientResources(serverClient))
FatalError("couldn't init server resources\n");
InitExtensions();
InitAtoms();
InitFonts();
SetConfigValues();
if (!create_connection_block())
FatalError("couldn't create connection block\n");
#ifdef DEBUG
fprintf(stderr, "Entering Dispatch loop\n");
#endif
Dispatch();
#ifdef DEBUG
fprintf(stderr, "Leaving Dispatch loop\n");
#endif
CacheReset();
CloseDownExtensions();
if ((dispatchException & DE_TERMINATE) || drone_server)
break;
fsfree(ConnectionInfo);
if (ReadConfigFile(configfilename) != FSSuccess)
FatalError("couldn't read config file\n");
}
CloseSockets();
CloseErrors();
exit(0);
}
int
NotImplemented(void)
{
NoopDDA();
ErrorF("not implemented\n");
return (FSBadImplementation);
}
static Bool
create_connection_block(void)
{
fsConnSetupAccept setup;
char *pBuf;
setup.release_number = VENDOR_RELEASE;
setup.vendor_len = strlen(VENDOR_STRING);
setup.max_request_len = MAX_REQUEST_SIZE;
setup.length = (SIZEOF(fsConnSetupAccept) + setup.vendor_len + 3) >> 2;
ConnInfoLen = SIZEOF(fsConnSetupAccept) + ((setup.vendor_len + 3) & ~3);
ConnectionInfo = (char *) fsalloc(ConnInfoLen);
if (!ConnectionInfo)
return FALSE;
memmove( ConnectionInfo, (char *) &setup, SIZEOF(fsConnSetupAccept));
pBuf = ConnectionInfo + SIZEOF(fsConnSetupAccept);
memmove( pBuf, VENDOR_STRING, (int) setup.vendor_len);
return TRUE;
}