void pchild(int signo) { int status; int pid; if (verbosesignalhandlers) kprintf("pchild signo %d pid %d\n",signo,getpid()); if (verbose) printf("%d waiting for child...", getpid()); pid = wait(&status); if (pid == -1) return; if (pid == helperpid || pid == progpid) { int what = 0; /* flush all */ ioctl(master,TIOCFLUSH,&what); close(master); ioctl(console,TIOCFLUSH,&what); close(console); if (pid == helperpid) killprog(); else killhelper(); if (restartprog) { longjmp(env,0);} } else { fprintf(stderr,"ERROR: I don't have other children, pid %d unknown to me\n",pid); } exit(0); }
void wrapup(int signo) { char *msg = "\n\rconsoled is being killed\n\r"; settitle("consoled: wrapping up"); if (verbosesignalhandlers) kprintf("wrapup signo: %d pid %d\n",signo, getpid()); if (getpid() == progpid) exit(0); write(console,msg,strlen(msg)); settitle("consoled: killing helper"); killhelper(); settitle("consoled: killing prog"); killprog(); if (verbose) printf("exiting %d\n",getpid()); settitle("consoled: exiting"); exit(0); }
static long progwrite(Chan *c, void *va, long n, vlong offset) { Prog *p, *f; Heapqry *hq; char buf[512]; Progctl *ctl; char *b; int i, pc; Cmdbuf *cb; Cmdtab *ct; USED(offset); USED(va); if(c->qid.type & QTDIR) error(Eisdir); acquire(); if(waserror()) { release(); nexterror(); } p = progpid(PID(c->qid)); if(p == nil) error(Ethread); switch(QID(c->qid)){ case Qctl: cb = parsecmd(va, n); if(waserror()){ free(cb); nexterror(); } ct = lookupcmd(cb, progcmd, nelem(progcmd)); switch(ct->index){ case CMkillgrp: killgrp(p, "killed"); break; case CMkill: killprog(p, "killed"); break; case CMrestricted: p->flags |= Prestrict; break; case CMexceptions: if(p->group->id != p->pid) error(Eperm); if(strcmp(cb->f[1], "propagate") == 0) p->flags |= Ppropagate; else if(strcmp(cb->f[1], "notifyleader") == 0) p->flags |= Pnotifyleader; else error(Ebadctl); break; case CMprivate: p->group->flags |= Pprivatemem; break; } poperror(); free(cb); break; case Qdbgctl: cb = parsecmd(va, n); if(waserror()){ free(cb); nexterror(); } if(cb->nf == 1 && strncmp(cb->f[0], "step", 4) == 0) ct = progdbgcmd; else ct = lookupcmd(cb, progdbgcmd, nelem(progdbgcmd)); switch(ct->index){ case CDstep: if(cb->nf == 1) i = strtoul(cb->f[0]+4, nil, 0); else i = strtoul(cb->f[1], nil, 0); dbgstep(c->aux, p, i); break; case CDtoret: f = currun(); i = calldepth(&p->R); while(f->kill == nil) { dbgstep(c->aux, p, 1024); if(i > calldepth(&p->R)) break; } break; case CDcont: f = currun(); while(f->kill == nil) dbgstep(c->aux, p, 1024); break; case CDstart: dbgstart(p); break; case CDstop: ctl = c->aux; ctl->stop = 1; break; case CDunstop: ctl = c->aux; ctl->stop = 0; break; case CDbpt: pc = strtoul(cb->f[3], nil, 10); ctl = c->aux; if(strcmp(cb->f[1], "set") == 0) ctl->bpts = setbpt(ctl->bpts, cb->f[2], pc); else if(strcmp(cb->f[1], "del") == 0) ctl->bpts = delbpt(ctl->bpts, cb->f[2], pc); else error(Ebadctl); break; case CDmaim: p->kill = "maim"; break; } poperror(); free(cb); break; case Qheap: /* * Heap query: * addr.Fn * pc+module.In */ i = n; if(i > sizeof(buf)-1) i = sizeof(buf)-1; memmove(buf, va, i); buf[i] = '\0'; hq = c->aux; hq->addr = strtoul(buf, &b, 0); if(*b == '+') hq->module = strtoul(b, &b, 0); if(*b++ != '.') error(Ebadctl); hq->fmt = *b++; hq->count = strtoul(b, nil, 0); break; default: print("unknown qid in procwrite\n"); error(Egreg); } poperror(); release(); return n; }