|
|
1.1 root 1: #include "univ.h"
2: #include "process.pri"
3: #include "sigmask.h"
4: #include "hostcore.h"
5: #include "expr.pub"
6: #include "master.pub"
7: #include "bpts.pri"
8: #include "frame.pri"
9: #include "memory.pub"
10: #include "symtab.pub"
11: #include "symbol.h"
12: #include "srcdir.h"
13: #include "asm.pub"
14: #include <CC/stdio.h>
15: SRCFILE("hostproc.c")
16:
17: int access(char*,int);
18: int kill(int,int);
19:
20: static char *pathexpand(char *f)
21: {
22: static char file[128];
23: extern char *PATH;
24: register char *pa, *p;
25:
26: if (*f != '/' && strncmp(f, "./", 2) && strncmp(f, "../", 3) &&
27: (pa=PATH)!=0){
28: while(*pa){
29: for(p=file; *pa && *pa!=':'; p++,pa++)
30: *p= *pa;
31: if(p!=file)
32: *p++='/';
33: if(*pa)
34: pa++;
35: (void)strcpy(p, f);
36: if (access(file, 5) != -1)
37: return file;
38: }
39: }
40: if (access(f, 5) != -1 )
41: return f;
42: return 0;
43: }
44:
45: void HostProcess::takeoverstopped()
46: {
47: if( pad ){
48: openstopped();
49: insert(ERRORKEY, "take over: already open");
50: return;
51: }
52: Pick( "take over", (Action)&HostProcess::substitute, (long) this );
53: }
54:
55: void HostProcess::reopendump()
56: {
57: char *error;
58:
59: insert(ERRORKEY, 0);
60: if( error = core->reopen(procpath, stabpath) ){
61: insert(ERRORKEY, error);
62: return;
63: }
64: docycle();
65: }
66:
67: void HostProcess::substitute(HostProcess *t)
68: {
69: char *error, *oldprocpath, *oldstabpath, *oldcomment;
70:
71: insert(ERRORKEY, 0);
72: if( !core ){
73: insert(ERRORKEY, "that ought to work - but it doesn't");
74: return;
75: }
76: if( !core->online() ){
77: insert(ERRORKEY, "cannot take over a coredump");
78: return;
79: }
80: _bpts->lift();
81: if( error = core->reopen(t->procpath, t->stabpath) ){
82: _bpts->lay();
83: insert(ERRORKEY, error);
84: return;
85: }
86: /* t->kill(); */
87: oldprocpath = procpath;
88: oldstabpath = stabpath;
89: oldcomment = comment;
90: procpath = t->procpath;
91: stabpath = t->stabpath;
92: comment = t->comment;
93: master->makeproc( oldprocpath, oldstabpath, oldcomment );
94: master->insert(t);
95: master->insert(this);
96: banner();
97: if( _asm ) _asm->banner();
98: if( _bpts ) _bpts->banner();
99: if( memory ) memory->banner();
100: if( globals ) globals->banner();
101: if( sigmsk ){
102: sigmsk->banner();
103: sigmsk->updatecore();
104: }
105: if( srcdir ) srcdir->banner();
106: core->symtab()->banner();
107: pad->clear();
108: _bpts->lay();
109: docycle();
110: }
111:
112: int HostProcess::accept( Action a )
113: {
114: return a == (Action)&HostProcess::substitute;
115: }
116:
117: void HostProcess::imprint()
118: {
119: char *parentpath = sf("%s%d", slashname(procpath), hostcore()->ppid() );
120: insert(ERRORKEY, "parent=%s", parentpath);
121: Process *p = master->search(parentpath);
122: if( !p ){
123: insert(ERRORKEY, "parent (%d) not opened", hostcore()->ppid());
124: return;
125: }
126: _bpts->liftparents(p->_bpts);
127: }
128:
129: void HostProcess::userclose()
130: {
131: if( sigmsk ){
132: sigmsk->hostclose();
133: delete sigmsk;
134: sigmsk = 0;
135: }
136: Process::userclose();
137: }
138:
139: int HostProcess::openstopped(long ischild)
140: {
141: Menu m, s;
142: char *error;
143:
144: Process::openpad();
145: if( core ) return 1;
146: insert(ERRORKEY, "Checking process and symbol table...");
147: core = (Core*) new HostCore(this, master);
148: if( error = core->open() ){
149: delete core;
150: core = 0;
151: if( ischild )
152: m.last( "open child", (Action)&HostProcess::open, 1 );
153: else
154: m.last( "open process", (Action)&HostProcess::open, 0 );
155: pad->menu( m );
156: insert(ERRORKEY, error);
157: return 0;
158: }
159: insert(ERRORKEY, core->symtab()->warn());
160: globals = new Globals(core);
161: _asm = core->newAsm();
162: if( core->online() ){
163: m.last( "stop", (Action)&HostProcess::stop );
164: m.last( "run", (Action)&Process::go );
165: }
166: m.last( "src text", (Action)&Process::srcfiles ); /* should check */
167: m.last( "Globals", (Action)&Process::openglobals );
168: m.last( "RawMemory", (Action)&Process::openmemory );
169: s.last( "Assembler", (Action)&Process::openasm );
170: s.last( "User Types",(Action)&Process::opentypes );
171: if( core->online() ){
172: s.last("Journal", (Action)&Process::openjournal);
173: s.last("Signals", (Action)&HostProcess::opensigmask);
174: s.last("Bpt List", (Action)&HostProcess::openbpts);
175: _bpts = new Bpts(core);
176: _bpts->lay();
177: if( ischild ) imprint();
178: sigmsk = new SigMask(hostcore());
179: m.last("kill?", (Action)&HostProcess::destroy );
180: }
181: m.last(s.index("more"));
182: pad->menu(m);
183: pad->makecurrent();
184: docycle();
185: return 1;
186: }
187:
188: void HostProcess::opensigmask()
189: {
190: if( sigmsk ) sigmsk->open();
191: }
192:
193: void HostProcess::destroy()
194: {
195: IF_LIVE( !core->online() ) return;
196: insert(ERRORKEY, core->destroy());
197: docycle();
198: }
199:
200: void HostProcess::stop()
201: {
202: IF_LIVE( !core->online() ) return;
203: if( !(sigmsk->mask&sigmsk->bit(SIGSTOP)) ) sigmsk->setsig(SIGSTOP);
204: Process::stop();
205: }
206:
207: Index HostProcess::carte()
208: {
209: Menu m;
210: if( !strcmp(procpath,"!") ){
211: m.last( "hang & open proc", (Action)&HostProcess::hangopen );
212: m.last( "hang & take over", (Action)&HostProcess::hangtakeover );
213: } else if( !strcmp(basename(procpath), "core") )
214: m.last( "open coredump",(Action)&HostProcess::openstopped );
215: else {
216: m.last( "open process", (Action)&HostProcess::open, 0 );
217: m.last( "take over", (Action)&HostProcess::takeover );
218: m.last( "open child", (Action)&HostProcess::open, 1 );
219: }
220: return m.index();
221: }
222:
223: void HostProcess::hang()
224: {
225: char program[128];
226: char *argv[10];
227:
228: char *from = stabpath;
229: char *to = argv[0] = program;
230: int i = 1;
231: for(;;) {
232: while(*from && *from != ' ')
233: *to++ = *from++;
234: *to++ = 0;
235: if (*from == 0) {
236: argv[i] = 0;
237: break;
238: } else {
239: while (*++from == ' ')
240: ;
241: if (*from)
242: argv[i++] = to;
243: }
244: }
245: char *ssave = stabpath;
246: stabpath = sf("%s", argv[0]);
247: int pid = ::fork();
248: if( !pid ){
249: int fd;
250: for( fd = 0; fd < _NFILE; ++fd ) ::close(fd);
251: ::open("/dev/null", 2);
252: ::dup2(0, 1);
253: ::dup2(0, 2);
254: ::setpgrp(0, ::getpid());
255: ::ptrace(PTRACE_TRACEME, 0, 0, 0, 0);
256: ::execvp(argv[0], argv);
257: ::exit(0);
258: }
259: procpath = sf("%d", pid);
260: master->makeproc("!", ssave);
261: master->insert(this);
262: }
263:
264: void HostProcess::hangopen()
265: {
266: hang();
267: openstopped();
268: }
269:
270: void HostProcess::hangtakeover()
271: {
272: hang();
273: takeoverstopped();
274: }
275:
276: void HostProcess::open(long ischild)
277: {
278: char *error;
279: int pid = 0;
280:
281: if( core )
282: return;
283: if (!stabpath) {
284: char *nstab;
285: char file[80];
286: sscanf(comment, " %*s %*s %*s %s", file);
287: if ((nstab = pathexpand(file)) == 0) {
288: error = "Can't find symbol table file";
289: goto err;
290: }
291: stabpath = sf("%s", nstab);
292: comment = 0;
293: master->insert(this);
294: }
295: sscanf(procpath, "%d", &pid);
296: ::kill(pid, SIGCONT);
297: if (::ptrace(PTRACE_ATTACH, pid, 0, 0, 0)) {
298: error = "Can't attach to process";
299: goto err;
300: }
301: openstopped(ischild);
302: return;
303: err:
304: Process::openpad();
305: insert(ERRORKEY, error);
306: return;
307:
308: }
309:
310: void HostProcess::takeover()
311: {
312: if (!stabpath) {
313: char *nstab;
314: char file[80];
315: sscanf(comment, " %*s %*s %*s %s", file);
316: if ((nstab = pathexpand(file)) == 0)
317: return;
318: stabpath = sf("%s", nstab);
319: comment = 0;
320: master->insert(this);
321: }
322: int pid = 0;
323: sscanf(procpath, "%d", &pid);
324: ::kill(pid, SIGCONT);
325: if (::ptrace(PTRACE_ATTACH, pid, 0, 0, 0))
326: return;
327: takeoverstopped();
328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.