14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4134Sdlw char id_libF77[] = "@(#)main.c 2.3 08/13/81"; 34130Sdlw 44130Sdlw #include <stdio.h> 54130Sdlw #include <signal.h> 64131Sdlw #include "../libI77/fiodefs.h" 74130Sdlw 84130Sdlw int xargc; 94130Sdlw char **xargv; 104130Sdlw 114130Sdlw main(argc, argv, arge) 124130Sdlw int argc; 134130Sdlw char **argv; 144130Sdlw char **arge; 154130Sdlw { 16*4134Sdlw int sigdie(); 174130Sdlw long int (*sigf)(); 184130Sdlw 194130Sdlw xargc = argc; 204130Sdlw xargv = argv; 21*4134Sdlw signal(SIGFPE, sigdie); /* ignore underflow, enable overflow */ 22*4134Sdlw signal(SIGIOT, sigdie); 23*4134Sdlw if(sigf=signal(SIGQUIT, sigdie) != SIG_DFL) signal(SIGQUIT, sigf); 24*4134Sdlw if(sigf=signal(SIGINT, sigdie) != SIG_DFL) signal(SIGINT, sigf); 25*4134Sdlw if(sigf=signal(SIGTERM, sigdie) != SIG_DFL) signal(SIGTERM, sigf); 26*4134Sdlw if(sigf=signal(SIGILL, sigdie) != SIG_DFL) signal(SIGILL, sigf); 27*4134Sdlw if(sigf=signal(SIGEMT, sigdie) != SIG_DFL) signal(SIGEMT, sigf); 28*4134Sdlw if(sigf=signal(SIGBUS, sigdie) != SIG_DFL) signal(SIGBUS, sigf); 29*4134Sdlw if(sigf=signal(SIGSEGV, sigdie) != SIG_DFL) signal(SIGSEGV, sigf); 304130Sdlw 314130Sdlw #ifdef pdp11 324130Sdlw ldfps(01200); /* detect overflow as an exception */ 334130Sdlw #endif 344130Sdlw 354130Sdlw f_init(); 364130Sdlw MAIN__(); 374130Sdlw f_exit(); 384130Sdlw } 394130Sdlw 40*4134Sdlw struct action { 41*4134Sdlw char *mesg; 42*4134Sdlw int core; 43*4134Sdlw } sig_act[16] = { 44*4134Sdlw { 0, 0}, /* SIGHUP */ 45*4134Sdlw {"Interrupt!", 0}, /* SIGINT */ 46*4134Sdlw {"Quit!", 1}, /* SIGQUIT */ 47*4134Sdlw {"Illegal instruction", 1}, /* SIGILL */ 48*4134Sdlw { 0, 0}, /* SIGTRAP */ 49*4134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 50*4134Sdlw {"EMT trap", 1}, /* SIGEMT */ 51*4134Sdlw {"Floating Point Exception", 1},/* SIGFPE */ 52*4134Sdlw { 0, 0}, /* SIGKILL */ 53*4134Sdlw {"Bus error", 1}, /* SIGBUS */ 54*4134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 55*4134Sdlw { 0, 0}, /* SIGSYS */ 56*4134Sdlw { 0, 0}, /* SIGPIPE */ 57*4134Sdlw { 0, 0}, /* SIGALRM */ 58*4134Sdlw {"Terminated", 0}, /* SIGTERM */ 59*4134Sdlw { 0, 0}, /* unassigned */ 60*4134Sdlw }; 614130Sdlw 624130Sdlw 63*4134Sdlw sigdie(s) 64*4134Sdlw int s; 654130Sdlw { 664131Sdlw extern unit units[]; 67*4134Sdlw register struct action *act = &sig_act[s-1]; 684131Sdlw /* clear buffers, then print error message */ 694130Sdlw f_exit(); 70*4134Sdlw if (act->mesg) fprintf(units[STDERR].ufd, "%s\n", act->mesg); 714130Sdlw _cleanup(); 724130Sdlw 73*4134Sdlw if(act->core) 744130Sdlw { 754130Sdlw /* now get a core */ 76*4134Sdlw signal(SIGIOT, SIG_DFL); 774130Sdlw abort(); 784130Sdlw } 79*4134Sdlw exit(s); 804130Sdlw } 81