1 | /* Set tz value |
2 | * by: John Stultz <john.stultz@linaro.org> |
3 | * (C) Copyright Linaro 2016 |
4 | * Licensed under the GPLv2 |
5 | * |
6 | * This program is free software: you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation, either version 2 of the License, or |
9 | * (at your option) any later version. |
10 | * |
11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | */ |
16 | |
17 | |
18 | #include <stdio.h> |
19 | #include <stdlib.h> |
20 | #include <time.h> |
21 | #include <sys/time.h> |
22 | #include <sys/timex.h> |
23 | #include <string.h> |
24 | #include <signal.h> |
25 | #include <unistd.h> |
26 | #include "../kselftest.h" |
27 | |
28 | int set_tz(int min, int dst) |
29 | { |
30 | struct timezone tz; |
31 | |
32 | tz.tz_minuteswest = min; |
33 | tz.tz_dsttime = dst; |
34 | |
35 | return settimeofday(0, &tz); |
36 | } |
37 | |
38 | int get_tz_min(void) |
39 | { |
40 | struct timezone tz; |
41 | struct timeval tv; |
42 | |
43 | memset(&tz, 0, sizeof(tz)); |
44 | gettimeofday(&tv, &tz); |
45 | return tz.tz_minuteswest; |
46 | } |
47 | |
48 | int get_tz_dst(void) |
49 | { |
50 | struct timezone tz; |
51 | struct timeval tv; |
52 | |
53 | memset(&tz, 0, sizeof(tz)); |
54 | gettimeofday(&tv, &tz); |
55 | return tz.tz_dsttime; |
56 | } |
57 | |
58 | int main(int argc, char **argv) |
59 | { |
60 | int i, ret; |
61 | int min, dst; |
62 | |
63 | min = get_tz_min(); |
64 | dst = get_tz_dst(); |
65 | printf("tz_minuteswest started at %i, dst at %i\n" , min, dst); |
66 | |
67 | printf("Checking tz_minuteswest can be properly set: " ); |
68 | fflush(stdout); |
69 | for (i = -15*60; i < 15*60; i += 30) { |
70 | ret = set_tz(min: i, dst); |
71 | ret = get_tz_min(); |
72 | if (ret != i) { |
73 | printf("[FAILED] expected: %i got %i\n" , i, ret); |
74 | goto err; |
75 | } |
76 | } |
77 | printf("[OK]\n" ); |
78 | |
79 | printf("Checking invalid tz_minuteswest values are caught: " ); |
80 | fflush(stdout); |
81 | |
82 | if (!set_tz(min: -15*60-1, dst)) { |
83 | printf("[FAILED] %i didn't return failure!\n" , -15*60-1); |
84 | goto err; |
85 | } |
86 | |
87 | if (!set_tz(min: 15*60+1, dst)) { |
88 | printf("[FAILED] %i didn't return failure!\n" , 15*60+1); |
89 | goto err; |
90 | } |
91 | |
92 | if (!set_tz(min: -24*60, dst)) { |
93 | printf("[FAILED] %i didn't return failure!\n" , -24*60); |
94 | goto err; |
95 | } |
96 | |
97 | if (!set_tz(min: 24*60, dst)) { |
98 | printf("[FAILED] %i didn't return failure!\n" , 24*60); |
99 | goto err; |
100 | } |
101 | |
102 | printf("[OK]\n" ); |
103 | |
104 | set_tz(min, dst); |
105 | return ksft_exit_pass(); |
106 | |
107 | err: |
108 | set_tz(min, dst); |
109 | return ksft_exit_fail(); |
110 | } |
111 | |