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"
10 564ca709 2004-04-19 devnull static void install(int);
13 564ca709 2004-04-19 devnull sproc(int xpid)
17 783aadbd 2005-02-11 devnull Regs *regs;
19 564ca709 2004-04-19 devnull if(symmap == 0)
20 564ca709 2004-04-19 devnull error("no map");
22 564ca709 2004-04-19 devnull if(pid == xpid)
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;
32 4f2ac1b7 2005-01-23 devnull /* 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;
42 4f2ac1b7 2005-01-23 devnull if(mapproc(xpid, cormap, &correg) < 0)
43 4f2ac1b7 2005-01-23 devnull error("setproc %d: %r", xpid);
45 4f2ac1b7 2005-01-23 devnull /* XXX check text file here? */
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";
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;
61 564ca709 2004-04-19 devnull install(pid);
65 564ca709 2004-04-19 devnull nproc(char **argv)
67 b4a659b6 2004-04-19 devnull int pid, i;
69 564ca709 2004-04-19 devnull pid = fork();
70 564ca709 2004-04-19 devnull switch(pid) {
72 564ca709 2004-04-19 devnull error("new: fork %r");
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());
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);
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]);
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);
99 564ca709 2004-04-19 devnull return pid;
103 564ca709 2004-04-19 devnull notes(int pid)
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;
111 564ca709 2004-04-19 devnull s = look("notes");
112 564ca709 2004-04-19 devnull if(s == 0)
115 564ca709 2004-04-19 devnull v = s->v;
116 564ca709 2004-04-19 devnull n = procnotes(pid, ¬es);
117 564ca709 2004-04-19 devnull if(n < 0)
118 564ca709 2004-04-19 devnull error("procnotes pid=%d: %r", pid);
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;
131 564ca709 2004-04-19 devnull free(notes);
135 564ca709 2004-04-19 devnull dostop(int pid)
137 564ca709 2004-04-19 devnull Lsym *s;
138 564ca709 2004-04-19 devnull Node *np, *p;
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);
153 564ca709 2004-04-19 devnull static void
154 564ca709 2004-04-19 devnull install(int pid)
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;
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)
165 564ca709 2004-04-19 devnull if(p == 0 && new == -1)
166 564ca709 2004-04-19 devnull new = i;
168 564ca709 2004-04-19 devnull if(new == -1)
169 564ca709 2004-04-19 devnull error("no free process slots");
171 564ca709 2004-04-19 devnull ptab[new].pid = pid;
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;
183 2e965b33 2004-05-05 devnull static int
184 2e965b33 2004-05-05 devnull installed(int pid)
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;
196 564ca709 2004-04-19 devnull deinstall(int pid)
199 564ca709 2004-04-19 devnull Lsym *s;
200 564ca709 2004-04-19 devnull List *f, **d;
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;
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;
224 564ca709 2004-04-19 devnull msg(int pid, char *msg)
227 564ca709 2004-04-19 devnull char err[ERRMAX];
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);
240 564ca709 2004-04-19 devnull error("msg: pid=%d: not found for %s", pid, msg);
244 564ca709 2004-04-19 devnull getstatus(int pid)
246 689be541 2005-11-28 devnull return "unknown";