main.c 2.45 KB
/*
 * main.c: driver daemon startup.
 *
 * Copyright 1995, Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
 * the contents of this file may not be disclosed to third parties, copied or
 * duplicated in any form, in whole or in part, without the prior written
 * permission of Silicon Graphics, Inc.
 *
 * RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to restrictions
 * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
 * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
 * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
 * rights reserved under the Copyright Laws of the United States.
 *
 * $Revision: 1.1.1.1 $
 */

#include <sys/file.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <bstring.h>
#include <string.h>

#include "driverd.h"
#include "utils.h"

#define DEFAULT_TIMEOUT		60	/* seconds */

static void RunOnce(void);
ClientPtr *clients;
ClientPtr  serverClient;

extern int  currentMaxClients;   /* current size of clients array */
extern long MaxClients;

char *daemon = "0";
int verbose_flag = 0;

void
ErrorF(char *s) {
    fprintf(stderr, "Driverd: %s", s);
}

void
FatalError(char *s) {
    fprintf(stderr, "Driverd: %s", s);
    exit(1);
}

void
Trace(char *s) {
    if (verbose_flag)
	fprintf(stderr, "Driverd Trace: %s", s);
}

/*
 * Check to see if the driver daemon is already running; if not, lock the
 * executable.
 */
static void
RunOnce()
{
    char driverdfile[64];
    int fd, ret;

    sprintf(driverdfile, "%s/usr/etc/driverd", getenv("ROOT"));
    fd  = open(driverdfile, O_RDONLY);
    if (fd == -1)
	return;

    ret = flock(fd, LOCK_EX|LOCK_NB);
    if (ret == -1)
	FatalError("driverd is already running\n");
}

main(int argc, char *argv[])
{
    int	i;

    if (argc != 1)
	verbose_flag = 1;

    /*
     * important - don't leave core files in /, which is where we start
     * with inetd;
     */
    if (getuid() == 0)
	chdir("/usr/tmp");

    RunOnce();

    CreateWellKnownSockets();

    clients = (ClientPtr *)malloc(MAXCLIENTS * sizeof(ClientPtr));

    if (!clients)
	FatalError("couldn't create client pointer array");

    for (i = 0; i < MAXCLIENTS; i++) {
	clients[i] = NULL;
    }

    Dispatch();

    /* 
     * We should never return from Dispatch...
     */

    exit(0);
}