1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright © 2020 Keith Packard
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above
14  *    copyright notice, this list of conditions and the following
15  *    disclaimer in the documentation and/or other materials provided
16  *    with the distribution.
17  *
18  * 3. Neither the name of the copyright holder nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33  * OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #include <stdlib.h>
37 #include <sys/time.h>
38 #include <stdio.h>
39 
40 int
main(void)41 main(void)
42 {
43         int             loop;
44         struct timeval  prev, cur;
45         int             ret;
46 
47         ret = gettimeofday(&prev, NULL);
48         if (ret < 0) {
49                 printf("gettimeofday return %d\n", ret);
50                 exit(2);
51         }
52         if (prev.tv_sec < 1600000000LL) {
53                 printf("gettimeofday return value before 2020-9-13 %lld\n",
54                        (long long) prev.tv_sec);
55                 exit(2);
56         }
57 	for (loop = 0; loop < 10000; loop++) {
58                 ret = gettimeofday(&cur, NULL);
59                 if (ret < 0) {
60                         printf("gettimeofday return %d\n", ret);
61                         exit(2);
62                 }
63                 if (cur.tv_sec > prev.tv_sec + 1000) {
64                         printf("gettimeofday: seconds changed by %lld\n",
65                                (long long) (cur.tv_sec - prev.tv_sec));
66                         exit(2);
67                 }
68                 if (cur.tv_sec > prev.tv_sec ||
69                     (cur.tv_sec == prev.tv_sec &&
70                      cur.tv_usec > prev.tv_usec))
71                 {
72                         printf("gettimeofday: ok\n");
73                         exit(0);
74                 }
75                 if (cur.tv_sec < prev.tv_sec ||
76                     (cur.tv_sec == prev.tv_sec &&
77                      cur.tv_usec < prev.tv_usec))
78                 {
79                         printf("gettimeofday: clock went backwards\n");
80                         exit(2);
81 		}
82 	}
83 	printf("gettimeofday: clock never changed\n");
84 	exit(1);
85 }
86