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#include <stdio.h>
26#include <stdlib.h>
27#include <unistd.h>
28#include <time.h>
29#include <sys/time.h>
30#ifdef KTEST
31#include "../kselftest.h"
32#else
33static inline int ksft_exit_pass(void)
34{
35 exit(0);
36}
37static inline int ksft_exit_fail(void)
38{
39 exit(1);
40}
41#endif
42
43#define NSEC_PER_SEC 1000000000LL
44
45#define KTIME_MAX ((long long)~((unsigned long long)1 << 63))
46#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
47
48#define YEAR_1901 (-0x7fffffffL)
49#define YEAR_1970 1
50#define YEAR_2038 0x7fffffffL
51#define YEAR_2262 KTIME_SEC_MAX
52#define YEAR_MAX ((long long)((1ULL<<63)-1))
53
54int is32bits(void)
55{
56 return (sizeof(long) == 4);
57}
58
59int settime(long long time)
60{
61 struct timeval now;
62 int ret;
63
64 now.tv_sec = (time_t)time;
65 now.tv_usec = 0;
66
67 ret = settimeofday(&now, NULL);
68
69 printf("Setting time to 0x%lx: %d\n", (long)time, ret);
70 return ret;
71}
72
73int do_tests(void)
74{
75 int ret;
76
77 ret = system("date");
78 ret = system("./inconsistency-check -c 0 -t 20");
79 ret |= system("./nanosleep");
80 ret |= system("./nsleep-lat");
81 return ret;
82
83}
84
85int main(int argc, char *argv[])
86{
87 int ret = 0;
88 int opt, dangerous = 0;
89 time_t start;
90
91
92 while ((opt = getopt(argc, argv, "d")) != -1) {
93 switch (opt) {
94 case 'd':
95 dangerous = 1;
96 }
97 }
98
99 start = time(0);
100
101
102 if (!settime(YEAR_1901)) {
103 ret = -1;
104 goto out;
105 }
106 if (!settime(YEAR_MAX)) {
107 ret = -1;
108 goto out;
109 }
110 if (!is32bits() && !settime(YEAR_2262)) {
111 ret = -1;
112 goto out;
113 }
114
115
116 settime(YEAR_1970);
117 ret = do_tests();
118 if (ret)
119 goto out;
120
121 settime(YEAR_2038 - 600);
122 ret = do_tests();
123 if (ret)
124 goto out;
125
126
127 if (is32bits() && !dangerous)
128 goto out;
129
130 settime(YEAR_2038 - 10);
131 ret = do_tests();
132 if (ret)
133 goto out;
134
135 settime(YEAR_2262 - 600);
136 ret = do_tests();
137
138out:
139
140 settime(start);
141 if (ret)
142 return ksft_exit_fail();
143 return ksft_exit_pass();
144}
145