summaryrefslogtreecommitdiffstats
path: root/bin/local/timettyrec.c
blob: 77d97e3c8584dd9070b02ac1cc6150cef49c5146 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * Copyright (c) 2004, Jilles Tjoelker
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with
 * or without modification, are permitted provided that the
 * following conditions are met:
 *
 * 1. Redistributions of source code must retain the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions and
 *    the following disclaimer in the documentation and/or
 *    other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

#include <sys/types.h>
#include <sys/time.h>

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    unsigned char buf[12];
    char data[65536];
    int n;
    int r;
    struct timeval totaltime, prev, cur, diff, thres;
    int first = 1;

    if (argc != 1)
    {
	fprintf(stderr, "Usage: %s\n", argv[0]);
	return 1;
    }

    timerclear(&totaltime);
    thres.tv_sec = 10;
    thres.tv_usec = 0;

    while ((errno = 0), fread(buf, 1, 12, stdin) == 12)
    {
	cur.tv_sec = (((((buf[3] << 8) | buf[2]) << 8) | buf[1]) << 8) | buf[0];
	cur.tv_usec = (((((buf[7] << 8) | buf[6]) << 8) | buf[5]) << 8) | buf[4];
	if (first)
	    first = 0;
	else
	{
	    timersub(&cur, &prev, &diff);
	    if (timercmp(&diff, &thres, >))
		diff = thres;
	    timeradd(&totaltime, &diff, &totaltime);
	}
	prev = cur;
	n = (((((buf[11] << 8) | buf[10]) << 8) | buf[9]) << 8) | buf[8];
	if ((unsigned int)n > sizeof(data))
	{
	    fprintf(stderr, "h->len too big (%d)\n", n);
	    exit(1);
	}
	r = fread(data, 1, n, stdin);
	if (n != r)
	{
	    perror("read stdin");
	    exit(1);
	}
    }

    if (errno != 0)
    {
	perror("read stdin");
	exit(1);
    }

    printf("%ld.%06ld\n", totaltime.tv_sec, totaltime.tv_usec);

    return 0;
}

/* vim:ts=8:cin:sw=4
 *  */