1/*2output:3testing4test 05tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=06Wed Dec 30 12:30:59 2020 CET7Wed Dec 30 11:30:59 2020 UTC8Wed Dec 30 12:30:59 2020 CET9Wed Dec 30 12:30:59 202010Wed Dec 30 12:30:59 202011test 112tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=013Wed Dec 30 12:30:59 2020 CET14Wed Dec 30 13:30:59 2020 UTC15Wed Dec 30 12:30:59 2020 CET16Wed Dec 30 12:30:59 202017Wed Dec 30 12:30:59 202018test 219tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=020Wed Dec 30 12:30:59 2020 CET21Wed Dec 30 11:30:59 2020 UTC22Wed Dec 30 12:30:59 2020 CET23Wed Dec 30 12:30:59 202024Wed Dec 30 12:30:59 202025test 326tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=027Wed Dec 30 12:30:59 2020 CET28Wed Dec 30 13:30:59 2020 UTC29Wed Dec 30 12:30:59 2020 CET30Wed Dec 30 12:30:59 202031Wed Dec 30 12:30:59 202032test 433tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=034Wed Dec 30 12:30:59 2020 CET35Wed Dec 30 14:00:59 2020 UTC36Wed Dec 30 12:30:59 2020 CET37Wed Dec 30 12:30:59 202038Wed Dec 30 12:30:59 202039test 540tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=041Thu Jan 28 12:30:59 2021 CET42Thu Jan 28 13:30:59 2021 UTC43Thu Jan 28 12:30:59 2021 CET44Thu Jan 28 12:30:59 202145Thu Jan 28 12:30:59 202146test 647tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=048Thu Jan 28 12:30:59 2021 CET49Thu Jan 28 13:30:59 2021 UTC50Thu Jan 28 12:30:59 2021 CET51Thu Jan 28 12:30:59 202152Thu Jan 28 12:30:59 202153test 754tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=155Wed Jan 6 13:30:59 2021 CEST56Wed Jan 6 13:30:59 2021 UTC57Wed Jan 6 13:30:59 2021 CEST58Wed Jan 6 13:30:59 202159Wed Jan 6 13:30:59 202160test 861tm_sec=59, tm_min=30, tm_hour=10, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=162Wed Jan 6 10:30:59 2021 CEST63Wed Jan 6 13:30:59 2021 UTC64Wed Jan 6 10:30:59 2021 CEST65Wed Jan 6 10:30:59 202166Wed Jan 6 10:30:59 202167test 968tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=069Thu Jan 28 12:30:59 2021 CET70Thu Jan 28 13:30:59 2021 UTC71Thu Jan 28 12:30:59 2021 CET72Thu Jan 28 12:30:59 202173Thu Jan 28 12:30:59 202174test 1075tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=176Wed Jan 6 13:30:59 2021 CEST77Wed Jan 6 13:30:59 2021 UTC78Wed Jan 6 13:30:59 2021 CEST79Wed Jan 6 13:30:59 202180Wed Jan 6 13:30:59 202181test 1182tm_sec=59, tm_min=30, tm_hour=12, tm_mday= 8, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 7, tm_isdst=083Fri Jan 8 12:30:59 2021 CET84Fri Jan 8 13:30:59 2021 UTC85Fri Jan 8 12:30:59 2021 CET86Fri Jan 8 12:30:59 202187Fri Jan 8 12:30:59 202188test 1289tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 8, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 7, tm_isdst=190Fri Jan 8 13:30:59 2021 CEST91Fri Jan 8 13:30:59 2021 UTC92Fri Jan 8 13:30:59 2021 CEST93Fri Jan 8 13:30:59 202194Fri Jan 8 13:30:59 202195test 1396tm_sec=59, tm_min=30, tm_hour=12, tm_mday=29, tm_mon= 1, tm_year= 124, tm_wday=4, tm_yday= 59, tm_isdst=097Thu Feb 29 12:30:59 2024 CET98Thu Feb 29 13:30:59 2024 UTC99Thu Feb 29 12:30:59 2024 CET100Thu Feb 29 12:30:59 2024101Thu Feb 29 12:30:59 2024102test 14103tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 1, tm_mon= 2, tm_year= 124, tm_wday=5, tm_yday= 60, tm_isdst=1104Fri Mar 1 13:30:59 2024 CEST105Fri Mar 1 13:30:59 2024 UTC106Fri Mar 1 13:30:59 2024 CEST107Fri Mar 1 13:30:59 2024108Fri Mar 1 13:30:59 2024109test 15110tm_sec=59, tm_min=30, tm_hour= 2, tm_mday= 4, tm_mon= 0, tm_year= 121, tm_wday=1, tm_yday= 3, tm_isdst=0111Mon Jan 4 02:30:59 2021 CET112Mon Jan 4 03:30:59 2021 UTC113Mon Jan 4 02:30:59 2021 CET114Mon Jan 4 02:30:59 2021115Mon Jan 4 02:30:59 2021116done117end:118*/119120#include <assert.h>121#include <stdio.h>122#include <stdlib.h>123#include <string.h>124#include <time.h>125126#define NELEM(x) (sizeof(x)/sizeof((x)[0]))127128struct test {129 struct tm tm;130 char *tz;131} tests[] = {132 //sec,min,hour,mday,mon,year,wday,yday,isdst,tz,133 {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-1"},134 {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01"},135 {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-01"},136 {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:00"},137 {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:30"},138 {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST3"},139 {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,4,8"},140 {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,4,8"},141 {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST3,4,8"},142 {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},143 {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},144 {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},145 {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,8"},146 {{ 59, 30, 12, 29, 1, 124, 0, 0, 0},"CET01CEST,J60,J80"},147 {{ 59, 30, 12, 1, 2, 124, 0, 0, 0},"CET01CEST,J60,J80"},148 {{ 59, 30, 2, 4, 0, 121, 0, 0, 0},"CET01CEST,J4/03,8/4"},149};150151char *faketz;152153#ifndef __unix__154#define putenv(x) (x)155/*156 * Ok, this is by definition undefined behaviour because157 * we are using the name of a library function. The reallity158 * is that if you use a static linker then this would159 * overload the libc getenv and it will work as expected,160 * but if you use a dynamic linker then the internal161 * references will be tied to the internal getenv function162 * and this would not work. For our main use case that is163 * testing scc libc this is good enough, and with the164 * fallback to putenv and unsetenv this will work in165 * the systems we are interested on166 */167char *168getenv(const char *name)169{170 if (strcmp(name, "TZ") != 0)171 return NULL;172 return faketz;173}174#endif175176int177test(void)178{179 time_t t;180 char buf[70], var[70], *tz;181 struct tm *tm;182 struct test *tp;183184 for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) {185 printf("test %d\n", (int) (tp - tests));186 tz = tp->tz;187 if (!tz)188 tz = "UTC";189 faketz = tz;190 sprintf(var, "TZ=%s", tz);191 putenv(var);192193 t = mktime(&tp->tm);194 if (t == -1) {195 puts("failed");196 continue;197 }198 printf("tm_sec=%2d, "199 "tm_min=%2d, "200 "tm_hour=%2d, "201 "tm_mday=%2d, "202 "tm_mon=%2d, "203 "tm_year=%4d, "204 "tm_wday=%d, "205 "tm_yday=%3d, "206 "tm_isdst=%d\n",207 tp->tm.tm_sec,208 tp->tm.tm_min,209 tp->tm.tm_hour,210 tp->tm.tm_mday,211 tp->tm.tm_mon,212 tp->tm.tm_year,213 tp->tm.tm_wday,214 tp->tm.tm_yday,215 tp->tm.tm_isdst);216 strftime(buf, sizeof(buf), "%c %Z", &tp->tm);217 puts(buf);218219 tm = gmtime(&t);220 strftime(buf, sizeof(buf), "%c %Z", tm);221 puts(buf);222223 tm = localtime(&t);224 strftime(buf, sizeof(buf), "%c %Z", tm);225 puts(buf);226227 fputs(asctime(tm), stdout);228 fputs(ctime(&t), stdout);229 }230231 return 0;232}233234int235main(void)236{237#if !defined(__unix__) && !defined(__SCC_TZ_TIME__)238 puts("RESULT: SKIP");239 return 0;240#endif241 puts("testing");242 test();243 puts("done");244 return 0;245}