Blame


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