Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "dat.h"
6 Biobuf bout;
8 void
9 usage(void)
10 {
11 fprint(2, "usage: auxstats [system [executable]]\n");
12 exits("usage");
13 }
15 int pid;
17 void
18 notifyf(void *v, char *msg)
19 {
20 USED(v);
22 if(strstr(msg, "child"))
23 noted(NCONT);
24 postnote(PNPROC, pid, msg);
25 exits(nil);
26 }
28 void
29 main(int argc, char **argv)
30 {
31 char *sys, *exe;
32 int i;
33 Waitmsg *w;
35 ARGBEGIN{
36 default:
37 usage();
38 }ARGEND
40 notify(notifyf);
42 sys = nil;
43 exe = nil;
44 if(argc > 0)
45 sys = argv[0];
46 if(argc > 1)
47 exe = argv[1];
48 if(argc > 2)
49 usage();
51 if(sys){
52 if(exe == nil)
53 exe = "auxstats";
54 for(;;){
55 switch(pid = fork()){
56 case -1:
57 sysfatal("fork: %r");
58 case 0:
59 rfork(RFNOTEG);
60 execlp("ssh", "ssh", "-nTC", sys, exe, nil);
61 _exit(97);
62 default:
63 if((w = wait()) == nil)
64 sysfatal("wait: %r");
65 if(w->pid != pid)
66 sysfatal("wait got wrong pid");
67 if(atoi(w->msg) == 97)
68 sysfatal("exec ssh failed");
69 free(w);
70 fprint(2, "stats: %s hung up; sleeping 60\n", sys);
71 sleep(60*1000);
72 fprint(2, "stats: redialing %s\n", sys);
73 break;
74 }
75 }
76 }
78 for(i=0; statfn[i]; i++)
79 statfn[i](1);
81 Binit(&bout, 1, OWRITE);
82 for(;;){
83 Bflush(&bout);
84 sleep(900);
85 for(i=0; statfn[i]; i++)
86 statfn[i](0);
87 }
88 }
90 char buf[16384];
91 char *line[100];
92 char *tok[100];
93 int nline, ntok;
95 void
96 readfile(int fd)
97 {
98 int n;
100 if(fd == -1){
101 nline = 0;
102 return;
105 seek(fd, 0, 0);
106 n = read(fd, buf, sizeof buf-1);
107 if(n < 0)
108 n = 0;
109 buf[n] = 0;
111 nline = getfields(buf, line, nelem(line), 0, "\n");
114 void
115 tokens(int i)
117 if(i >= nline){
118 ntok = 0;
119 return;
121 ntok = tokenize(line[i], tok, nelem(tok));