ftp.nice.ch/pub/next/unix/mail/elm2.4/elm.2.4pl17.s.tar.gz#/src/signals.c

This is signals.c in view mode; [Download] [Up]

static char rcsid[] = "@(#)$Id: signals.c,v 5.6 1992/12/11 02:39:53 syd Exp $";

/*******************************************************************************
 *  The Elm Mail System  -  $Revision: 5.6 $   $State: Exp $
 *
 *			Copyright (c) 1988-1992 USENET Community Trust
 *			Copyright (c) 1986,1987 Dave Taylor
 *******************************************************************************
 * Bug reports, patches, comments, suggestions should be sent to:
 *
 *	Syd Weinstein, Elm Coordinator
 *	elm@DSI.COM			dsinc!elm
 *
 *******************************************************************************
 * $Log: signals.c,v $
 * Revision 5.6  1992/12/11  02:39:53  syd
 * A try at making USR? not loose mailbox
 *
 * Revision 5.5  1992/12/07  02:41:21  syd
 * This implements the use of SIGUSR1 and SIGUSR2 as discussed on the
 * mailing list recently, and adds them to the documentation.
 * From: scs@lokkur.dexter.mi.us (Steve Simmons)
 *
 * Revision 5.4  1992/11/26  00:46:13  syd
 * changes to first change screen back (Raw off) and then issue final
 * error message.
 * From: Syd
 *
 * Revision 5.3  1992/10/27  01:43:40  syd
 * Move posix_signal to lib directory
 * From: tom@osf.org
 *
 * Revision 5.2  1992/10/25  02:01:58  syd
 * Here are the patches to support POSIX sigaction().
 * From: tom@osf.org
 *
 * Revision 5.1  1992/10/03  22:58:40  syd
 * Initial checkin as of 2.4 Release at PL0
 *
 *
 ******************************************************************************/

/** This set of routines traps various signals and informs the
    user of the error, leaving the program in a nice, graceful
    manner.

**/

#include "headers.h"
#include "s_elm.h"

extern int pipe_abort;		/* set to TRUE if receive SIGPIPE */

SIGHAND_TYPE
quit_signal(sig)
{
	dprint(1, (debugfile, "\n\n** Received SIGQUIT **\n\n\n\n"));
	leave(0);
}

SIGHAND_TYPE
hup_signal(sig)
{
	dprint(1, (debugfile, "\n\n** Received SIGHUP **\n\n\n\n"));
	leave(0);
}

SIGHAND_TYPE
term_signal(sig) 
{
	dprint(1, (debugfile, "\n\n** Received SIGTERM **\n\n\n\n"));
	leave(0);
}

SIGHAND_TYPE
ill_signal(sig)
{
	MoveCursor(LINES,0);
	Raw(OFF);
	dprint(1, (debugfile, "\n\n** Received SIGILL **\n\n\n\n"));
	printf(catgets(elm_msg_cat, ElmSet, ElmIllegalInstructionSignal,
		"\n\nIllegal Instruction signal!\n\n"));
	emergency_exit();
}

SIGHAND_TYPE
fpe_signal(sig)  
{
	MoveCursor(LINES,0);
	Raw(OFF);
	dprint(1, (debugfile, "\n\n** Received SIGFPE **\n\n\n\n"));
	printf(catgets(elm_msg_cat, ElmSet, ElmFloatingPointSignal,
		"\n\nFloating Point Exception signal!\n\n"));
	emergency_exit();
}

SIGHAND_TYPE
bus_signal(sig)
{
	MoveCursor(LINES,0);
	Raw(OFF);
	dprint(1, (debugfile, "\n\n** Received SIGBUS **\n\n\n\n"));
	printf(catgets(elm_msg_cat, ElmSet, ElmBusErrorSignal,
		"\n\nBus Error signal!\n\n"));
	emergency_exit();
}

SIGHAND_TYPE
segv_signal(sig)
{
	MoveCursor(LINES,0);
	Raw(OFF);
	dprint(1, (debugfile,"\n\n** Received SIGSEGV **\n\n\n\n"));
	printf(catgets(elm_msg_cat, ElmSet, ElmSegmentViolationSignal,
		"\n\nSegment Violation signal!\n\n"));
	emergency_exit();
}

SIGHAND_TYPE
alarm_signal(sig)
{	
	/** silently process alarm signal for timeouts... **/
#ifdef	BSD
	if (InGetPrompt)
		longjmp(GetPromptBuf, 1);
#else
	signal(SIGALRM, alarm_signal);
#endif
}

SIGHAND_TYPE
pipe_signal(sig)
{
	/** silently process pipe signal... **/
	dprint(2, (debugfile, "*** received SIGPIPE ***\n\n"));
	
	pipe_abort = TRUE;	/* internal signal ... wheeee!  */

	signal(SIGPIPE, pipe_signal);
}

#ifdef SIGTSTP
int was_in_raw_state;

SIGHAND_TYPE
sig_user_stop(sig)
{
	dprint(1, (debugfile,"\n\n** Received SIGTSTP **\n\n\n\n", sig));
	/* This is called when the user presses a ^Z to stop the
	   process within BSD 
	*/
#ifdef	SIGTSTP
	signal(SIGTSTP, SIG_DFL);
#endif

	was_in_raw_state = RawState();
	Raw(OFF);	/* turn it off regardless */

	printf(catgets(elm_msg_cat, ElmSet, ElmStoppedUseFGToReturn,
		"\n\nStopped.  Use \"fg\" to return to ELM\n\n"));

	kill(0, SIGSTOP);
}

SIGHAND_TYPE
sig_return_from_user_stop(sig)
{
	/** this is called when returning from a ^Z stop **/
	dprint(1, (debugfile,"\n\n** Received SIGCONT **\n\n\n\n", sig));

#ifndef	BSD
	signal(SIGCONT, sig_return_from_user_stop);
#endif
	signal(SIGTSTP, sig_user_stop);

	printf(catgets(elm_msg_cat, ElmSet, ElmBackInElmRedraw,
	 "\nBack in ELM. (You might need to explicitly request a redraw.)\n\n"));

	if (was_in_raw_state)
	  Raw(ON);

#ifdef	BSD
	if (InGetPrompt)
		longjmp(GetPromptBuf, 1);
#endif
}
#endif

#ifdef SIGWINCH
SIGHAND_TYPE
winch_signal(sig)
{
#ifndef	BSD
	signal(SIGWINCH, winch_signal);
#endif
	resize_screen = 1;
}
#endif

SIGHAND_TYPE
usr1_signal(sig)
{
	dprint(1, (debugfile, "\n\n** Received SIGUSR1 **\n\n\n\n"));
	question_me = FALSE;
	while ( leave_mbox(TRUE, FALSE, TRUE) == -1)
		newmbox(cur_folder, TRUE);

	leave(0);
}

SIGHAND_TYPE
usr2_signal(sig)
{
	dprint(1, (debugfile, "\n\n** Received SIGUSR2 **\n\n\n\n"));
	question_me = FALSE;
	while ( leave_mbox(TRUE, FALSE, TRUE) == -1)
		newmbox(cur_folder, TRUE);

	quit(FALSE);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.