home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
trn_12.zip
/
src
/
final.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-04
|
6KB
|
291 lines
/* $Id: final.c,v 4.4.3.1 1992/02/01 03:09:32 sob PATCH_3 sob $
*
* $Log: final.c,v $
* Revision 4.4.3.1 1992/02/01 03:09:32 sob
* Release 4.4 Patchlevel 3
*
* Revision 4.4.2.1 1991/12/01 18:05:42 sob
* Patchlevel 2 changes
*
* Revision 4.4 1991/09/09 20:18:23 sob
* release 4.4
*
*
*
*/
/* This software is Copyright 1991 by Stan Barber.
*
* Permission is hereby granted to copy, reproduce, redistribute or otherwise
* use this software as long as: there is no monetary profit gained
* specifically from the use or reproduction of this software, it is not
* sold, rented, traded or otherwise marketed, and this copyright notice is
* included prominently in any copy made.
*
* The author make no claims as to the fitness or correctness of this software
* for any use whatsoever, and it is provided as is. Any use of this software
* is at the user's own risk.
*/
#include "EXTERN.h"
#include "common.h"
#include "util.h"
#include "term.h"
#include "ng.h"
#include "init.h"
#include "bits.h"
#include "last.h"
#include "rcstuff.h"
#include "ngdata.h"
#include "artio.h"
#include "intrp.h"
#ifdef SERVER
#include "server.h"
#endif
#include "INTERN.h"
#include "final.h"
#ifndef sigmask
#define sigmask(m) (1 << ((m)-1))
#endif
void
final_init()
{
#ifdef SIGTSTP
sigset(SIGTSTP, stop_catcher); /* job control signals */
sigset(SIGTTOU, stop_catcher); /* job control signals */
sigset(SIGTTIN, stop_catcher); /* job control signals */
#endif
sigset(SIGINT, int_catcher); /* always catch interrupts */
#ifdef SIGHUP
sigset(SIGHUP, sig_catcher); /* and hangups */
#endif
sigset(SIGILL, sig_catcher);
#ifdef SIGTRAP
sigset(SIGTRAP, sig_catcher);
#endif
sigset(SIGFPE, sig_catcher);
#ifdef SIGBUS
sigset(SIGBUS, sig_catcher);
#endif
sigset(SIGSEGV, sig_catcher);
#ifdef SIGSYS
sigset(SIGSYS, sig_catcher);
#endif
sigset(SIGTERM, sig_catcher);
#ifdef SIGXCPU
sigset(SIGXCPU, sig_catcher);
#endif
#ifdef SIGXFSZ
sigset(SIGXFSZ, sig_catcher);
#endif
#ifdef SIGWINCH
sigset(SIGWINCH, winch_catcher);
#endif
#ifndef lint
#ifdef SIGEMT
sigignore(SIGEMT);
#endif
#endif /* lint */
}
void /* very much void */
finalize(status)
int status;
{
termlib_reset();
if (bizarre)
resetty();
if (lockname && *lockname)
UNLINK(lockname);
#ifdef USETHREADS
if (tmpthread_group)
UNLINK(tmpthread_file);
#endif
#ifdef SERVER
if (*active_name)
UNLINK(active_name);
if (openart) {
char artname[MAXFILENAME];
char intrpwork[MAXFILENAME];
interp(intrpwork,MAXFILENAME,"%P");
sprintf(artname, "%s/rrn%ld.%d", intrpwork, (long)openart, getpid());
UNLINK(artname);
}
close_server();
#endif /* SERVER */
if (status < 0) {
/*** OS2: Hmmm,.... what's so special about /usr/tmp, that
we chdir to that directory ??? If we abort the
program, and we assume that it is useful to change
to a specific directory, than let's change to the
users home-directory. ***/
/* chdir("/usr/tmp"); */
_chdir2(uupc_rc_settings.home);
sigset(SIGILL,SIG_DFL);
#ifdef SIGBLOCK
/*** OS2: sigsetmask is not yet supported by emx 0.8g */
/* sigsetmask(sigblock(0) & ~(sigmask(SIGILL) | sigmask(SIGIOT))); */
#endif
abort();
}
exit(status);
}
/* come here on interrupt */
SIGRET
int_catcher(dummy)
int dummy;
{
sigset(SIGINT,int_catcher);
#ifdef DEBUGGING
if (debug)
write(2,"int_catcher\n",12);
#endif
if (!waiting) {
if (int_count) { /* was there already an interrupt? */
write(2,"\nBye-bye.\n",10);
sig_catcher(0); /* emulate the other signals */
}
int_count++;
}
}
/* come here on signal other than interrupt, stop, or cont */
SIGRET
sig_catcher(signo)
int signo;
{
#ifdef VERBOSE
static char *signame[] = {
"",
"HUP",
"INT",
"QUIT",
"ILL",
"TRAP",
"IOT",
"EMT",
"FPE",
"KILL",
"BUS",
"SEGV",
"SYS",
"PIPE",
"ALRM",
"TERM",
"???"
#ifdef SIGTSTP
,"STOP",
"TSTP",
"CONT",
"CHLD",
"TTIN",
"TTOU",
"TINT",
"XCPU",
"XFSZ"
#ifdef SIGPROF
,"VTALARM",
"PROF"
#endif
#endif
};
#endif
#ifdef DEBUGGING
if (debug) {
printf("\nSIG%s--.newsrc not restored in debug\n",signame[signo]);
finalize(-1);
}
#endif
if (panic) {
#ifdef SIGBLOCK
/*** OS2: sigsetmask is not yet supported by emx 0.8g */
/* sigsetmask(sigblock(0) & ~(sigmask(SIGILL) | sigmask(SIGIOT))); */
#endif
abort();
}
(void) sigset(SIGILL,SIG_DFL);
panic = TRUE; /* disable terminal I/O */
if (doing_ng) { /* need we reconstitute rc line? */
#ifdef DELAYMARK
yankback();
#endif
restore_ng(); /* then do so (hope this works) */
}
doing_ng = FALSE;
if (rc_changed) /* need we write .newsrc out? */
write_rc(); /* then do so */
rc_changed = FALSE;
#ifdef SIGHUP
if (signo != SIGHUP)
#endif
#ifdef VERBOSE
IF(verbose)
printf("\nCaught %s%s--.newsrc restored\n",
signo ? "a SIG" : "an internal error", signame[signo]);
ELSE
#endif
#ifdef TERSE
printf("\nSignal %d--bye bye\n",signo);
#endif
switch (signo) {
#ifdef SIGBUS
case SIGBUS:
#endif
case SIGILL:
case SIGSEGV:
finalize(-signo);
}
finalize(1); /* and blow up */
}
#ifdef SIGTSTP
/* come here on stop signal */
SIGRET
stop_catcher(signo)
int signo;
{
if (!waiting) {
checkpoint_rc(); /* good chance of crash while stopped */
if (clear_on_stop) {
clear();
putchar('\n') ; FLUSH;
}
termlib_reset();
resetty(); /* this is the point of all this */
#ifdef DEBUGGING
if (debug)
write(2,"stop_catcher\n",13);
#endif
sigset(signo,SIG_DFL); /* enable stop */
#ifdef SIGBLOCK
sigsetmask(sigblock(0) & ~(1 << (signo-1)));
#endif
kill(0,signo); /* and do the stop */
savetty();
#ifdef MAILCALL
mailcount = 0; /* force recheck */
#endif
if (!panic) {
if (!waiting) {
termlib_init();
noecho(); /* set no echo */
crmode(); /* set cbreak mode */
forceme("\f"); /* cause a refresh */
/* (defined only if TIOCSTI defined) */
errno = 0; /* needed for getcmd */
}
}
}
sigset(signo,stop_catcher); /* unenable the stop */
}
#endif