/* dumpnetload.c by Michael Thorpe 2006-07-13 */ #include #include #include #include #include #include #include #include #include #include struct result { unsigned int sequence; float latency; /* in msec */ }; static const char usage[]="usage: dumpnetload [-d] [-l ] \n"; static char *errorfile=0; static char *host; static void error(const char *msg) { FILE *f; if(errorfile) { f=fopen(errorfile,"w"); if(f) { fputs(msg,f); fclose(f); } } exit(1); } int parseline(char *s,struct result *result) { while(isdigit(*s)) s++; if(strncmp(s," bytes from ",12)) return(1); s+=12; while(!isspace(*s)) s++; if(2 != sscanf(s," icmp_seq=%u ttl=%*u time=%f ms",&result->sequence,&result->latency)) return(1); return(0); } static const char *makefilename(const struct tm *tm) { static char t[16]; snprintf(t,sizeof(t),"%04u-%02u-%02u",1900+tm->tm_year,tm->tm_mon+1,tm->tm_mday); return(t); } void writeall(int fd,char *s) { int i,j; i=strlen(s); while(i) { j=write(fd,s,i); if(j<=0) error("Couldn't write output file!\n"); s+=j; i-=j; } } int doit(int fout,unsigned int numsamples,int firsttime) { FILE *f; int i,seq; char s[128]; struct result res; i=snprintf(s,sizeof(s),"ping -n -i 5 -s 8 -c %u %s",numsamples,host); if(i<=0 || i>=sizeof(s)-1) return(1); f=popen(s,"r"); if(!f) return(1); if(firsttime) writeall(fout,"restart\n"); seq=0; while(s==fgets(s,sizeof(s),f)) { if(parseline(s,&res)) continue; while(seqres.sequence) writeall(fout,"restart\n"); */ snprintf(s,sizeof(s),"%.2f\n",res.latency); writeall(fout,s); seq=res.sequence+1; } while(seq error log filename\n",stdout); return(0); case 'l': if(errorfile) { fputs("Why specify two log files for errors?\n",stderr); return(1); } errorfile=optarg; break; case '?': return(1); } } if(argc != optind+2) { fputs(usage,stderr); return(1); } host=argv[optind++]; if(chdir(argv[optind])) { fprintf(stderr,"Couldn't chdir to %s!\n",argv[optind]); return(1); } if(daemonmode) { i=fork(); if(i<0) { fprintf(stderr,"Couldn't fork!\n"); return(-1); } else if(i>0) return(0); close(0); close(1); close(2); } signal(SIGCHLD,SIG_IGN); time(&dumbassesdesignedlibc); tm=gmtime(&dumbassesdesignedlibc); while(1) { i=fork(); if(i<0) { fprintf(stderr,"Couldn't fork!\n"); return(-1); } else if(i>0) { oldday=(tm->tm_year*512)+(tm->tm_mon*32)+tm->tm_mday; do { i=(60-tm->tm_sec)+60*((59-tm->tm_min)+60*(23-tm->tm_hour)); sleep(i); time(&dumbassesdesignedlibc); tm=gmtime(&dumbassesdesignedlibc); i=(tm->tm_year*512)+(tm->tm_mon*32)+tm->tm_mday; } while(i==oldday); } else { i=(60-tm->tm_sec)+60*((59-tm->tm_min)+60*(23-tm->tm_hour)); if(i<5) exit(0); fname=makefilename(tm); f=open(fname,O_WRONLY|O_CREAT|O_APPEND,0666); if(f==-1) error("Couldn't open output file!\n"); doit(f,i/5,firsttime); exit(0); } firsttime=0; } error("How'd we get here?!?"); return(42); }