xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/timers/set-tz.c (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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