]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - usr.sbin/rtadvd/timer_subr.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / usr.sbin / rtadvd / timer_subr.c
1 /*      $FreeBSD$       */
2 /*      $KAME: timer.c,v 1.9 2002/06/10 19:59:47 itojun Exp $   */
3
4 /*
5  * Copyright (C) 1998 WIDE Project.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the project nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32
33 #include <sys/time.h>
34 #include <sys/queue.h>
35 #include <sys/socket.h>
36 #include <syslog.h>
37 #include <stdio.h>
38 #include <inttypes.h>
39
40 #include "timer.h"
41 #include "timer_subr.h"
42
43 struct timeval *
44 rtadvd_timer_rest(struct rtadvd_timer *rat)
45 {
46         static struct timeval returnval, now;
47
48         gettimeofday(&now, NULL);
49         if (TIMEVAL_LEQ(&rat->rat_tm, &now)) {
50                 syslog(LOG_DEBUG,
51                     "<%s> a timer must be expired, but not yet",
52                     __func__);
53                 returnval.tv_sec = returnval.tv_usec = 0;
54         }
55         else
56                 TIMEVAL_SUB(&rat->rat_tm, &now, &returnval);
57
58         return (&returnval);
59 }
60
61 /* result = a + b */
62 void
63 TIMEVAL_ADD(struct timeval *a, struct timeval *b, struct timeval *result)
64 {
65         long l;
66
67         if ((l = a->tv_usec + b->tv_usec) < MILLION) {
68                 result->tv_usec = l;
69                 result->tv_sec = a->tv_sec + b->tv_sec;
70         }
71         else {
72                 result->tv_usec = l - MILLION;
73                 result->tv_sec = a->tv_sec + b->tv_sec + 1;
74         }
75 }
76
77 /*
78  * result = a - b
79  * XXX: this function assumes that a >= b.
80  */
81 void
82 TIMEVAL_SUB(struct timeval *a, struct timeval *b, struct timeval *result)
83 {
84         long l;
85
86         if ((l = a->tv_usec - b->tv_usec) >= 0) {
87                 result->tv_usec = l;
88                 result->tv_sec = a->tv_sec - b->tv_sec;
89         }
90         else {
91                 result->tv_usec = MILLION + l;
92                 result->tv_sec = a->tv_sec - b->tv_sec - 1;
93         }
94 }
95
96 char *
97 sec2str(uint32_t s, char *buf)
98 {
99         uint32_t day;
100         uint32_t hour;
101         uint32_t min;
102         uint32_t sec;
103         char *p;
104
105         min = s / 60;
106         sec = s % 60;
107
108         hour = min / 60;
109         min = min % 60;
110
111         day = hour / 24;
112         hour = hour % 24;
113
114         p = buf;
115         if (day > 0)
116                 p += sprintf(p, "%" PRIu32 "d", day);
117         if (hour > 0)
118                 p += sprintf(p, "%" PRIu32 "h", hour);
119         if (min > 0)
120                 p += sprintf(p, "%" PRIu32 "m", min);
121
122         if ((p == buf) || (sec > 0 && p > buf))
123                 sprintf(p, "%" PRIu32 "s", sec);
124
125         return (buf);
126 }