Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <ctype.h>5 #include <mach.h>6 #define Extern extern7 #include "acid.h"8 #include "y.tab.h"10 static void install(int);12 void13 sproc(int xpid)14 {15 Lsym *s;16 int i;17 Regs *regs;19 if(symmap == 0)20 error("no map");22 if(pid == xpid)23 return;25 if(corhdr){26 regs = coreregs(corhdr, xpid);27 if(regs == nil)28 error("no such pid in core dump");29 free(correg);30 correg = regs;31 }else{32 /* XXX should only change register set here if cormap already mapped */33 if(xpid <= 0)34 error("bad pid");35 unmapproc(cormap);36 unmapfile(corhdr, cormap);37 free(correg);38 correg = nil;39 pid = -1;40 corpid = -1;42 if(mapproc(xpid, cormap, &correg) < 0)43 error("setproc %d: %r", xpid);45 /* XXX check text file here? */47 for(i=0; i<cormap->nseg; i++){48 if(cormap->seg[i].file == nil){49 if(strcmp(cormap->seg[i].name, "data") == 0)50 cormap->seg[i].name = "*data";51 if(strcmp(cormap->seg[i].name, "text") == 0)52 cormap->seg[i].name = "*text";53 }54 }55 }56 pid = xpid;57 corpid = pid;58 s = look("pid");59 s->v->store.u.ival = pid;61 install(pid);62 }64 int65 nproc(char **argv)66 {67 int pid, i;69 pid = fork();70 switch(pid) {71 case -1:72 error("new: fork %r");73 case 0:74 rfork(RFNAMEG|RFNOTEG);75 if(ctlproc(getpid(), "hang") < 0)76 fatal("new: hang %d: %r", getpid());78 close(0);79 close(1);80 close(2);81 for(i = 3; i < NFD; i++)82 close(i);84 open("/dev/tty", OREAD);85 open("/dev/tty", OWRITE);86 open("/dev/tty", OWRITE);87 exec(argv[0], argv);88 fatal("new: exec %s: %r");89 default:90 install(pid);91 msg(pid, "waitstop");92 notes(pid);93 sproc(pid);94 dostop(pid);95 break;96 }98 return pid;99 }101 void102 notes(int pid)103 {104 Lsym *s;105 Value *v;106 int i, n;107 char **notes;108 List *l, **tail;110 s = look("notes");111 if(s == 0)112 return;114 v = s->v;115 n = procnotes(pid, ¬es);116 if(n < 0)117 error("procnotes pid=%d: %r", pid);119 v->set = 1;120 v->type = TLIST;121 v->store.u.l = 0;122 tail = &v->store.u.l;123 for(i=0; i<n; i++) {124 l = al(TSTRING);125 l->store.u.string = strnode(notes[i]);126 l->store.fmt = 's';127 *tail = l;128 tail = &l->next;129 }130 free(notes);131 }133 void134 dostop(int pid)135 {136 Lsym *s;137 Node *np, *p;139 s = look("stopped");140 if(s && s->proc) {141 np = an(ONAME, ZN, ZN);142 np->sym = s;143 np->store.fmt = 'D';144 np->type = TINT;145 p = con(pid);146 p->store.fmt = 'D';147 np = an(OCALL, np, p);148 execute(np);149 }150 }152 static void153 install(int pid)154 {155 Lsym *s;156 List *l;157 int i, new, p;159 new = -1;160 for(i = 0; i < Maxproc; i++) {161 p = ptab[i].pid;162 if(p == pid)163 return;164 if(p == 0 && new == -1)165 new = i;166 }167 if(new == -1)168 error("no free process slots");170 ptab[new].pid = pid;172 s = look("proclist");173 l = al(TINT);174 l->store.fmt = 'D';175 l->store.u.ival = pid;176 l->next = s->v->store.u.l;177 s->v->store.u.l = l;178 s->v->set = 1;179 }181 /*182 static int183 installed(int pid)184 {185 int i;187 for(i=0; i<Maxproc; i++)188 if(ptab[i].pid == pid)189 return 1;190 return 0;191 }192 */194 void195 deinstall(int pid)196 {197 int i;198 Lsym *s;199 List *f, **d;201 for(i = 0; i < Maxproc; i++) {202 if(ptab[i].pid == pid) {203 detachproc(pid);204 // close(ptab[i].ctl);205 ptab[i].pid = 0;206 s = look("proclist");207 d = &s->v->store.u.l;208 for(f = *d; f; f = f->next) {209 if(f->store.u.ival == pid) {210 *d = f->next;211 break;212 }213 }214 s = look("pid");215 if(s->v->store.u.ival == pid)216 s->v->store.u.ival = 0;217 return;218 }219 }220 }222 void223 msg(int pid, char *msg)224 {225 int i;226 char err[ERRMAX];228 for(i = 0; i < Maxproc; i++) {229 if(ptab[i].pid == pid) {230 if(ctlproc(pid, msg) < 0){231 errstr(err, sizeof err);232 if(strcmp(err, "process exited") == 0)233 deinstall(pid);234 error("msg: pid=%d %s: %s", pid, msg, err);235 }236 return;237 }238 }239 error("msg: pid=%d: not found for %s", pid, msg);240 }242 char *243 getstatus(int pid)244 {245 int fd;246 char *p;248 static char buf[128];250 sprint(buf, "/proc/%d/status", pid);251 fd = open(buf, OREAD);252 if(fd < 0)253 error("open %s: %r", buf);254 read(fd, buf, sizeof(buf));255 close(fd);256 p = buf+56+12; /* Do better! */257 while(*p == ' ')258 p--;259 p[1] = '\0';260 return buf+56; /* ditto */261 }