Cleanup and bugfixes(...).
[doldaconnect.git] / config / speedrec.c
CommitLineData
d3372da9 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>
d3372da9 9#include <signal.h>
10
e374cdc3 11char buf[65536];
d3372da9 12volatile int eof;
13
14void sighandler(int sig)
15{
16 eof = 1;
17}
18
19int 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;
d3372da9 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 {
e374cdc3 44 ret = read(0, buf, sizeof(buf));
d3372da9 45 if((ret < 0) && (errno != EINTR))
46 {
e374cdc3 47 perror("cannot read");
d3372da9 48 exit(1);
49 }
e374cdc3 50 if((ret == 0) || eof)
51 break;
52 datalen = ret;
53 numbytes += ret;
54 while(datalen > 0)
d3372da9 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 }
d3372da9 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}