6b1b5debe86034e1f54998c81154955800fe4a0b
[doldaconnect.git] / config / speedrec.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/file.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <errno.h>
8 #include <time.h>
9 #include <signal.h>
10
11 char buf[65536];
12 volatile int eof;
13
14 void sighandler(int sig)
15 {
16     eof = 1;
17 }
18
19 int main(int argc, char **argv)
20 {
21     int i;
22     int ret, fd;
23     time_t starttime, endtime;
24     long long numbytes;
25     size_t datalen;
26     FILE *recfile;
27     int thisrec, numrecs, numuses, maxrec;
28     int recs[5];
29     
30     if(argc < 2)
31     {
32         fprintf(stderr, "usage: speedrec recfile\n");
33         exit(1);
34     }
35     numbytes = 0;
36     starttime = endtime = 0;
37     datalen = 0;
38     eof = 0;
39     signal(SIGHUP, sighandler);
40     signal(SIGINT, sighandler);
41     signal(SIGTERM, sighandler);
42     while(1)
43     {
44         ret = read(0, buf, sizeof(buf));
45         if((ret < 0) && (errno != EINTR))
46         {
47             perror("cannot read");
48             exit(1);
49         }
50         if((ret == 0) || eof)
51             break;
52         datalen = ret;
53         numbytes += ret;
54         while(datalen > 0)
55         {
56             ret = write(1, buf, datalen);
57             if((ret < 0) && (errno != EINTR))
58             {
59                 perror("cannot write");
60                 exit(1);
61             }
62             memmove(buf, buf + ret, datalen -= ret);
63         }
64     }
65     if((starttime == 0) || (endtime == 0) || (endtime == starttime))
66         exit(0);
67     if(numbytes == 0)
68         exit(0);
69     thisrec = (int)(numbytes / ((long long)(endtime - starttime)));
70     if((fd = open(argv[1], O_RDWR | O_CREAT, 0666)) < 0)
71     {
72         perror(argv[1]);
73         exit(1);
74     }
75     recfile = fdopen(fd, "r+");
76     close(0);
77     close(1);
78     flock(fd, LOCK_EX);
79     if(fscanf(recfile, "%i\n", &numuses) < 1)
80         numuses = 0;
81     if(fscanf(recfile, "%i\n", &maxrec) < 1)
82         maxrec = 0;
83     if(fscanf(recfile, "%i\n", &numrecs) < 1)
84         numrecs = 0;
85     for(i = 0; i < numrecs; i++)
86         fscanf(recfile, "%i\n", &recs[i]);
87     if(numrecs == 5)
88     {
89         for(i = 0; i < 4; i++)
90             recs[i] = recs[i + 1];
91         numrecs = 4;
92     }
93     recs[numrecs++] = thisrec;
94     rewind(recfile);
95     ftruncate(fd, 0);
96     fprintf(recfile, "%i\n", numuses + 1);
97     fprintf(recfile, "%i\n", (thisrec > maxrec)?thisrec:maxrec);
98     fprintf(recfile, "%i\n", numrecs);
99     for(i = 0; i < numrecs; i++)
100         fprintf(recfile, "%i\n", recs[i]);
101     flock(fd, LOCK_UN);
102     fclose(recfile);
103     return(0);
104 }