home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume4 / spacewar / part04 / sw.c < prev    next >
C/C++ Source or Header  |  1988-05-31  |  5KB  |  265 lines

  1. /*
  2.  * Spacewar - main for spacewar game
  3.  *
  4.  * Copyright 1984 obo Systems, Inc.
  5.  * Copyright 1984 Dan Rosenblatt
  6.  */
  7.  
  8. #include <signal.h>
  9. #include "spacewar.h"
  10.  
  11. int numpling;
  12.  
  13. #ifdef BSD
  14. #   include <sys/ioctl.h>
  15.     static int sigtrap,swlgnfd;
  16. #else /* VMS SYSIII SYSV */
  17. #ifdef VMS
  18. #    include <descrip.h>
  19. #    include <ssdef.h>
  20. #    include <psldef.h>
  21.     static $DESCRIPTOR(mlbx,SWCOMFILE);
  22.     extern short inmlbx;
  23. #else /* SYSIII SYSV */
  24. #    include <sys/types.h>
  25. #    include <sys/stat.h>
  26. #endif /* VMS SYSIII SYSV */
  27. #endif /* BSD VMS SYSIII SYSV */
  28. extern int doproctrap,doupdate;
  29. static int dbglvl;
  30. static VOID catchtrp(),catchalrm();
  31.  
  32. main(argc,argv)
  33. int argc;
  34. char *argv[];
  35. {
  36.     extern VOID proctrap(),shutdown(),cmd();
  37. #ifdef VMS
  38.     int i;
  39. #endif /* VMS */
  40.     extern int errno;
  41. #ifdef BSD
  42.     int swpidfd,thispid,pfd[2];
  43. #endif /* BSD */
  44.  
  45.     if (argc > 1) dbglvl = atoi(argv[1]);
  46.  
  47.     /* insure running in background */
  48. #ifndef VMS
  49.     /*if (fork() > 0) exit(0);*/
  50. #endif /* VMS BSD SYSIII SYSV */
  51.  
  52.     /* ignore interrupts, shutdown on terminate */
  53.     /* break connection with controlling tty */
  54.     /* close unneccesary files */
  55. #ifndef VMS
  56.     signal(SIGHUP,SIG_IGN);
  57.     signal(SIGINT,SIG_IGN);
  58.     signal(SIGQUIT,SIG_IGN);
  59.     signal(SIGTERM,shutdown);
  60. #ifdef SIGTSTP
  61.     signal(SIGTSTP,SIG_IGN);
  62. #endif
  63. #ifdef SIGTTIN
  64.     signal(SIGTTIN,SIG_IGN);
  65. #endif
  66. #ifdef SIGTTOU
  67.     signal(SIGTTOU,SIG_IGN);
  68. #endif
  69. #ifdef TIOCNOTTY
  70.     ioctl(0,TIOCNOTTY,0);
  71.     close(open("/dev/console",1));
  72. #endif
  73.     setpgrp(getpid(),getpid());
  74. #endif
  75.     close(0);
  76.     close(1);
  77.  
  78.     /* set up objects and aliens */
  79.     srand(time(0));
  80.     objinit();
  81.     alninit();
  82.  
  83.     /* set up readsw pipe/named pipe/mailbox  */
  84. #ifdef BSD
  85.     if (pipe(pfd) || pfd[0] != 0 || pfd[1] != 1) {
  86.         perror("pipe");
  87.         exit(1);
  88.     }
  89.  
  90.     /* set up communication files */
  91.     thispid = getpid();
  92.     if ((swpidfd=creat(SWPIDFILE,0644)) < 0 ||
  93.     write(swpidfd,&thispid,sizeof(thispid)) != sizeof(thispid) ||
  94.     close(swpidfd)) {
  95.         perror(SWPIDFILE);
  96.         exit(1);
  97.     }
  98.     if ((swlgnfd=creat(SWLGNFILE,0666)) < 0 || close(swlgnfd) ||
  99.     (swlgnfd=open(SWLGNFILE,0)) < 0) {
  100.         perror(SWLGNFILE);
  101.         if (unlink(SWPIDFILE)) perror(SWPIDFILE);
  102.         exit(1);
  103.     }
  104. #else /* VMS SYSIII SYSV */
  105. #ifdef VMS
  106.     if ((i=sys$assign(&mlbx,&inmlbx,PSL$C_USER,0)) != SS$_NORMAL) {
  107.         perror("assign mlbx");
  108. #ifdef DEBUG
  109.         VDBG("sw assign()=%d, errno=%d\n",i,errno);
  110. #endif
  111.         exit(1);
  112.     }
  113. #else /* SYSIII SYSV */
  114.     if (mknod(SWCOMFILE,0666+S_IFIFO,0) ||
  115.     open(SWCOMFILE,0) != 0 ||
  116.     open(SWCOMFILE,1) != 1) {
  117.         perror(SWCOMFILE);
  118.         exit(1);
  119.     }
  120. #endif /* VMS SYSIII SYSV */
  121. #endif /* VMS BSD SYSIII SYSV */
  122.  
  123.     /* open dbm(3) file */
  124.     if (dbminit(SWDATABASE)) {
  125.         perror(SWDATABASE);
  126. #ifdef BSD
  127.         if (unlink(SWLGNFILE)) perror(SWLGNFILE);
  128.         if (unlink(SWPIDFILE)) perror(SWPIDFILE);
  129. #else /* VMS SYSIII SYSV */
  130. #ifndef VMS
  131.         if (unlink(SWCOMFILE)) perror(SWCOMFILE);
  132. #endif    /* VMS SYSIII SYSV */
  133. #endif /* VMS BSD SYSIII SYSV */
  134.         exit(1);
  135.     }
  136.  
  137.     /* catch asynchronous event notification from playsw */
  138. #ifdef BSD
  139.     signal(SIGTRAP,catchtrp);
  140. #endif /* BSD */
  141.  
  142.     /* trap alarm to update universe */
  143.     signal(SIGALRM,catchalrm);
  144.  
  145.     /*******************/
  146.     /* MAIN PROCESSING */
  147.     /*******************/
  148.  
  149.     /* get and process commands and interrupts */
  150.     for (;;) {
  151.         cmd();
  152. #ifdef BSD
  153.         if (sigtrap) {
  154.             doproctrap = 0;
  155.             proctrap(swlgnfd,&sigtrap);
  156.             doproctrap = 1;
  157.         }
  158. #endif /* BSD */
  159.         if (doupdate < 0) {
  160.             doproctrap = 0;
  161.             update();
  162.             if (doproctrap == 0) doproctrap = 1;
  163.             doupdate = 1;
  164.         }
  165.     }
  166.  
  167. }
  168.  
  169. firstplyr()
  170. {catchalrm();}
  171.  
  172. static VOID catchalrm()
  173. {
  174.  
  175. #ifdef DEBUG
  176.     VDBG("catchalrm\n");
  177. #endif
  178. #ifdef VMS
  179.     sys$cancel(inmlbx);
  180. #endif /* VMS */
  181.     signal(SIGALRM,catchalrm);
  182.     if (doproctrap > 0 && doupdate > 0) {
  183.         doproctrap = 0;
  184.         update();
  185.         if (doproctrap == 0) doproctrap = 1;
  186.     } else
  187.         doupdate = -1;
  188.     if (numpling)
  189.         alarm(1);
  190. }
  191.  
  192. #ifdef BSD
  193. static VOID catchtrp()
  194. {
  195. #ifdef DEBUG
  196.     VDBG("catchtrp [doproctrap=%d]\n",doproctrap);
  197. #endif
  198.     ++sigtrap;
  199.     if (doproctrap > 0) {
  200.         doproctrap = 0;
  201.         proctrap(swlgnfd,&sigtrap);
  202.         doproctrap = 1;
  203.     } else
  204.         doproctrap = -1;
  205. }
  206. #endif /* BSD */
  207.  
  208.  
  209. #ifdef DEBUG
  210.  
  211. #undef NULL
  212. #include <stdio.h>
  213.  
  214. #ifdef VMS
  215. #include <varargs.h>
  216. VOID DBG(va_alist)
  217. va_dcl
  218. {
  219.     va_list ap;
  220.     int nargs,i,a[8];
  221.     char *fmt;
  222.  
  223.     va_start(ap);
  224.     va_count(nargs);
  225.     fmt = va_arg(ap,char *);
  226.     for (i=0;--nargs > 0;++i)
  227.         a[i] = va_arg(ap,int);
  228.     va_end(ap);
  229.     while (i < sizeof(a)/sizeof(a[0]))
  230.         a[i++] = -1;
  231.     if (dbglvl > 0) fprintf(stderr,fmt,
  232.     a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
  233. }
  234. VOID VDBG(va_alist)
  235. va_dcl
  236. {
  237.     va_list ap;
  238.     int nargs,i,a[8];
  239.     char *fmt;
  240.  
  241.     va_start(ap);
  242.     va_count(nargs);
  243.     fmt = va_arg(ap,char *);
  244.     for (i=0;--nargs > 0;++i)
  245.         a[i] = va_arg(ap,int);
  246.     va_end(ap);
  247.     while (i < sizeof(a)/sizeof(a[0]))
  248.         a[i++] = -1;
  249.     if (dbglvl > 1) fprintf(stderr,fmt,
  250.     a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
  251. }
  252. #else
  253. /*VARARGS1*/
  254. VOID DBG(fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)
  255. char *fmt;
  256. {if (dbglvl > 0) fprintf(stderr,fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);}
  257.  
  258. /*VARARGS1*/
  259. VOID VDBG(fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)
  260. char *fmt;
  261. {if (dbglvl > 1) fprintf(stderr,fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);}
  262. #endif
  263.  
  264. #endif
  265.