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

  1. /*
  2.  * Spacewar - program that a user runs to play spacewar - VMS ONLY!
  3.  *          show newsfile
  4.  *          start up the game if its not running including mailbox creation
  5.  *          notify spacewar of a new player
  6.  *          assign screen mailbox
  7.  *          get plogin value for rsw
  8.  *          spawn rsw
  9.  *          set 'raw' mode
  10.  *          read screen mailbox continually looking for shutdown msg
  11.  *
  12.  * Copyright 1985 obo Systems, Inc.
  13.  * Copyright 1985 Dan Rosenblatt
  14.  */
  15.  
  16. #include "spacewar.h"
  17. #include "uio.h"
  18. #include <signal.h>
  19. #include <stdio.h>
  20.  
  21. #include <descrip.h>
  22. #include <ssdef.h>
  23. #include <iodef.h>
  24. #include <psldef.h>
  25. #include <ttdef.h>
  26. #include <prvdef.h>
  27.  
  28. main()
  29. {
  30.     int i,j,rswpid;
  31.     static $DESCRIPTOR(swmlbx,SWCOMFILE);
  32.     short swchan,chan;
  33.     static char waitmsg[]="\nJust a moment while the game cranks up ...\n";
  34.     static $DESCRIPTOR(swgame,SWGAME);
  35.     static $DESCRIPTOR(swerr,SWERR);
  36.     static $DESCRIPTOR(swname,"sw");
  37.     struct dsc$descriptor_d mlbx;
  38.     int prv[2];
  39.     struct uio uio;
  40.     char buf[128];
  41.     extern int errno;
  42.     static $DESCRIPTOR(tty,"TT");
  43.     short tchan;
  44.     unsigned short speed,parity,fill;
  45.     struct {
  46.         unsigned char class,type;
  47.         unsigned short width;
  48.         unsigned mode : 24;
  49.         unsigned char length;
  50.     } swtty,savtty;
  51.  
  52.  
  53.     /* if newsfile readable, show it */
  54.     if ((i=open(SWNEWS,0)) >= 0) {
  55.         char buf[512];
  56.         int j;
  57.         while ((j=read(i,buf,sizeof(buf))) > 0)
  58.             write(2,buf,j);
  59.         close(i);
  60.     }
  61.  
  62.     /* if spacewar not running, run it */
  63.     if (sys$assign(&swmlbx,&swchan,PSL$C_USER,0) != SS$_NORMAL) {
  64.         write(2,waitmsg,strlen(waitmsg));
  65.         if ((i=sys$crembx(1,&swchan,0,0,0,PSL$C_USER,&swmlbx)) !=
  66.         SS$_NORMAL) {
  67.             perror("crembx 1");
  68.             sprintf(buf,"vmspsw crembx()=%d, errno=%d\n",i,errno);
  69.             write(2,buf,strlen(buf));
  70.             exit(SS$_ABORT);
  71.         }
  72.         prv[0] = 1<<PRV$V_PRMMBX | 1<<PRV$V_SYSNAM;
  73.         prv[1] = 0;
  74.         if ((i=sys$creprc(0,&swgame,0,&swerr,&swerr,prv,0,&swname,15,
  75.         0,0,512/*PRC$M_DETACH*/)) != SS$_NORMAL) {
  76.             perror(SWGAME);
  77.             sprintf(buf,"vmspsw creprc()=%d, errno=%d\n",i,errno);
  78.             write(2,buf,strlen(buf));
  79.             if ((i=sys$delmbx(swchan)) != SS$_NORMAL) {
  80.                 perror("delete mbx");
  81.                 sprintf(buf,"vmspsw delmbx()=%d, errno=%d\n",
  82.                 i,errno);
  83.                 write(2,buf,strlen(buf));
  84.             }
  85.             exit(SS$_ABORT);
  86.         }
  87.     }
  88.  
  89.     /* notify spacewar of a new player */
  90.     sprintf(uio.uio_chrs,"sw%x",getpid());
  91.     uio.uio_lgn = 0;
  92.     if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,sizeof(uio),0,0,0,0))
  93.     != SS$_NORMAL) {
  94.         sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",i,errno);
  95.         write(2,buf,strlen(buf));
  96.         exit(SS$_ABORT);
  97.     }
  98.  
  99.     /* assign the screen mailbox */
  100.     mlbx.dsc$w_length = strlen(uio.uio_chrs);
  101.     mlbx.dsc$b_dtype = DSC$K_DTYPE_T;
  102.     mlbx.dsc$b_class = DSC$K_CLASS_S;
  103.     mlbx.dsc$a_pointer = uio.uio_chrs;
  104.     for (j=10;j-- > 0;)
  105.         if ((i=sys$assign(&mlbx,&chan,PSL$C_USER,0)) != SS$_NORMAL) {
  106.         if (j) {
  107.             sleep(1);
  108.             continue;
  109.         }
  110.         perror("assign mbx");
  111.         sprintf(buf,"vmspsw assignmbx()=%d, errno=%d\n",i,errno);
  112.         write(2,buf,strlen(buf));
  113.         exit(SS$_ABORT);
  114.         } else
  115.         break;
  116.  
  117.     /* get plogin value for rsw */
  118.     if ((i=sys$qiow(0,chan,IO$_READVBLK,0,0,0,buf,sizeof(buf),0,0,0,0)) !=
  119.     SS$_NORMAL) {
  120.         sprintf(buf,"vmspsw qiow(READVBLK)=%d, errno=%d\n",i,errno);
  121.         write(2,buf,strlen(buf));
  122.     }
  123.  
  124.     /* spawn rsw */
  125.     switch(rswpid=vfork()) {
  126.         case -1: /* failed */
  127.             perror("vfork");
  128.             uio.uio_lgn = SIGHUP;
  129.             if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,
  130.             sizeof(uio),0,0,0,0)) != SS$_NORMAL) {
  131.                 sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",
  132.                 i,errno);
  133.                 write(2,buf,strlen(buf));
  134.             }
  135.             exit(SS$_ABORT);
  136.  
  137.         case 0: /* child */
  138.             execl(SWREAD,"vmsrsw",buf,uio.uio_chrs,0);
  139.             perror(SWREAD);
  140.             uio.uio_lgn = SIGHUP;
  141.             if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,
  142.             sizeof(uio),0,0,0,0)) != SS$_NORMAL) {
  143.                 sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",
  144.                 i,errno);
  145.                 write(2,buf,strlen(buf));
  146.             }
  147.             exit(SS$_ABORT);
  148.     }
  149.  
  150.     /* set 'raw' mode */
  151.     if ((i=sys$assign(&tty,&tchan,PSL$C_USER,0)) != SS$_NORMAL) {
  152.         sprintf(buf,"vmspsw assign()=%d, errno=%d\n",i,errno);
  153.         write(2,buf,strlen(buf));
  154.     }
  155.     if ((i=sys$qiow(0,tchan,IO$_SENSEMODE,0,0,0,&savtty,0,&speed,&fill,
  156.     &parity,0)) != SS$_NORMAL) {
  157.         sprintf(buf,"vmspsw qiow(SENSE)=%d, errno=%d\n",i,errno);
  158.         write(2,buf,strlen(buf));
  159.     }
  160.     swtty = savtty;
  161.     swtty.mode |= TT$M_PASSALL+TT$M_NOECHO;
  162.     if ((i=sys$qiow(0,tchan,IO$_SETMODE,0,0,0,&swtty,0,speed,fill,parity,
  163.     0)) != SS$_NORMAL) {
  164.         sprintf(buf,"vmspsw qiow(SET)=%d, errno=%d\n",i,errno);
  165.         write(2,buf,strlen(buf));
  166.     }
  167.  
  168.     /* read screen mailbox continually looking for shutdown msg */
  169.     for (;;) {
  170.         if ((i=sys$qiow(0,chan,IO$_READVBLK,0,0,0,buf,sizeof(buf),
  171.         0,0,0,0)) != SS$_NORMAL) {
  172.             sprintf(buf,"vmspsw qiow(READVBLK)=%d, errno=%d\n",i,errno);
  173.             write(2,buf,strlen(buf));
  174.         }
  175.         if (!strcmp(buf,"ShUtDoWn")) break;
  176.         write(1,buf,strlen(buf));
  177.     }
  178.     kill(rswpid,SIGTERM);
  179.  
  180.     /* reset terminal */
  181.     if ((i=sys$qiow(0,tchan,IO$_SETMODE,0,0,0,&savtty,0,speed,fill,parity,
  182.     0)) != SS$_NORMAL) {
  183.         sprintf(buf,"vmspsw qiow(SET)=%d, errno=%d\n",i,errno);
  184.         write(2,buf,strlen(buf));
  185.     }
  186.  
  187.     exit(SS$_NORMAL);
  188. }
  189.