Skip to content

Commit

Permalink
Merge from Gnulib
Browse files Browse the repository at this point in the history
This incorporates:
2017-11-23 stat: work around Solaris bug with tv_nsec < 0
2017-11-12 maint: shorten https://lists.gnu.org/archive/html/... links
* build-aux/config.sub, doc/misc/texinfo.tex, lib/allocator.h:
* lib/fstatat.c, lib/intprops.h, lib/lstat.c, lib/signal.in.h:
* lib/stat-time.h, lib/stdio-impl.h, lib/stdio.in.h:
* lib/timespec.h, m4/alloca.m4, m4/extern-inline.m4:
* m4/faccessat.m4, m4/fstatat.m4, m4/gnulib-common.m4:
* m4/lstat.m4, m4/std-gnu11.m4, m4/sys_types_h.m4:
* m4/vararrays.m4:
Copy from Gnulib.
  • Loading branch information
eggert committed Nov 26, 2017
1 parent 265cee5 commit 8be3aee
Show file tree
Hide file tree
Showing 20 changed files with 162 additions and 76 deletions.
15 changes: 14 additions & 1 deletion build-aux/config.sub
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Configuration validation subroutine script.
# Copyright 1992-2017 Free Software Foundation, Inc.

timestamp='2017-11-04'
timestamp='2017-11-23'

# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -1546,6 +1546,19 @@ case $os in
-dicos*)
os=-dicos
;;
-pikeos*)
# Until real need of OS specific support for
# particular features comes up, bare metal
# configurations are quite functional.
case $basic_machine in
arm*)
os=-eabi
;;
*)
os=-elf
;;
esac
;;
-nacl*)
;;
-ios)
Expand Down
49 changes: 28 additions & 21 deletions doc/misc/texinfo.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
% Load plain if necessary, i.e., if running under initex.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
%
\def\texinfoversion{2017-09-11.18}
\def\texinfoversion{2017-11-17.06}
%
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
Expand Down Expand Up @@ -5969,24 +5969,30 @@
% Split the last of the double-column material.
\savemarks
\balancecolumns
%
}%
\eject % call the \output just set
\ifdim\pagetotal=0pt
% Having called \balancecolumns once, we do not
% want to call it again. Therefore, reset \output to its normal
% definition right away.
\global\output = {\onepageout{\pagecontents\PAGE}}%
}%
\eject
\endgroup % started in \begindoublecolumns
\restoremarks
% Leave the double-column material on the current page, no automatic
% page break.
\box\balancedcolumns
%
% \pagegoal was set to the doubled \vsize above, since we restarted
% the current page. We're now back to normal single-column
% typesetting, so reset \pagegoal to the normal \vsize.
\global\vsize = \txipageheight %
\pagegoal = \txipageheight %
%
\endgroup % started in \begindoublecolumns
\restoremarks
% Leave the double-column material on the current page, no automatic
% page break.
\box\balancedcolumns
%
% \pagegoal was set to the doubled \vsize above, since we restarted
% the current page. We're now back to normal single-column
% typesetting, so reset \pagegoal to the normal \vsize.
\global\vsize = \txipageheight %
\pagegoal = \txipageheight %
\else
% We had some left-over material. This might happen when \doublecolumnout
% is called in \balancecolumns. Try again.
\expandafter\enddoublecolumns
\fi
}
\newbox\balancedcolumns
\setbox\balancedcolumns=\vbox{shouldnt see this}%
Expand All @@ -6001,6 +6007,7 @@
\ifdim\dimen@<5\baselineskip
% Don't split a short final column in two.
\setbox2=\vbox{}%
\global\setbox\balancedcolumns=\vbox{\pagesofar}%
\else
\divide\dimen@ by 2 % target to split to
\dimen@ii = \dimen@
Expand All @@ -6016,15 +6023,15 @@
\repeat
}%
% Now the left column is in box 1, and the right column in box 3.
%
% Check whether the left column has come out higher than the page itself.
% (Note that we have doubled \vsize for the double columns, so
% the actual height of the page is 0.5\vsize).
\ifdim2\ht1>\vsize
% Just split the last of the double column material roughly in half.
\setbox2=\box0
\setbox0 = \vsplit2 to \dimen@ii
\setbox0=\vbox to \dimen@ii {\unvbox0\vfill}%
\setbox2=\vbox to \dimen@ii {\unvbox2\vfill}%
% It appears that we have been called upon to balance too much material.
% Output some of it with \doublecolumnout, leaving the rest on the page.
\setbox\PAGE=\box0
\doublecolumnout
\else
% Compare the heights of the two columns.
\ifdim4\ht1>5\ht3
Expand All @@ -6037,10 +6044,10 @@
\setbox2=\vbox to\ht1{\unvbox3\unskip}%
\setbox0=\vbox to\ht1{\unvbox1\unskip}%
\fi
\global\setbox\balancedcolumns=\vbox{\pagesofar}%
\fi
\fi
%
\global\setbox\balancedcolumns=\vbox{\pagesofar}%
}
\catcode`\@ = \other
Expand Down
2 changes: 1 addition & 1 deletion lib/allocator.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct allocator
/* Do not use GCC attributes such as __attribute__ ((malloc)) with
the function types pointed at by these members, because these
attributes do not work with pointers to functions. See
<https://lists.gnu.org/archive/html/bug-gnulib/2011-04/msg00007.html>. */
<https://lists.gnu.org/r/bug-gnulib/2011-04/msg00007.html>. */

/* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE
should return NULL, though not necessarily set errno. When given
Expand Down
12 changes: 10 additions & 2 deletions lib/fstatat.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
above. */
#include "sys/stat.h"

#include "stat-time.h"

#include <errno.h>
#include <fcntl.h>
#include <string.h>
Expand All @@ -51,6 +53,12 @@ orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
# endif

static int
normal_fstatat (int fd, char const *file, struct stat *st, int flag)
{
return stat_time_normalize (orig_fstatat (fd, file, st, flag), st);
}

/* fstatat should always follow symbolic links that end in /, but on
Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
Likewise, trailing slash on a non-directory should be an error.
Expand All @@ -63,7 +71,7 @@ orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
int
rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
{
int result = orig_fstatat (fd, file, st, flag);
int result = normal_fstatat (fd, file, st, flag);
size_t len;

if (LSTAT_FOLLOWS_SLASHED_SYMLINK || result != 0)
Expand All @@ -79,7 +87,7 @@ rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
errno = ENOTDIR;
return -1;
}
result = orig_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
result = normal_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
}
/* Fix stat behavior. */
if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
Expand Down
6 changes: 3 additions & 3 deletions lib/intprops.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))

/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
<https://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>. */
<https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>. */
#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))

/* The extra casts in the following macros work around compiler bugs,
Expand Down Expand Up @@ -179,7 +179,7 @@
/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
See above for restrictions. Avoid && and || as they tickle
bugs in Sun C 5.11 2010/08/13 and other compilers; see
<https://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>. */
<https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>. */
#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
((b) < 0 \
? ((a) < 0 \
Expand Down Expand Up @@ -443,7 +443,7 @@
implementation-defined result or signal for values outside T's
range. However, code that works around this theoretical problem
runs afoul of a compiler bug in Oracle Studio 12.3 x86. See:
https://lists.gnu.org/archive/html/bug-gnulib/2017-04/msg00049.html
https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
As the compiler bug is real, don't try to work around the
theoretical problem. */

Expand Down
39 changes: 21 additions & 18 deletions lib/lstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ orig_lstat (const char *filename, struct stat *buf)
above. */
# include "sys/stat.h"

# include "stat-time.h"

# include <string.h>
# include <errno.h>

Expand All @@ -66,32 +68,33 @@ orig_lstat (const char *filename, struct stat *buf)
int
rpl_lstat (const char *file, struct stat *sbuf)
{
size_t len;
int lstat_result = orig_lstat (file, sbuf);

if (lstat_result != 0)
return lstat_result;
int result = orig_lstat (file, sbuf);

/* This replacement file can blindly check against '/' rather than
using the ISSLASH macro, because all platforms with '\\' either
lack symlinks (mingw) or have working lstat (cygwin) and thus do
not compile this file. 0 len should have already been filtered
out above, with a failure return of ENOENT. */
len = strlen (file);
if (file[len - 1] != '/' || S_ISDIR (sbuf->st_mode))
return 0;

/* At this point, a trailing slash is only permitted on
symlink-to-dir; but it should have found information on the
directory, not the symlink. Call stat() to get info about the
link's referent. Our replacement stat guarantees valid results,
even if the symlink is not pointing to a directory. */
if (!S_ISLNK (sbuf->st_mode))
if (result == 0)
{
errno = ENOTDIR;
return -1;
if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/')
result = stat_time_normalize (result, sbuf);
else
{
/* At this point, a trailing slash is permitted only on
symlink-to-dir; but it should have found information on the
directory, not the symlink. Call 'stat' to get info about the
link's referent. Our replacement stat guarantees valid results,
even if the symlink is not pointing to a directory. */
if (!S_ISLNK (sbuf->st_mode))
{
errno = ENOTDIR;
return -1;
}
result = stat (file, sbuf);
}
}
return stat (file, sbuf);
return result;
}

#endif /* HAVE_LSTAT */
2 changes: 1 addition & 1 deletion lib/signal.in.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1];
/* When also using extern inline, suppress the use of static inline in
standard headers of problematic Apple configurations, as Libc at
least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
<https://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>.
<https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
Perhaps Apple will fix this some day. */
#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
&& (defined __i386__ || defined __x86_64__))
Expand Down
45 changes: 45 additions & 0 deletions lib/stat-time.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
#ifndef STAT_TIME_H
#define STAT_TIME_H 1

#include "intprops.h"

#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <time.h>

Expand Down Expand Up @@ -202,6 +206,47 @@ get_stat_birthtime (struct stat const *st)
return t;
}

/* If a stat-like function returned RESULT, normalize the timestamps
in *ST, in case this platform suffers from the Solaris 11 bug where
tv_nsec might be negative. Return the adjusted RESULT, setting
errno to EOVERFLOW if normalization overflowed. This function
is intended to be private to this .h file. */
_GL_STAT_TIME_INLINE int
stat_time_normalize (int result, struct stat *st)
{
#if defined __sun && defined STAT_TIMESPEC
if (result == 0)
{
long int timespec_resolution = 1000000000;
short int const ts_off[] = { offsetof (struct stat, st_atim),
offsetof (struct stat, st_mtim),
offsetof (struct stat, st_ctim) };
int i;
for (i = 0; i < sizeof ts_off / sizeof *ts_off; i++)
{
struct timespec *ts = (struct timespec *) ((char *) st + ts_off[i]);
long int q = ts->tv_nsec / timespec_resolution;
long int r = ts->tv_nsec % timespec_resolution;
if (r < 0)
{
r += timespec_resolution;
q--;
}
ts->tv_nsec = r;
/* Overflow is possible, as Solaris 11 stat can yield
tv_sec == TYPE_MINIMUM (time_t) && tv_nsec == -1000000000.
INT_ADD_WRAPV is OK, since time_t is signed on Solaris. */
if (INT_ADD_WRAPV (q, ts->tv_sec, &ts->tv_sec))
{
errno = EOVERFLOW;
return -1;
}
}
}
#endif
return result;
}

#ifdef __cplusplus
}
#endif
Expand Down
4 changes: 2 additions & 2 deletions lib/stdio-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
#ifdef __TANDEM /* NonStop Kernel */
# ifndef _IOERR
/* These values were determined by the program 'stdioext-flags' at
<https://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>. */
<https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
# define _IOERR 0x40
# define _IOREAD 0x80
# define _IOWRT 0x4
Expand Down Expand Up @@ -132,7 +132,7 @@ struct _gl_real_FILE
# define fp_ ((struct _gl_real_FILE *) fp)

/* These values were determined by a program similar to the one at
<https://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>. */
<https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
# define _IOREAD 0x1
# define _IOWRT 0x2
# define _IORW 0x4
Expand Down
2 changes: 1 addition & 1 deletion lib/stdio.in.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
/* When also using extern inline, suppress the use of static inline in
standard headers of problematic Apple configurations, as Libc at
least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
<https://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>.
<https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
Perhaps Apple will fix this some day. */
#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
&& defined __GNUC__ && defined __STDC__)
Expand Down
2 changes: 1 addition & 1 deletion lib/timespec.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ timespec_cmp (struct timespec a, struct timespec b)
return 1;

/* Pacify gcc -Wstrict-overflow (bleeding-edge circa 2017-10-02). See:
http://lists.gnu.org/archive/html/bug-gnulib/2017-10/msg00006.html */
http://lists.gnu.org/r/bug-gnulib/2017-10/msg00006.html */
assume (-1 <= a.tv_nsec && a.tv_nsec <= 2 * TIMESPEC_RESOLUTION);
assume (-1 <= b.tv_nsec && b.tv_nsec <= 2 * TIMESPEC_RESOLUTION);

Expand Down
2 changes: 1 addition & 1 deletion m4/alloca.m4
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ AC_DEFUN([gl_FUNC_ALLOCA],
AC_DEFUN([gl_PREREQ_ALLOCA], [:])

# This works around a bug in autoconf <= 2.68.
# See <https://lists.gnu.org/archive/html/bug-gnulib/2011-06/msg00277.html>.
# See <https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html>.

m4_version_prereq([2.69], [] ,[
Expand Down
6 changes: 3 additions & 3 deletions m4/extern-inline.m4
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ AC_DEFUN([gl_EXTERN_INLINE],
[/* Please see the Gnulib manual for how to use these macros.
Suppress extern inline with HP-UX cc, as it appears to be broken; see
<https://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
<https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
Suppress extern inline with Sun C in standards-conformance mode, as it
mishandles inline functions that call each other. E.g., for 'inline void f
Expand All @@ -28,13 +28,13 @@ AC_DEFUN([gl_EXTERN_INLINE],
from calling static functions. This bug is known to occur on:
OS X 10.8 and earlier; see:
https://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
DragonFly; see
http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
FreeBSD; see:
https://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
Expand Down
Loading

0 comments on commit 8be3aee

Please sign in to comment.