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 postnote(PNPROC, pid, msg);25 exits(nil);26 }28 void29 main(int argc, char **argv)30 {31 char *sys, *exe;32 int i;33 Waitmsg *w;35 ARGBEGIN{36 default:37 usage();38 }ARGEND40 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 void96 readfile(int fd)97 {98 int n;100 if(fd == -1){101 nline = 0;102 return;103 }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");112 }114 void115 tokens(int i)116 {117 if(i >= nline){118 ntok = 0;119 return;120 }121 ntok = tokenize(line[i], tok, nelem(tok));122 }