|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4127 (0x101f)
Types: TextFile
Names: »psw.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/psw.c«
/*
* Spacewar - program that a user runs to play spacewar
* start up the game if its not running
* set tty permissions so that spacewar can communicate
* notify spacewar of a new player
* pause in order to tie up the shell
*
* Copyright 1984 obo Systems, Inc.
* Copyright 1984 Dan Rosenblatt
*/
#ifdef BSD
# include <sys/ioctl.h>
extern long lseek();
#else /* SYSIII SYSV */
# include <fcntl.h>
#endif /* BSD SYSIII SYSV */
#include <signal.h>
#include "spacewar.h"
#include "uio2.h"
struct uio2 uio;
int swpid,swlgnfd;
char *thistty;
static VOID fixttyexit(),catchsig();
main()
{
int i;
char *ttyname();
static char waitmsg[]="\nJust a moment while the game cranks up ...\n";
static char backmsg[]="Doesn't make sense to run in background\n";
extern char **environ;
/* if newsfile readable, show it */
if ((i=open(SWNEWS,0)) >= 0) {
char buf[1024];
int j;
while ((j=read(i,buf,sizeof(buf))) > 0)
write(2,buf,j);
close(i);
}
uio.uio2pid = getpid();
/* if spacewar not running, run it */
#ifdef BSD
if (access(SWPIDFILE,0)) {
#else /* SYSIII SYSV */
if (access(SWCOMFILE,0)) {
#endif /* BSD SYSIII SYSV */
tryagain:
write(2,waitmsg,strlen(waitmsg));
switch(fork()) {
case -1: /* fork failed */
perror("fork");
exit(1);
case 0: /* child */
#ifdef BSD
for (i=0;i < 20;ioctl(i++,FIOCLEX,NULL));
ioctl(2,FIONCLEX,NULL);
#else /* SYSIII SYSV */
for (i=0;i < 20;fcntl(i++,F_SETFD,1));
fcntl(2,F_SETFD,0);
#endif /* BSD SYSIII SYSV */
close(2);
lseek(open(SWERR,1),0L,2);
environ = NULL;
execle(SWGAME,"sw",(char *)0,(char *)0);
perror(SWGAME);
kill(uio.uio2pid,SIGKILL); /* inform parent */
exit(1);
default: /* parent; wait for the game to get going */
#ifdef BSD
while (access(SWPIDFILE,0))
#else /* SYSIII SYSV */
while (access(SWCOMFILE,0))
#endif /* BSD SYSIII SYSV */
sleep(2);
break;
}
}
/* trap user signals, termination signal */
/* (insure not running in background) */
if (signal(SIGINT,catchsig) == SIG_IGN) {
write(2,backmsg,strlen(backmsg));
exit(1);
}
signal(SIGHUP,catchsig);
signal(SIGQUIT,catchsig);
signal(SIGTERM,fixttyexit);
#ifdef BSD
/* get pid of game to notify it of a new player */
if ((i=open(SWPIDFILE,0)) < 0 ||
read(i,&swpid,sizeof(swpid)) != sizeof(swpid) ||
close(i)) {
perror(SWPIDFILE);
exit(1);
}
/* open notification information file */
if ((swlgnfd=open(SWLGNFILE,1)) < 0) {
perror(SWLGNFILE);
exit(1);
}
#else /* SYSIII SYSV */
/* open communication file */
if ((swlgnfd=open(SWCOMFILE,O_WRONLY|O_NDELAY)) < 0) {
perror("notify spacewar");
write(2,"Restarting!\n",12);
unlink(SWCOMFILE);
goto tryagain;
/*perror(SWCOMFILE);
*exit(1);
*/
}
#endif /* BSD SYSIII SYSV */
/* get tty name and set permissions so */
/* that the spacewar game can communicate */
if (!(thistty = ttyname(0)) && !(thistty = ttyname(1))) {
perror("ttyname");
exit(1);
}
strcpy(uio.uio2tty,thistty);
#ifdef BSD
/* notify spacewar of new player's tty and this program's pid */
if (lseek(swlgnfd,0L,2) < 0L ||
write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
perror(SWLGNFILE);
fixttyexit(1);
}
if (kill(swpid,SIGTRAP)) {
perror("notify spacewar");
write(2,"Restarting!\n",12);
close(swlgnfd);
unlink(SWPIDFILE);
unlink(SWLGNFILE);
goto tryagain;
}
#else /* SYSIII SYSV */
if (write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
perror(SWCOMFILE);
fixttyexit(1);
}
#endif /* BSD SYSIII SYSV */
/* wait for notification so that shell is tied up */
uio.uio2tty[0] = '\0';
for (;;) pause();
}
static VOID catchsig(sig)
int sig;
{
signal(sig,catchsig);
uio.uio2sig = sig;
#ifdef BSD
if (lseek(swlgnfd,0L,2) < 0L ||
write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
perror(SWLGNFILE);
fixttyexit(1);
}
if (kill(swpid,SIGTRAP)) {
perror("notify spacewar");
fixttyexit(1);
}
#else /* SYSIII SYSV */
if (write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
perror(SWCOMFILE);
fixttyexit(1);
}
#endif /* BSD SYSIII SYSV */
}
static VOID fixttyexit(n)
int n;
{
exit(n);
}