|
|
1.1 ! root 1: /* ! 2: * @(#)main.c 2.1 ! 3: */ ! 4: #include <stdio.h> ! 5: #include <signal.h> ! 6: #include "../libI77/fiodefs.h" ! 7: ! 8: #define ILL_ALIGN_FAULT 14 ! 9: ! 10: extern int errno; ! 11: char *getenv(); ! 12: ! 13: int xargc; ! 14: char **xargv; ! 15: ! 16: main(argc, argv, arge) ! 17: int argc; ! 18: char **argv; ! 19: char **arge; ! 20: { ! 21: int sigdie(); ! 22: long int (*sigf)(); ! 23: int signum; ! 24: ! 25: xargc = argc; ! 26: xargv = argv; ! 27: ! 28: for (signum=1; signum<=16; signum++) ! 29: { ! 30: if((sigf=signal(signum, sigdie)) != SIG_DFL) signal(signum, sigf); ! 31: } ! 32: ! 33: f_init(); ! 34: MAIN_(); ! 35: f_exit(); ! 36: return 0; ! 37: } ! 38: ! 39: struct action { ! 40: char *mesg; ! 41: int core; ! 42: } sig_act[16] = { ! 43: {"Hangup", 0}, /* SIGHUP */ ! 44: {"Interrupt!", 0}, /* SIGINT */ ! 45: {"Quit!", 1}, /* SIGQUIT */ ! 46: {"Illegal ", 1}, /* SIGILL */ ! 47: {"Trace Trap", 1}, /* SIGTRAP */ ! 48: {"IOT Trap", 1}, /* SIGIOT */ ! 49: {"EMT Trap", 1}, /* SIGEMT */ ! 50: {"Arithmetic Exception", 1}, /* SIGFPE */ ! 51: { 0, 0}, /* SIGKILL */ ! 52: {"Bus error", 1}, /* SIGBUS */ ! 53: {"Segmentation violation", 1}, /* SIGSEGV */ ! 54: {"Sys arg", 1}, /* SIGSYS */ ! 55: {"Open pipe", 0}, /* SIGPIPE */ ! 56: {"Alarm", 0}, /* SIGALRM */ ! 57: {"Terminated", 0}, /* SIGTERM */ ! 58: {"Sig 16", 0}, /* unassigned */ ! 59: }; ! 60: ! 61: /* The following arrays are defined & used assuming that signal codes are ! 62: 1 to 5 for SIGFPE, and 0 to 3 for SIGILL. ! 63: Actually ILL_ALIGN_FAULT=14, and is mapped to 3. */ ! 64: ! 65: #define N_ACT_FPE 5 /* number of entries in act_fpe[] */ ! 66: ! 67: struct action act_fpe[] = { ! 68: {"Integer overflow", 1}, ! 69: {"Integer divide by 0", 1}, ! 70: {"Floating divide by zero", 1}, ! 71: {"Floating point overflow", 1}, ! 72: {"Floating point underflow", 1}, ! 73: }; ! 74: ! 75: #define N_ACT_ILL 4 /* number of entries in act_ill[] */ ! 76: ! 77: struct action act_ill[] = { ! 78: {"addr mode", 1}, ! 79: {"instruction", 1}, ! 80: {"operand", 0}, ! 81: {"alignment", 1}, ! 82: }; ! 83: ! 84: ! 85: sigdie(s, t, sc) ! 86: int s; int t; struct sigcontext *sc; ! 87: { ! 88: extern unit units[]; ! 89: register struct action *act = &sig_act[s-1]; ! 90: /* print error message, then flush buffers */ ! 91: ! 92: if (s == SIGHUP || s == SIGINT || s == SIGQUIT) ! 93: signal(s, SIG_IGN); /* don't allow it again */ ! 94: else ! 95: signal(s, SIG_DFL); /* shouldn't happen again, but ... */ ! 96: ! 97: if (act->mesg) ! 98: { ! 99: fprintf(units[STDERR].ufd, "*** %s", act->mesg); ! 100: if (s == SIGFPE) ! 101: { ! 102: if ((t-1) >= 0 && t < N_ACT_FPE) ! 103: fprintf(units[STDERR].ufd, ": %s", act_fpe[t-1].mesg); ! 104: else ! 105: fprintf(units[STDERR].ufd, ": Type=%d?", t); ! 106: } ! 107: else if (s == SIGILL) ! 108: { ! 109: if (t == ILL_ALIGN_FAULT) /* ILL_ALIGN_FAULT maps to last ! 110: t = N_ACT_ILL-1; entry in act_ill[] */ ! 111: if (t >= 0 && t < N_ACT_ILL) ! 112: fprintf(units[STDERR].ufd, "%s", act_ill[t].mesg); ! 113: else ! 114: fprintf(units[STDERR].ufd, "compat mode: Code=%d", t); ! 115: } ! 116: putc('\n', units[STDERR].ufd); ! 117: } ! 118: f77_abort( s, act->core ); ! 119: } ! 120: ! 121: extern int _dbsubc; /* dbsubc is non-zero if -lg was specified to ld */ ! 122: f77_abort( err_val, act_core ) ! 123: { ! 124: char first_char, *env_var; ! 125: int core_dump; ! 126: ! 127: env_var = getenv("f77_dump_flag"); ! 128: first_char = (env_var == NULL) ? 0 : *env_var; ! 129: ! 130: signal(SIGILL, SIG_DFL); ! 131: sigsetmask(0); /* don't block */ ! 132: ! 133: /* see if we want a core dump: ! 134: first line checks for signals like hangup - don't dump then. ! 135: second line checks if -lg specified to ld (e.g. by saying ! 136: -g to f77) and checks the f77_dump_flag var. */ ! 137: core_dump = ((nargs() != 2) || act_core) && ! 138: ( (_dbsubc && (first_char != 'n')) || first_char == 'y'); ! 139: ! 140: if( !core_dump ) ! 141: fprintf(units[STDERR].ufd,"*** Execution terminated\n"); ! 142: ! 143: f_exit(); ! 144: _cleanup(); ! 145: if( nargs() ) errno = err_val; ! 146: else errno = -2; /* prior value will be meaningless, ! 147: so set it to undefined value */ ! 148: ! 149: if( core_dump ) abort(); ! 150: else exit( errno ); ! 151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.