Blame winpr/libwinpr/timezone/timezone.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Time Zone
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/wtypes.h>
Packit 1fb8d4
#include <winpr/timezone.h>
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include "../log.h"
Packit 1fb8d4
Packit 1fb8d4
#define TAG WINPR_TAG("timezone")
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
Packit 1fb8d4
#include <time.h>
Packit 1fb8d4
#include <unistd.h>
Packit 1fb8d4
Packit 1fb8d4
/* Table generated with TimeZones.csx */
Packit 1fb8d4
#include "TimeZones.c"
Packit 1fb8d4
Packit 1fb8d4
/* Table generated with WindowsZones.csx */
Packit 1fb8d4
#include "WindowsZones.c"
Packit 1fb8d4
Packit 1fb8d4
static UINT64 winpr_windows_gmtime(void)
Packit 1fb8d4
{
Packit 1fb8d4
	time_t unix_time;
Packit 1fb8d4
	UINT64 windows_time;
Packit 1fb8d4
	time(&unix_time);
Packit 1fb8d4
Packit 1fb8d4
	if (unix_time < 0)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	windows_time = (UINT64)unix_time;
Packit 1fb8d4
	windows_time *= 10000000;
Packit 1fb8d4
	windows_time += 621355968000000000ULL;
Packit 1fb8d4
	return windows_time;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static char* winpr_read_unix_timezone_identifier_from_file(FILE* fp)
Packit 1fb8d4
{
Packit 1fb8d4
	INT64 length;
Packit 1fb8d4
	char* tzid = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (_fseeki64(fp, 0, SEEK_END) != 0)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	length = _ftelli64(fp);
Packit 1fb8d4
Packit 1fb8d4
	if (_fseeki64(fp, 0, SEEK_SET) != 0)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (length < 2)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	tzid = (char*) malloc((size_t)length + 1);
Packit 1fb8d4
Packit 1fb8d4
	if (!tzid)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (fread(tzid, (size_t)length, 1, fp) != 1)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(tzid);
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	tzid[length] = '\0';
Packit 1fb8d4
Packit 1fb8d4
	if (tzid[length - 1] == '\n')
Packit 1fb8d4
		tzid[length - 1] = '\0';
Packit 1fb8d4
Packit 1fb8d4
	return tzid;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static char* winpr_get_timezone_from_link(void)
Packit 1fb8d4
{
Packit 1fb8d4
	const char* links[] =
Packit 1fb8d4
	{
Packit 1fb8d4
		"/etc/localtime",
Packit 1fb8d4
		"/etc/TZ"
Packit 1fb8d4
	};
Packit 1fb8d4
	size_t x;
Packit 1fb8d4
	ssize_t len;
Packit 1fb8d4
	char buf[1024];
Packit 1fb8d4
	char* tzid = NULL;
Packit 1fb8d4
Packit 1fb8d4
	/*
Packit 1fb8d4
	 * On linux distros such as Redhat or Archlinux, a symlink at /etc/localtime
Packit 1fb8d4
	 * will point to /usr/share/zoneinfo/region/place where region/place could be
Packit 1fb8d4
	 * America/Montreal for example.
Packit 1fb8d4
	 * Some distributions do have to symlink at /etc/TZ.
Packit 1fb8d4
	 */
Packit 1fb8d4
Packit 1fb8d4
	for (x = 0; x < sizeof(links) / sizeof(links[0]); x++)
Packit 1fb8d4
	{
Packit 1fb8d4
		const char* link = links[x];
Packit 1fb8d4
Packit 1fb8d4
		if ((len = readlink(link, buf, sizeof(buf) - 1)) != -1)
Packit 1fb8d4
		{
Packit 1fb8d4
			int num = 0;
Packit 1fb8d4
			size_t alloc;
Packit 1fb8d4
			SSIZE_T pos = len;
Packit 1fb8d4
			buf[len] = '\0';
Packit 1fb8d4
Packit 1fb8d4
			/* find the position of the 2nd to last "/" */
Packit 1fb8d4
Packit 1fb8d4
			while (num < 2)
Packit 1fb8d4
			{
Packit 1fb8d4
				if (pos == 0)
Packit 1fb8d4
					break;
Packit 1fb8d4
Packit 1fb8d4
				pos -= 1;
Packit 1fb8d4
Packit 1fb8d4
				if (buf[pos] == '/')
Packit 1fb8d4
					num++;
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			if ((len < 0) || (pos < 0) || (pos > len))
Packit 1fb8d4
				return NULL;
Packit 1fb8d4
Packit 1fb8d4
			alloc = (size_t)len - (size_t)pos;
Packit 1fb8d4
			tzid = (char*) malloc(alloc + 1);
Packit 1fb8d4
Packit 1fb8d4
			if (!tzid)
Packit 1fb8d4
				return NULL;
Packit 1fb8d4
Packit 1fb8d4
			strncpy(tzid, buf + pos + 1, alloc);
Packit 1fb8d4
			return tzid;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static char* winpr_get_unix_timezone_identifier_from_file(void)
Packit 1fb8d4
{
Packit 1fb8d4
	FILE* fp;
Packit 1fb8d4
	char* tzid = NULL;
Packit 1fb8d4
#if defined(ANDROID)
Packit 1fb8d4
	fp = popen("getprop persist.sys.timezone", "r");
Packit 1fb8d4
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
Packit 1fb8d4
	fp = fopen("/var/db/zoneinfo", "r");
Packit 1fb8d4
#else
Packit 1fb8d4
	fp = fopen("/etc/timezone", "r");
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	if (NULL == fp)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	tzid = winpr_read_unix_timezone_identifier_from_file(fp);
Packit 1fb8d4
#if defined(ANDROID)
Packit 1fb8d4
	pclose(fp) ;
Packit 1fb8d4
#else
Packit 1fb8d4
	fclose(fp) ;
Packit 1fb8d4
#endif
Packit 1fb8d4
	return tzid;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL winpr_match_unix_timezone_identifier_with_list(const char* tzid, const char* list)
Packit 1fb8d4
{
Packit 1fb8d4
	char* p;
Packit 1fb8d4
	char* list_copy;
Packit 1fb8d4
	list_copy = _strdup(list);
Packit 1fb8d4
Packit 1fb8d4
	if (!list_copy)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	p = strtok(list_copy, " ");
Packit 1fb8d4
Packit 1fb8d4
	while (p != NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (strcmp(p, tzid) == 0)
Packit 1fb8d4
		{
Packit 1fb8d4
			free(list_copy);
Packit 1fb8d4
			return TRUE;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		p = strtok(NULL, " ");
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	free(list_copy);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static TIME_ZONE_ENTRY* winpr_detect_windows_time_zone(void)
Packit 1fb8d4
{
Packit 1fb8d4
	size_t i, j;
Packit 1fb8d4
	char* tzid;
Packit 1fb8d4
	TIME_ZONE_ENTRY* timezone;
Packit 1fb8d4
	tzid = winpr_get_unix_timezone_identifier_from_file();
Packit 1fb8d4
Packit 1fb8d4
	if (tzid == NULL)
Packit 1fb8d4
		tzid = winpr_get_timezone_from_link();
Packit 1fb8d4
Packit 1fb8d4
	if (tzid == NULL)
Packit 1fb8d4
		return NULL;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < ARRAYSIZE(TimeZoneTable); i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		for (j = 0; j < ARRAYSIZE(WindowsTimeZoneIdTable); j++)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (strcmp(TimeZoneTable[i].Id, WindowsTimeZoneIdTable[j].windows) != 0)
Packit 1fb8d4
				continue;
Packit 1fb8d4
Packit 1fb8d4
			if (winpr_match_unix_timezone_identifier_with_list(tzid, WindowsTimeZoneIdTable[j].tzid))
Packit 1fb8d4
			{
Packit 1fb8d4
				free(tzid);
Packit 1fb8d4
				timezone = (TIME_ZONE_ENTRY*) malloc(sizeof(TIME_ZONE_ENTRY));
Packit 1fb8d4
Packit 1fb8d4
				if (!timezone)
Packit 1fb8d4
					return NULL;
Packit 1fb8d4
Packit 1fb8d4
				*timezone = TimeZoneTable[i];
Packit 1fb8d4
				return timezone;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	WLog_ERR(TAG,  "Unable to find a match for unix timezone: %s", tzid);
Packit 1fb8d4
	free(tzid);
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static const TIME_ZONE_RULE_ENTRY* winpr_get_current_time_zone_rule(const TIME_ZONE_RULE_ENTRY*
Packit 1fb8d4
        rules, UINT32 count)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 i;
Packit 1fb8d4
	UINT64 windows_time;
Packit 1fb8d4
	windows_time = winpr_windows_gmtime();
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < count; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		if ((rules[i].TicksStart >= windows_time) && (windows_time >= rules[i].TicksEnd))
Packit 1fb8d4
		{
Packit 1fb8d4
			/*WLog_ERR(TAG,  "Got rule %d from table at %p with count %"PRIu32"", i, (void*) rules, count);*/
Packit 1fb8d4
			return &rules[i];
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	WLog_ERR(TAG,  "Unable to get current timezone rule");
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
Packit 1fb8d4
{
Packit 1fb8d4
	time_t t;
Packit 1fb8d4
	struct tm* local_time;
Packit 1fb8d4
	TIME_ZONE_ENTRY* dtz;
Packit 1fb8d4
	LPTIME_ZONE_INFORMATION tz = lpTimeZoneInformation;
Packit 1fb8d4
	lpTimeZoneInformation->StandardBias = 0;
Packit 1fb8d4
	time(&t);
Packit 1fb8d4
	local_time = localtime(&t);
Packit 1fb8d4
	memset(tz, 0, sizeof(TIME_ZONE_INFORMATION));
Packit 1fb8d4
#ifdef HAVE_TM_GMTOFF
Packit 1fb8d4
	{
Packit 1fb8d4
		long bias = -(local_time->tm_gmtoff / 60L);
Packit 1fb8d4
Packit 1fb8d4
		if (bias > INT32_MAX)
Packit 1fb8d4
			bias = INT32_MAX;
Packit 1fb8d4
Packit 1fb8d4
		tz->Bias = (LONG)bias;
Packit 1fb8d4
	}
Packit 1fb8d4
#else
Packit 1fb8d4
	tz->Bias = 0;
Packit 1fb8d4
#endif
Packit 1fb8d4
	dtz = winpr_detect_windows_time_zone();
Packit 1fb8d4
Packit 1fb8d4
	if (dtz != NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		int status;
Packit 1fb8d4
		WLog_DBG(TAG, "tz: Bias=%"PRId32" sn='%s' dln='%s'",
Packit 1fb8d4
		         dtz->Bias, dtz->StandardName, dtz->DaylightName);
Packit 1fb8d4
		tz->Bias = dtz->Bias;
Packit 1fb8d4
		tz->StandardBias = 0;
Packit 1fb8d4
		tz->DaylightBias = 0;
Packit 1fb8d4
		ZeroMemory(tz->StandardName, sizeof(tz->StandardName));
Packit 1fb8d4
		ZeroMemory(tz->DaylightName, sizeof(tz->DaylightName));
Packit 1fb8d4
		status = MultiByteToWideChar(CP_UTF8, 0, dtz->StandardName, -1, tz->StandardName,
Packit 1fb8d4
		                             sizeof(tz->StandardName) / sizeof(WCHAR) - 1);
Packit 1fb8d4
Packit 1fb8d4
		if (status < 1)
Packit 1fb8d4
		{
Packit 1fb8d4
			WLog_ERR(TAG, "StandardName conversion failed - using default");
Packit 1fb8d4
			goto out_error;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		status = MultiByteToWideChar(CP_UTF8, 0, dtz->DaylightName, -1, tz->DaylightName,
Packit 1fb8d4
		                             sizeof(tz->DaylightName) / sizeof(WCHAR) - 1);
Packit 1fb8d4
Packit 1fb8d4
		if (status < 1)
Packit 1fb8d4
		{
Packit 1fb8d4
			WLog_ERR(TAG, "DaylightName conversion failed - using default");
Packit 1fb8d4
			goto out_error;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if ((dtz->SupportsDST) && (dtz->RuleTableCount > 0))
Packit 1fb8d4
		{
Packit 1fb8d4
			const TIME_ZONE_RULE_ENTRY* rule = winpr_get_current_time_zone_rule(dtz->RuleTable,
Packit 1fb8d4
			                                   dtz->RuleTableCount);
Packit 1fb8d4
Packit 1fb8d4
			if (rule != NULL)
Packit 1fb8d4
			{
Packit 1fb8d4
				tz->DaylightBias = -rule->DaylightDelta;
Packit 1fb8d4
				tz->StandardDate = rule->StandardDate;
Packit 1fb8d4
				tz->DaylightDate = rule->DaylightDate;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		free(dtz);
Packit 1fb8d4
		/* 1 ... TIME_ZONE_ID_STANDARD
Packit 1fb8d4
		 * 2 ... TIME_ZONE_ID_DAYLIGHT */
Packit 1fb8d4
		return local_time->tm_isdst ? 2 : 1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/* could not detect timezone, use computed bias from tm_gmtoff */
Packit 1fb8d4
	WLog_DBG(TAG, "tz not found, using computed bias %"PRId32".", tz->Bias);
Packit 1fb8d4
out_error:
Packit 1fb8d4
	free(dtz);
Packit 1fb8d4
	memcpy(tz->StandardName, L"Client Local Time", sizeof(tz->StandardName));
Packit 1fb8d4
	memcpy(tz->DaylightName, L"Client Local Time", sizeof(tz->DaylightName));
Packit 1fb8d4
	return 0; /* TIME_ZONE_ID_UNKNOWN */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION* lpTimeZoneInformation)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime, LPFILETIME lpFileTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpSystemTime);
Packit 1fb8d4
	WINPR_UNUSED(lpFileTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL FileTimeToSystemTime(const FILETIME* lpFileTime, LPSYSTEMTIME lpSystemTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpFileTime);
Packit 1fb8d4
	WINPR_UNUSED(lpSystemTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone,
Packit 1fb8d4
                                     LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZone);
Packit 1fb8d4
	WINPR_UNUSED(lpUniversalTime);
Packit 1fb8d4
	WINPR_UNUSED(lpLocalTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
Packit 1fb8d4
                                     LPSYSTEMTIME lpLocalTime, LPSYSTEMTIME lpUniversalTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	WINPR_UNUSED(lpLocalTime);
Packit 1fb8d4
	WINPR_UNUSED(lpUniversalTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
/*
Packit 1fb8d4
 * GetDynamicTimeZoneInformation is provided by the SDK if _WIN32_WINNT >= 0x0600 in SDKs above 7.1A
Packit 1fb8d4
 * and incorrectly if _WIN32_WINNT >= 0x0501 in older SDKs
Packit 1fb8d4
 */
Packit 1fb8d4
#if !defined(_WIN32) || (defined(_WIN32) && (defined(NTDDI_WIN8) && _WIN32_WINNT < 0x0600 || !defined(NTDDI_WIN8) && _WIN32_WINNT < 0x0501)) /* Windows Vista */
Packit 1fb8d4
Packit 1fb8d4
DWORD GetDynamicTimeZoneInformation(PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(pTimeZoneInformation);
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL SetDynamicTimeZoneInformation(const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL GetTimeZoneInformationForYear(USHORT wYear, PDYNAMIC_TIME_ZONE_INFORMATION pdtzi,
Packit 1fb8d4
                                   LPTIME_ZONE_INFORMATION ptzi)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(wYear);
Packit 1fb8d4
	WINPR_UNUSED(pdtzi);
Packit 1fb8d4
	WINPR_UNUSED(ptzi);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0601)) /* Windows 7 */
Packit 1fb8d4
Packit 1fb8d4
BOOL SystemTimeToTzSpecificLocalTimeEx(const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation,
Packit 1fb8d4
                                       const SYSTEMTIME* lpUniversalTime, LPSYSTEMTIME lpLocalTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	WINPR_UNUSED(lpUniversalTime);
Packit 1fb8d4
	WINPR_UNUSED(lpLocalTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL TzSpecificLocalTimeToSystemTimeEx(const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation,
Packit 1fb8d4
                                       const SYSTEMTIME* lpLocalTime, LPSYSTEMTIME lpUniversalTime)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	WINPR_UNUSED(lpLocalTime);
Packit 1fb8d4
	WINPR_UNUSED(lpUniversalTime);
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#if !defined(_WIN32) || (defined(_WIN32) && (_WIN32_WINNT < 0x0602)) /* Windows 8 */
Packit 1fb8d4
Packit 1fb8d4
DWORD EnumDynamicTimeZoneInformation(const DWORD dwIndex,
Packit 1fb8d4
                                     PDYNAMIC_TIME_ZONE_INFORMATION lpTimeZoneInformation)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(dwIndex);
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
DWORD GetDynamicTimeZoneInformationEffectiveYears(const PDYNAMIC_TIME_ZONE_INFORMATION
Packit 1fb8d4
        lpTimeZoneInformation,
Packit 1fb8d4
        LPDWORD FirstYear, LPDWORD LastYear)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(lpTimeZoneInformation);
Packit 1fb8d4
	WINPR_UNUSED(FirstYear);
Packit 1fb8d4
	WINPR_UNUSED(LastYear);
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif