|
|
1.1 ! root 1: #include "hostcore.h" ! 2: #include "process.pri" ! 3: #include "srctext.pub" ! 4: #include "sigmask.h" ! 5: SRCFILE("sigmask.c") ! 6: ! 7: char *SignalName(int sig) ! 8: { ! 9: switch( sig ){ ! 10: case 0: return "0 (no signal)"; ! 11: case SIGHUP: return "hangup"; ! 12: case SIGINT: return "interrupt"; ! 13: case SIGQUIT: return "quit"; ! 14: case SIGILL: return "illegal instruction"; ! 15: case SIGTRAP: return "trace/BPT"; ! 16: case SIGIOT: return "IOT instruction"; ! 17: case SIGEMT: return "EMT instruction"; ! 18: case SIGFPE: return "floating exception"; ! 19: case SIGKILL: return "kill"; ! 20: case SIGBUS: return "bus error"; ! 21: case SIGSEGV: return "memory fault"; ! 22: case SIGSYS: return "bad system call"; ! 23: case SIGPIPE: return "broken pipe"; ! 24: case SIGALRM: return "alarm call"; ! 25: case SIGTERM: return "terminated"; ! 26: case SIGSTOP: return "stop"; ! 27: case SIGCONT: return "continue"; ! 28: case SIGTSTP: return "stop tty"; ! 29: case SIGCHLD: return "child termination"; ! 30: case SIGTTIN: return "stop tty input"; ! 31: case SIGTTOU: return "stop tty output"; ! 32: case SIGXCPU: return "cpu timelimit"; ! 33: case SIGXFSZ: return "file sizelimit"; ! 34: #ifdef V9 ! 35: case SIGTINT: return "input available"; ! 36: #else ! 37: case SIGIO: return "i/o possible"; ! 38: case SIGURG: return "urgent condition"; ! 39: case SIGVTALRM: return "virtual alarm"; ! 40: case SIGPROF: return "profiling alarm"; ! 41: case SIGWINCH: return "window changed"; ! 42: #endif ! 43: } ! 44: return Name( "signal %d", sig ); ! 45: } ! 46: ! 47: void SigMask::banner() ! 48: { ! 49: trace( "%d.banner()", this ); VOK; ! 50: if( pad ){ ! 51: pad->banner( "Signals: %s", core->procpath() ); ! 52: pad->name( "Signals" ); ! 53: } ! 54: } ! 55: ! 56: SigMask::SigMask(HostCore *c) ! 57: { ! 58: trace( "%d.SigMask(%d)", this, c ); VOK; ! 59: core = c; ! 60: pad = 0; ! 61: mask = bit(SIGILL) ! 62: |bit(SIGINT) ! 63: |bit(SIGTRAP) ! 64: |bit(SIGIOT) ! 65: |bit(SIGEMT) ! 66: |bit(SIGFPE) ! 67: |bit(SIGBUS) ! 68: |bit(SIGSEGV) ! 69: |bit(SIGSYS) ! 70: |bit(SIGPIPE) ! 71: |bit(SIGSTOP); ! 72: #ifdef V9 ! 73: exechang = 0; ! 74: #else ! 75: exechang = 1; ! 76: #endif ! 77: updatecore(); ! 78: } ! 79: ! 80: const long EXECKEY = 33; ! 81: ! 82: void SigMask::open() ! 83: { ! 84: Menu m; ! 85: int i; ! 86: trace( "%d.open()", this ); VOK; ! 87: if( !pad ){ ! 88: pad = new Pad( (PadRcv*) this ); ! 89: #ifdef V9 ! 90: pad->lines(EXECKEY); ! 91: #endif ! 92: banner(); ! 93: m.last( "clear pending signal", (Action)&SigMask::clrcurrsig, 0 ); ! 94: m.last( "clear pending and go", (Action)&SigMask::clrcurrsig, 1 ); ! 95: pad->menu(m); ! 96: pad->options(TRUNCATE); ! 97: #ifdef V9 ! 98: for( i = 1; i <= EXECKEY; ++i ) linereq( i, 0 ); ! 99: #else ! 100: for( i = 1; i <= EXECKEY-1; ++i ) linereq( i, 0 ); ! 101: #endif ! 102: } ! 103: pad->makecurrent(); ! 104: } ! 105: ! 106: void SigMask::updatecore(char *error) ! 107: { ! 108: if( !error ) error = core->exechang(exechang); ! 109: if( !error ) error = core->signalmask(mask); ! 110: core->process()->pad->error(error); ! 111: } ! 112: ! 113: void SigMask::execline(long e) ! 114: { ! 115: static char *i[] = { "clear", "hang" }; ! 116: static char *l[] = { "", ">>> " }; ! 117: Menu m; ! 118: trace( "%d.execline(%d,ox%X)", this, e, a ); VOK; ! 119: exechang = e &= 1; ! 120: updatecore(); ! 121: long comp = e^1; ! 122: m.last( i[comp], (Action) &SigMask::execline, comp ); ! 123: Attrib a = 0; ! 124: pad->insert( EXECKEY, a, (PadRcv*)this, m, "%sexec()", l[e] ); ! 125: } ! 126: ! 127: void SigBit::set(SigMask *s) { s->setsig(bit); } ! 128: void SigBit::clr(SigMask *s) { s->clrsig(bit); } ! 129: void SigBit::send(SigMask *s) { s->sendsig(bit); } ! 130: ! 131: void SigMask::linereq(long sig, Attrib a ) ! 132: { ! 133: Menu m; ! 134: static SigBit *sigbit; ! 135: if( !sigbit ) ! 136: sigbit = new SigBit[33]; ! 137: trace( "%d.linereq(%d,0x%X)", this, sig, a ); VOK; ! 138: if( sig == EXECKEY ){ ! 139: execline(exechang); ! 140: return; ! 141: } ! 142: char *on = mask&bit(sig) ? ">>> " : ""; ! 143: m.last( "send signal", (Action)&SigBit::send, (long)this ); ! 144: if( on[0] == '>' ) ! 145: m.first("trace off", (Action)&SigBit::clr, (long)this); ! 146: else ! 147: m.first("trace on", (Action)&SigBit::set, (long)this); ! 148: sigbit[sig].bit = sig; ! 149: pad->insert(sig, a, (PadRcv*)(sigbit+sig), m, "%s%s", on, SignalName(sig)); ! 150: } ! 151: ! 152: void SigMask::signalmask(long sig) ! 153: { ! 154: trace( "%d.signalmask(%d)", this, sig ); VOK; ! 155: linereq(sig, SELECTLINE); ! 156: updatecore(); ! 157: } ! 158: ! 159: void SigMask::sendsig(long sig) ! 160: { ! 161: trace( "%d.sendsig(%d)", this, sig ); VOK; ! 162: updatecore(core->sendsig(sig)); ! 163: } ! 164: ! 165: void SigMask::setsig(long sig) ! 166: { ! 167: trace( "%d.setsig(%d)", this, sig ); VOK; ! 168: mask |= bit(sig); ! 169: signalmask( sig ); ! 170: } ! 171: ! 172: void SigMask::clrsig(long sig) ! 173: { ! 174: trace( "%d.clrsig(%d)", this, sig ); VOK; ! 175: mask &= ~bit(sig); ! 176: if( sig==SIGSTOP || sig==SIGTRAP ) ! 177: updatecore( "warning: debugging signal disabled" ); ! 178: signalmask( sig ); ! 179: } ! 180: ! 181: void SigMask::hostclose() ! 182: { ! 183: trace( "%d.hostclose()", this ); VOK; ! 184: if( pad ){ ! 185: delete pad; ! 186: pad = 0; ! 187: } ! 188: } ! 189: ! 190: void SigMask::clrcurrsig(long andgo) ! 191: { ! 192: trace( "%d.clrcurrsig()", this ); VOK; ! 193: updatecore(core->clrcurrsig()); ! 194: if( andgo ) core->process()->go(); ! 195: else core->process()->cycle(); ! 196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.