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