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