Sync with 2016b

This commit is contained in:
christos 2016-03-15 15:16:01 +00:00
parent 7215e4a264
commit e4c8546a4c
13 changed files with 539 additions and 235 deletions

View File

@ -0,0 +1,69 @@
Contributing to the tz code and data
The time zone database is by no means authoritative: governments
change timekeeping rules erratically and sometimes with little
warning, the data entries do not cover all of civil time before
1970, and undoubtedly errors remain in the code and data. Feel
free to fill gaps or fix mistakes, and please email improvements
to tz@iana.org for use in the future.
To email small changes, please run a POSIX shell command like
'diff -u old/europe new/europe >myfix.patch', and attach
myfix.patch to the email.
For more-elaborate changes, please read the Theory file and browse
the mailing list archives <http://mm.icann.org/pipermail/tz/> for
examples of patches that tend to work well. Ideally, additions to
data should contain commentary citing reliable sources as
justification.
Please submit changes against either the latest release in
<ftp://ftp.iana.org/tz/> or the master branch of the experimental
Git repository. If you use Git the following workflow may be helpful:
* Copy the experimental repository.
git clone https://github.com/eggert/tz.git
cd tz
* Get current with the master branch.
git checkout master
git pull
* Switch to a new branch for the changes. Choose a different
branch name for each change set.
git checkout -b mybranch
* Edit source files. Include commentary that justifies the
changes by citing reliable sources.
* Debug the changes, e.g.:
make check
make install
./zdump -v America/Los_Angeles
* For each separable change, commit it in the new branch, e.g.:
git add northamerica
git commit
See recent 'git log' output for the commit-message style.
* Create patch files 0001-*, 0002-*, ...
git format-patch master
* After reviewing the patch files, send the patches to tz@iana.org
for others to review.
git send-email master
* Start anew by getting current with the master branch again
(the second step above).
Please do not create issues or pull requests on GitHub, as the
proper procedure for proposing and distributing patches is via
email as illustrated above.

View File

@ -5,7 +5,7 @@
PACKAGE= tzcode
# Version numbers of the code and data distributions.
VERSION= 2015g
VERSION= 2016b
# Email address for bug reports.
BUGEMAIL= tz@iana.org
@ -84,14 +84,18 @@ LIBDIR= $(TOPDIR)/lib
# below. If you want both sets of data available, with leap seconds counted
# normally, use
# REDO= right_posix
# below. If you want just POSIX-compatible time values, but with
# out-of-scope and often-wrong data from the file 'backzone', use
# REDO= posix_packrat
# POSIX mandates that leap seconds not be counted; for compatibility with it,
# use "posix_only", "posix_right", or "posix_packrat".
# below. POSIX mandates that leap seconds not be counted; for compatibility
# with it, use "posix_only" or "posix_right".
REDO= posix_right
# If you want out-of-scope and often-wrong data from the file 'backzone', use
# PACKRATDATA= backzone
# To omit this data, use
# PACKRATDATA=
PACKRATDATA=
# Since "." may not be in PATH...
YEARISTYPE= ./yearistype
@ -102,6 +106,8 @@ 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
# -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
@ -112,6 +118,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.
@ -237,11 +245,22 @@ CFLAGS=
LDFLAGS= $(LFLAGS)
# For leap seconds, this Makefile uses LEAPSECONDS='-L leapseconds' in
# submake command lines. The default is no leap seconds.
LEAPSECONDS=
# The zic command and its arguments.
zic= ./zic
ZIC= $(zic) $(ZFLAGS)
ZFLAGS=
# How to use zic to install tzdata binary files.
ZIC_INSTALL= $(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR) $(LEAPSECONDS)
# The name of a Posix-compliant 'awk' on your system.
AWK= awk
@ -345,8 +364,8 @@ MANTXTS= newctime.3.txt newstrftime.3.txt newtzset.3.txt \
time2posix.3.txt \
tzfile.5.txt tzselect.8.txt zic.8.txt zdump.8.txt \
date.1.txt
COMMON= CONTRIBUTING Makefile NEWS README Theory
WEB_PAGES= tz-art.htm tz-link.htm
COMMON= CONTRIBUTING LICENSE Makefile NEWS README Theory
WEB_PAGES= tz-art.htm tz-how-to.html tz-link.htm
DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
PRIMARY_YDATA= africa antarctica asia australasia \
europe northamerica southamerica
@ -367,7 +386,7 @@ ENCHILADA= $(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC)
SHELL= /bin/sh
all: tzselect zic zdump libtz.a $(TABDATA)
all: tzselect yearistype zic zdump libtz.a $(TABDATA)
ALL: all date $(ENCHILADA)
@ -376,8 +395,7 @@ install: all $(DATA) $(REDO) $(MANS)
$(DESTDIR)$(LIBDIR) \
$(DESTDIR)$(MANDIR)/man3 $(DESTDIR)$(MANDIR)/man5 \
$(DESTDIR)$(MANDIR)/man8
$(ZIC) -y $(YEARISTYPE) \
-d $(DESTDIR)$(TZDIR) -l $(LOCALTIME) -p $(POSIXRULES)
$(ZIC_INSTALL) -l $(LOCALTIME) -p $(POSIXRULES)
cp -f iso3166.tab $(ZONETABLES) $(DESTDIR)$(TZDIR)/.
cp tzselect zic zdump $(DESTDIR)$(ETCDIR)/.
cp libtz.a $(DESTDIR)$(LIBDIR)/.
@ -399,7 +417,7 @@ version.h:
zdump: $(TZDOBJS)
$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZDOBJS) $(LDLIBS)
zic: $(TZCOBJS) yearistype
zic: $(TZCOBJS)
$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS)
yearistype: yearistype.sh
@ -409,13 +427,28 @@ yearistype: yearistype.sh
leapseconds: $(LEAP_DEPS)
$(AWK) -f leapseconds.awk leap-seconds.list >$@
posix_only: zic $(TDATA)
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR) \
-L /dev/null $(TDATA)
# Arguments to pass to submakes of install_data.
# They can be overridden by later submake arguments.
INSTALLARGS = \
DESTDIR=$(DESTDIR) \
LEAPSECONDS='$(LEAPSECONDS)' \
PACKRATDATA='$(PACKRATDATA)' \
TZDIR=$(TZDIR) \
YEARISTYPE=$(YEARISTYPE) \
ZIC='$(ZIC)'
right_only: zic leapseconds $(TDATA)
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR) \
-L leapseconds $(TDATA)
# 'make install_data' installs one set of tz binary files.
# It can be tailored by setting LEAPSECONDS, PACKRATDATA, etc.
install_data: zic leapseconds yearistype $(PACKRATDATA) $(TDATA)
$(ZIC_INSTALL) $(TDATA)
$(AWK) '/^Rule/' $(TDATA) | $(ZIC_INSTALL) - $(PACKRATDATA)
posix_only:
$(MAKE) $(INSTALLARGS) LEAPSECONDS= install_data
right_only:
$(MAKE) $(INSTALLARGS) LEAPSECONDS='-L leapseconds' \
install_data
# In earlier versions of this makefile, the other two directories were
# subdirectories of $(TZDIR). However, this led to configuration errors.
@ -426,26 +459,22 @@ right_only: zic leapseconds $(TDATA)
# Therefore, the other two directories are now siblings of $(TZDIR).
# You must replace all of $(TZDIR) to switch from not using leap seconds
# to using them, or vice versa.
right_posix: right_only leapseconds
right_posix: right_only
rm -fr $(DESTDIR)$(TZDIR)-leaps
ln -s $(TZDIR_BASENAME) $(DESTDIR)$(TZDIR)-leaps || \
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR)-leaps \
-L leapseconds $(TDATA)
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR)-posix \
-L /dev/null $(TDATA)
$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-leaps right_only
$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-posix posix_only
posix_right: posix_only leapseconds
posix_right: posix_only
rm -fr $(DESTDIR)$(TZDIR)-posix
ln -s $(TZDIR_BASENAME) $(DESTDIR)$(TZDIR)-posix || \
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR)-posix \
-L /dev/null $(TDATA)
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR)-leaps \
-L leapseconds $(TDATA)
$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-posix posix_only
$(MAKE) $(INSTALLARGS) TZDIR=$(TZDIR)-leaps right_only
posix_packrat: posix_only backzone
$(AWK) '/^Rule/' $(TDATA) | \
$(ZIC) -y $(YEARISTYPE) -d $(DESTDIR)$(TZDIR) \
-L /dev/null - backzone
# This obsolescent rule is present for backwards compatibility with
# tz releases 2014g through 2015g. It should go away eventually.
posix_packrat:
$(MAKE) $(INSTALLARGS) PACKRATDATA=backzone posix_only
zones: $(REDO)
@ -661,6 +690,7 @@ zic.o: private.h tzfile.h version.h
.PHONY: check check_character_set check_links
.PHONY: check_public check_sorted check_tables
.PHONY: check_time_t_alternatives check_web check_white_space clean clean_misc
.PHONY: install maintainer-clean names posix_packrat posix_only posix_right
.PHONY: install install_data maintainer-clean names
.PHONY: posix_only posix_packrat posix_right
.PHONY: public right_only right_posix signatures tarballs typecheck
.PHONY: zonenames zones

View File

@ -1,5 +1,119 @@
News for the tz database
Release 2016b - 2016-03-12 17:30:14 -0800
Changes affecting future time stamps
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. They need distinct zones since their
post-1970 histories disagree. 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. The Astrakhan change is already official; the others have
passed the first reading in the State Duma and are extremely likely.
Also, Asia/Sakhalin moves from +10 to +11 on 2016-03-27 at 02:00.
(Thanks to Alexander Krivenyshev for the heads-up, and to Matt Johnson
and Stepan Golosunov for followup.)
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. (Thanks to Jean Antoine via
Steffen Thorsen.)
Palestine's spring-forward transition on 2016-03-26 is at 01:00, not 00:00.
(Thanks to Hannah Kreitem.) Guess future transitions will be March's last
Saturday at 01:00, not March's last Friday at 24:00.
Changes affecting past time stamps
Europe/Chisinau observed DST during 1990, and switched from +04 to
+03 at 1990-05-06 02:00, instead of switching from +03 to +02.
(Thanks to Stepan Golosunov.)
1991 abbreviations in Europe/Samara should be SAMT/SAMST, not
KUYT/KUYST. (Thanks to Stepan Golosunov.)
Changes to code
tzselect's diagnostics and checking, and checktab.awk's checking,
have been improved. (Thanks to J William Piggott.)
tzcode now builds under MinGW. (Thanks to Ian Abbott and Esben Haabendal.)
tzselect now tests Julian-date TZ settings more accurately.
(Thanks to J William Piggott.)
Changes to commentary
Comments in zone tables have been improved. (Thanks to J William Piggott.)
tzselect again limits its menu comments so that menus fit on a
24x80 alphanumeric display.
A new web page tz-how-to.html. (Thanks to Bill Seymour.)
In the Theory file, the description of possible time zone abbreviations in
tzdata has been cleaned up, as the old description was unclear and
inconsistent. (Thanks to Alain Mouette for reporting the problem.)
Release 2016a - 2016-01-26 23:28:02 -0800
Changes affecting future time stamps
America/Cayman will not observe daylight saving this year after all.
Revert our guess that it would. (Thanks to Matt Johnson.)
Asia/Chita switches from +0800 to +0900 on 2016-03-27 at 02:00.
(Thanks to Alexander Krivenyshev.)
Asia/Tehran now has DST predictions for the year 2038 and later,
to be March 21 00:00 to September 21 00:00. This is likely better
than predicting no DST, albeit off by a day every now and then.
Changes affecting past and future time stamps
America/Metlakatla switched from PST all year to AKST/AKDT on
2015-11-01 at 02:00. (Thanks to Steffen Thorsen.)
America/Santa_Isabel has been removed, and replaced with a
backward compatibility link to America/Tijuana. Its contents were
apparently based on a misreading of Mexican legislation.
Changes affecting past time stamps
Asia/Karachi's two transition times in 2002 were off by a minute.
(Thanks to Matt Johnson.)
Changes affecting build procedure
An installer can now combine leap seconds with use of the backzone file,
e.g., with 'make PACKRATDATA=backzone REDO=posix_right zones'.
The old 'make posix_packrat' rule is now marked as obsolescent.
(Thanks to Ian Abbott for an initial implementation.)
Changes affecting documentation and commentary
A new file LICENSE makes it easier to see that the code and data
are mostly public-domain. (Thanks to James Knight.) The three
non-public-domain files now use the current (3-clause) BSD license
instead of older versions of that license.
tz-link.htm mentions the BDE library (thanks to Andrew Paprocki),
CCTZ (thanks to Tim Parenti), TimeJones.com, and has a new section
on editing tz source files (with a mention of Sublime zoneinfo,
thanks to Gilmore Davidson).
The Theory and asia files now mention the 2015 book "The Global
Transformation of Time, 1870-1950", and cite a couple of reviews.
The America/Chicago entry now documents the informal use of US
central time in Fort Pierre, South Dakota. (Thanks to Rick
McDermid, Matt Johnson, and Steve Jones.)
Release 2015g - 2015-10-01 00:39:51 -0700
Changes affecting future time stamps
@ -26,6 +140,9 @@ Release 2015g - 2015-10-01 00:39:51 -0700
localtime no longer mishandles America/Anchorage after 2037.
(Thanks to Bradley White for reporting the bug.)
On hosts with signed 32-bit time_t, localtime no longer mishandles
Pacific/Fiji after 2038-01-16 14:00 UTC.
The localtime module allows the variables 'timezone', 'daylight',
and 'altzone' to be in common storage shared with other modules,
and declares them in case the system <time.h> does not.

View File

@ -10,10 +10,6 @@ locations around the globe. It is updated periodically to reflect
changes made by political bodies to time zone boundaries, UTC offsets,
and daylight-saving rules.
Unless otherwise specified, all files in the tz code and data are in
the public domain, so clarified as of 2009-05-17 by Arthur David Olson.
The few exceptions are code derived from BSD, which uses the BSD license.
Here is a recipe for acquiring, building, installing, and testing the
tz distribution on a GNU/Linux or similar host.
@ -59,3 +55,9 @@ None of them are responsible for remaining errors.
Look in <ftp://ftp.iana.org/tz/releases/> for updated versions of these files.
Please send comments or information to tz@iana.org.
-----
This file is in the public domain, so clarified as of 2009-05-17 by
Arthur David Olson. The other files in this distribution are either
public domain or BSD licensed; see the file LICENSE for details.

View File

@ -173,7 +173,7 @@ like 'EST' to be compatible with human tradition and POSIX.
Here are the general rules used for choosing time zone abbreviations,
in decreasing order of importance:
Use abbreviations that consist of three or more ASCII letters.
Use three or more characters that are ASCII alphanumerics or '+' or '-'.
Previous editions of this database also used characters like
' ' and '?', but these characters have a special meaning to
the shell and cause commands like
@ -181,19 +181,16 @@ in decreasing order of importance:
to have unexpected effects.
Previous editions of this rule required upper-case letters,
but the Congressman who introduced Chamorro Standard Time
preferred "ChST", so the rule has been relaxed.
This rule guarantees that all abbreviations could have
been specified by a POSIX TZ string. POSIX
requires at least three characters for an
abbreviation. POSIX through 2000 says that an abbreviation
cannot start with ':', and cannot contain ',', '-',
'+', NUL, or a digit. POSIX from 2001 on changes this
rule to say that an abbreviation can contain only '-', '+',
preferred "ChST", so lower-case letters are now allowed.
Also, POSIX from 2001 on relaxed the rule to allow '-', '+',
and alphanumeric characters from the portable character set
in the current locale. To be portable to both sets of
rules, an abbreviation must therefore use only ASCII
letters.
in the current locale. In practice ASCII alphanumerics and
'+' and '-' are safe in all locales.
In other words, in the C locale the POSIX extended regular
expression [-+[:alnum:]]{3,} should match the abbreviation.
This guarantees that all abbreviations could have been
specified by a POSIX TZ string.
Use abbreviations that are in common use among English-speakers,
e.g. 'EST' for Eastern Standard Time in North America.
@ -263,7 +260,15 @@ Errors in the tz database arise from many sources:
be needed if the tz database's scope were extended to cover even
just the known or guessed history of standard time; for example,
the current single entry for France would need to split into dozens
of entries, perhaps hundreds.
of entries, perhaps hundreds. And in most of the world even this
approach would be misleading due to widespread disagreement or
indifference about what times should be observed. In her 2015 book
"The Global Transformation of Time, 1870-1950", Vanessa Ogle writes
"Outside of Europe and North America there was no system of time
zones at all, often not even a stable landscape of mean times,
prior to the middle decades of the twentieth century". See:
Timothy Shenk, Booked: A Global History of Time. Dissent 2015-12-17
https://www.dissentmagazine.org/blog/booked-a-global-history-of-time-vanessa-ogle
* Most of the pre-1970 data entries come from unreliable sources, often
astrology books that lack citations and whose compilers evidently

View File

@ -1,4 +1,4 @@
/* $NetBSD: localtime.c,v 1.101 2016/02/20 20:11:37 christos Exp $ */
/* $NetBSD: localtime.c,v 1.102 2016/03/15 15:16:01 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
@ -10,7 +10,7 @@
#if 0
static char elsieid[] = "@(#)localtime.c 8.17";
#else
__RCSID("$NetBSD: localtime.c,v 1.101 2016/02/20 20:11:37 christos Exp $");
__RCSID("$NetBSD: localtime.c,v 1.102 2016/03/15 15:16:01 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -177,18 +177,6 @@ static timezone_t gmtptr;
static char lcl_TZname[TZ_STRLEN_MAX + 1];
static int lcl_is_set;
#if !defined(__LIBC12_SOURCE__)
__aconst char * tzname[2] = {
(__aconst char *)__UNCONST(wildabbr),
(__aconst char *)__UNCONST(wildabbr)
};
#else
extern __aconst char * tzname[2];
#endif
#ifdef _REENTRANT
static rwlock_t lcl_lock = RWLOCK_INITIALIZER;
@ -204,15 +192,30 @@ static rwlock_t lcl_lock = RWLOCK_INITIALIZER;
static struct tm tm;
#ifdef USG_COMPAT
#if !defined(__LIBC12_SOURCE__)
#if !HAVE_POSIX_DECLS || defined(__NetBSD__)
# if !defined(__LIBC12_SOURCE__)
__aconst char * tzname[2] = {
(__aconst char *)__UNCONST(wildabbr),
(__aconst char *)__UNCONST(wildabbr)
};
# else
extern __aconst char * tzname[2];
# endif /* __LIBC12_SOURCE__ */
# ifdef USG_COMPAT
# if !defined(__LIBC12_SOURCE__)
long timezone = 0;
int daylight = 0;
#else
extern int daylight;
extern long timezone __RENAME(__timezone13);
#endif
#endif /* defined USG_COMPAT */
# endif /* __LIBC12_SOURCE__ */
# endif /* defined USG_COMPAT */
#endif /* !HAVE_POSIX_DECLS */
#ifdef ALTZONE
long altzone = 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: private.h,v 1.44 2015/10/09 17:21:45 christos Exp $ */
/* $NetBSD: private.h,v 1.45 2016/03/15 15:16:01 christos Exp $ */
#ifndef PRIVATE_H
#define PRIVATE_H
@ -34,6 +34,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 */
@ -46,6 +50,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
@ -122,6 +130,9 @@
#ifndef ENAMETOOLONG
# define ENAMETOOLONG EINVAL
#endif
#ifndef ENOTSUP
# define ENOTSUP EINVAL
#endif
#ifndef EOVERFLOW
# define EOVERFLOW EINVAL
#endif
@ -395,25 +406,21 @@ 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.
*/
#ifndef asctime_r
extern char * asctime_r(struct tm const *restrict, char *restrict);
#if !HAVE_DECL_ASCTIME_R && !defined asctime_r
extern char *asctime_r(struct tm const *restrict, char *restrict);
#endif
#if defined(USG_COMPAT) && !defined(__NetBSD__)
# ifndef timezone
#if !HAVE_POSIX_DECLS
# if defined(USG_COMPAT) && !defined(__NetBSD__)
# ifndef timezone
extern long timezone;
# endif
# ifndef daylight
# endif
# ifndef daylight
extern int daylight;
# endif
# endif
#endif
#if defined ALTZONE && !defined altzone
extern long altzone;
#endif

View File

@ -1,4 +1,33 @@
/* $NetBSD: strftime.c,v 1.35 2015/10/09 17:21:45 christos Exp $ */
/* $NetBSD: strftime.c,v 1.36 2016/03/15 15:16:01 christos Exp $ */
/* Convert a broken-down time stamp to a string. */
/* Copyright 1989 The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE. */
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
@ -6,7 +35,7 @@
static char elsieid[] = "@(#)strftime.c 7.64";
static char elsieid[] = "@(#)strftime.c 8.3";
#else
__RCSID("$NetBSD: strftime.c,v 1.35 2015/10/09 17:21:45 christos Exp $");
__RCSID("$NetBSD: strftime.c,v 1.36 2016/03/15 15:16:01 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -18,8 +47,7 @@ __RCSID("$NetBSD: strftime.c,v 1.35 2015/10/09 17:21:45 christos Exp $");
#include "setlocale_local.h"
/*
** Based on the UCB version with the copyright notice and sccsid
** appearing below.
** Based on the UCB version with the copyright notice appearing above.
**
** This is ANSIish only when "multibyte character == plain character".
*/
@ -37,39 +65,6 @@ __RCSID("$NetBSD: strftime.c,v 1.35 2015/10/09 17:21:45 christos Exp $");
#undef TM_GMTOFF
#endif
/*
** Copyright (c) 1989, 1993
** The Regents of the University of California. All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
** 1. Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in the
** documentation and/or other materials provided with the distribution.
** 3. All advertising materials mentioning features or use of this software
** must display the following acknowledgement:
** This product includes software developed by the University of
** California, Berkeley and its contributors.
** 4. Neither the name of the University nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
*/
#include "tzfile.h"
#include "fcntl.h"
#include "locale.h"
@ -91,7 +86,9 @@ static char * _fmt(const timezone_t, const char *, const struct tm *, char *,
const char *, int *, locale_t);
static char * _yconv(int, int, bool, bool, char *, const char *);
#if !HAVE_POSIX_DECLS
extern char * tzname[];
#endif
#ifndef YEAR_2000_NAME
#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"

View File

@ -274,6 +274,15 @@ time I've ever been early for work. Except for all those daylight
savings days. Lousy farmers."</td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>TV episode title</td><td>Tracks</td></tr>
<tr><td>TV series</td><td><em>The Good Wife</em></td></tr>
<tr><td>TV episode number</td><td>12, season 7</td></tr>
<tr><td>Network</td><td>CBS</td></tr>
<tr><td>Air date</td><td>2016-01-17</td></tr>
<tr><td>Notes</td><td>The applicability of a contract hinges on the
time zone associated with a video time stamp.</td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>Artist</td><td>Jules Verne</td></tr>
<tr><td>Book</td><td><em>Around the World in Eighty Days</em>
(<em>Le tour du monde en quatre-vingts jours</em>)</td></tr>
@ -344,10 +353,19 @@ broadcast 1997-02-13, in which Kramer decides that daylight saving time
isn't coming fast enough, so he sets his watch ahead an hour.
</li>
<li>
The syndicated comic strip <em>Dilbert</em> featured an all-too-rare example of
time zone humor on 1998-03-14.
The syndicated comic strip <em>Dilbert</em> featured an
<a href='http://dilbert.com/strip/1998-03-14'>all-too-rare example of
time zone humor</a> on 1998-03-14.
</li>
<li>
The webcomic <em>xkcd</em> has the strip
"<a href='https://xkcd.com/673/'>The Sun</a>" (2009-12-09) and the panels
"<a href='https://xkcd.com/1017/'>Backward in Time</a>" (2012-02-14),
"<a href='https://xkcd.com/1061/'>EST</a>" (2012-05-28), and
"<a href='https://xkcd.com/1335/'>Now</a>" (2014-02-26).
The related book <em>What If?</em> has an entry
"<a href='https://what-if.xkcd.com/26/'>Leap Seconds</a>" (2012-12-31).
<li>
Surrealist artist Guy Billout's work "Date Line" appeared on page 103
of the 1999-11 <em>Atlantic Monthly</em>.
</li>
@ -432,6 +450,14 @@ hilarity ensues.
(Never mind that this should be 7:30am in Mumbai, yet for some reason the show
proceeds as though it's also mid-evening there.)
</li>
<li>
In the "14 Days to Go"/"T Minus..." episode of
<em>You, Me and the Apocalypse</em>
(first aired 2015-11-11 in the UK, 2016-03-10 in the US),
the success of a mission to deal with a comet
hinges on whether or not Russia observes daylight saving time.
(In the US, the episode first aired in the week before the switch to DST.)
</li>
</ul>
<hr>
<ul>
@ -506,7 +532,7 @@ Peppermint Patty: "What if the world comes to an end tonight, Marcie?"
Marcie: "I promise there'll be a tomorrow, sir ... in fact,
it's already tomorrow in Australia!"
<br>
(Charles M. Schulz, <em>Peanuts</em>, 1980-06-13)
(Charles M. Schulz, <a href='http://www.gocomics.com/peanuts/1980/06/13'><em>Peanuts</em>, 1980-06-13</a>)
</li>
</ul>
</body>

View File

@ -2,13 +2,15 @@
PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Sources for Time Zone and Daylight Saving Time Data</title>
<head profile="http://dublincore.org/documents/2008/08/04/dc-html/">
<title>Sources for time zone and daylight saving time data</title>
<link rel="schema.DC" href="http://purl.org/DC/elements/1.1/">
<meta http-equiv="Content-type" content='text/html; charset="UTF-8"'>
<meta name="DC.Title"
content="Sources for time zone and daylight saving time data">
<meta name="DC.Creator" content="Eggert, Paul">
<meta name="DC.Contributor" content="Olson, Arthur David">
<meta name="DC.Date" content="2015-10-01">
<meta name="DC.Date" content="2016-02-29">
<meta name="DC.Description"
content="Sources of information about time zones and daylight saving time">
<meta name="DC.Identifier"
@ -17,7 +19,7 @@
content="database,daylight saving,DST,time zone,timezone,tz,zoneinfo">
</head>
<body>
<h1>Sources for Time Zone and Daylight Saving Time Data</h1>
<h1>Sources for time zone and daylight saving time data</h1>
<h2>The <code><abbr title="time zone">tz</abbr></code> database</h2>
<p>
The <a href="https://en.wikipedia.org/wiki/Public_domain">public-domain</a>
@ -160,7 +162,7 @@ Here are some links that may be of interest.
<li>The article
<a href="https://en.wikipedia.org/wiki/Tz_database">tz database</a> is
an encyclopedic summary.</li>
<li><a href="https://web.archive.org/web/20140221080916/http://www.cstdbill.com/tzdb/tz-how-to.html">How to Read the
<li><a href="tz-how-to.html">How to Read the
tz Database Source Files</a> explains the <code><abbr>tz</abbr></code>
database format.</li>
<li><a
@ -168,6 +170,24 @@ href="http://blog.jonudell.net/2009/10/23/a-literary-appreciation-of-the-olsonzo
literary appreciation of the Olson/Zoneinfo/tz database</a> comments on the
database's style.</li>
</ul>
<h2>Editing <code><abbr>tz</abbr></code> database source files</h2>
<p>Sources for the <code><abbr>tz</abbr></code> database are
<a href="https://en.wikipedia.org/wiki/UTF-8"><abbr
title="Unicode Transformation Format 8-bit">UTF-8</abbr></a>
<a href="https://en.wikipedia.org/wiki/Text_file">text files</a>
with lines terminated by <a href="https://en.wikipedia.org/wiki/Newline"><abbr
title="linefeed">LF</abbr></a>,
which can be modified by common text editors such
as <a href="https://www.gnu.org/software/emacs/">GNU Emacs</a>,
<a href="https://wiki.gnome.org/Apps/Gedit">gedit</a>, and
<a href="http://www.vim.org/">vim</a>. One
editor has a package to simplify editing further:</p>
<ul>
<li><a href="https://packagecontrol.io/packages/zoneinfo">Sublime
zoneinfo</a> is a <a href="http://www.sublimetext.com/">Sublime
Text</a> package for syntax highlighting <code><abbr>tz</abbr></code>
source files.</li>
</ul>
<h2>Web sites using recent versions of the <code><abbr>tz</abbr></code> database</h2>
<p>
These are listed roughly in ascending order of complexity and fanciness.
@ -175,11 +195,13 @@ These are listed roughly in ascending order of complexity and fanciness.
<ul>
<li><a href="http://time.is">Time.is</a> shows locations'
time and zones in a simple format.</li>
<li><a href="https://www.timejones.com/">TimeJones.com</a> is a simple
time zone converter.</li>
<li><a
href="http://twiki.org/cgi-bin/xtra/tzdatepick.html">Date and Time Gateway</a>
lets you see the <code><abbr>TZ</abbr></code> values directly.</li>
<li><a
href="http://convertit.com/Go/ConvertIt/World_Time/Current_Time.ASP">Current
href="http://www.convertit.com/Go/ConvertIt/World_Time/Current_Time.ASP">Current
Time in 1000 Places</a> uses descriptions of the values.</li>
<li><a href="http://www.timezoneconverter.com/cgi-bin/tzc.tzc">Time Zone
Converter</a>
@ -187,7 +209,7 @@ uses a pulldown menu.</li>
<li><a href="http://home.kpn.nl/vanadovv/time/TZworld.html">Complete
timezone information for all countries</a> displays tables of DST rules.
<li><a href="http://www.timeanddate.com/worldclock/">The World Clock &ndash;
Time Zones</a> lets you sort zone names and convert times.</li>
Worldwide</a> lets you sort zone names and convert times.</li>
<li><a href="http://www.zeitverschiebung.net/en/">Time Difference</a>
calculates the current time difference between locations.</li>
<li><a href="http://www.wx-now.com">Weather Now</a> lists the weather too.</li>
@ -356,6 +378,14 @@ a <code><abbr>tz</abbr></code> binary file reader written in C that
creates a <code>GTimeZone</code> object representing sets
of <abbr>UT</abbr> offsets.
It is freely available under the <abbr>LGPL</abbr>.</li>
<li>The
<a href="https://github.com/bloomberg/bde/wiki">BDE Standard Library</a>'s
<code>baltzo::TimeZoneUtil</code> component contains a C++
implementation of a binary file reader. It is freely available under
the Apache License.</li>
<li><a href="https://github.com/google/cctz">CCTZ</a> is a simple C++
library that translates between UTC and civil time and can read binary
files. It is freely available under the Apache License.</li>
<li><a href="http://bmsi.com/java/#TZ">ZoneInfo.java</a>
is a <code><abbr>tz</abbr></code> binary file reader written in Java.
It is freely available under the <abbr>LGPL</abbr>.</li>
@ -612,7 +642,7 @@ is Singapore in the "Wrong" Time Zone?</a> details the
history of legal time in Singapore and Malaysia.</dd>
<dt>United Kingdom</dt>
<dd><a
href="http://www.polyomino.org.uk/british-time/">History of
href="https://www.polyomino.org.uk/british-time/">History of
legal time in Britain</a> discusses in detail the country
with perhaps the best-documented history of clock adjustments.
The National Physical Laboratory also maintains an <a
@ -620,7 +650,7 @@ href="http://www.npl.co.uk/educate-explore/what-is-time/archive-of-summer-time-d
of Summer time dates</a>.</dd>
<dt>United States</dt>
<dd>The Department of Transportation's <a
href="http://www.transportation.gov/regulations/recent-time-zone-proceedings">Recent
href="https://www.transportation.gov/regulations/recent-time-zone-proceedings">Recent
Time Zone Proceedings</a> lists changes to time zone boundaries.</dd>
</dl>
<h2>Precision timekeeping</h2>
@ -669,7 +699,7 @@ code for converting among time scales like
<abbr title="International Atomic Time">TAI</abbr>,
<abbr>TDB</abbr>, <abbr>TDT</abbr> and
<abbr>UTC</abbr>.</li>
<li><a href="http://www2.jpl.nasa.gov/basics/bsf2-3.php">Basics of
<li><a href="http://solarsystem.nasa.gov/basics/bsf2-3.php">Basics of
Space Flight &ndash; Reference Systems &ndash; Time Conventions</a>
briefly explains interplanetary space flight timekeeping.</li>
<li><a
@ -740,7 +770,7 @@ specifies an <abbr>ISO</abbr> 8601
profile for use in new Internet
protocols.</li>
<li>
<a href="http://www.hackcraft.net/web/datetime/">Date &amp; Time
<a href="https://www.hackcraft.net/web/datetime/">Date &amp; Time
Formats on the Web</a> surveys web- and Internet-oriented date and time
formats.</li>
<li>

View File

@ -1,6 +1,6 @@
#! /bin/bash
#
# $NetBSD: tzselect.ksh,v 1.14 2015/06/21 16:06:51 christos Exp $
# $NetBSD: tzselect.ksh,v 1.15 2016/03/15 15:16:01 christos Exp $
#
PKGVERSION='(tzcode) '
TZVERSION=see_Makefile
@ -9,7 +9,7 @@ REPORT_BUGS_TO=tz@iana.org
# Ask the user about the time zone, and output the resulting TZ value to stdout.
# Interact with the user via stderr and stdin.
# Contributed by Paul Eggert.
# Contributed by Paul Eggert. This file is in the public domain.
# Porting notes:
#
@ -348,11 +348,14 @@ while
'that is 10 hours ahead (east) of UTC.'
read TZ
$AWK -v TZ="$TZ" 'BEGIN {
tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})"
time = "(2[0-4]|[0-1]?[0-9])" \
"(:[0-5][0-9](:[0-5][0-9])?)?"
offset = "[-+]?" time
date = "(J?[0-9]+|M[0-9]+\\.[0-9]+\\.[0-9]+)"
datetime = "," date "(/" time ")?"
mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
jdate = "((J[1-9]|[0-9]|J?[1-9][0-9]" \
"|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])"
datetime = ",(" mdate "|" jdate ")(/" time ")?"
tzpattern = "^(:.*|" tzname offset "(" tzname \
"(" offset ")?(" datetime datetime ")?)?)$"
if (TZ ~ tzpattern) exit 1
@ -511,7 +514,7 @@ while
case $TZsec in
$UTsec)
extra_info="
Local time is now: $TZdate.
Selected time is now: $TZdate.
Universal Time is now: $UTdate."
break
esac
@ -547,7 +550,7 @@ case $SHELL in
*) file=.profile line="TZ='$TZ'; export TZ"
esac
say >&2 "
test -t 1 && say >&2 "
You can make this change permanent for yourself by appending the line
$line
to the file '$file' in your home directory; then log out and log in again.

View File

@ -1,4 +1,4 @@
/* $NetBSD: zdump.c,v 1.42 2015/08/13 11:21:18 christos Exp $ */
/* $NetBSD: zdump.c,v 1.43 2016/03/15 15:16:01 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2009-05-17 by Arthur David Olson.
@ -6,7 +6,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: zdump.c,v 1.42 2015/08/13 11:21:18 christos Exp $");
__RCSID("$NetBSD: zdump.c,v 1.43 2016/03/15 15:16:01 christos Exp $");
#endif /* !defined lint */
/*
@ -254,11 +254,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[];
#endif
/* The minimum and maximum finite time values. */
enum { atime_shift = CHAR_BIT * sizeof (time_t) - 2 };

View File

@ -1,4 +1,4 @@
/* $NetBSD: zic.c,v 1.56 2015/10/09 17:21:45 christos Exp $ */
/* $NetBSD: zic.c,v 1.57 2016/03/15 15:16:01 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2006-07-17 by Arthur David Olson.
@ -10,7 +10,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: zic.c,v 1.56 2015/10/09 17:21:45 christos Exp $");
__RCSID("$NetBSD: zic.c,v 1.57 2016/03/15 15:16:01 christos Exp $");
#endif /* !defined lint */
#include "private.h"
@ -32,6 +32,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
@ -97,21 +104,23 @@ 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);
static int addtype(zic_t, char * const, bool, bool, bool);
static int addtype(zic_t, char const *, bool, bool, bool);
static void leapadd(zic_t, bool, int, int);
static void adjleap(void);
static void associate(void);
@ -125,15 +134,14 @@ static void inlink(char ** fields, int nfields);
static void inrule(char ** fields, int nfields);
static bool inzcont(char ** fields, int nfields);
static bool inzone(char ** fields, int nfields);
static bool inzsub(char ** fields, int nfields, int iscont);
static bool inzsub(char **, int, int);
static int itsdir(const char * name);
static bool is_alpha(char a);
static char lowerit(char);
static bool mkdirs(char * filename);
static bool mkdirs(char *);
static void newabbr(const char * abbr);
static zic_t oadd(zic_t t1, zic_t t2);
static void outzone(const struct zone * zp, int ntzones);
static int rcomp(const void * leftp, const void * rightp);
static zic_t rpytime(const struct rule * rp, zic_t wantedy);
static void rulesub(struct rule * rp,
const char * loyearp, const char * hiyearp,
@ -141,8 +149,6 @@ static void rulesub(struct rule * rp,
const char * dayp, const char * timep);
static zic_t tadd(zic_t t1, zic_t t2);
static bool yearistype(int year, const char * type);
static int atcomp(const void *avp, const void *bvp);
static void updateminmax(zic_t x);
/* Bound on length of what %z can expand to. */
enum { PERCENT_Z_LEN_BOUND = sizeof "+995959" - 1 };
@ -525,31 +531,31 @@ static const char * leapsec;
static const char * yitcommand;
int
main(int argc, char *argv[])
main(int argc, char **argv)
{
int i;
int j;
int c;
#ifdef S_IWGRP
(void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
#endif
#if HAVE_GETTEXT - 0
(void) setlocale(LC_MESSAGES, "");
#if HAVE_GETTEXT
setlocale(LC_MESSAGES, "");
#ifdef TZ_DOMAINDIR
(void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
#endif /* defined TEXTDOMAINDIR */
(void) textdomain(TZ_DOMAIN);
textdomain(TZ_DOMAIN);
#endif /* HAVE_GETTEXT */
progname = argv[0];
if (TYPE_BIT(zic_t) < 64) {
(void) fprintf(stderr, "%s: %s\n", progname,
fprintf(stderr, "%s: %s\n", progname,
_("wild compilation-time specification of zic_t"));
return EXIT_FAILURE;
}
for (i = 1; i < argc; ++i)
if (strcmp(argv[i], "--version") == 0) {
(void) printf("zic %s%s\n", PKGVERSION, TZVERSION);
printf("zic %s%s\n", PKGVERSION, TZVERSION);
close_file(stdout, NULL);
return EXIT_SUCCESS;
} else if (strcmp(argv[i], "--help") == 0) {
@ -771,41 +777,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);
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;
result = link(fromname, toname);
if (result != 0) {
const char *s = fromfield;
const char *t;
char *p;
size_t dotdots = 0;
char * symlinkcontents = NULL;
do
t = s;
while ((s = strchr(s, '/'))
&& strncmp(fromfield, tofield, ++s - fromfield) == 0);
do
t = s;
while ((s = strchr(s, '/'))
&& ! strncmp (fromfield, tofield,
++s - fromfield));
for (s = tofield + (t - fromfield); *s; s++)
dotdots += *s == '/';
symlinkcontents
= zic_malloc(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) {
for (s = tofield + (t - fromfield); *s; s++)
dotdots += *s == '/';
symlinkcontents = zic_malloc(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");
@ -828,8 +840,11 @@ dolink(char const *fromfield, char const *tofield)
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);
@ -876,18 +891,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
{
char *nameslashdot = relname(name, ".");
res = stat(nameslashdot, &st);
free(nameslashdot);
return res == 0;
}
if (res == 0)
return S_ISDIR(st.st_mode) != 0;
#endif
if (res == 0 || errno == EOVERFLOW) {
char *nameslashdot = relname(name, ".");
bool dir = stat(nameslashdot, &st) == 0 || errno == EOVERFLOW;
free(nameslashdot);
return dir;
}
return -1;
}
/*
@ -914,7 +928,7 @@ associate(void)
int i, j;
if (nrules != 0) {
(void) qsort(rules, (size_t)nrules, sizeof *rules, rcomp);
qsort(rules, (size_t)nrules, sizeof *rules, rcomp);
for (i = 0; i < nrules - 1; ++i) {
if (strcmp(rules[i].r_name,
rules[i + 1].r_name) != 0)
@ -1184,7 +1198,7 @@ inzcont(char **fields, int nfields)
}
static bool
inzsub(char **const fields, const int nfields, const int iscont)
inzsub(char **fields, int nfields, const int iscont)
{
char * cp;
char * cp1;
@ -1377,7 +1391,7 @@ inleap(char **fields, int nfields)
}
static void
inlink(char **const fields, const int nfields)
inlink(char **fields, int nfields)
{
struct link l;
@ -1574,7 +1588,7 @@ puttzcode(const zic_t val, FILE *const fp)
char buf[4];
convert(val, buf);
(void) fwrite(buf, sizeof buf, (size_t) 1, fp);
fwrite(buf, sizeof buf, (size_t) 1, fp);
}
static void
@ -1583,7 +1597,7 @@ puttzcode64(const zic_t val, FILE *const fp)
char buf[8];
convert64(val, buf);
(void) fwrite(buf, sizeof buf, (size_t) 1, fp);
fwrite(buf, sizeof buf, (size_t) 1, fp);
}
static int
@ -1620,8 +1634,7 @@ writezone(const char *const name, const char *const string, char version)
** Sort.
*/
if (timecnt > 1)
(void) qsort(attypes, (size_t) timecnt, sizeof *attypes,
atcomp);
qsort(attypes, (size_t) timecnt, sizeof *attypes, atcomp);
/*
** Optimize.
*/
@ -1699,10 +1712,10 @@ 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);
(void) fprintf(stderr, _("%s: Can't remove %s: %s\n"),
fprintf(stderr, _("%s: Can't remove %s: %s\n"),
progname, fullname, e);
exit(EXIT_FAILURE);
}
@ -1712,7 +1725,7 @@ writezone(const char *const name, const char *const string, char version)
if ((fp = fopen(fullname, "wb")) == NULL) {
const char *e = strerror(errno);
(void) fprintf(stderr, _("%s: Can't create %s: %s\n"),
fprintf(stderr, _("%s: Can't create %s: %s\n"),
progname, fullname, e);
exit(EXIT_FAILURE);
}
@ -1828,16 +1841,15 @@ writezone(const char *const name, const char *const string, char version)
if (strcmp(&thischars[j], thisabbr) == 0)
break;
if (j == thischarcnt) {
(void) strcpy(&thischars[(int) thischarcnt],
strcpy(&thischars[(int) thischarcnt],
thisabbr);
thischarcnt += strlen(thisabbr) + 1;
}
indmap[abbrinds[i]] = j;
}
#define DO(field) (void) fwrite(tzh.field, \
sizeof tzh.field, (size_t) 1, fp)
#define DO(field) fwrite(tzh.field, sizeof tzh.field, (size_t) 1, fp)
tzh = tzh0;
(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
tzh.tzh_version[0] = version;
convert(thistypecnt, tzh.tzh_ttisgmtcnt);
convert(thistypecnt, tzh.tzh_ttisstdcnt);
@ -1868,16 +1880,16 @@ writezone(const char *const name, const char *const string, char version)
unsigned char uc;
uc = typemap[types[i]];
(void) fwrite(&uc, sizeof uc, (size_t) 1, fp);
fwrite(&uc, sizeof uc, (size_t) 1, fp);
}
for (i = 0; i < typecnt; ++i)
if (writetype[i]) {
puttzcode(gmtoffs[i], fp);
(void) putc(isdsts[i], fp);
(void) putc((unsigned char) indmap[abbrinds[i]], fp);
putc(isdsts[i], fp);
putc((unsigned char) indmap[abbrinds[i]], fp);
}
if (thischarcnt != 0)
(void) fwrite(thischars, sizeof thischars[0],
fwrite(thischars, sizeof thischars[0],
(size_t) thischarcnt, fp);
for (i = thisleapi; i < thisleaplim; ++i) {
zic_t todo;
@ -1906,12 +1918,12 @@ writezone(const char *const name, const char *const string, char version)
}
for (i = 0; i < typecnt; ++i)
if (writetype[i])
(void) putc(ttisstds[i], fp);
putc(ttisstds[i], fp);
for (i = 0; i < typecnt; ++i)
if (writetype[i])
(void) putc(ttisgmts[i], fp);
putc(ttisgmts[i], fp);
}
(void) fprintf(fp, "\n%s\n", string);
fprintf(fp, "\n%s\n", string);
close_file(fp, fullname);
free(ats);
free(fullname);
@ -1966,14 +1978,14 @@ doabbr(char *abbr, int abbrlen, struct zone const *zp, const char *letters,
if (slashp == NULL) {
char letterbuf[PERCENT_Z_LEN_BOUND + 1];
if (zp->z_format_specifier == 'z')
letters = abbroffset(letterbuf, -zp->z_gmtoff + stdoff);
letters = abbroffset(letterbuf, zp->z_gmtoff + stdoff);
else if (!letters)
letters = "%s";
(void) snprintf(abbr, abbrlen, format, letters);
snprintf(abbr, abbrlen, format, letters);
} else if (stdoff != 0) {
(void) strlcpy(abbr, slashp + 1, abbrlen);
strlcpy(abbr, slashp + 1, abbrlen);
} else {
(void) memcpy(abbr, format, slashp - format);
memcpy(abbr, format, slashp - format);
abbr[slashp - format] = '\0';
}
len = strlen(abbr);
@ -2502,7 +2514,7 @@ outzone(const struct zone *zpfirst, int zonecount)
zp->z_format != NULL &&
strchr(zp->z_format, '%') == NULL &&
strchr(zp->z_format, '/') == NULL)
(void)strncpy(startbuf, zp->z_format,
strncpy(startbuf, zp->z_format,
max_abbr_len + 1 - 1);
eat(zp->z_filename, zp->z_linenum);
if (*startbuf == '\0')
@ -2594,7 +2606,7 @@ addtt(zic_t starttime, int type)
}
static int
addtype(zic_t gmtoff, char *const abbr, bool isdst, bool ttisstd, bool ttisgmt)
addtype(zic_t gmtoff, char const *abbr, bool isdst, bool ttisstd, bool ttisgmt)
{
int i, j;
@ -2690,7 +2702,7 @@ yearistype(int year, const char *type)
if (type == NULL || *type == '\0')
return true;
buf = zic_realloc(buf, 132 + strlen(yitcommand) + strlen(type));
(void)sprintf(buf, "%s %d %s", yitcommand, year, type); /* XXX: sprintf is safe */
sprintf(buf, "%s %d %s", yitcommand, year, type); /* XXX: sprintf is safe */
result = system(buf);
if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
case 0:
@ -2699,7 +2711,7 @@ yearistype(int year, const char *type)
return false;
}
error(_("Wild result from command execution"));
(void) fprintf(stderr, _("%s: command was '%s', result was %d\n"),
fprintf(stderr, _("%s: command was '%s', result was %d\n"),
progname, buf, result);
for ( ; ; )
exit(EXIT_FAILURE);
@ -2992,7 +3004,7 @@ mp = _("time zone abbreviation differs from POSIX standard");
error(_("too many, or too long, time zone abbreviations"));
exit(EXIT_FAILURE);
}
(void)strncpy(&chars[charcnt], string, sizeof(chars) - charcnt - 1);
strncpy(&chars[charcnt], string, sizeof(chars) - charcnt - 1);
charcnt += i;
}