Annotation of gforth/engine/signals.c, revision 1.1

1.1     ! anton       1: /* signal handling
        !             2: 
        !             3:   Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.
        !             4: 
        !             5:   This file is part of Gforth.
        !             6: 
        !             7:   Gforth is free software; you can redistribute it and/or
        !             8:   modify it under the terms of the GNU General Public License
        !             9:   as published by the Free Software Foundation; either version 2
        !            10:   of the License, or (at your option) any later version.
        !            11: 
        !            12:   This program is distributed in the hope that it will be useful,
        !            13:   but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15:   GNU General Public License for more details.
        !            16: 
        !            17:   You should have received a copy of the GNU General Public License
        !            18:   along with this program; if not, write to the Free Software
        !            19:   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20: 
        !            21: */
        !            22: 
        !            23: 
        !            24: #define _GNU_SOURCE
        !            25: 
        !            26: #include <stdio.h>
        !            27: #include <signal.h>
        !            28: #include <setjmp.h>
        !            29: #include <string.h>
        !            30: #include <stdlib.h>
        !            31: #if !defined(apollo) && !defined(MSDOS)
        !            32: #include <sys/ioctl.h>
        !            33: #endif
        !            34: #include "config.h"
        !            35: #include "forth.h"
        !            36: #include "io.h"
        !            37: 
        !            38: 
        !            39: #define DEFAULTCOLS 80
        !            40: #if defined(MSDOS) || defined (_WIN32)
        !            41: #define DEFAULTROWS 25
        !            42: #else
        !            43: #define DEFAULTROWS 24
        !            44: #endif
        !            45: 
        !            46: UCell cols=DEFAULTCOLS;
        !            47: UCell rows=DEFAULTROWS;
        !            48: 
        !            49: 
        !            50: static void
        !            51: graceful_exit (int sig)
        !            52: {
        !            53:   deprep_terminal();
        !            54:   fprintf (stderr, "\n\n%s.\n", strsignal (sig));
        !            55:   exit (0x80|sig);
        !            56: }
        !            57: 
        !            58: jmp_buf throw_jmp_buf;
        !            59: 
        !            60: static void 
        !            61: signal_throw(int sig)
        !            62: {
        !            63:   int code;
        !            64:   struct {
        !            65:     int signal;
        !            66:     int throwcode;
        !            67:   } *p, throwtable[] = {
        !            68:     { SIGINT, -28 },
        !            69:     { SIGFPE, -55 },
        !            70: #ifdef SIGBUS
        !            71:     { SIGBUS, -23 },
        !            72: #endif
        !            73:     { SIGSEGV, -9 },
        !            74:   };
        !            75:   signal(sig,signal_throw);
        !            76:   for (code=-256-sig, p=throwtable; p<throwtable+(sizeof(throwtable)/sizeof(*p)); p++)
        !            77:     if (sig == p->signal) {
        !            78:       code = p->throwcode;
        !            79:       break;
        !            80:     }
        !            81:   longjmp(throw_jmp_buf,code); /* or use siglongjmp ? */
        !            82: }
        !            83: 
        !            84: #ifdef SIGCONT
        !            85: static void termprep (int sig)
        !            86: {
        !            87:   signal(sig,termprep);
        !            88:   terminal_prepped=0;
        !            89: }
        !            90: #endif
        !            91: 
        !            92: void get_winsize()
        !            93: {
        !            94: #ifdef TIOCGWINSZ
        !            95:   struct winsize size;
        !            96:   
        !            97:   if (ioctl (1, TIOCGWINSZ, (char *) &size) >= 0) {
        !            98:     rows = size.ws_row;
        !            99:     cols = size.ws_col;
        !           100:   }
        !           101: #else
        !           102:   char *s;
        !           103:   if ((s=getenv("LINES"))) {
        !           104:     rows=atoi(s);
        !           105:     if (rows==0)
        !           106:       rows=DEFAULTROWS;
        !           107:   }
        !           108:   if ((s=getenv("COLUMNS"))) {
        !           109:     rows=atoi(s);
        !           110:     if (rows==0)
        !           111:       cols=DEFAULTCOLS;
        !           112:   }
        !           113: #endif
        !           114: }
        !           115: 
        !           116: #ifdef SIGWINCH
        !           117: static void change_winsize(int sig)
        !           118: {
        !           119:   signal(sig,change_winsize);
        !           120: #ifdef TIOCGWINSZ
        !           121:   get_winsize();
        !           122: #endif
        !           123: }
        !           124: #endif
        !           125: 
        !           126: void install_signal_handlers (void)
        !           127: {
        !           128: 
        !           129: #if 0
        !           130: /* these signals are handled right by default, no need to handle them;
        !           131:    they are listed here just for fun */
        !           132:   static short sigs_to_default [] = {
        !           133: #ifdef SIGCHLD
        !           134:     SIGCHLD,
        !           135: #endif
        !           136: #ifdef SIGINFO
        !           137:     SIGINFO,
        !           138: #endif
        !           139: #ifdef SIGIO
        !           140:     SIGIO,
        !           141: #endif
        !           142: #ifdef SIGLOST
        !           143:     SIGLOST,
        !           144: #endif
        !           145: #ifdef SIGKILL
        !           146:     SIGKILL,
        !           147: #endif
        !           148: #ifdef SIGSTOP
        !           149:     SIGSTOP,
        !           150: #endif
        !           151: #ifdef SIGPWR
        !           152:     SIGPWR,
        !           153: #endif
        !           154: #ifdef SIGMSG
        !           155:     SIGMSG,
        !           156: #endif
        !           157: #ifdef SIGDANGER
        !           158:     SIGDANGER,
        !           159: #endif
        !           160: #ifdef SIGMIGRATE
        !           161:     SIGMIGRATE,
        !           162: #endif
        !           163: #ifdef SIGPRE
        !           164:     SIGPRE,
        !           165: #endif
        !           166: #ifdef SIGVIRT
        !           167:     SIGVIRT,
        !           168: #endif
        !           169: #ifdef SIGGRANT
        !           170:     SIGGRANT,
        !           171: #endif
        !           172: #ifdef SIGRETRACT
        !           173:     SIGRETRACT,
        !           174: #endif
        !           175: #ifdef SIGSOUND
        !           176:     SIGSOUND,
        !           177: #endif
        !           178: #ifdef SIGSAK
        !           179:     SIGSAK,
        !           180: #endif
        !           181: #ifdef SIGTSTP
        !           182:     SIGTSTP,
        !           183: #endif
        !           184: #ifdef SIGTTIN
        !           185:     SIGTTIN,
        !           186: #endif
        !           187: #ifdef SIGTTOU
        !           188:     SIGTTOU,
        !           189: #endif
        !           190: #ifdef SIGSTKFLT
        !           191:     SIGSTKFLT,
        !           192: #endif
        !           193: #ifdef SIGUNUSED
        !           194:     SIGUNUSED,
        !           195: #endif
        !           196:   };
        !           197: #endif
        !           198: 
        !           199:   static short sigs_to_throw [] = {
        !           200: #ifdef SIGBREAK
        !           201:     SIGBREAK,
        !           202: #endif
        !           203: #ifdef SIGINT
        !           204:     SIGINT,
        !           205: #endif
        !           206: #ifdef SIGILL
        !           207:     SIGILL,
        !           208: #endif
        !           209: #ifdef SIGEMT
        !           210:     SIGEMT,
        !           211: #endif
        !           212: #ifdef SIGFPE
        !           213:     SIGFPE,
        !           214: #endif
        !           215: #ifdef SIGIOT
        !           216:     SIGIOT,
        !           217: #endif
        !           218: #ifdef SIGSEGV
        !           219:     SIGSEGV,
        !           220: #endif
        !           221: #ifdef SIGALRM
        !           222:     SIGALRM,
        !           223: #endif
        !           224: #ifdef SIGPIPE
        !           225:     SIGPIPE,
        !           226: #endif
        !           227: #ifdef SIGPOLL
        !           228:     SIGPOLL,
        !           229: #endif
        !           230: #ifdef SIGPROF
        !           231:     SIGPROF,
        !           232: #endif
        !           233: #ifdef SIGBUS
        !           234:     SIGBUS,
        !           235: #endif
        !           236: #ifdef SIGSYS
        !           237:     SIGSYS,
        !           238: #endif
        !           239: #ifdef SIGTRAP
        !           240:     SIGTRAP,
        !           241: #endif
        !           242: #ifdef SIGURG
        !           243:     SIGURG,
        !           244: #endif
        !           245: #ifdef SIGUSR1
        !           246:     SIGUSR1,
        !           247: #endif
        !           248: #ifdef SIGUSR2
        !           249:     SIGUSR2,
        !           250: #endif
        !           251: #ifdef SIGVTALRM
        !           252:     SIGVTALRM,
        !           253: #endif
        !           254: #ifdef SIGXFSZ
        !           255:     SIGXFSZ,
        !           256: #endif
        !           257:   };
        !           258:   static short sigs_to_quit [] = {
        !           259: #ifdef SIGHUP
        !           260:     SIGHUP,
        !           261: #endif
        !           262: #ifdef SIGQUIT
        !           263:     SIGQUIT,
        !           264: #endif
        !           265: #ifdef SIGABRT
        !           266:     SIGABRT,
        !           267: #endif
        !           268: #ifdef SIGTERM
        !           269:     SIGTERM,
        !           270: #endif
        !           271: #ifdef SIGXCPU
        !           272:     SIGXCPU,
        !           273: #endif
        !           274:   };
        !           275:   int i;
        !           276: 
        !           277: #define DIM(X)         (sizeof (X) / sizeof *(X))
        !           278: /*
        !           279:   for (i = 0; i < DIM (sigs_to_ignore); i++)
        !           280:     signal (sigs_to_ignore [i], SIG_IGN);
        !           281: */
        !           282:   for (i = 0; i < DIM (sigs_to_throw); i++)
        !           283:     signal (sigs_to_throw [i], die_on_signal ? graceful_exit : signal_throw);
        !           284:   for (i = 0; i < DIM (sigs_to_quit); i++)
        !           285:     signal (sigs_to_quit [i], graceful_exit);
        !           286: #ifdef SIGCONT
        !           287:     signal (SIGCONT, termprep);
        !           288: #endif
        !           289: #ifdef SIGWINCH
        !           290:     signal (SIGWINCH, change_winsize);
        !           291: #endif
        !           292: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>