14130Sdlw /* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ 2*4135Sdlw char id_libF77[] = "@(#)main.c 2.4 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 { 164134Sdlw int sigdie(); 174130Sdlw long int (*sigf)(); 184130Sdlw 194130Sdlw xargc = argc; 204130Sdlw xargv = argv; 214134Sdlw signal(SIGFPE, sigdie); /* ignore underflow, enable overflow */ 224134Sdlw signal(SIGIOT, sigdie); 23*4135Sdlw if((sigf=signal(SIGQUIT, sigdie)) != SIG_DFL) signal(SIGQUIT, sigf); 24*4135Sdlw if((sigf=signal(SIGINT, sigdie)) != SIG_DFL) signal(SIGINT, sigf); 25*4135Sdlw if((sigf=signal(SIGTERM, sigdie)) != SIG_DFL) signal(SIGTERM, sigf); 26*4135Sdlw if((sigf=signal(SIGILL, sigdie)) != SIG_DFL) signal(SIGILL, sigf); 27*4135Sdlw if((sigf=signal(SIGEMT, sigdie)) != SIG_DFL) signal(SIGEMT, sigf); 28*4135Sdlw if((sigf=signal(SIGBUS, sigdie)) != SIG_DFL) signal(SIGBUS, sigf); 29*4135Sdlw 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 404134Sdlw struct action { 414134Sdlw char *mesg; 424134Sdlw int core; 434134Sdlw } sig_act[16] = { 444134Sdlw { 0, 0}, /* SIGHUP */ 454134Sdlw {"Interrupt!", 0}, /* SIGINT */ 464134Sdlw {"Quit!", 1}, /* SIGQUIT */ 474134Sdlw {"Illegal instruction", 1}, /* SIGILL */ 484134Sdlw { 0, 0}, /* SIGTRAP */ 494134Sdlw {"IOT Trap", 1}, /* SIGIOT */ 504134Sdlw {"EMT trap", 1}, /* SIGEMT */ 514134Sdlw {"Floating Point Exception", 1},/* SIGFPE */ 524134Sdlw { 0, 0}, /* SIGKILL */ 534134Sdlw {"Bus error", 1}, /* SIGBUS */ 544134Sdlw {"Segmentation violation", 1}, /* SIGSEGV */ 554134Sdlw { 0, 0}, /* SIGSYS */ 564134Sdlw { 0, 0}, /* SIGPIPE */ 574134Sdlw { 0, 0}, /* SIGALRM */ 584134Sdlw {"Terminated", 0}, /* SIGTERM */ 594134Sdlw { 0, 0}, /* unassigned */ 604134Sdlw }; 614130Sdlw 624130Sdlw 634134Sdlw sigdie(s) 644134Sdlw int s; 654130Sdlw { 664131Sdlw extern unit units[]; 674134Sdlw register struct action *act = &sig_act[s-1]; 684131Sdlw /* clear buffers, then print error message */ 694130Sdlw f_exit(); 704134Sdlw if (act->mesg) fprintf(units[STDERR].ufd, "%s\n", act->mesg); 714130Sdlw _cleanup(); 724130Sdlw 734134Sdlw if(act->core) 744130Sdlw { 754130Sdlw /* now get a core */ 764134Sdlw signal(SIGIOT, SIG_DFL); 774130Sdlw abort(); 784130Sdlw } 794134Sdlw exit(s); 804130Sdlw } 81