#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <fcntl.h> #include <time.h> #ifdef DOS #include <alloc.h> #endif #ifdef UNIX #include <sys/ioctl.h> #include <sys/lock.h> #else #ifdef DOS #include <dos.h> #include <process.h> #endif #endif #include "struct.h" #include <setjmp.h> jmp_buf errjmp; /* * main driver loop */ void Time_Alert() { log_error("Watchdog timer alert\n"); panic(); } void End_Limit() { #ifdef SIGALRM alarm(0); #endif } void Allow_Time(t) long t; { #ifdef SIGALRM signal(SIGALRM,Time_Alert); alarm(t); #endif } /* * It all starts here. */ short Booted=0; #ifdef DOS int #else void #endif main(argc,argv) int argc; char *argv[]; { int debug=0; long to,tc; int fh; #ifdef UNIX char *p; #endif /* * Lock ourselves away if the yama_lock is set and we are run * from inittab */ #ifdef UNIX while(getppid()==1&&access("/usr/sysdev/yama/YAMA/yama_lock",0)==0) sleep(120); if(getppid()==1) { close(0); close(1); close(2); setpgrp(getpid(),0); if(open("yboot_log",O_RDWR|O_APPEND)==-1) open("/dev/null",O_RDWR); dup(0); dup(0); } #endif /* * Init randoms and announce ourselves */ srand(getpid()); printf("YAMA 1.15, (c) 1990 Alan Cox.\n"); printf("\ This software is provided free and without any warranty implied or otherwise\n\ See the file 'LICENSE' for details.\n"); if(argv[1]&&strcmp(argv[1],"-d")==0) { debug=1; argv++; argc--; } else { #ifdef UNIX #ifdef SIGILL signal(SIGILL,GoSplat); #endif #ifdef SIGSEGV signal(SIGSEGV,GoSplat); #endif #ifdef SIGBUS signal(SIGBUS,GoSplat); #endif #ifdef SIGFPE signal(SIGFPE,GoSplat); /* dorks dividing by zero.. hardly floating point! */ #endif #endif } #ifdef SIGPIPE signal(SIGPIPE,SIG_IGN); /* We cause these */ #endif if(!argv[1]) { fprintf(stderr,"%s [-d] <DB_NAME>\n",argv[0]); exit(4); } /* * Load the game */ if(Load_Database(argv[1],debug)!=0) { printf("[EXIT]: Abandoning.\n"); exit(5); } /* * Commence IPC operations */ if(Bind_To_Server()==0) { fprintf(stderr,"Server not responding... exiting.\n"); exit(6); } /* * Get Real Time */ time(&tc); fprintf(stderr,"Booted System\nRunning pid=%d\n",getpid()); fflush(stderr); Booted=1; /* From now on we shove errors into runtime */ if(setjmp(errjmp)) { /* we come here after a panic, panic has decided whether to take a running jump.. we just do the work currently all we do is... */ ; } else { /* * Run an initial table 6 cycle */ Exec_Time_Event(); } /* * The main loop */ while(1) { time(&to); do { Allow_Time(60); /* If your machine stops dead at times you might want to up this */ Scan_Packets(); End_Limit(); time(&tc); } while(to==tc); if(UsersActive()>0) { Allow_Time(60); Exec_Time_Event(); End_Limit(); } } }