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