Move programs in /config into appropriate subdirectories.
[doldaconnect.git] / config / cmd / speedrec.c
diff --git a/config/cmd/speedrec.c b/config/cmd/speedrec.c
new file mode 100644 (file)
index 0000000..4638e33
--- /dev/null
@@ -0,0 +1,107 @@
+#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);
+}