Hello community, here is the log from the commit of package timezone for openSUSE:Factory checked in at 2016-10-06 14:32:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/timezone (Old) and /work/SRC/openSUSE:Factory/.timezone.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "timezone" Changes: -------- --- /work/SRC/openSUSE:Factory/timezone/timezone-java.changes 2016-09-21 18:24:40.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.timezone.new/timezone-java.changes 2016-10-06 14:32:28.000000000 +0200 @@ -2,33 +1,0 @@ -Fri Sep 16 12:08:42 UTC 2016 - astie...@suse.com - -- timezone update 2016g: - * Turkey will remain on UTC+03 after 2016-10-30 bsc#997830 - * New leap second 2016-12-31 23:59:60 UTC - Remove 0001-Positive-leap-second-on-2016-12-31.patch - * Corrections for past DST transitions - * Antarcica and nautical time zones now use numeric time zone - abbreviations instead of obsolete alphanumeric ones - * Renamed Asia/Rangoon to Asia/Yangon - * The following change was previously patched in the package - and is now upstream: - + If the installed localtime and/or posixrules files are - symbolic links, zic now keeps them symbolic links when - updating them, for compatibility with platforms like - OpenSUSE where other programs configure these files as - symlinks. - + zic now avoids hard linking to symbolic links, avoids - some unnecessary mkdir and stat system calls, and uses - shorter file names internally. - + Drop the patches: - tzcode-fromname.patch - tzcode-link.diff - tzcode-revert-01-8c9cb9580.patch - tzcode-revert-02-301f794f3.patch - tzcode-revert-03-39fd078a6.patch - tzcode-symlink.patch - tzcode-zic.diff - * zdump has a new -i option to generate transitions in a - more-compact but still human-readable format. (experimental) -- Drop upstream signatures and keyring, tarball generated from git - -------------------------------------------------------------------- timezone.changes: same change Old: ---- tzcode2016g.tar.gz tzdata2016g.tar.gz New: ---- 0001-Positive-leap-second-on-2016-12-31.patch timezone.keyring tzcode-fromname.patch tzcode-link.diff tzcode-revert-01-8c9cb9580.patch tzcode-revert-02-301f794f3.patch tzcode-revert-03-39fd078a6.patch tzcode-symlink.patch tzcode-zic.diff tzcode2016f.tar.gz tzcode2016f.tar.gz.asc tzdata2016f.tar.gz tzdata2016f.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ timezone-java.spec ++++++ --- /var/tmp/diff_new_pack.3LFw5D/_old 2016-10-06 14:32:29.000000000 +0200 +++ /var/tmp/diff_new_pack.3LFw5D/_new 2016-10-06 14:32:29.000000000 +0200 @@ -25,12 +25,26 @@ Group: System/Base # COMMON-BEGIN # COMMON-BEGIN -Version: 2016g +Version: 2016f Release: 0 -Source: tzdata%{version}.tar.gz -Source1: tzcode%{version}.tar.gz +Source: ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz +Source1: ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz +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 +Patch2: tzcode-fromname.patch Patch3: iso3166-uk.diff +Patch4: tzcode-link.diff +Patch5: tzcode-symlink.patch +# PATCH-FIX-UPSTREAM 0001-Positive-leap-second-on-2016-12-31.patch bsc#988184 +Patch6: 0001-Positive-leap-second-on-2016-12-31.patch # COMMON-END # COMMON-END Url: http://www.gnu.org/software/libc/libc.html @@ -50,8 +64,19 @@ %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 %patch3 -p1 +%if 0%{?suse_version} < 1220 +%patch4 -p1 +%else +%patch5 -p1 +%endif +%patch6 -p1 sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358] # COMMON-PREP-END # COMMON-PREP-END ++++++ timezone.spec ++++++ --- /var/tmp/diff_new_pack.3LFw5D/_old 2016-10-06 14:32:29.000000000 +0200 +++ /var/tmp/diff_new_pack.3LFw5D/_new 2016-10-06 14:32:29.000000000 +0200 @@ -23,12 +23,26 @@ Url: http://www.iana.org/time-zones PreReq: filesystem, coreutils # COMMON-BEGIN -Version: 2016g +Version: 2016f Release: 0 -Source: tzdata%{version}.tar.gz -Source1: tzcode%{version}.tar.gz +Source: ftp://ftp.iana.org/tz/releases/tzdata%{version}.tar.gz +Source1: ftp://ftp.iana.org/tz/releases/tzcode%{version}.tar.gz +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 +Patch2: tzcode-fromname.patch Patch3: iso3166-uk.diff +Patch4: tzcode-link.diff +Patch5: tzcode-symlink.patch +# PATCH-FIX-UPSTREAM 0001-Positive-leap-second-on-2016-12-31.patch bsc#988184 +Patch6: 0001-Positive-leap-second-on-2016-12-31.patch # COMMON-END BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -44,8 +58,19 @@ %prep %setup -q -c -a 1 # COMMON-PREP-BEGIN +%patch100 -p1 -R +%patch101 -p1 -R +%patch102 -p1 -R %patch0 -p1 +%patch1 -p1 +%patch2 -p1 %patch3 -p1 +%if 0%{?suse_version} < 1220 +%patch4 -p1 +%else +%patch5 -p1 +%endif +%patch6 -p1 sed -ri 's@/usr/local/etc/zoneinfo@%{_datadir}/zoneinfo@g' *.[1358] # COMMON-PREP-END ++++++ 0001-Positive-leap-second-on-2016-12-31.patch ++++++ >From 6d5fc7fed0690f22574a9b795575e2bb7962716c Mon Sep 17 00:00:00 2001 From: Tim Parenti <t...@timtimeonline.com> Date: Mon, 18 Jul 2016 23:10:36 -0400 Subject: [PATCH] Positive leap second on 2016-12-31 * leap-seconds.list: Per IERS Bulletin C52 (2016-07-06), a positive leap second will be inserted into the UTC time scale at the end of 2016-12-31. Update file from NIST, retrieved from <ftp://time.nist.gov/pub/leap-seconds.list>. --- leap-seconds.list | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/leap-seconds.list b/leap-seconds.list index 7552796..22fa785 100644 --- a/leap-seconds.list +++ b/leap-seconds.list @@ -143,7 +143,7 @@ # Boulder, Colorado # judah.lev...@nist.gov # -# Last Update of leap second values: 5 January 2015 +# Last Update of leap second values: 8 July 2016 # # The following line shows this last update date in NTP timestamp # format. This is the date on which the most recent change to @@ -151,7 +151,7 @@ # be identified by the unique pair of characters in the first two # columns as shown below. # -#$ 3629404800 +#$ 3676924800 # # The NTP timestamps are in units of seconds since the NTP epoch, # which is 1 January 1900, 00:00:00. The Modified Julian Day number @@ -199,10 +199,10 @@ # current -- the update time stamp, the data and the name of the file # will not change. # -# Updated through IERS Bulletin C51 -# File expires on: 28 December 2016 +# Updated through IERS Bulletin C52 +# File expires on: 28 June 2017 # -#@ 3691872000 +#@ 3707596800 # 2272060800 10 # 1 Jan 1972 2287785600 11 # 1 Jul 1972 @@ -231,6 +231,7 @@ 3439756800 34 # 1 Jan 2009 3550089600 35 # 1 Jul 2012 3644697600 36 # 1 Jul 2015 +3692217600 37 # 1 Jan 2017 # # the following special comment contains the # hash value of the data in this file computed @@ -246,4 +247,4 @@ # the hash line is also ignored in the # computation. # -#h afc03691 8ff53838 42080ba1 cdd22f1 48192c10 +#h dacf2c42 2c4765d6 3c797af8 2cf630eb 699c8c67 -- 2.6.6 ++++++ tzcode-fromname.patch ++++++ Index: timezone-2016b/zic.c =================================================================== --- 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) { - const char *s = fromfield; + const char *s = fromname; const char *t; char *p; size_t dotdots = 0; @@ -777,10 +777,10 @@ dolink(char const *fromfield, char const do t = s; while ((s = strchr(s, '/')) - && ! strncmp (fromfield, tofield, - ++s - fromfield)); + && ! strncmp (fromname, tofield, + ++s - fromname)); - for (s = tofield + (t - fromfield); *s; s++) + for (s = tofield + (t - fromname); *s; s++) dotdots += *s == '/'; symlinkcontents = emalloc(3 * dotdots + strlen(t) + 1); ++++++ tzcode-link.diff ++++++ This patch is used on openSUSE versions older than 12.2. Back then, /etc/localtime was either a hard link to a zone file in /usr/share/zoneinfo or a copy of it. By default, zic tries the following approaches to create /etc/localtime: 1. Hard link 2. Symbolic link 3. File copy This patch changes the order to: 1. Hard link 2. File copy 3. Symbolic link Index: timezone-2015f/zic.c =================================================================== --- timezone-2015f.orig/zic.c +++ timezone-2015f/zic.c @@ -738,6 +738,23 @@ relname(char const *dir, char const *bas } } +static int +copy(fromname, toname) +const char * const fromname; +const char * const toname; +{ + if (!fork()) { + execl("/bin/cp", "cp", fromname, toname, (char*) NULL); + _exit(1); + } + int s; + if (wait(&s) < 0) + return -1; + if (!WIFEXITED(s)) + return -1; + return -WEXITSTATUS(s); +} + static void dolink(char const *fromfield, char const *tofield) { @@ -767,6 +784,8 @@ dolink(char const *fromfield, char const exit(EXIT_FAILURE); result = link(fromname, toname); + if (result != 0) + result = copy(fromname, toname); if (result != 0) { const char *s = fromname; const char *t; ++++++ tzcode-revert-01-8c9cb9580.patch ++++++ commit 8c9cb958078b470e352a58f7f2d756544051e59b Author: Paul Eggert <egg...@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; ++++++ tzcode-revert-02-301f794f3.patch ++++++ commit 301f794f33d145b08fbf7f5247c8663d404fabb5 Author: Paul Eggert <egg...@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. ++++++ tzcode-revert-03-39fd078a6.patch ++++++ commit 39fd078a694fa762de5ae7efceca1dbfb7be94b3 Author: Paul Eggert <egg...@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"), ++++++ tzcode-symlink.patch ++++++ This patch is used on openSUSE 12.2 or newer. Nowadays, /etc/localtime is by default a symbolic link to a zone file in /usr/share/zoneinfo. By default, zic tries the following approaches to create /etc/localtime: 1. Hard link 2. Symbolic link 3. File copy This patch changes the logic slightly: keep using symbolic links if /etc/localtime is already one. If it isn't, use the default order as listed above. Index: timezone-2015f/zic.c =================================================================== --- timezone-2015f.orig/zic.c +++ timezone-2015f/zic.c @@ -105,7 +105,7 @@ static int addtype(zic_t, char const *, static void leapadd(zic_t, bool, int, int); static void adjleap(void); static void associate(void); -static void dolink(const char * fromfield, const char * tofield); +static void dolink(const char * fromfield, const char * tofield, int defaultsymlink); static char ** getfields(char * buf); static zic_t gethms(const char * string, const char * errstring, bool); @@ -633,7 +633,7 @@ _("%s: More than one -L option specified */ for (i = 0; i < nlinks; ++i) { eat(links[i].l_filename, links[i].l_linenum); - dolink(links[i].l_from, links[i].l_to); + dolink(links[i].l_from, links[i].l_to, false); if (noise) for (j = 0; j < nlinks; ++j) if (strcmp(links[i].l_to, @@ -642,11 +642,11 @@ _("%s: More than one -L option specified } if (lcltime != NULL) { eat(_("command line"), 1); - dolink(lcltime, TZDEFAULT); + dolink(lcltime, TZDEFAULT, true); } if (psxrules != NULL) { eat(_("command line"), 1); - dolink(psxrules, TZDEFRULES); + dolink(psxrules, TZDEFRULES, false); } if (warnings && (ferror(stderr) || fclose(stderr) != 0)) return EXIT_FAILURE; @@ -739,14 +739,17 @@ relname(char const *dir, char const *bas } static void -dolink(char const *fromfield, char const *tofield) +dolink(char const *fromfield, char const *tofield, int defaultsymlink) { + struct stat st; register char * fromname; register char * toname; register int fromisdir; fromname = relname(directory, fromfield); toname = relname(directory, tofield); + if (lstat(fromname, &st) == 0 && S_ISLNK(st.st_mode)) + defaultsymlink = true; /* ** We get to be careful here since ** there's a fair chance of root running us. @@ -760,14 +763,14 @@ dolink(char const *fromfield, char const } if (itsdir(toname) <= 0) remove(toname); - if (link(fromname, toname) != 0) { + if (defaultsymlink || link(fromname, toname) != 0) { int result; if (! mkdirs(toname)) exit(EXIT_FAILURE); - - result = link(fromname, toname); - if (result != 0) { + if (!defaultsymlink) + result = link(fromname, toname); + if ((defaultsymlink || (!defaultsymlink && result != 0))) { const char *s = fromname; const char *t; char *p; ++++++ tzcode-zic.diff ++++++ Index: timezone-2016b/zic.c =================================================================== --- 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); +#if 0 if (result == 0) warning(_("hard link failed, symbolic link used")); +#endif free(symlinkcontents); } if (result != 0) { ++++++ tzcode2016g.tar.gz -> tzcode2016f.tar.gz ++++++ ++++ 3114 lines of diff (skipped) ++++++ tzdata2016g.tar.gz -> tzdata2016f.tar.gz ++++++ ++++ 2097 lines of diff (skipped)