text: #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));
  }
  
  