plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

main.c (1692B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include "dat.h"
      5 
      6 Biobuf bout;
      7 
      8 void
      9 usage(void)
     10 {
     11 	fprint(2, "usage: auxstats [system [executable]]\n");
     12 	exits("usage");
     13 }
     14 
     15 int pid;
     16 
     17 void
     18 notifyf(void *v, char *msg)
     19 {
     20 	USED(v);
     21 
     22 	if(strstr(msg, "child"))
     23 		noted(NCONT);
     24 	if(pid)
     25 		postnote(PNPROC, pid, msg);
     26 	exits(nil);
     27 }
     28 
     29 void
     30 main(int argc, char **argv)
     31 {
     32 	char *sys, *exe;
     33 	int i;
     34 	Waitmsg *w;
     35 
     36 	ARGBEGIN{
     37 	default:
     38 		usage();
     39 	}ARGEND
     40 
     41 	notify(notifyf);
     42 
     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();
     51 
     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 	}
     78 
     79 	for(i=0; statfn[i]; i++)
     80 		statfn[i](1);
     81 
     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 }
     90 
     91 char buf[16384];
     92 char *line[100];
     93 char *tok[100];
     94 int nline, ntok;
     95 
     96 void
     97 readfile(int fd)
     98 {
     99 	int n;
    100 
    101 	if(fd == -1){
    102 		nline = 0;
    103 		return;
    104 	}
    105 
    106 	seek(fd, 0, 0);
    107 	n = read(fd, buf, sizeof buf-1);
    108 	if(n < 0)
    109 		n = 0;
    110 	buf[n] = 0;
    111 
    112 	nline = getfields(buf, line, nelem(line), 0, "\n");
    113 }
    114 
    115 void
    116 tokens(int i)
    117 {
    118 	if(i >= nline){
    119 		ntok = 0;
    120 		return;
    121 	}
    122 	ntok = tokenize(line[i], tok, nelem(tok));
    123 }