X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=config%2Fcmd%2Fspeedrec.c;fp=config%2Fcmd%2Fspeedrec.c;h=4638e33c8b9eff7a4c781fb15f18e4cc8d69517f;hb=7df0ddad481bb2e644bba361d0d3defdbd68494e;hp=0000000000000000000000000000000000000000;hpb=d6af9cf30349e4c09b4e9e60342bf1ddd142abd1;p=doldaconnect.git diff --git a/config/cmd/speedrec.c b/config/cmd/speedrec.c new file mode 100644 index 0000000..4638e33 --- /dev/null +++ b/config/cmd/speedrec.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char buf[65536]; +volatile int eof; + +void sighandler(int sig) +{ + eof = 1; +} + +int main(int argc, char **argv) +{ + int i; + int ret, fd; + time_t starttime, endtime; + long long numbytes; + size_t datalen; + FILE *recfile; + int thisrec, numrecs, numuses, maxrec; + int recs[5]; + + if(argc < 2) + { + fprintf(stderr, "usage: speedrec recfile\n"); + exit(1); + } + numbytes = 0; + starttime = endtime = 0; + datalen = 0; + eof = 0; + signal(SIGHUP, sighandler); + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); + while(1) + { + ret = read(0, buf, sizeof(buf)); + if((ret < 0) && (errno != EINTR)) + { + perror("cannot read"); + exit(1); + } + if((ret == 0) || eof) + break; + if(starttime == 0) + starttime = time(NULL); + endtime = time(NULL); + datalen = ret; + numbytes += ret; + while(datalen > 0) + { + ret = write(1, buf, datalen); + if((ret < 0) && (errno != EINTR)) + { + perror("cannot write"); + exit(1); + } + memmove(buf, buf + ret, datalen -= ret); + } + } + if((starttime == 0) || (endtime == 0) || (endtime == starttime)) + exit(0); + if(numbytes == 0) + exit(0); + thisrec = (int)(numbytes / ((long long)(endtime - starttime))); + if((fd = open(argv[1], O_RDWR | O_CREAT, 0666)) < 0) + { + perror(argv[1]); + exit(1); + } + recfile = fdopen(fd, "r+"); + close(0); + close(1); + flock(fd, LOCK_EX); + if(fscanf(recfile, "%i\n", &numuses) < 1) + numuses = 0; + if(fscanf(recfile, "%i\n", &maxrec) < 1) + maxrec = 0; + if(fscanf(recfile, "%i\n", &numrecs) < 1) + numrecs = 0; + for(i = 0; i < numrecs; i++) + fscanf(recfile, "%i\n", &recs[i]); + if(numrecs == 5) + { + for(i = 0; i < 4; i++) + recs[i] = recs[i + 1]; + numrecs = 4; + } + recs[numrecs++] = thisrec; + rewind(recfile); + ftruncate(fd, 0); + fprintf(recfile, "%i\n", numuses + 1); + fprintf(recfile, "%i\n", (thisrec > maxrec)?thisrec:maxrec); + fprintf(recfile, "%i\n", numrecs); + for(i = 0; i < numrecs; i++) + fprintf(recfile, "%i\n", recs[i]); + flock(fd, LOCK_UN); + fclose(recfile); + return(0); +}