From 6b60f7e04ab071e94f351e398e87bb21f03936b7451d51e423fa199d14565520 Mon Sep 17 00:00:00 2001
From: Dominique Leuenberger <dleuenberger@suse.com>
Date: Sat, 26 Mar 2016 14:07:49 +0000
Subject: [PATCH] Accepting request 379068 from Base:System

1

OBS-URL: https://build.opensuse.org/request/show/379068
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/timezone?expand=0&rev=102
---
 iso3166-uk.diff                  |   8 +-
 timezone-java.changes            |  33 ++++
 timezone-java.spec               |   8 +-
 timezone-java.spec.in            |   2 +-
 timezone.changes                 |  33 ++++
 timezone.spec                    |   8 +-
 tzcode-fromname.patch            |  10 +-
 tzcode-revert-01-8c9cb9580.patch |  60 ++++++
 tzcode-revert-02-301f794f3.patch |  96 ++++++++++
 tzcode-revert-03-39fd078a6.patch | 319 +++++++++++++++++++++++++++++++
 tzcode-zic.diff                  |   8 +-
 tzcode2016a.tar.gz               |   3 -
 tzcode2016a.tar.gz.asc           |  17 --
 tzcode2016c.tar.gz               |   3 +
 tzcode2016c.tar.gz.asc           |  17 ++
 tzdata-china.diff                |  26 +--
 tzdata2016a.tar.gz               |   3 -
 tzdata2016a.tar.gz.asc           |  17 --
 tzdata2016c.tar.gz               |   3 +
 tzdata2016c.tar.gz.asc           |  17 ++
 20 files changed, 622 insertions(+), 69 deletions(-)
 create mode 100644 tzcode-revert-01-8c9cb9580.patch
 create mode 100644 tzcode-revert-02-301f794f3.patch
 create mode 100644 tzcode-revert-03-39fd078a6.patch
 delete mode 100644 tzcode2016a.tar.gz
 delete mode 100644 tzcode2016a.tar.gz.asc
 create mode 100644 tzcode2016c.tar.gz
 create mode 100644 tzcode2016c.tar.gz.asc
 delete mode 100644 tzdata2016a.tar.gz
 delete mode 100644 tzdata2016a.tar.gz.asc
 create mode 100644 tzdata2016c.tar.gz
 create mode 100644 tzdata2016c.tar.gz.asc

diff --git a/iso3166-uk.diff b/iso3166-uk.diff
index 5d56268..e7059a0 100644
--- a/iso3166-uk.diff
+++ b/iso3166-uk.diff
@@ -1,8 +1,8 @@
-Index: timezone-2014i/iso3166.tab
+Index: timezone-2016b/iso3166.tab
 ===================================================================
---- timezone-2014i.orig/iso3166.tab
-+++ timezone-2014i/iso3166.tab
-@@ -100,7 +100,7 @@ FM	Micronesia
+--- timezone-2016b.orig/iso3166.tab
++++ timezone-2016b/iso3166.tab
+@@ -99,7 +99,7 @@ FM	Micronesia
  FO	Faroe Islands
  FR	France
  GA	Gabon
diff --git a/timezone-java.changes b/timezone-java.changes
index 36c4c7a..1e5f655 100644
--- a/timezone-java.changes
+++ b/timezone-java.changes
@@ -1,3 +1,36 @@
+-------------------------------------------------------------------
+Wed Mar 23 23:05:32 UTC 2016 - astieger@suse.com
+
+- timezone update 2016c [boo#972433]
+  * Azerbaijan no longer observes DST (Asia/Baku)
+  * Chile reverts from permanent to seasonal DST.
+  * Correct past timestamps for Europe/Kaliningrad, Europe/Vilnius,
+    Europe/Volgograd 1989-1991
+
+-------------------------------------------------------------------
+Thu Mar 17 06:52:00 UTC 2016 - lchiquitto@suse.com
+
+- timezone update 2016b [boo#971377]
+  * New zones Europe/Astrakhan and Europe/Ulyanovsk for Astrakhan
+    and Ulyanovsk Oblasts, Russia, both of which will switch from
+    +03 to +04 on 2016-03-27 at 02:00 local time.
+  * New zone Asia/Barnaul for Altai Krai and Altai Republic, Russia,
+    which will switch from +06 to +07 on the same date and local time.
+  * Asia/Sakhalin moves from +10 to +11 on 2016-03-27 at 02:00.
+  * As a trial of a new system that needs less information to be made
+    up, the new zones use numeric time zone abbreviations like "+04"
+    instead of invented abbreviations like "ASTT".
+  * Haiti will not observe DST in 2016.
+  * Palestine's spring-forward transition on 2016-03-26 is at 01:00,
+    not 00:00.
+  * tzselect's diagnostics and checking, and checktab.awk's checking,
+    have been improved.
+  * tzselect now tests Julian-date TZ settings more accurately.
+    (Thanks to J William Piggott.)
+- tzcode-revert-01-8c9cb9580.patch, tzcode-revert-02-301f794f3.patch,
+  tzcode-revert-03-39fd078a6.patch: Revert some porting fixes specific
+  to MS-Windows that rewrites parts of zic touched by our patches.
+
 -------------------------------------------------------------------
 Thu Jan 28 07:37:16 UTC 2016 - astieger@suse.com
 
diff --git a/timezone-java.spec b/timezone-java.spec
index 935fb6a..fd35728 100644
--- a/timezone-java.spec
+++ b/timezone-java.spec
@@ -25,7 +25,7 @@ License:        BSD-3-Clause and SUSE-Public-Domain
 Group:          System/Base
 # COMMON-BEGIN
 # COMMON-BEGIN
-Version:        2016a
+Version:        2016c
 Release:        0
 Source:         ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz
 Source1:        ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz
@@ -33,6 +33,9 @@ Source2:        ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz.asc
 Source3:        ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz.asc
 # http://sks.mrball.net/pks/lookup?op=get&search=0xED97E90E62AA7E34
 Source4:        timezone.keyring
+Patch100:       tzcode-revert-01-8c9cb9580.patch
+Patch101:       tzcode-revert-02-301f794f3.patch
+Patch102:       tzcode-revert-03-39fd078a6.patch
 Patch0:         tzdata-china.diff
 Patch1:         tzcode-zic.diff
 # PATCH-FIX-OPENSUSE bnc#845530
@@ -59,6 +62,9 @@ package is intended for Java Virtual Machine based on OpenJDK.
 %setup -c  -a 1
 # COMMON-PREP-BEGIN
 # COMMON-PREP-BEGIN
+%patch100 -p1 -R
+%patch101 -p1 -R
+%patch102 -p1 -R
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
diff --git a/timezone-java.spec.in b/timezone-java.spec.in
index 0af5e1e..213d43d 100644
--- a/timezone-java.spec.in
+++ b/timezone-java.spec.in
@@ -1,7 +1,7 @@
 #
 # spec file for package timezone-java
 #
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
diff --git a/timezone.changes b/timezone.changes
index 36c4c7a..1e5f655 100644
--- a/timezone.changes
+++ b/timezone.changes
@@ -1,3 +1,36 @@
+-------------------------------------------------------------------
+Wed Mar 23 23:05:32 UTC 2016 - astieger@suse.com
+
+- timezone update 2016c [boo#972433]
+  * Azerbaijan no longer observes DST (Asia/Baku)
+  * Chile reverts from permanent to seasonal DST.
+  * Correct past timestamps for Europe/Kaliningrad, Europe/Vilnius,
+    Europe/Volgograd 1989-1991
+
+-------------------------------------------------------------------
+Thu Mar 17 06:52:00 UTC 2016 - lchiquitto@suse.com
+
+- timezone update 2016b [boo#971377]
+  * New zones Europe/Astrakhan and Europe/Ulyanovsk for Astrakhan
+    and Ulyanovsk Oblasts, Russia, both of which will switch from
+    +03 to +04 on 2016-03-27 at 02:00 local time.
+  * New zone Asia/Barnaul for Altai Krai and Altai Republic, Russia,
+    which will switch from +06 to +07 on the same date and local time.
+  * Asia/Sakhalin moves from +10 to +11 on 2016-03-27 at 02:00.
+  * As a trial of a new system that needs less information to be made
+    up, the new zones use numeric time zone abbreviations like "+04"
+    instead of invented abbreviations like "ASTT".
+  * Haiti will not observe DST in 2016.
+  * Palestine's spring-forward transition on 2016-03-26 is at 01:00,
+    not 00:00.
+  * tzselect's diagnostics and checking, and checktab.awk's checking,
+    have been improved.
+  * tzselect now tests Julian-date TZ settings more accurately.
+    (Thanks to J William Piggott.)
+- tzcode-revert-01-8c9cb9580.patch, tzcode-revert-02-301f794f3.patch,
+  tzcode-revert-03-39fd078a6.patch: Revert some porting fixes specific
+  to MS-Windows that rewrites parts of zic touched by our patches.
+
 -------------------------------------------------------------------
 Thu Jan 28 07:37:16 UTC 2016 - astieger@suse.com
 
diff --git a/timezone.spec b/timezone.spec
index 9c58546..bfcf113 100644
--- a/timezone.spec
+++ b/timezone.spec
@@ -23,7 +23,7 @@ Group:          System/Base
 Url:            http://www.iana.org/time-zones
 PreReq:         filesystem, coreutils
 # COMMON-BEGIN
-Version:        2016a
+Version:        2016c
 Release:        0
 Source:         ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz
 Source1:        ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz
@@ -31,6 +31,9 @@ Source2:        ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz.asc
 Source3:        ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz.asc
 # http://sks.mrball.net/pks/lookup?op=get&search=0xED97E90E62AA7E34
 Source4:        timezone.keyring
+Patch100:       tzcode-revert-01-8c9cb9580.patch
+Patch101:       tzcode-revert-02-301f794f3.patch
+Patch102:       tzcode-revert-03-39fd078a6.patch
 Patch0:         tzdata-china.diff
 Patch1:         tzcode-zic.diff
 # PATCH-FIX-OPENSUSE bnc#845530
@@ -53,6 +56,9 @@ can select an appropriate time zone for your system with YaST.
 %prep
 %setup -q -c -a 1
 # COMMON-PREP-BEGIN
+%patch100 -p1 -R
+%patch101 -p1 -R
+%patch102 -p1 -R
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
diff --git a/tzcode-fromname.patch b/tzcode-fromname.patch
index 5b350fc..f9d913d 100644
--- a/tzcode-fromname.patch
+++ b/tzcode-fromname.patch
@@ -1,8 +1,8 @@
-Index: timezone-2015d/zic.c
+Index: timezone-2016b/zic.c
 ===================================================================
---- timezone-2015d.orig/zic.c
-+++ timezone-2015d/zic.c
-@@ -757,7 +757,7 @@ dolink(const char *const fromfield, cons
+--- timezone-2016b.orig/zic.c
++++ timezone-2016b/zic.c
+@@ -768,7 +768,7 @@ dolink(char const *fromfield, char const
  
  		result = link(fromname, toname);
  		if (result != 0) {
@@ -11,7 +11,7 @@ Index: timezone-2015d/zic.c
  				const char *t;
  				char *p;
  				size_t dotdots = 0;
-@@ -766,10 +766,10 @@ dolink(const char *const fromfield, cons
+@@ -777,10 +777,10 @@ dolink(char const *fromfield, char const
  				do
  					 t = s;
  				while ((s = strchr(s, '/'))
diff --git a/tzcode-revert-01-8c9cb9580.patch b/tzcode-revert-01-8c9cb9580.patch
new file mode 100644
index 0000000..809499b
--- /dev/null
+++ b/tzcode-revert-01-8c9cb9580.patch
@@ -0,0 +1,60 @@
+commit 8c9cb958078b470e352a58f7f2d756544051e59b
+Author: Paul Eggert <eggert@cs.ucla.edu>
+Date:   Fri Feb 26 12:36:17 2016 -0800
+
+    Fix asctime_r warning with MS-Windows
+    
+    Problem reported by Ian Abbott in:
+    http://mm.icann.org/pipermail/tz/2016-February/023291.html
+    * Makefile (CFLAGS): Add comment about new -D option.
+    * private.h (HAVE_DECL_ASCTIME_R): New macro.
+    (asctime_r): Depend on this, not on HAVE_POSIX_DECLS.
+
+diff --git a/Makefile b/Makefile
+index 20c2c98..5e2fb52 100644
+--- a/Makefile
++++ b/Makefile
+@@ -106,6 +106,7 @@ LDLIBS=
+ 
+ # Add the following to the end of the "CFLAGS=" line as needed.
+ #  -DBIG_BANG=-9999999LL if the Big Bang occurred at time -9999999 (see zic.c)
++#  -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r
+ #  -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
+ #  -DHAVE_DOS_FILE_NAMES if file names have drive specifiers etc. (MS-DOS)
+ #  -DHAVE_GETTEXT=1 if 'gettext' works (GNU, Linux, Solaris); also see LDLIBS
+diff --git a/private.h b/private.h
+index e23764d..941e91b 100644
+--- a/private.h
++++ b/private.h
+@@ -22,6 +22,10 @@
+ ** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
+ */
+ 
++#ifndef HAVE_DECL_ASCTIME_R
++#define HAVE_DECL_ASCTIME_R 1
++#endif
++
+ #ifndef HAVE_GETTEXT
+ #define HAVE_GETTEXT		0
+ #endif /* !defined HAVE_GETTEXT */
+@@ -386,17 +390,11 @@ time_t time(time_t *);
+ void tzset(void);
+ #endif
+ 
+-/*
+-** Some time.h implementations don't declare asctime_r.
+-** Others might define it as a macro.
+-** Fix the former without affecting the latter.
+-** Similarly for timezone, daylight, and altzone.
+-*/
++#if !HAVE_DECL_ASCTIME_R && !defined asctime_r
++extern char *asctime_r(struct tm const *restrict, char *restrict);
++#endif
+ 
+ #if !HAVE_POSIX_DECLS
+-# ifndef asctime_r
+-extern char *	asctime_r(struct tm const *restrict, char *restrict);
+-# endif
+ # ifdef USG_COMPAT
+ #  ifndef timezone
+ extern long timezone;
diff --git a/tzcode-revert-02-301f794f3.patch b/tzcode-revert-02-301f794f3.patch
new file mode 100644
index 0000000..b621070
--- /dev/null
+++ b/tzcode-revert-02-301f794f3.patch
@@ -0,0 +1,96 @@
+commit 301f794f33d145b08fbf7f5247c8663d404fabb5
+Author: Paul Eggert <eggert@cs.ucla.edu>
+Date:   Fri Feb 26 08:58:45 2016 -0800
+
+    Fix tzname redefinition in MS-Windows
+    
+    Problem reported by Ian Abbott in:
+    http://mm.icann.org/pipermail/tz/2016-February/023289.html
+    * localtime.c (tzname): Don’t define if HAVE_POSIX_DECLS,
+    as causes the Microsoft compiler to complain that tzname
+    is redeclared without dllimport.
+    * localtime.c, private.h (altzone): Do define even if
+    HAVE_POSIX_DECLS, since this is not a POSIX-specified variable.
+
+diff --git a/localtime.c b/localtime.c
+index e3bc763..276ce34 100644
+--- a/localtime.c
++++ b/localtime.c
+@@ -178,11 +178,6 @@ static struct state	gmtmem;
+ static char		lcl_TZname[TZ_STRLEN_MAX + 1];
+ static int		lcl_is_set;
+ 
+-char *			tzname[2] = {
+-	(char *) wildabbr,
+-	(char *) wildabbr
+-};
+-
+ /*
+ ** Section 4.12.3 of X3.159-1989 requires that
+ **	Except for the strftime function, these functions [asctime,
+@@ -193,10 +188,16 @@ char *			tzname[2] = {
+ 
+ static struct tm	tm;
+ 
+-#ifdef USG_COMPAT
++#if !HAVE_POSIX_DECLS
++char *			tzname[2] = {
++	(char *) wildabbr,
++	(char *) wildabbr
++};
++# ifdef USG_COMPAT
+ long			timezone;
+ int			daylight;
+-#endif /* defined USG_COMPAT */
++# endif
++#endif
+ 
+ #ifdef ALTZONE
+ long			altzone;
+diff --git a/private.h b/private.h
+index 6080e71..e23764d 100644
+--- a/private.h
++++ b/private.h
+@@ -386,8 +386,6 @@ time_t time(time_t *);
+ void tzset(void);
+ #endif
+ 
+-#if !HAVE_POSIX_DECLS
+-
+ /*
+ ** Some time.h implementations don't declare asctime_r.
+ ** Others might define it as a macro.
+@@ -395,24 +393,24 @@ void tzset(void);
+ ** Similarly for timezone, daylight, and altzone.
+ */
+ 
+-#ifndef asctime_r
++#if !HAVE_POSIX_DECLS
++# ifndef asctime_r
+ extern char *	asctime_r(struct tm const *restrict, char *restrict);
+-#endif
+-
+-#ifdef USG_COMPAT
+-# ifndef timezone
+-extern long timezone;
+ # endif
+-# ifndef daylight
++# ifdef USG_COMPAT
++#  ifndef timezone
++extern long timezone;
++#  endif
++#  ifndef daylight
+ extern int daylight;
++#  endif
+ # endif
+ #endif
++
+ #if defined ALTZONE && !defined altzone
+ extern long altzone;
+ #endif
+ 
+-#endif
+-
+ /*
+ ** The STD_INSPIRED functions are similar, but most also need
+ ** declarations if time_tz is defined.
diff --git a/tzcode-revert-03-39fd078a6.patch b/tzcode-revert-03-39fd078a6.patch
new file mode 100644
index 0000000..0cccaa2
--- /dev/null
+++ b/tzcode-revert-03-39fd078a6.patch
@@ -0,0 +1,319 @@
+commit 39fd078a694fa762de5ae7efceca1dbfb7be94b3
+Author: Paul Eggert <eggert@cs.ucla.edu>
+Date:   Fri Feb 26 03:33:54 2016 -0800
+
+    Port better to MS-Windows
+    
+    Problems reported by Ian Abbott in:
+    http://mm.icann.org/pipermail/tz/2016-February/023286.html
+    http://mm.icann.org/pipermail/tz/2016-February/023287.html
+    * Makefile (CFLAGS): Add comment about new -D options.
+    * date.c (environ, optarg, optind, tzname):
+    * private.h (asctime_r, timezone, daylight, altzone):
+    * strftime.c (tzname):
+    * zdump.c (environ, getopt, optarg, optind, tzname):
+    * zic.c (getopt, link, optarg, optind):
+    Do not declare if HAVE_POSIX_DECLS, to avoid collisions with
+    system declarations, which is a problem with MS-Windows
+    and tzname and the dllimport attribute.
+    * date.c, zdump.c (tzname): Do not specify size, as POSIX doesn’t.
+    * private.h (HAVE_POSIX_DECLS): Default to 1.
+    (ENOTSUP): Default to EINVAL.
+    * zic.c: If HAVE_DIRECT_H, include direct.h and io.h and
+    define a mkdir macro, for MS-Windows.
+    (link, symlink): Set errno to ENOTSUP in the substitutes.
+    (dolink): Don’t complain merely because link and/or
+    symlink is not supported.  Be a bit more economical and robust
+    about checking for directories and existing destinations.
+    Report errno-related string on link failures.
+    (itsdir): Work correctly even if a directory has a timestamp that
+    is out of time_t range, so that stat fails with errno ==
+    EOVERFLOW.
+    (writezone): Don’t remove files we can’t stat.
+
+diff --git a/Makefile b/Makefile
+index 568f7f6..20c2c98 100644
+--- a/Makefile
++++ b/Makefile
+@@ -106,6 +106,7 @@ LDLIBS=
+ 
+ # Add the following to the end of the "CFLAGS=" line as needed.
+ #  -DBIG_BANG=-9999999LL if the Big Bang occurred at time -9999999 (see zic.c)
++#  -DHAVE_DIRECT_H if mkdir needs <direct.h> (MS-Windows)
+ #  -DHAVE_DOS_FILE_NAMES if file names have drive specifiers etc. (MS-DOS)
+ #  -DHAVE_GETTEXT=1 if 'gettext' works (GNU, Linux, Solaris); also see LDLIBS
+ #  -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
+@@ -116,6 +117,8 @@ LDLIBS=
+ #  -DHAVE_LOCALTIME_RZ=0 if you do not want zdump to use localtime_rz
+ #	This defaults to 1 if a working localtime_rz seems to be available.
+ #	localtime_rz can make zdump significantly faster, but is nonstandard.
++#  -DHAVE_POSIX_DECLS=0 if your system's include files do not declare
++#	functions like 'link' or variables like 'tzname' required by POSIX
+ #  -DHAVE_STDINT_H=1 if you have a pre-C99 compiler with "stdint.h"
+ #  -DHAVE_STRFTIME_L=1 if <time.h> declares locale_t and strftime_l
+ #	This defaults to 0 if _POSIX_VERSION < 200809, 1 otherwise.
+diff --git a/date.c b/date.c
+index 824e57d..4c11f61 100644
+--- a/date.c
++++ b/date.c
+@@ -42,10 +42,12 @@
+ #define SECSPERMIN	60
+ #endif /* !defined SECSPERMIN */
+ 
++#if !HAVE_POSIX_DECLS
+ extern char **		environ;
+ extern char *		optarg;
+ extern int		optind;
+-extern char *		tzname[2];
++extern char *		tzname[];
++#endif
+ 
+ static int		retval = EXIT_SUCCESS;
+ 
+diff --git a/private.h b/private.h
+index 1c176e6..6080e71 100644
+--- a/private.h
++++ b/private.h
+@@ -34,6 +34,10 @@
+ #define HAVE_LINK		1
+ #endif /* !defined HAVE_LINK */
+ 
++#ifndef HAVE_POSIX_DECLS
++#define HAVE_POSIX_DECLS 1
++#endif
++
+ #ifndef HAVE_STRDUP
+ #define HAVE_STRDUP 1
+ #endif
+@@ -106,6 +110,9 @@
+ #ifndef ENAMETOOLONG
+ # define ENAMETOOLONG EINVAL
+ #endif
++#ifndef ENOTSUP
++# define ENOTSUP EINVAL
++#endif
+ #ifndef EOVERFLOW
+ # define EOVERFLOW EINVAL
+ #endif
+@@ -379,6 +386,8 @@ time_t time(time_t *);
+ void tzset(void);
+ #endif
+ 
++#if !HAVE_POSIX_DECLS
++
+ /*
+ ** Some time.h implementations don't declare asctime_r.
+ ** Others might define it as a macro.
+@@ -402,6 +411,8 @@ extern int daylight;
+ extern long altzone;
+ #endif
+ 
++#endif
++
+ /*
+ ** The STD_INSPIRED functions are similar, but most also need
+ ** declarations if time_tz is defined.
+diff --git a/strftime.c b/strftime.c
+index 7a139bd..f75f9fd 100644
+--- a/strftime.c
++++ b/strftime.c
+@@ -106,7 +106,9 @@ static char *	_fmt(const char *, const struct tm *, char *, const char *,
+ 			int *);
+ static char *	_yconv(int, int, bool, bool, char *, char const *);
+ 
++#if !HAVE_POSIX_DECLS
+ extern char *	tzname[];
++#endif
+ 
+ #ifndef YEAR_2000_NAME
+ #define YEAR_2000_NAME	"CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
+diff --git a/zdump.c b/zdump.c
+index 063a263..64d90f6 100644
+--- a/zdump.c
++++ b/zdump.c
+@@ -238,12 +238,14 @@ enum { SECSPER400YEARS_FITS = SECSPERLYEAR <= INTMAX_MAX / 400 };
+ # define timezone_t char **
+ #endif
+ 
++#if !HAVE_POSIX_DECLS
+ extern char **	environ;
+ extern int	getopt(int argc, char * const argv[],
+ 			const char * options);
+ extern char *	optarg;
+ extern int	optind;
+-extern char *	tzname[2];
++extern char *	tzname[];
++#endif
+ 
+ /* The minimum and maximum finite time values.  */
+ enum { atime_shift = CHAR_BIT * sizeof (time_t) - 2 };
+diff --git a/zic.c b/zic.c
+index 78ab870..0ec3359 100644
+--- a/zic.c
++++ b/zic.c
+@@ -22,6 +22,13 @@ typedef int_fast64_t	zic_t;
+ #define ZIC_MAX_ABBR_LEN_WO_WARN	6
+ #endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
+ 
++#ifdef HAVE_DIRECT_H
++# include <direct.h>
++# include <io.h>
++# undef mkdir
++# define mkdir(name, mode) _mkdir(name)
++#endif
++
+ #if HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+ #endif
+@@ -87,17 +94,19 @@ struct zone {
+ 	zic_t		z_untiltime;
+ };
+ 
++#if !HAVE_POSIX_DECLS
+ extern int	getopt(int argc, char * const argv[],
+ 			const char * options);
+ extern int	link(const char * fromname, const char * toname);
+ extern char *	optarg;
+ extern int	optind;
++#endif
+ 
+ #if ! HAVE_LINK
+-# define link(from, to) (-1)
++# define link(from, to) (errno = ENOTSUP, -1)
+ #endif
+ #if ! HAVE_SYMLINK
+-# define symlink(from, to) (-1)
++# define symlink(from, to) (errno = ENOTSUP, -1)
+ #endif
+ 
+ static void	addtt(zic_t starttime, int type);
+@@ -758,41 +767,47 @@ dolink(char const *fromfield, char const *tofield)
+ 			progname, fromname, e);
+ 		exit(EXIT_FAILURE);
+ 	}
+-	if (itsdir(toname) <= 0)
+-		remove(toname);
+ 	if (link(fromname, toname) != 0) {
+-		int	result;
++	  int link_errno = errno;
++	  bool retry_if_link_supported = false;
+ 
+-		if (! mkdirs(toname))
+-			exit(EXIT_FAILURE);
+-
+-		result = link(fromname, toname);
+-		if (result != 0) {
+-				const char *s = fromfield;
+-				const char *t;
+-				char *p;
+-				size_t dotdots = 0;
+-				register char * symlinkcontents = NULL;
+-
+-				do
+-					 t = s;
+-				while ((s = strchr(s, '/'))
+-				       && ! strncmp (fromfield, tofield,
+-						     ++s - fromfield));
+-
+-				for (s = tofield + (t - fromfield); *s; s++)
+-				  dotdots += *s == '/';
+-				symlinkcontents
+-				  = emalloc(3 * dotdots + strlen(t) + 1);
+-				for (p = symlinkcontents; dotdots-- != 0; p += 3)
+-				  memcpy(p, "../", 3);
+-				strcpy(p, t);
+-				result = symlink(symlinkcontents, toname);
+-				if (result == 0)
+-warning(_("hard link failed, symbolic link used"));
+-				free(symlinkcontents);
+-		}
+-		if (result != 0) {
++	  if (link_errno == ENOENT || link_errno == ENOTSUP) {
++	    if (! mkdirs(toname))
++	      exit(EXIT_FAILURE);
++	    retry_if_link_supported = true;
++	  }
++	  if ((link_errno == EEXIST || link_errno == ENOTSUP)
++	      && itsdir(toname) == 0
++	      && (remove(toname) == 0 || errno == ENOENT))
++	    retry_if_link_supported = true;
++	  if (retry_if_link_supported && link_errno != ENOTSUP)
++	    link_errno = link(fromname, toname) == 0 ? 0 : errno;
++	  if (link_errno != 0) {
++	    const char *s = fromfield;
++	    const char *t;
++	    char *p;
++	    size_t dotdots = 0;
++	    char *symlinkcontents;
++	    int symlink_result;
++
++	    do
++	      t = s;
++	    while ((s = strchr(s, '/'))
++		   && strncmp(fromfield, tofield, ++s - fromfield) == 0);
++
++	    for (s = tofield + (t - fromfield); *s; s++)
++	      dotdots += *s == '/';
++	    symlinkcontents = emalloc(3 * dotdots + strlen(t) + 1);
++	    for (p = symlinkcontents; dotdots-- != 0; p += 3)
++	      memcpy(p, "../", 3);
++	    strcpy(p, t);
++	    symlink_result = symlink(symlinkcontents, toname);
++	    free(symlinkcontents);
++	    if (symlink_result == 0) {
++	      if (link_errno != ENOTSUP)
++		warning(_("symbolic link used because hard link failed: %s"),
++			strerror (link_errno));
++	    } else {
+ 			FILE *fp, *tp;
+ 			int c;
+ 			fp = fopen(fromname, "rb");
+@@ -815,8 +830,11 @@ warning(_("hard link failed, symbolic link used"));
+ 				putc(c, tp);
+ 			close_file(fp, fromname);
+ 			close_file(tp, toname);
+-			warning(_("link failed, copy used"));
+-		}
++			if (link_errno != ENOTSUP)
++			  warning(_("copy used because hard link failed: %s"),
++				  strerror (link_errno));
++	    }
++	  }
+ 	}
+ 	free(fromname);
+ 	free(toname);
+@@ -863,18 +881,17 @@ itsdir(char const *name)
+ {
+ 	struct stat st;
+ 	int res = stat(name, &st);
+-	if (res != 0)
+-		return res;
+ #ifdef S_ISDIR
+-	return S_ISDIR(st.st_mode) != 0;
+-#else
+-	{
++	if (res == 0)
++		return S_ISDIR(st.st_mode) != 0;
++#endif
++	if (res == 0 || errno == EOVERFLOW) {
+ 		char *nameslashdot = relname(name, ".");
+-		res = stat(nameslashdot, &st);
++		bool dir = stat(nameslashdot, &st) == 0 || errno == EOVERFLOW;
+ 		free(nameslashdot);
+-		return res == 0;
++		return dir;
+ 	}
+-#endif
++	return -1;
+ }
+ 
+ /*
+@@ -1685,7 +1702,7 @@ writezone(const char *const name, const char *const string, char version)
+ 	/*
+ 	** Remove old file, if any, to snap links.
+ 	*/
+-	if (itsdir(fullname) <= 0 && remove(fullname) != 0 && errno != ENOENT) {
++	if (itsdir(fullname) == 0 && remove(fullname) != 0 && errno != ENOENT) {
+ 		const char *e = strerror(errno);
+ 
+ 		fprintf(stderr, _("%s: Can't remove %s: %s\n"),
diff --git a/tzcode-zic.diff b/tzcode-zic.diff
index 35b3615..625cef2 100644
--- a/tzcode-zic.diff
+++ b/tzcode-zic.diff
@@ -1,8 +1,8 @@
-Index: timezone-2015d/zic.c
+Index: timezone-2016b/zic.c
 ===================================================================
---- timezone-2015d.orig/zic.c
-+++ timezone-2015d/zic.c
-@@ -777,8 +777,10 @@ dolink(const char *const fromfield, cons
+--- timezone-2016b.orig/zic.c
++++ timezone-2016b/zic.c
+@@ -788,8 +788,10 @@ dolink(char const *fromfield, char const
  				  memcpy(p, "../", 3);
  				strcpy(p, t);
  				result = symlink(symlinkcontents, toname);
diff --git a/tzcode2016a.tar.gz b/tzcode2016a.tar.gz
deleted file mode 100644
index f404832..0000000
--- a/tzcode2016a.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:11ae66d59b844e8c6c81914c9dd73b666627bd7792855ba9de195eee4520c28d
-size 184047
diff --git a/tzcode2016a.tar.gz.asc b/tzcode2016a.tar.gz.asc
deleted file mode 100644
index c774320..0000000
--- a/tzcode2016a.tar.gz.asc
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1
-
-iQIcBAABAgAGBQJWqHJCAAoJEO2X6Q5iqn40vggP/iUDh0UDG3g9lQfV41yXx+Dg
-4Ln+RVSEkfKE82ffPSJzvyRQzp1l/U2alopcI+Ernou7hmcrYYcJC827QZ+boiLv
-uK5/LIDqI/uBb6j3bxt2aiymsbL1+q4C3RDypujKa4lh0kuinO6MUTpnIEGmNdAl
-l0q6pWyJfH4UYxT8UCjCvJrNQwMxCD+31oz4blUMUr3h/TdAfd/uRs0xm06Fi6ss
-HSzJ1P2gej4uTdGzuWczbZrCdkpLvZXhYt/kIQ3tOl+9bAJOJa0/3zVuIxUO6DNL
-w4RRaHbdtvtDUw7vqGcIe2nZHZ4GdRfHINi2sflHfH6auq53x6mWiOGbDqAMQkk4
-2HFnHr8sawB+6TA8vSgayOKg+Ja2eX/4IXBqrGBzt96a0AfJDgWlulgA5oc6lQvy
-BAYtgXYfUTg05EEZOIvL1kDR3CZJB2v6U72DVT8y6Bs52w1ue1/7HfhY9N5hHor5
-nCeaeqoQLopMdfpMn3pATqRXvTFsxmlDaN8Y2S6IZyvQgPqpPGBdaH0i+Ran5bXf
-vKCRpxS6rsSvOdliNCnr2hytk5UrRdxuLJ6yWiUjhVBszGISUR15w2iwK26NifIR
-ZbMV4e2bcZl7kGcq+dIeTtjAoXeP+Bh3Y3NfIq37O1NK8gsx31GfGMVifJYxE4ti
-qtlircuZtjdkQR0GmACZ
-=cUhj
------END PGP SIGNATURE-----
diff --git a/tzcode2016c.tar.gz b/tzcode2016c.tar.gz
new file mode 100644
index 0000000..7b4cef1
--- /dev/null
+++ b/tzcode2016c.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:344b1bd486935bca2b7baa47db3b99b32211c45f31ec0d1ead8bacd103c5a416
+size 192354
diff --git a/tzcode2016c.tar.gz.asc b/tzcode2016c.tar.gz.asc
new file mode 100644
index 0000000..5aab106
--- /dev/null
+++ b/tzcode2016c.tar.gz.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iQIcBAABAgAGBQJW8kvPAAoJEO2X6Q5iqn40jpMQAJEISYMBgL9Vcx3U1IuTo5mI
+dBs0XW6cjgzefG3DdWK95VILUUXDEhtZGOkwdbEZVuH4uv0CApwtoW24w6X0w/qm
+y4xZZYpvzClrySVszcJFMgRQC4MeOxQ0KUmSLRMzV3TKSI01AmewZblftxC3FSAK
+GrOD2Z86ObGf9pbpcOBycFyhyy4QNd65SxiOZ70uhgZejoNE6T7zb/KHto6PzjD4
+CzAhn8w1bqeglTM4zrfiEmSDGEZM+3OgLNHgmTvOQcYwB3fxdvQasSioyCb9axfj
+MJYNm2oBslanWwPXjwssBQeSPyLN8tYHcICsn7Qu+4iVCvMJBlrzXhBNla7Dmxdk
+Bl02fXKivnQ3S3s7/K7RZyMV87DthPDY9NQtUrKCkg1unBn7vbJ2e+kKe13qzFmi
+z7LAgKoJII34PoLhBrEF0M643DMTT0xEA3jbFSOIUoI5LawjlC57M8FhOgVD7dbA
+bxzgOMyYzUwhJLOk5pFzkMmifVhwcbUCSl52kBI8H+TBkR9g11gb1PQ4PF2f9H2R
+YcJaYP5kNzoPU8a2lStfxVLqx3iwJ9i5FwpVnMQxinySFvLAnrZ7YBYqJjYdYsn4
+LV//V12VctwvF84VtaX3iK53Z79rLYM2Zz2x4AVjfSaAtF4ZDPC/ZauZIhqSLked
+rkdqvg2CgR2jn1qVhS3E
+=ohkH
+-----END PGP SIGNATURE-----
diff --git a/tzdata-china.diff b/tzdata-china.diff
index 2d5dd66..e80b7b6 100644
--- a/tzdata-china.diff
+++ b/tzdata-china.diff
@@ -1,8 +1,8 @@
-Index: timezone-2015d/asia
+Index: timezone-2016b/asia
 ===================================================================
---- timezone-2015d.orig/asia
-+++ timezone-2015d/asia
-@@ -516,6 +516,10 @@ Rule	PRC	1987	1991	-	Apr	Sun>=10	0:00	1:
+--- timezone-2016b.orig/asia
++++ timezone-2016b/asia
+@@ -518,6 +518,10 @@ Rule	PRC	1987	1991	-	Apr	Sun>=10	0:00	1:
  Zone	Asia/Shanghai	8:05:43	-	LMT	1901
  			8:00	Shang	C%sT	1949
  			8:00	PRC	C%sT
@@ -13,11 +13,11 @@ Index: timezone-2015d/asia
  # Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
  # / Wulumuqi.  (Please use Asia/Shanghai if you prefer Beijing time.)
  Zone	Asia/Urumqi	5:50:20	-	LMT	1928
-Index: timezone-2015d/backward
+Index: timezone-2016b/backward
 ===================================================================
---- timezone-2015d.orig/backward
-+++ timezone-2015d/backward
-@@ -93,7 +93,7 @@ Link	America/Mexico_City	Mexico/General
+--- timezone-2016b.orig/backward
++++ timezone-2016b/backward
+@@ -94,7 +94,7 @@ Link	America/Mexico_City	Mexico/General
  Link	Pacific/Auckland	NZ
  Link	Pacific/Chatham		NZ-CHAT
  Link	America/Denver		Navajo
@@ -26,12 +26,12 @@ Index: timezone-2015d/backward
  Link	Pacific/Pohnpei		Pacific/Ponape
  Link	Pacific/Pago_Pago	Pacific/Samoa
  Link	Pacific/Chuuk		Pacific/Truk
-Index: timezone-2015d/zone.tab
+Index: timezone-2016b/zone.tab
 ===================================================================
---- timezone-2015d.orig/zone.tab
-+++ timezone-2015d/zone.tab
-@@ -143,6 +143,7 @@ CK	-2114-15946	Pacific/Rarotonga
- CL	-3327-07040	America/Santiago	most locations
+--- timezone-2016b.orig/zone.tab
++++ timezone-2016b/zone.tab
+@@ -144,6 +144,7 @@ CK	-2114-15946	Pacific/Rarotonga
+ CL	-3327-07040	America/Santiago	Chile (most areas)
  CL	-2709-10926	Pacific/Easter	Easter Island
  CM	+0403+00942	Africa/Douala
 +CN	+3955+11626	Asia/Beijing	China Standard Time
diff --git a/tzdata2016a.tar.gz b/tzdata2016a.tar.gz
deleted file mode 100644
index f3643d6..0000000
--- a/tzdata2016a.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5efa6b324e64ef921ef700ac3273a51895f672684a30e342f68e47871c6a8cd1
-size 302817
diff --git a/tzdata2016a.tar.gz.asc b/tzdata2016a.tar.gz.asc
deleted file mode 100644
index 33c1e0e..0000000
--- a/tzdata2016a.tar.gz.asc
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1
-
-iQIcBAABAgAGBQJWqHJHAAoJEO2X6Q5iqn40O/QP/0dWxkvnViAXibpFmZeQF9qC
-18S3oL35D9CwWdIo60zmQ1K4lzq7k3K4fCs+VAZnlp8DeqxbnX/utfFsxRGBZu9F
-fHYeIyxPB+Gm45SE3USefZgD38LDDmEIkeQ+SE3geDSVKMO/gHGk55jl/8vylm1d
-bIdU/1PNSr5EZt2LlXuRRO1lnQ6cW1G5vDtGj4nyB++/FDIi4qsBMQy21qqRs2K3
-vcw3yRQbqz7rEUxG/k0d9KU/dRUY980f4pHx2kkYpRKL2nhLeYqH3jfRUhOgwupS
-Yp4fVFF1gZWbxjcf8Xb97jpCW0q4TL4wPYFQNOsLJJGtNeRP1Pgz7FsjH1qwSUy2
-blX1UWhtFAjUnHF+XO7Z5DUexoq1+14OFWSGwxuGpwUNxgtMmRr4KZVuKg9ag7jC
-hKoegozcf90lZ+PmuAXNbz1S9DcILRFG7qnV+E3oKPjyOQBnU1z7Mx0rtleT14iQ
-Pdi0ygv4/9cs07dOsF3oqRfwqldYogYF0/O3559eQzGfKdxOIu0eLZV9PLaCnAoM
-2zpnPOBqBIwUHRynd6EBJyeu1WCRoC/oIvEs8A8QINf6EN/Fu/Xxgmf8HwwRIOE+
-xgJeNE4Z4xjWiCmu7dvBZJIZZi7dmWaHwste+WxUMZ0boDsYOmnkGCclpSb+MzpX
-49a9DUdrNMurifgNd4vy
-=WafQ
------END PGP SIGNATURE-----
diff --git a/tzdata2016c.tar.gz b/tzdata2016c.tar.gz
new file mode 100644
index 0000000..f10093e
--- /dev/null
+++ b/tzdata2016c.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8700d981e6f2007ac037dabb5d2b12f390e8629bbc30e564bc21cf0c069a2d48
+size 308625
diff --git a/tzdata2016c.tar.gz.asc b/tzdata2016c.tar.gz.asc
new file mode 100644
index 0000000..07d820f
--- /dev/null
+++ b/tzdata2016c.tar.gz.asc
@@ -0,0 +1,17 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1
+
+iQIcBAABAgAGBQJW8kvPAAoJEO2X6Q5iqn40RNkQALaqvu+Htes5GqYguOlXTjHK
+SEuSiAX/8NytW2xq0d640AODLoMp0hdj5fbyWn+b7kwwOH22w/83l1aYLrVwDihA
+JCDzHk2Z+/ryBVNzBDYq09O070m2z3LHl4hJknbReMBWem6Ar5El4kJAxO7xVZik
+MS9LCNHoMQ1v1inWpU1A0LY9uFcDAMiFl4JCS/Z9RkJYmjP4fBZlviz26BrIW1vz
+q1YdG9jSLuiJUVxVRftrDrHcmBFdy1jssW5KAof3eQpynZ61O9LAYR1py+nKydox
+UsQe+QNXybQXLNnk9l5nO9yNHp1y9zbzoz3LKgnqhXuyayA74qkHQEPywW0F3Q1F
+wkjqBsHP9bS6mdA1LTwDMLmC+l4x/7gyRttRzeEdhV0KPktMW2xCKC9EWEyzYBny
+zeQ80WGKHYf6j9Gmnw1HnRAi99NZKBg00Zu5bgdireYctqFA53fNLz48ib8SC/WY
+4eBXNypmv80VHjOie/VJIXgdwuiEhl8T2mf/WTiSjY0NRmhuMB6QP9OGsS+48Qhz
+LWlaNa9qRRIJlV0PquzPRE03WTVdEocp0XIKCrhRebYQNhB4GhlDc2iz8SqufetA
+5Pfr2ws/oLAxPqa/bkLo60JJLtBds9B8loZ6FjfKj6q/2YdbOen9eOiIAbF5Zl/r
+hd53qVMRzG0VTWf3VYr9
+=jrsu
+-----END PGP SIGNATURE-----