+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/file.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <time.h>
+#include <signal.h>
+
+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);
+}