bill@chinet.chi.il.us (Bill Mitchell) (02/09/90)
I recently posted a hodgepodge of comments on de and elvis mixed
in with remarks about problems with signals. I had hoped for some
reaction to the signals part, but have seen none.
My posting included a test program which failed on my minix 1.5.0
system. I've now tried the test program on a Sun system at work,
and it runs just fine there.
Am I the only one with this problem? If not, is there a known fix?
/*----------------- signals test program ------------------------*/
/*
** This program was put together from modules borrowed from
** the de disk editor program to test restoring of changed
** tty settings before exit by intercepting sigint and sigquit.
**
** I did this because I noticed my terminal being left in raw mode
** on some exits from de and from elvis. This program restores tty
** settings just fine for normal exit, but either leaves me in raw
** mode or crashes my machine altogether for anything else.
**
** The program works just fine when tested on a Sun system at work,
** and restores tty settings nicely in all cases.
**
** This is pretty much unchanged from the original code borrowed from
** the de program except for a new main() and except for using memcpy
** in Set_Term() instead of saying struct_1 = struct_2.
**
*/
#include <sgtty.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
void Save_Term(), Set_Term(), Reset_Term(), Sigint();
static struct sgttyb saved_mode;
static struct tchars saved_chars;
main() {
Save_Term();
Set_Term();
signal( SIGINT, Sigint );
signal( SIGQUIT, Sigint );
printf("\
press 'i' for SIGINT\r\n\
press 'q' for SIGQUIT\r\n\
press 'o' for output test\r\n\
press anything else for normal exit: ");
if (getchar() == 'o')
for(;;)
printf("\r\npress 'i' or 'q'");
Reset_Term();
printf("\nNormal exit\n");
exit(0);
}
void Save_Term()
{
ioctl( 0, TIOCGETP, &saved_mode );
ioctl( 0, TIOCGETC, &saved_chars );
}
void Set_Term()
{
struct sgttyb mode;
struct tchars chars;
memcpy(&mode, &saved_mode, sizeof(struct sgttyb));
memcpy(&chars, &saved_chars, sizeof(struct tchars));
/* No tab expansion, no echo, don't map ^M to ^J, cbreak mode */
mode.sg_flags = mode.sg_flags & ~XTABS & ~ECHO & ~CRMOD | CBREAK;
/* Change the interrupt and quit character */
chars.t_intrc = 'i';
chars.t_quitc = 'q';
ioctl( 0, TIOCSETP, &mode );
ioctl( 0, TIOCSETC, &chars );
}
void Reset_Term()
{
ioctl( 0, TIOCSETP, &saved_mode );
ioctl( 0, TIOCSETC, &saved_chars );
}
void Sigint()
{
Reset_Term(); /* Restore terminal characteristics */
printf("\nSigint ran\n");
exit( 1 );
}