|
|
1.1 root 1: #include "hostcore.h"
2: #include "master.pri"
3: #include "process.pri"
4: #include <CC/stdio.h>
5: #include "symtab.pri"
6: SRCFILE("hostmaster.c")
7:
8: Process *HostMaster::domakeproc(char *p, char *s, char* c)
9: {
10: return (Process*) new HostProcess(child, p, s, c);
11: }
12:
13: extern char *UNIX;
14:
15: HostMaster::HostMaster()
16: {
17: static char *ps[] = {
18: "/bin/ps ",
19: "/bin/ps a",
20: "/bin/ps x",
21: 0 };
22: Menu m;
23: int i;
24:
25: pad = new Pad( (PadRcv*) this ); /* this code cannot */
26: pad->options(TRUNCATE|SORTED); /* be in base ctor */
27: pad->name( "pi" );
28: pad->banner( "pi = 3.141592653" ); // 3.141592653 589793
29: for( i = 0; ps[i]; ++i )
30: m.last( ps[i], (Action)&HostMaster::refresh, (long)ps[i] );
31: m.last("kernel pi", (Action)&HostMaster::kpi);
32: m.last("quit?", (Action)&HostMaster::exit, 0);
33: pad->menu(m);
34: pad->makecurrent();
35: if( UNIX ){
36: Process *p = (Process*) new HostProcess(0, 0, UNIX);
37: core = new HostCore(p, this);
38: pad->insert(1, FLUSHLINE, "Checking %s symbols ...", UNIX );
39: char *error = core->open();
40: if( error )
41: pad->insert(1, "%s: %s", UNIX, error);
42: else {
43: error = core->symtab()->warn();
44: pad->insert(1, "%s", error ? error : "" );
45: }
46: }
47: refresh(0);
48: }
49:
50: void HostMaster::exit() { ::exit(0); }
51:
52: void HostMaster::kpi()
53: {
54: if( !kernmaster ) kernmaster = new KernMaster(core->_symtab);
55: kernmaster->pad->makecurrent();
56: }
57:
58: #define PSOUT 100
59: #define PROCS 100
60: char *HostMaster::dopscmd(char *ps)
61: {
62: char psout[PROCS][PSOUT];
63: FILE *f, *Popen(char*,char*);
64: int Pclose(FILE *);
65: void qsort(char*,int,int,int(*)(char*,char*));
66: int pid, i, j, e;
67:
68: if( !ps ) return 0;
69: if( !(f = Popen( ps, "r")) )
70: return SysErr( "cannot read from popen(): " );
71: for( i = 0; i<PROCS && fgets(psout[i],PSOUT,f); ++i ) {}
72: if( e = Pclose(f) )
73: return sf( "exit(%d): %s", e, ps );
74: qsort( &psout[0][0], i, PSOUT, strcmp );
75: for( j = 0; j <= i; ++j )
76: if( 2 == sscanf( psout[j], " %d %[^\n]", &pid, psout[0] ) )
77: makeproc( sf("%d",pid), 0, psout[0] );
78: return 0;
79: }
80:
81: void HostMaster::refresh(char *ps)
82: {
83: char *error;
84: Process *p;
85:
86: pad->clear();
87: makeproc( "core", "a.out", "" );
88: makeproc( "!", "a.out", "" );
89: if( error = dopscmd(ps) ) pad->error(error);
90: for( p = child; p; p = p->sibling )
91: if( p->core || (p->stabpath && !strcmp(p->stabpath,"!")))
92: insert(p);
93: }
94:
95: char *HostMaster::kbd(char *s)
96: {
97: char *corep, core[64], syms[64], star = 0;
98: HostProcess *p;
99: void StartAudit();
100:
101: while( *s == ' ' ) ++s;
102: if( !strcmp(s, "new Audit") ){
103: StartAudit();
104: return 0;
105: }
106: while( *s==' ' ) ++s;
107: switch( *s ){
108: case '!':
109: for( ++s; *s==' '; ++s ) {}
110: makeproc("!", s, "");
111: break;
112: case '*':
113: star = 1;
114: for( ++s; *s==' '; ++s ) {}
115: default:
116: switch( sscanf(s, "%s %s \n", corep = core, syms) ){
117: case 2: if( alldigits(corep) )
118: corep = sf( "%s", core );
119: p = (HostProcess*) makeproc(corep, syms[0]?syms:0, 0);
120: if( star && p ) p->open();
121: break;
122: default:
123: return help();
124: }
125: }
126: return 0;
127: }
128:
129: char *HostMaster::help()
130: {
131: return "[*] <corepath | pid> <tables> {[open] process/dump} | !<cmd> {program}";
132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.