Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include <mach.h>
6 #define Extern extern
7 #include "acid.h"
8 #include "y.tab.h"
10 static void install(int);
12 void
13 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 int
65 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 void
102 notes(int pid)
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, &notes);
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;
130 free(notes);
133 void
134 dostop(int pid)
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);
152 static void
153 install(int pid)
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;
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;
181 /*
182 static int
183 installed(int pid)
185 int i;
187 for(i=0; i<Maxproc; i++)
188 if(ptab[i].pid == pid)
189 return 1;
190 return 0;
192 */
194 void
195 deinstall(int pid)
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;
214 s = look("pid");
215 if(s->v->store.u.ival == pid)
216 s->v->store.u.ival = 0;
217 return;
222 void
223 msg(int pid, char *msg)
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);
236 return;
239 error("msg: pid=%d: not found for %s", pid, msg);
242 char *
243 getstatus(int pid)
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 */