|
|
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 l
Length: 2660 (0xa64)
Types: TextFile
Names: »logoff.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/logoff.c«
/*
* Spacewar - logoff a player:
* reset tty modes
* close the tty I/O channel
* terminate (signal) the play and read processes
* clear out the login structure
*
* Copyright 1984 obo Systems, Inc.
* Copyright 1984 Dan Rosenblatt
*/
#include <signal.h>
#include "spacewar.h"
#include "universe.h"
#include "login.h"
#ifdef BSD
# include <sgtty.h>
#else /* VMS SYSIII SYSV */
#ifdef VMS
# include <ssdef.h>
#else /* SYSIII SYSV */
# include <sys/types.h>
# include <sys/ioctl.h>
# include <termio.h>
#endif /* VMS SYSIII SYSV */
#endif /* BSD VMS SYSIII SYSV */
VOID logoff(plogin)
register struct login *plogin;
{
#ifdef VMS
int i;
#endif /* VMS */
extern int errno;
#ifdef DEBUG
DBG("logoff(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
#endif
/* remove from universe if playing */
if (plogin->ln_play.ip_ptr) unplay(plogin);
/*****************/
/* set tty modes */
/*****************/
#ifdef BSD
{
struct sgttyb tmode;
if (gtty(plogin->ln_tty,&tmode)) {
perror("gtty");
goto sigh; /* horrendous */
}
/* reset echo and no cbreak mode */
/* (too bad the previous states weren't saved) */
tmode.sg_flags &= ~CBREAK;
tmode.sg_flags |= ECHO;
if (stty(plogin->ln_tty,&tmode)) {
perror("stty");
goto sigh; /* horrendous */
}
}
#else /* VMS SYSIII SYSV */
#ifndef VMS
{
struct termio tmode;
if (ioctl(plogin->ln_tty,TCGETA,&tmode)) {
perror("ioctl TCGETA");
goto sigh; /* horrendous */
}
/* reset echo and erase/kill edit processing */
/* (too bad the previous states weren't saved) */
tmode.c_lflag |= ICANON+ECHO+ECHOE+ECHOK+ECHONL;
tmode.c_cc[VEOF] = CEOF;
tmode.c_cc[VEOL] = CNUL;
if (ioctl(plogin->ln_tty,TCSETA,&tmode)) {
perror("ioctl TCSETA");
goto sigh; /* horrendous */
}
}
#endif /* VMS SYSIII SYSV */
#endif /* BSD VMS SYSIII SYSV */
/* close the player's terminal and kill the read and play processes */
sigh:
#ifdef VMS
output(plogin,0,0,0);
output(plogin,'C',0,"ShUtDoWn");
output(plogin,0,0,0);
if ((i=sys$delmbx(plogin->ln_tty)) != SS$_NORMAL) {
perror("delete mlbx 1");
#ifdef DEBUG
VDBG("logoff delmbx()=%d, errno=%d\n",i,errno);
#endif
}
if ((i=sys$dassgn(plogin->ln_tty)) != SS$_NORMAL) {
perror("dassgn mlbx 1");
#ifdef DEBUG
VDBG("logoff dassgn()=%d, errno=%d\n",i,errno);
#endif
}
#else /* BSD SYSIII SYSV */
if (close(plogin->ln_tty))
perror("close");
if (kill(plogin->ln_readpid,SIGTERM))
perror("kill readsw");
else
wait(0);
if (kill(plogin->ln_playpid,SIGTERM))
perror("kill playsw");
#endif /* VMS BSD SYSIII SYSV */
/* reset the login entry */
binit((char *)plogin,sizeof(*plogin));
#ifdef DEBUG
VDBG("logoff return\n");
#endif
}