#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include "dat.h" | |
Biobuf bout; | |
void | |
usage(void) | |
{ | |
fprint(2, "usage: auxstats [system [executable]]\n"); | |
exits("usage"); | |
} | |
int pid; | |
void | |
notifyf(void *v, char *msg) | |
{ | |
USED(v); | |
if(strstr(msg, "child")) | |
noted(NCONT); | |
postnote(PNPROC, pid, msg); | |
exits(nil); | |
} | |
void | |
main(int argc, char **argv) | |
{ | |
char *sys, *exe; | |
int i; | |
Waitmsg *w; | |
ARGBEGIN{ | |
default: | |
usage(); | |
}ARGEND | |
notify(notifyf); | |
sys = nil; | |
exe = nil; | |
if(argc > 0) | |
sys = argv[0]; | |
if(argc > 1) | |
exe = argv[1]; | |
if(argc > 2) | |
usage(); | |
if(sys){ | |
if(exe == nil) | |
exe = "auxstats"; | |
for(;;){ | |
switch(pid = fork()){ | |
case -1: | |
sysfatal("fork: %r"); | |
case 0: | |
rfork(RFNOTEG); | |
execlp("ssh", "ssh", "-nTC", sys, exe, nil); | |
_exit(97); | |
default: | |
if((w = wait()) == nil) | |
sysfatal("wait: %r"); | |
if(w->pid != pid) | |
sysfatal("wait got wrong pid"); | |
if(atoi(w->msg) == 97) | |
sysfatal("exec ssh failed"); | |
free(w); | |
fprint(2, "stats: %s hung up; sleeping 60\n", sys); | |
sleep(60*1000); | |
fprint(2, "stats: redialing %s\n", sys); | |
break; | |
} | |
} | |
} | |
for(i=0; statfn[i]; i++) | |
statfn[i](1); | |
Binit(&bout, 1, OWRITE); | |
for(;;){ | |
Bflush(&bout); | |
sleep(900); | |
for(i=0; statfn[i]; i++) | |
statfn[i](0); | |
} | |
} | |
char buf[16384]; | |
char *line[100]; | |
char *tok[100]; | |
int nline, ntok; | |
void | |
readfile(int fd) | |
{ | |
int n; | |
if(fd == -1){ | |
nline = 0; | |
return; | |
} | |
seek(fd, 0, 0); | |
n = read(fd, buf, sizeof buf-1); | |
if(n < 0) | |
n = 0; | |
buf[n] = 0; | |
nline = getfields(buf, line, nelem(line), 0, "\n"); | |
} | |
void | |
tokens(int i) | |
{ | |
if(i >= nline){ | |
ntok = 0; | |
return; | |
} | |
ntok = tokenize(line[i], tok, nelem(tok)); | |
} | |