summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/regress/lib/libc/time/time_conversion/Makefile11
-rw-r--r--src/regress/lib/libc/time/time_conversion/timetest.c1725
2 files changed, 1736 insertions, 0 deletions
diff --git a/src/regress/lib/libc/time/time_conversion/Makefile b/src/regress/lib/libc/time/time_conversion/Makefile
new file mode 100644
index 0000000000..fa73d6acc0
--- /dev/null
+++ b/src/regress/lib/libc/time/time_conversion/Makefile
@@ -0,0 +1,11 @@
1# $OpenBSD: Makefile,v 1.1 2022/11/06 12:57:08 beck Exp $
2
3PROG= timetest
4SRCS= timetest.c
5
6REGRESS_TARGETS=do-timetest
7
8do-timetest: ${PROG}
9 ./${PROG}
10
11.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/time/time_conversion/timetest.c b/src/regress/lib/libc/time/time_conversion/timetest.c
new file mode 100644
index 0000000000..825315c464
--- /dev/null
+++ b/src/regress/lib/libc/time/time_conversion/timetest.c
@@ -0,0 +1,1725 @@
1/* $OpenBSD: timetest.c,v 1.1 2022/11/06 12:57:08 beck Exp $ */
2
3/*
4 * Copyright (c) 2022 Bob Beck <beck@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/stat.h>
20#include <sys/stdint.h>
21#include <sys/types.h>
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <time.h>
27
28struct timetest {
29 char *descr;
30 char *timezone;
31 time_t time;
32 struct tm local_tm;
33 struct tm gmt_tm;
34};
35
36static int tm_match(struct tm * tm1, struct tm *tm2) {
37 if (tm2->tm_year != tm1->tm_year ||
38 tm2->tm_mon != tm1->tm_mon ||
39 tm2->tm_mday != tm1->tm_mday ||
40 tm2->tm_hour != tm1->tm_hour ||
41 tm2->tm_min != tm1->tm_min ||
42 tm2->tm_sec != tm1->tm_sec ||
43 tm2->tm_wday != tm1->tm_wday ||
44 tm2->tm_yday != tm1->tm_yday ||
45 tm2->tm_yday != tm1->tm_yday ||
46 tm2->tm_isdst != tm1->tm_isdst ||
47 tm2->tm_gmtoff != tm1->tm_gmtoff ||
48 strcmp(tm2->tm_zone, tm1->tm_zone) != 0)
49 return 0;
50 return 1;
51}
52
53struct timetest timetests[] = {
54 {
55 .descr="moon",
56 .timezone="posix/America/Edmonton",
57 .time=-16751025,
58 .local_tm= {
59 .tm_year=69,
60 .tm_mon=5,
61 .tm_mday=20,
62 .tm_hour=19,
63 .tm_min=56,
64 .tm_sec=15,
65 .tm_wday=5,
66 .tm_yday=170,
67 .tm_isdst=0,
68 .tm_gmtoff=-25200,
69 .tm_zone="MST"
70 },
71 .gmt_tm= {
72 .tm_year=69,
73 .tm_mon=5,
74 .tm_mday=21,
75 .tm_hour=2,
76 .tm_min=56,
77 .tm_sec=15,
78 .tm_wday=6,
79 .tm_yday=171,
80 .tm_isdst=0,
81 .tm_gmtoff=0,
82 .tm_zone="GMT"
83 },
84 },
85 {
86 .descr="moon",
87 .timezone="right/UTC",
88 .time=-16751025,
89 .local_tm= {
90 .tm_year=69,
91 .tm_mon=5,
92 .tm_mday=21,
93 .tm_hour=2,
94 .tm_min=56,
95 .tm_sec=15,
96 .tm_wday=6,
97 .tm_yday=171,
98 .tm_isdst=0,
99 .tm_gmtoff=0,
100 .tm_zone="UTC"
101 },
102 .gmt_tm= {
103 .tm_year=69,
104 .tm_mon=5,
105 .tm_mday=21,
106 .tm_hour=2,
107 .tm_min=56,
108 .tm_sec=15,
109 .tm_wday=6,
110 .tm_yday=171,
111 .tm_isdst=0,
112 .tm_gmtoff=0,
113 .tm_zone="GMT"
114 },
115 },
116 {
117 .descr="moon",
118 .timezone="right/America/Edmonton",
119 .time=-16751025,
120 .local_tm= {
121 .tm_year=69,
122 .tm_mon=5,
123 .tm_mday=20,
124 .tm_hour=19,
125 .tm_min=56,
126 .tm_sec=15,
127 .tm_wday=5,
128 .tm_yday=170,
129 .tm_isdst=0,
130 .tm_gmtoff=-25200,
131 .tm_zone="MST"
132 },
133 .gmt_tm= {
134 .tm_year=69,
135 .tm_mon=5,
136 .tm_mday=21,
137 .tm_hour=2,
138 .tm_min=56,
139 .tm_sec=15,
140 .tm_wday=6,
141 .tm_yday=171,
142 .tm_isdst=0,
143 .tm_gmtoff=0,
144 .tm_zone="GMT"
145 },
146 },
147 {
148 .descr="epoch",
149 .timezone="posix/America/Edmonton",
150 .time=0,
151 .local_tm= {
152 .tm_year=69,
153 .tm_mon=11,
154 .tm_mday=31,
155 .tm_hour=17,
156 .tm_min=0,
157 .tm_sec=0,
158 .tm_wday=3,
159 .tm_yday=364,
160 .tm_isdst=0,
161 .tm_gmtoff=-25200,
162 .tm_zone="MST"
163 },
164 .gmt_tm= {
165 .tm_year=70,
166 .tm_mon=0,
167 .tm_mday=1,
168 .tm_hour=0,
169 .tm_min=0,
170 .tm_sec=0,
171 .tm_wday=4,
172 .tm_yday=0,
173 .tm_isdst=0,
174 .tm_gmtoff=0,
175 .tm_zone="GMT"
176 },
177 },
178 {
179 .descr="epoch",
180 .timezone="right/UTC",
181 .time=0,
182 .local_tm= {
183 .tm_year=70,
184 .tm_mon=0,
185 .tm_mday=1,
186 .tm_hour=0,
187 .tm_min=0,
188 .tm_sec=0,
189 .tm_wday=4,
190 .tm_yday=0,
191 .tm_isdst=0,
192 .tm_gmtoff=0,
193 .tm_zone="UTC"
194 },
195 .gmt_tm= {
196 .tm_year=70,
197 .tm_mon=0,
198 .tm_mday=1,
199 .tm_hour=0,
200 .tm_min=0,
201 .tm_sec=0,
202 .tm_wday=4,
203 .tm_yday=0,
204 .tm_isdst=0,
205 .tm_gmtoff=0,
206 .tm_zone="GMT"
207 },
208 },
209 {
210 .descr="epoch",
211 .timezone="right/America/Edmonton",
212 .time=0,
213 .local_tm= {
214 .tm_year=69,
215 .tm_mon=11,
216 .tm_mday=31,
217 .tm_hour=17,
218 .tm_min=0,
219 .tm_sec=0,
220 .tm_wday=3,
221 .tm_yday=364,
222 .tm_isdst=0,
223 .tm_gmtoff=-25200,
224 .tm_zone="MST"
225 },
226 .gmt_tm= {
227 .tm_year=70,
228 .tm_mon=0,
229 .tm_mday=1,
230 .tm_hour=0,
231 .tm_min=0,
232 .tm_sec=0,
233 .tm_wday=4,
234 .tm_yday=0,
235 .tm_isdst=0,
236 .tm_gmtoff=0,
237 .tm_zone="GMT"
238 },
239 },
240 {
241 .descr="epoch - 1",
242 .timezone="posix/America/Edmonton",
243 .time=-1,
244 .local_tm= {
245 .tm_year=69,
246 .tm_mon=11,
247 .tm_mday=31,
248 .tm_hour=16,
249 .tm_min=59,
250 .tm_sec=59,
251 .tm_wday=3,
252 .tm_yday=364,
253 .tm_isdst=0,
254 .tm_gmtoff=-25200,
255 .tm_zone="MST"
256 },
257 .gmt_tm= {
258 .tm_year=69,
259 .tm_mon=11,
260 .tm_mday=31,
261 .tm_hour=23,
262 .tm_min=59,
263 .tm_sec=59,
264 .tm_wday=3,
265 .tm_yday=364,
266 .tm_isdst=0,
267 .tm_gmtoff=0,
268 .tm_zone="GMT"
269 },
270 },
271 {
272 .descr="epoch - 1",
273 .timezone="right/UTC",
274 .time=-1,
275 .local_tm= {
276 .tm_year=69,
277 .tm_mon=11,
278 .tm_mday=31,
279 .tm_hour=23,
280 .tm_min=59,
281 .tm_sec=59,
282 .tm_wday=3,
283 .tm_yday=364,
284 .tm_isdst=0,
285 .tm_gmtoff=0,
286 .tm_zone="UTC"
287 },
288 .gmt_tm= {
289 .tm_year=69,
290 .tm_mon=11,
291 .tm_mday=31,
292 .tm_hour=23,
293 .tm_min=59,
294 .tm_sec=59,
295 .tm_wday=3,
296 .tm_yday=364,
297 .tm_isdst=0,
298 .tm_gmtoff=0,
299 .tm_zone="GMT"
300 },
301 },
302 {
303 .descr="epoch - 1",
304 .timezone="right/America/Edmonton",
305 .time=-1,
306 .local_tm= {
307 .tm_year=69,
308 .tm_mon=11,
309 .tm_mday=31,
310 .tm_hour=16,
311 .tm_min=59,
312 .tm_sec=59,
313 .tm_wday=3,
314 .tm_yday=364,
315 .tm_isdst=0,
316 .tm_gmtoff=-25200,
317 .tm_zone="MST"
318 },
319 .gmt_tm= {
320 .tm_year=69,
321 .tm_mon=11,
322 .tm_mday=31,
323 .tm_hour=23,
324 .tm_min=59,
325 .tm_sec=59,
326 .tm_wday=3,
327 .tm_yday=364,
328 .tm_isdst=0,
329 .tm_gmtoff=0,
330 .tm_zone="GMT"
331 },
332 },
333 {
334 .descr="legacy min",
335 .timezone="posix/America/Edmonton",
336 .time=-2147483648,
337 .local_tm= {
338 .tm_year=1,
339 .tm_mon=11,
340 .tm_mday=13,
341 .tm_hour=13,
342 .tm_min=12,
343 .tm_sec=0,
344 .tm_wday=5,
345 .tm_yday=346,
346 .tm_isdst=0,
347 .tm_gmtoff=-27232,
348 .tm_zone="LMT"
349 },
350 .gmt_tm= {
351 .tm_year=1,
352 .tm_mon=11,
353 .tm_mday=13,
354 .tm_hour=20,
355 .tm_min=45,
356 .tm_sec=52,
357 .tm_wday=5,
358 .tm_yday=346,
359 .tm_isdst=0,
360 .tm_gmtoff=0,
361 .tm_zone="GMT"
362 },
363 },
364 {
365 .descr="legacy min",
366 .timezone="right/UTC",
367 .time=-2147483648,
368 .local_tm= {
369 .tm_year=1,
370 .tm_mon=11,
371 .tm_mday=13,
372 .tm_hour=20,
373 .tm_min=45,
374 .tm_sec=52,
375 .tm_wday=5,
376 .tm_yday=346,
377 .tm_isdst=0,
378 .tm_gmtoff=0,
379 .tm_zone="UTC"
380 },
381 .gmt_tm= {
382 .tm_year=1,
383 .tm_mon=11,
384 .tm_mday=13,
385 .tm_hour=20,
386 .tm_min=45,
387 .tm_sec=52,
388 .tm_wday=5,
389 .tm_yday=346,
390 .tm_isdst=0,
391 .tm_gmtoff=0,
392 .tm_zone="GMT"
393 },
394 },
395 {
396 .descr="legacy min - 1",
397 .timezone="posix/America/Edmonton",
398 .time=-2147483649,
399 .local_tm= {
400 .tm_year=1,
401 .tm_mon=11,
402 .tm_mday=13,
403 .tm_hour=13,
404 .tm_min=11,
405 .tm_sec=59,
406 .tm_wday=5,
407 .tm_yday=346,
408 .tm_isdst=0,
409 .tm_gmtoff=-27232,
410 .tm_zone="LMT"
411 },
412 .gmt_tm= {
413 .tm_year=1,
414 .tm_mon=11,
415 .tm_mday=13,
416 .tm_hour=20,
417 .tm_min=45,
418 .tm_sec=51,
419 .tm_wday=5,
420 .tm_yday=346,
421 .tm_isdst=0,
422 .tm_gmtoff=0,
423 .tm_zone="GMT"
424 },
425 },
426 {
427 .descr="legacy min - 1",
428 .timezone="right/UTC",
429 .time=-2147483649,
430 .local_tm= {
431 .tm_year=1,
432 .tm_mon=11,
433 .tm_mday=13,
434 .tm_hour=20,
435 .tm_min=45,
436 .tm_sec=51,
437 .tm_wday=5,
438 .tm_yday=346,
439 .tm_isdst=0,
440 .tm_gmtoff=0,
441 .tm_zone="UTC"
442 },
443 .gmt_tm= {
444 .tm_year=1,
445 .tm_mon=11,
446 .tm_mday=13,
447 .tm_hour=20,
448 .tm_min=45,
449 .tm_sec=51,
450 .tm_wday=5,
451 .tm_yday=346,
452 .tm_isdst=0,
453 .tm_gmtoff=0,
454 .tm_zone="GMT"
455 },
456 },
457 {
458 .descr="legacy max",
459 .timezone="posix/America/Edmonton",
460 .time=2147483647,
461 .local_tm= {
462 .tm_year=138,
463 .tm_mon=0,
464 .tm_mday=18,
465 .tm_hour=20,
466 .tm_min=14,
467 .tm_sec=7,
468 .tm_wday=1,
469 .tm_yday=17,
470 .tm_isdst=0,
471 .tm_gmtoff=-25200,
472 .tm_zone="MST"
473 },
474 .gmt_tm= {
475 .tm_year=138,
476 .tm_mon=0,
477 .tm_mday=19,
478 .tm_hour=3,
479 .tm_min=14,
480 .tm_sec=7,
481 .tm_wday=2,
482 .tm_yday=18,
483 .tm_isdst=0,
484 .tm_gmtoff=0,
485 .tm_zone="GMT"
486 },
487 },
488 {
489 .descr="legacy max",
490 .timezone="right/UTC",
491 .time=2147483647,
492 .local_tm= {
493 .tm_year=138,
494 .tm_mon=0,
495 .tm_mday=19,
496 .tm_hour=3,
497 .tm_min=13,
498 .tm_sec=40,
499 .tm_wday=2,
500 .tm_yday=18,
501 .tm_isdst=0,
502 .tm_gmtoff=0,
503 .tm_zone="UTC"
504 },
505 .gmt_tm= {
506 .tm_year=138,
507 .tm_mon=0,
508 .tm_mday=19,
509 .tm_hour=3,
510 .tm_min=14,
511 .tm_sec=7,
512 .tm_wday=2,
513 .tm_yday=18,
514 .tm_isdst=0,
515 .tm_gmtoff=0,
516 .tm_zone="GMT"
517 },
518 },
519 {
520 .descr="legacy max + 1",
521 .timezone="posix/America/Edmonton",
522 .time=2147483648,
523 .local_tm= {
524 .tm_year=138,
525 .tm_mon=0,
526 .tm_mday=18,
527 .tm_hour=20,
528 .tm_min=14,
529 .tm_sec=8,
530 .tm_wday=1,
531 .tm_yday=17,
532 .tm_isdst=0,
533 .tm_gmtoff=-25200,
534 .tm_zone="MST"
535 },
536 .gmt_tm= {
537 .tm_year=138,
538 .tm_mon=0,
539 .tm_mday=19,
540 .tm_hour=3,
541 .tm_min=14,
542 .tm_sec=8,
543 .tm_wday=2,
544 .tm_yday=18,
545 .tm_isdst=0,
546 .tm_gmtoff=0,
547 .tm_zone="GMT"
548 },
549 },
550 {
551 .descr="legacy max + 1",
552 .timezone="right/UTC",
553 .time=2147483648,
554 .local_tm= {
555 .tm_year=138,
556 .tm_mon=0,
557 .tm_mday=19,
558 .tm_hour=3,
559 .tm_min=13,
560 .tm_sec=41,
561 .tm_wday=2,
562 .tm_yday=18,
563 .tm_isdst=0,
564 .tm_gmtoff=0,
565 .tm_zone="UTC"
566 },
567 .gmt_tm= {
568 .tm_year=138,
569 .tm_mon=0,
570 .tm_mday=19,
571 .tm_hour=3,
572 .tm_min=14,
573 .tm_sec=8,
574 .tm_wday=2,
575 .tm_yday=18,
576 .tm_isdst=0,
577 .tm_gmtoff=0,
578 .tm_zone="GMT"
579 },
580 },
581 {
582 .descr="min",
583 .timezone="posix/America/Edmonton",
584 .time=INT64_MIN,
585 .local_tm= {
586 .tm_year=0,
587 .tm_mon=0,
588 .tm_mday=0,
589 .tm_hour=0,
590 .tm_min=0,
591 .tm_sec=0,
592 .tm_wday=0,
593 .tm_yday=0,
594 .tm_isdst=0,
595 .tm_gmtoff=0,
596 .tm_zone="FAILURE"
597 },
598 .gmt_tm= {
599 .tm_year=0,
600 .tm_mon=0,
601 .tm_mday=0,
602 .tm_hour=0,
603 .tm_min=0,
604 .tm_sec=0,
605 .tm_wday=0,
606 .tm_yday=0,
607 .tm_isdst=0,
608 .tm_gmtoff=0,
609 .tm_zone="FAILURE"
610 },
611 },
612 {
613 .descr="min",
614 .timezone="right/UTC",
615 .time=INT64_MIN,
616 .local_tm= {
617 .tm_year=0,
618 .tm_mon=0,
619 .tm_mday=0,
620 .tm_hour=0,
621 .tm_min=0,
622 .tm_sec=0,
623 .tm_wday=0,
624 .tm_yday=0,
625 .tm_isdst=0,
626 .tm_gmtoff=0,
627 .tm_zone="FAILURE"
628 },
629 .gmt_tm= {
630 .tm_year=0,
631 .tm_mon=0,
632 .tm_mday=0,
633 .tm_hour=0,
634 .tm_min=0,
635 .tm_sec=0,
636 .tm_wday=0,
637 .tm_yday=0,
638 .tm_isdst=0,
639 .tm_gmtoff=0,
640 .tm_zone="FAILURE"
641 },
642 },
643 {
644 .descr="max",
645 .timezone="right/America/Edmonton",
646 .time=9223372036854775807,
647 .local_tm= {
648 .tm_year=0,
649 .tm_mon=0,
650 .tm_mday=0,
651 .tm_hour=0,
652 .tm_min=0,
653 .tm_sec=0,
654 .tm_wday=0,
655 .tm_yday=0,
656 .tm_isdst=0,
657 .tm_gmtoff=0,
658 .tm_zone="FAILURE"
659 },
660 .gmt_tm= {
661 .tm_year=0,
662 .tm_mon=0,
663 .tm_mday=0,
664 .tm_hour=0,
665 .tm_min=0,
666 .tm_sec=0,
667 .tm_wday=0,
668 .tm_yday=0,
669 .tm_isdst=0,
670 .tm_gmtoff=0,
671 .tm_zone="FAILURE"
672 },
673 },
674 {
675 .descr="max",
676 .timezone="posix/America/Edmonton",
677 .time=9223372036854775807,
678 .local_tm= {
679 .tm_year=0,
680 .tm_mon=0,
681 .tm_mday=0,
682 .tm_hour=0,
683 .tm_min=0,
684 .tm_sec=0,
685 .tm_wday=0,
686 .tm_yday=0,
687 .tm_isdst=0,
688 .tm_gmtoff=0,
689 .tm_zone="FAILURE"
690 },
691 .gmt_tm= {
692 .tm_year=0,
693 .tm_mon=0,
694 .tm_mday=0,
695 .tm_hour=0,
696 .tm_min=0,
697 .tm_sec=0,
698 .tm_wday=0,
699 .tm_yday=0,
700 .tm_isdst=0,
701 .tm_gmtoff=0,
702 .tm_zone="FAILURE"
703 },
704 },
705 {
706 .descr="max",
707 .timezone="right/UTC",
708 .time=9223372036854775807,
709 .local_tm= {
710 .tm_year=0,
711 .tm_mon=0,
712 .tm_mday=0,
713 .tm_hour=0,
714 .tm_min=0,
715 .tm_sec=0,
716 .tm_wday=0,
717 .tm_yday=0,
718 .tm_isdst=0,
719 .tm_gmtoff=0,
720 .tm_zone="FAILURE"
721 },
722 .gmt_tm= {
723 .tm_year=0,
724 .tm_mon=0,
725 .tm_mday=0,
726 .tm_hour=0,
727 .tm_min=0,
728 .tm_sec=0,
729 .tm_wday=0,
730 .tm_yday=0,
731 .tm_isdst=0,
732 .tm_gmtoff=0,
733 .tm_zone="FAILURE"
734 },
735 },
736 {
737 .descr="min",
738 .timezone="right/America/Edmonton",
739 .time=INT64_MIN,
740 .local_tm= {
741 .tm_year=0,
742 .tm_mon=0,
743 .tm_mday=0,
744 .tm_hour=0,
745 .tm_min=0,
746 .tm_sec=0,
747 .tm_wday=0,
748 .tm_yday=0,
749 .tm_isdst=0,
750 .tm_gmtoff=0,
751 .tm_zone="FAILURE"
752 },
753 .gmt_tm= {
754 .tm_year=0,
755 .tm_mon=0,
756 .tm_mday=0,
757 .tm_hour=0,
758 .tm_min=0,
759 .tm_sec=0,
760 .tm_wday=0,
761 .tm_yday=0,
762 .tm_isdst=0,
763 .tm_gmtoff=0,
764 .tm_zone="FAILURE"
765 },
766 },
767 {
768 .descr="0000",
769 .timezone="posix/America/Edmonton",
770 .time=-62167219200,
771 .local_tm= {
772 .tm_year=-1901,
773 .tm_mon=11,
774 .tm_mday=31,
775 .tm_hour=16,
776 .tm_min=26,
777 .tm_sec=8,
778 .tm_wday=5,
779 .tm_yday=364,
780 .tm_isdst=0,
781 .tm_gmtoff=-27232,
782 .tm_zone="LMT"
783 },
784 .gmt_tm= {
785 .tm_year=-1900,
786 .tm_mon=0,
787 .tm_mday=1,
788 .tm_hour=0,
789 .tm_min=0,
790 .tm_sec=0,
791 .tm_wday=6,
792 .tm_yday=0,
793 .tm_isdst=0,
794 .tm_gmtoff=0,
795 .tm_zone="GMT"
796 },
797 },
798 {
799 .descr="0000",
800 .timezone="right/UTC",
801 .time=-62167219200,
802 .local_tm= {
803 .tm_year=-1900,
804 .tm_mon=0,
805 .tm_mday=1,
806 .tm_hour=0,
807 .tm_min=0,
808 .tm_sec=0,
809 .tm_wday=6,
810 .tm_yday=0,
811 .tm_isdst=0,
812 .tm_gmtoff=0,
813 .tm_zone="UTC"
814 },
815 .gmt_tm= {
816 .tm_year=-1900,
817 .tm_mon=0,
818 .tm_mday=1,
819 .tm_hour=0,
820 .tm_min=0,
821 .tm_sec=0,
822 .tm_wday=6,
823 .tm_yday=0,
824 .tm_isdst=0,
825 .tm_gmtoff=0,
826 .tm_zone="GMT"
827 },
828 },
829 {
830 .descr="0000",
831 .timezone="right/America/Edmonton",
832 .time=-62167219200,
833 .local_tm= {
834 .tm_year=-1901,
835 .tm_mon=11,
836 .tm_mday=31,
837 .tm_hour=16,
838 .tm_min=26,
839 .tm_sec=8,
840 .tm_wday=5,
841 .tm_yday=364,
842 .tm_isdst=0,
843 .tm_gmtoff=-27232,
844 .tm_zone="LMT"
845 },
846 .gmt_tm= {
847 .tm_year=-1900,
848 .tm_mon=0,
849 .tm_mday=1,
850 .tm_hour=0,
851 .tm_min=0,
852 .tm_sec=0,
853 .tm_wday=6,
854 .tm_yday=0,
855 .tm_isdst=0,
856 .tm_gmtoff=0,
857 .tm_zone="GMT"
858 },
859 },
860 {
861 .descr="9999",
862 .timezone="posix/America/Edmonton",
863 .time=253402300799,
864 .local_tm= {
865 .tm_year=8099,
866 .tm_mon=11,
867 .tm_mday=31,
868 .tm_hour=16,
869 .tm_min=59,
870 .tm_sec=59,
871 .tm_wday=5,
872 .tm_yday=364,
873 .tm_isdst=0,
874 .tm_gmtoff=-25200,
875 .tm_zone="MST"
876 },
877 .gmt_tm= {
878 .tm_year=8099,
879 .tm_mon=11,
880 .tm_mday=31,
881 .tm_hour=23,
882 .tm_min=59,
883 .tm_sec=59,
884 .tm_wday=5,
885 .tm_yday=364,
886 .tm_isdst=0,
887 .tm_gmtoff=0,
888 .tm_zone="GMT"
889 },
890 },
891 {
892 .descr="9999",
893 .timezone="right/UTC",
894 .time=253402300799,
895 .local_tm= {
896 .tm_year=8099,
897 .tm_mon=11,
898 .tm_mday=31,
899 .tm_hour=23,
900 .tm_min=59,
901 .tm_sec=32,
902 .tm_wday=5,
903 .tm_yday=364,
904 .tm_isdst=0,
905 .tm_gmtoff=0,
906 .tm_zone="UTC"
907 },
908 .gmt_tm= {
909 .tm_year=8099,
910 .tm_mon=11,
911 .tm_mday=31,
912 .tm_hour=23,
913 .tm_min=59,
914 .tm_sec=59,
915 .tm_wday=5,
916 .tm_yday=364,
917 .tm_isdst=0,
918 .tm_gmtoff=0,
919 .tm_zone="GMT"
920 },
921 },
922 {
923 .descr="9999",
924 .timezone="right/America/Edmonton",
925 .time=253402300799,
926 .local_tm= {
927 .tm_year=8099,
928 .tm_mon=11,
929 .tm_mday=31,
930 .tm_hour=16,
931 .tm_min=59,
932 .tm_sec=32,
933 .tm_wday=5,
934 .tm_yday=364,
935 .tm_isdst=0,
936 .tm_gmtoff=-25200,
937 .tm_zone="MST"
938 },
939 .gmt_tm= {
940 .tm_year=8099,
941 .tm_mon=11,
942 .tm_mday=31,
943 .tm_hour=23,
944 .tm_min=59,
945 .tm_sec=59,
946 .tm_wday=5,
947 .tm_yday=364,
948 .tm_isdst=0,
949 .tm_gmtoff=0,
950 .tm_zone="GMT"
951 },
952 },
953 {
954 .descr="leap second - 1",
955 .timezone="posix/America/Edmonton",
956 .time=1483228825,
957 .local_tm= {
958 .tm_year=116,
959 .tm_mon=11,
960 .tm_mday=31,
961 .tm_hour=17,
962 .tm_min=0,
963 .tm_sec=25,
964 .tm_wday=6,
965 .tm_yday=365,
966 .tm_isdst=0,
967 .tm_gmtoff=-25200,
968 .tm_zone="MST"
969 },
970 .gmt_tm= {
971 .tm_year=117,
972 .tm_mon=0,
973 .tm_mday=1,
974 .tm_hour=0,
975 .tm_min=0,
976 .tm_sec=25,
977 .tm_wday=0,
978 .tm_yday=0,
979 .tm_isdst=0,
980 .tm_gmtoff=0,
981 .tm_zone="GMT"
982 },
983 },
984 {
985 .descr="leap second",
986 .timezone="posix/America/Edmonton",
987 .time=1483228826,
988 .local_tm= {
989 .tm_year=116,
990 .tm_mon=11,
991 .tm_mday=31,
992 .tm_hour=17,
993 .tm_min=0,
994 .tm_sec=26,
995 .tm_wday=6,
996 .tm_yday=365,
997 .tm_isdst=0,
998 .tm_gmtoff=-25200,
999 .tm_zone="MST"
1000 },
1001 .gmt_tm= {
1002 .tm_year=117,
1003 .tm_mon=0,
1004 .tm_mday=1,
1005 .tm_hour=0,
1006 .tm_min=0,
1007 .tm_sec=26,
1008 .tm_wday=0,
1009 .tm_yday=0,
1010 .tm_isdst=0,
1011 .tm_gmtoff=0,
1012 .tm_zone="GMT"
1013 },
1014 },
1015 {
1016 .descr="leap second + 1",
1017 .timezone="posix/America/Edmonton",
1018 .time=1483228827,
1019 .local_tm= {
1020 .tm_year=116,
1021 .tm_mon=11,
1022 .tm_mday=31,
1023 .tm_hour=17,
1024 .tm_min=0,
1025 .tm_sec=27,
1026 .tm_wday=6,
1027 .tm_yday=365,
1028 .tm_isdst=0,
1029 .tm_gmtoff=-25200,
1030 .tm_zone="MST"
1031 },
1032 .gmt_tm= {
1033 .tm_year=117,
1034 .tm_mon=0,
1035 .tm_mday=1,
1036 .tm_hour=0,
1037 .tm_min=0,
1038 .tm_sec=27,
1039 .tm_wday=0,
1040 .tm_yday=0,
1041 .tm_isdst=0,
1042 .tm_gmtoff=0,
1043 .tm_zone="GMT"
1044 },
1045 },
1046 {
1047 .descr="leap second - 1",
1048 .timezone="right/UTC",
1049 .time=1483228825,
1050 .local_tm= {
1051 .tm_year=116,
1052 .tm_mon=11,
1053 .tm_mday=31,
1054 .tm_hour=23,
1055 .tm_min=59,
1056 .tm_sec=59,
1057 .tm_wday=6,
1058 .tm_yday=365,
1059 .tm_isdst=0,
1060 .tm_gmtoff=0,
1061 .tm_zone="UTC"
1062 },
1063 .gmt_tm= {
1064 .tm_year=117,
1065 .tm_mon=0,
1066 .tm_mday=1,
1067 .tm_hour=0,
1068 .tm_min=0,
1069 .tm_sec=25,
1070 .tm_wday=0,
1071 .tm_yday=0,
1072 .tm_isdst=0,
1073 .tm_gmtoff=0,
1074 .tm_zone="GMT"
1075 },
1076 },
1077 {
1078 .descr="leap second",
1079 .timezone="right/UTC",
1080 .time=1483228826,
1081 .local_tm= {
1082 .tm_year=116,
1083 .tm_mon=11,
1084 .tm_mday=31,
1085 .tm_hour=23,
1086 .tm_min=59,
1087 .tm_sec=60,
1088 .tm_wday=6,
1089 .tm_yday=365,
1090 .tm_isdst=0,
1091 .tm_gmtoff=0,
1092 .tm_zone="UTC"
1093 },
1094 .gmt_tm= {
1095 .tm_year=117,
1096 .tm_mon=0,
1097 .tm_mday=1,
1098 .tm_hour=0,
1099 .tm_min=0,
1100 .tm_sec=26,
1101 .tm_wday=0,
1102 .tm_yday=0,
1103 .tm_isdst=0,
1104 .tm_gmtoff=0,
1105 .tm_zone="GMT"
1106 },
1107 },
1108 {
1109 .descr="leap second + 1",
1110 .timezone="right/UTC",
1111 .time=1483228827,
1112 .local_tm= {
1113 .tm_year=117,
1114 .tm_mon=0,
1115 .tm_mday=1,
1116 .tm_hour=0,
1117 .tm_min=0,
1118 .tm_sec=0,
1119 .tm_wday=0,
1120 .tm_yday=0,
1121 .tm_isdst=0,
1122 .tm_gmtoff=0,
1123 .tm_zone="UTC"
1124 },
1125 .gmt_tm= {
1126 .tm_year=117,
1127 .tm_mon=0,
1128 .tm_mday=1,
1129 .tm_hour=0,
1130 .tm_min=0,
1131 .tm_sec=27,
1132 .tm_wday=0,
1133 .tm_yday=0,
1134 .tm_isdst=0,
1135 .tm_gmtoff=0,
1136 .tm_zone="GMT"
1137 },
1138 },
1139 {
1140 .descr="leap second - 1",
1141 .timezone="right/America/Edmonton",
1142 .time=1483228825,
1143 .local_tm= {
1144 .tm_year=116,
1145 .tm_mon=11,
1146 .tm_mday=31,
1147 .tm_hour=16,
1148 .tm_min=59,
1149 .tm_sec=59,
1150 .tm_wday=6,
1151 .tm_yday=365,
1152 .tm_isdst=0,
1153 .tm_gmtoff=-25200,
1154 .tm_zone="MST"
1155 },
1156 .gmt_tm= {
1157 .tm_year=117,
1158 .tm_mon=0,
1159 .tm_mday=1,
1160 .tm_hour=0,
1161 .tm_min=0,
1162 .tm_sec=25,
1163 .tm_wday=0,
1164 .tm_yday=0,
1165 .tm_isdst=0,
1166 .tm_gmtoff=0,
1167 .tm_zone="GMT"
1168 },
1169 },
1170 {
1171 .descr="leap second",
1172 .timezone="right/America/Edmonton",
1173 .time=1483228826,
1174 .local_tm= {
1175 .tm_year=116,
1176 .tm_mon=11,
1177 .tm_mday=31,
1178 .tm_hour=16,
1179 .tm_min=59,
1180 .tm_sec=60,
1181 .tm_wday=6,
1182 .tm_yday=365,
1183 .tm_isdst=0,
1184 .tm_gmtoff=-25200,
1185 .tm_zone="MST"
1186 },
1187 .gmt_tm= {
1188 .tm_year=117,
1189 .tm_mon=0,
1190 .tm_mday=1,
1191 .tm_hour=0,
1192 .tm_min=0,
1193 .tm_sec=26,
1194 .tm_wday=0,
1195 .tm_yday=0,
1196 .tm_isdst=0,
1197 .tm_gmtoff=0,
1198 .tm_zone="GMT"
1199 },
1200 },
1201 {
1202 .descr="leap second + 1",
1203 .timezone="right/America/Edmonton",
1204 .time=1483228827,
1205 .local_tm= {
1206 .tm_year=116,
1207 .tm_mon=11,
1208 .tm_mday=31,
1209 .tm_hour=17,
1210 .tm_min=0,
1211 .tm_sec=0,
1212 .tm_wday=6,
1213 .tm_yday=365,
1214 .tm_isdst=0,
1215 .tm_gmtoff=-25200,
1216 .tm_zone="MST"
1217 },
1218 .gmt_tm= {
1219 .tm_year=117,
1220 .tm_mon=0,
1221 .tm_mday=1,
1222 .tm_hour=0,
1223 .tm_min=0,
1224 .tm_sec=27,
1225 .tm_wday=0,
1226 .tm_yday=0,
1227 .tm_isdst=0,
1228 .tm_gmtoff=0,
1229 .tm_zone="GMT"
1230 },
1231 },
1232 {
1233 .descr="transition standard to daylight - 1",
1234 .timezone="posix/America/Edmonton",
1235 .time=1457859599,
1236 .local_tm= {
1237 .tm_year=116,
1238 .tm_mon=2,
1239 .tm_mday=13,
1240 .tm_hour=1,
1241 .tm_min=59,
1242 .tm_sec=59,
1243 .tm_wday=0,
1244 .tm_yday=72,
1245 .tm_isdst=0,
1246 .tm_gmtoff=-25200,
1247 .tm_zone="MST"
1248 },
1249 .gmt_tm= {
1250 .tm_year=116,
1251 .tm_mon=2,
1252 .tm_mday=13,
1253 .tm_hour=8,
1254 .tm_min=59,
1255 .tm_sec=59,
1256 .tm_wday=0,
1257 .tm_yday=72,
1258 .tm_isdst=0,
1259 .tm_gmtoff=0,
1260 .tm_zone="GMT"
1261 },
1262 },
1263 {
1264 .descr="transition standard to daylight",
1265 .timezone="posix/America/Edmonton",
1266 .time=1457859600,
1267 .local_tm= {
1268 .tm_year=116,
1269 .tm_mon=2,
1270 .tm_mday=13,
1271 .tm_hour=3,
1272 .tm_min=0,
1273 .tm_sec=0,
1274 .tm_wday=0,
1275 .tm_yday=72,
1276 .tm_isdst=1,
1277 .tm_gmtoff=-21600,
1278 .tm_zone="MDT"
1279 },
1280 .gmt_tm= {
1281 .tm_year=116,
1282 .tm_mon=2,
1283 .tm_mday=13,
1284 .tm_hour=9,
1285 .tm_min=0,
1286 .tm_sec=0,
1287 .tm_wday=0,
1288 .tm_yday=72,
1289 .tm_isdst=0,
1290 .tm_gmtoff=0,
1291 .tm_zone="GMT"
1292 },
1293 },
1294 {
1295 .descr="transition standard to daylight + 1",
1296 .timezone="posix/America/Edmonton",
1297 .time=1457859601,
1298 .local_tm= {
1299 .tm_year=116,
1300 .tm_mon=2,
1301 .tm_mday=13,
1302 .tm_hour=3,
1303 .tm_min=0,
1304 .tm_sec=1,
1305 .tm_wday=0,
1306 .tm_yday=72,
1307 .tm_isdst=1,
1308 .tm_gmtoff=-21600,
1309 .tm_zone="MDT"
1310 },
1311 .gmt_tm= {
1312 .tm_year=116,
1313 .tm_mon=2,
1314 .tm_mday=13,
1315 .tm_hour=9,
1316 .tm_min=0,
1317 .tm_sec=1,
1318 .tm_wday=0,
1319 .tm_yday=72,
1320 .tm_isdst=0,
1321 .tm_gmtoff=0,
1322 .tm_zone="GMT"
1323 },
1324 },
1325 {
1326 .descr="transition standard to daylight - 1",
1327 .timezone="right/America/Edmonton",
1328 .time=1457859625,
1329 .local_tm= {
1330 .tm_year=116,
1331 .tm_mon=2,
1332 .tm_mday=13,
1333 .tm_hour=1,
1334 .tm_min=59,
1335 .tm_sec=59,
1336 .tm_wday=0,
1337 .tm_yday=72,
1338 .tm_isdst=0,
1339 .tm_gmtoff=-25200,
1340 .tm_zone="MST"
1341 },
1342 .gmt_tm= {
1343 .tm_year=116,
1344 .tm_mon=2,
1345 .tm_mday=13,
1346 .tm_hour=9,
1347 .tm_min=0,
1348 .tm_sec=25,
1349 .tm_wday=0,
1350 .tm_yday=72,
1351 .tm_isdst=0,
1352 .tm_gmtoff=0,
1353 .tm_zone="GMT"
1354 },
1355 },
1356 {
1357 .descr="transition standard to daylight",
1358 .timezone="right/America/Edmonton",
1359 .time=1457859626,
1360 .local_tm= {
1361 .tm_year=116,
1362 .tm_mon=2,
1363 .tm_mday=13,
1364 .tm_hour=3,
1365 .tm_min=0,
1366 .tm_sec=0,
1367 .tm_wday=0,
1368 .tm_yday=72,
1369 .tm_isdst=1,
1370 .tm_gmtoff=-21600,
1371 .tm_zone="MDT"
1372 },
1373 .gmt_tm= {
1374 .tm_year=116,
1375 .tm_mon=2,
1376 .tm_mday=13,
1377 .tm_hour=9,
1378 .tm_min=0,
1379 .tm_sec=26,
1380 .tm_wday=0,
1381 .tm_yday=72,
1382 .tm_isdst=0,
1383 .tm_gmtoff=0,
1384 .tm_zone="GMT"
1385 },
1386 },
1387 {
1388 .descr="transition standard to daylight + 1",
1389 .timezone="right/America/Edmonton",
1390 .time=1457859627,
1391 .local_tm= {
1392 .tm_year=116,
1393 .tm_mon=2,
1394 .tm_mday=13,
1395 .tm_hour=3,
1396 .tm_min=0,
1397 .tm_sec=1,
1398 .tm_wday=0,
1399 .tm_yday=72,
1400 .tm_isdst=1,
1401 .tm_gmtoff=-21600,
1402 .tm_zone="MDT"
1403 },
1404 .gmt_tm= {
1405 .tm_year=116,
1406 .tm_mon=2,
1407 .tm_mday=13,
1408 .tm_hour=9,
1409 .tm_min=0,
1410 .tm_sec=27,
1411 .tm_wday=0,
1412 .tm_yday=72,
1413 .tm_isdst=0,
1414 .tm_gmtoff=0,
1415 .tm_zone="GMT"
1416 },
1417 },
1418 {
1419 .descr="transition daylight to standard - 1",
1420 .timezone="posix/America/Edmonton",
1421 .time=1478419199,
1422 .local_tm= {
1423 .tm_year=116,
1424 .tm_mon=10,
1425 .tm_mday=6,
1426 .tm_hour=1,
1427 .tm_min=59,
1428 .tm_sec=59,
1429 .tm_wday=0,
1430 .tm_yday=310,
1431 .tm_isdst=1,
1432 .tm_gmtoff=-21600,
1433 .tm_zone="MDT"
1434 },
1435 .gmt_tm= {
1436 .tm_year=116,
1437 .tm_mon=10,
1438 .tm_mday=6,
1439 .tm_hour=7,
1440 .tm_min=59,
1441 .tm_sec=59,
1442 .tm_wday=0,
1443 .tm_yday=310,
1444 .tm_isdst=0,
1445 .tm_gmtoff=0,
1446 .tm_zone="GMT"
1447 },
1448 },
1449 {
1450 .descr="transition daylight to standard",
1451 .timezone="posix/America/Edmonton",
1452 .time=1478419200,
1453 .local_tm= {
1454 .tm_year=116,
1455 .tm_mon=10,
1456 .tm_mday=6,
1457 .tm_hour=1,
1458 .tm_min=0,
1459 .tm_sec=0,
1460 .tm_wday=0,
1461 .tm_yday=310,
1462 .tm_isdst=0,
1463 .tm_gmtoff=-25200,
1464 .tm_zone="MST"
1465 },
1466 .gmt_tm= {
1467 .tm_year=116,
1468 .tm_mon=10,
1469 .tm_mday=6,
1470 .tm_hour=8,
1471 .tm_min=0,
1472 .tm_sec=0,
1473 .tm_wday=0,
1474 .tm_yday=310,
1475 .tm_isdst=0,
1476 .tm_gmtoff=0,
1477 .tm_zone="GMT"
1478 },
1479 },
1480 {
1481 .descr="transition daylight to standard + 1",
1482 .timezone="posix/America/Edmonton",
1483 .time=1478419201,
1484 .local_tm= {
1485 .tm_year=116,
1486 .tm_mon=10,
1487 .tm_mday=6,
1488 .tm_hour=1,
1489 .tm_min=0,
1490 .tm_sec=1,
1491 .tm_wday=0,
1492 .tm_yday=310,
1493 .tm_isdst=0,
1494 .tm_gmtoff=-25200,
1495 .tm_zone="MST"
1496 },
1497 .gmt_tm= {
1498 .tm_year=116,
1499 .tm_mon=10,
1500 .tm_mday=6,
1501 .tm_hour=8,
1502 .tm_min=0,
1503 .tm_sec=1,
1504 .tm_wday=0,
1505 .tm_yday=310,
1506 .tm_isdst=0,
1507 .tm_gmtoff=0,
1508 .tm_zone="GMT"
1509 },
1510 },
1511 {
1512 .descr="transition daylight to standard - 1",
1513 .timezone="right/America/Edmonton",
1514 .time=1478419225,
1515 .local_tm= {
1516 .tm_year=116,
1517 .tm_mon=10,
1518 .tm_mday=6,
1519 .tm_hour=1,
1520 .tm_min=59,
1521 .tm_sec=59,
1522 .tm_wday=0,
1523 .tm_yday=310,
1524 .tm_isdst=1,
1525 .tm_gmtoff=-21600,
1526 .tm_zone="MDT"
1527 },
1528 .gmt_tm= {
1529 .tm_year=116,
1530 .tm_mon=10,
1531 .tm_mday=6,
1532 .tm_hour=8,
1533 .tm_min=0,
1534 .tm_sec=25,
1535 .tm_wday=0,
1536 .tm_yday=310,
1537 .tm_isdst=0,
1538 .tm_gmtoff=0,
1539 .tm_zone="GMT"
1540 },
1541 },
1542 {
1543 .descr="transition daylight to standard",
1544 .timezone="right/America/Edmonton",
1545 .time=1478419226,
1546 .local_tm= {
1547 .tm_year=116,
1548 .tm_mon=10,
1549 .tm_mday=6,
1550 .tm_hour=1,
1551 .tm_min=0,
1552 .tm_sec=0,
1553 .tm_wday=0,
1554 .tm_yday=310,
1555 .tm_isdst=0,
1556 .tm_gmtoff=-25200,
1557 .tm_zone="MST"
1558 },
1559 .gmt_tm= {
1560 .tm_year=116,
1561 .tm_mon=10,
1562 .tm_mday=6,
1563 .tm_hour=8,
1564 .tm_min=0,
1565 .tm_sec=26,
1566 .tm_wday=0,
1567 .tm_yday=310,
1568 .tm_isdst=0,
1569 .tm_gmtoff=0,
1570 .tm_zone="GMT"
1571 },
1572 },
1573 {
1574 .descr="transition daylight to standard + 1",
1575 .timezone="right/America/Edmonton",
1576 .time=1478419227,
1577 .local_tm= {
1578 .tm_year=116,
1579 .tm_mon=10,
1580 .tm_mday=6,
1581 .tm_hour=1,
1582 .tm_min=0,
1583 .tm_sec=1,
1584 .tm_wday=0,
1585 .tm_yday=310,
1586 .tm_isdst=0,
1587 .tm_gmtoff=-25200,
1588 .tm_zone="MST"
1589 },
1590 .gmt_tm= {
1591 .tm_year=116,
1592 .tm_mon=10,
1593 .tm_mday=6,
1594 .tm_hour=8,
1595 .tm_min=0,
1596 .tm_sec=27,
1597 .tm_wday=0,
1598 .tm_yday=310,
1599 .tm_isdst=0,
1600 .tm_gmtoff=0,
1601 .tm_zone="GMT"
1602 },
1603 },
1604 {
1605 .descr = NULL,
1606 },
1607};
1608
1609void printtm(FILE *f, struct tm *tm)
1610{
1611 fprintf(f, "\t\t{\n\t\t\t.tm_year=%d,\n\t\t\t.tm_mon=%d,\n\t\t\t"
1612 ".tm_mday=%d,\n\t\t\t.tm_hour=%d,\n\t\t\t.tm_min=%d,\n\t\t\t"
1613 ".tm_sec=%d,\n\t\t\t.tm_wday=%d,\n\t\t\t.tm_yday=%d,\n\t\t\t"
1614 ".tm_isdst=%d,\n\t\t\t.tm_gmtoff=%ld,\n\t\t\t.tm_zone=\"%s\""
1615 "\n\t\t},\n",
1616 tm->tm_year,
1617 tm->tm_mon,
1618 tm->tm_mday,
1619 tm->tm_hour,
1620 tm->tm_min,
1621 tm->tm_sec,
1622 tm->tm_wday,
1623 tm->tm_yday,
1624 tm->tm_isdst,
1625 tm->tm_gmtoff,
1626 tm->tm_zone);
1627}
1628
1629int dotimetest(struct timetest *test, int print)
1630{
1631 int failures = 0;
1632 struct tm local = {}, gmt = {};
1633 time_t converted;
1634 if (gmtime_r(&test->time, &gmt) == NULL) {
1635 memset(&gmt, 0, sizeof(gmt));
1636 gmt.tm_zone="FAILURE";
1637 } else {
1638 converted = timegm(&gmt);
1639 if (converted != test->time) {
1640 fprintf(stderr, "FAIL: test \"%s\", tz \"%s\" timegm "
1641 "does not match expected value\n", test->descr,
1642 test->timezone);
1643 fprintf(stderr, "expected: %lld\n", test->time);
1644 fprintf(stderr, "actual: %lld\n", converted);
1645 failures++;
1646 }
1647 }
1648 if (!tm_match(&test->gmt_tm, &gmt)) {
1649 fprintf(stderr, "FAIL: test \"%s\", tz \"%s\" gmtime_r does not"
1650 " match expected value\n", test->descr, test->timezone);
1651 fprintf(stderr, "expected: ");
1652 printtm(stderr, &test->gmt_tm);
1653 fprintf(stderr, "actual: ");
1654 printtm(stderr, &gmt);
1655 failures++;
1656 }
1657 setenv("TZ", test->timezone, 1);
1658 if (localtime_r(&test->time, &local) == NULL) {
1659 memset(&local, 0, sizeof(local));
1660 local.tm_zone="FAILURE";
1661 } else {
1662 converted = mktime(&local);
1663 if (converted != test->time) {
1664 fprintf(stderr, "FAIL: test \"%s\", tz \"%s\" mktime "
1665 "does not match expected value\n", test->descr,
1666 test->timezone);
1667 fprintf(stderr, "expected: %lld\n", test->time);
1668 fprintf(stderr, "actual: %lld\n", converted);
1669 failures++;
1670 }
1671 }
1672 if (!tm_match(&test->local_tm, &local)) {
1673 fprintf(stderr, "FAIL: test \"%s\", tz \"%s\" localtime_r does "
1674 "not match expected value\n", test->descr, test->timezone);
1675 fprintf(stderr, "expected: ");
1676 printtm(stderr, &test->local_tm);
1677 fprintf(stderr, "actual: ");
1678 printtm(stderr, &local);
1679 failures++;
1680 }
1681 if (print) {
1682 printf("\t{\n\t\t.descr=\"%s\",\n\t\t.timezone=\"%s\",\n\t\t"
1683 ".time=%lld,\n", test->descr, test->timezone, test->time);
1684 printf("\t\t.local_tm=");
1685 printtm(stdout, &local);
1686 printf("\t\t.gmt_tm=");
1687 printtm(stdout, &gmt);
1688 printf("\t},\n");
1689 }
1690 return failures;
1691}
1692
1693
1694void printtmdescr(FILE *f, struct tm *tm, char * descr)
1695{
1696 fprintf(f, "%s: ", descr);
1697 printtm(f, tm);
1698}
1699
1700int main() {
1701 int failures = 0;
1702 int verbose = 0;
1703 struct stat sb;
1704
1705 if (stat("/usr/share/zoneinfo/posix", &sb) == -1) {
1706 fprintf(stderr, "WARNING: /usr/share/zoneinfo/posix not"
1707 "present,\nCreate posix time zones to run this test.\n");
1708 exit(0);
1709 }
1710 if (stat("/usr/share/zoneinfo/right", &sb) == -1) {
1711 fprintf(stderr, "WARNING: /usr/share/zoneinfo/right not"
1712 "present,\nCreate right time zones to run this test.\n");
1713 exit(0);
1714 }
1715
1716 for (size_t i = 0; timetests[i].descr != NULL; i++) {
1717 failures += dotimetest(&timetests[i], verbose);
1718 }
1719 if (failures)
1720 fprintf(stderr, "FAIL: %d time test failures\n", failures);
1721 else
1722 printf("SUCCESS: no time test failures\n");
1723 exit(failures);
1724}
1725