Merge from gnulib

This incorporates:
2016-01-24 openat_proc_name: fix last '/' overwritten on OS/2 kLIBC
2016-01-24 closedir, dirfd, opendir: port to OpenSolaris 5.10
2016-01-15 detect utimes() correctly on OS/2 kLIBC
2016-01-15 openat_proc_name: port to OS/2 kLIBC
2016-01-14 stdint: check _INTPTR_T_DECLARED for intptr_t etc.
2016-01-14 opendir, closedir, dirfd, fdopendir: port to OS/2 kLIBC
2016-01-14 dup, dup2, fcntl: support a directory fd on OS/2 kLIBC
2016-01-14 binary-io: don't put fd in binary mode if a console on EMX
2016-01-14 sig2str: list all signals on FreeBSD >= 7
2016-01-13 acl-permissions: port to USE_ACL==0 platforms
2016-01-12 mktime: rename macro to avoid glibc clash
2016-01-12 Port "$@" to OpenIndiana ksh93
2016-01-12 Port Universal Time settings to strict POSIX
* build-aux/gitlog-to-changelog, build-aux/update-copyright:
* doc/misc/texinfo.tex, lib/acl-internal.c, lib/acl-internal.h:
* lib/binary-io.h, lib/dirent.in.h, lib/dirfd.c, lib/dup2.c:
* lib/fcntl.c, lib/fdopendir.c, lib/mktime.c, lib/openat-proc.c:
* lib/sig2str.h, lib/stdint.in.h, m4/dirfd.m4, m4/dup2.m4:
* m4/fcntl.m4, m4/utimes.m4:
Copy from gnulib.
* m4/gnulib-comp.m4: Regenerate.
This commit is contained in:
Paul Eggert 2016-01-24 14:50:47 -08:00
parent fbce4757a8
commit 1698036a43
20 changed files with 422 additions and 91 deletions

View file

@ -1,9 +1,9 @@
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"'
& eval 'exec perl -wS "$0" $argv:q'
if 0;
# Convert git log output to ChangeLog format.
my $VERSION = '2016-01-11 22:04'; # UTC
my $VERSION = '2016-01-12 23:09'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook

View file

@ -1,9 +1,9 @@
eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" ${1+"$@"}'
eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" "$@"'
& eval 'exec perl -wS -0777 -pi "$0" $argv:q'
if 0;
# Update an FSF copyright year list to include the current year.
my $VERSION = '2016-01-11.22:04'; # UTC
my $VERSION = '2016-01-12.23:13'; # UTC
# Copyright (C) 2009-2016 Free Software Foundation, Inc.
#

View file

@ -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{2016-01-11.19}
\def\texinfoversion{2016-01-20.20}
%
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@ -4737,11 +4737,10 @@
\def\_{\normalunderscore}%
\def\-{}% @- shouldn't affect sorting
%
\def\lbracechar{{\indexlbrace}}%
\def\rbracechar{{\indexrbrace}}%
\let\{=\lbracechar
\let\}=\rbracechar
%
\uccode`\1=`\{ \uppercase{\def\{{1}}%
\uccode`\1=`\} \uppercase{\def\}{1}}%
\let\lbracechar\{
\let\rbracechar\}
%
% Non-English letters.
\def\AA{AA}%
@ -4901,9 +4900,15 @@
\indexdummies % Must do this here, since \bf, etc expand at this stage
\useindexbackslash % \indexbackslash isn't defined now so it will be output
% as is; and it will print as backslash.
% The braces around \indexbrace are recognized by texindex.
%
% Get the string to sort by, by processing the index entry with all
% font commands turned off.
{\indexnofonts
\def\lbracechar{{\indexlbrace}}%
\def\rbracechar{{\indexrbrace}}%
\let\{=\lbracechar
\let\}=\rbracechar
\indexnonalnumdisappear
\xdef\indexsortkey{}%
\let\sortas=\indexwritesortas
@ -8526,10 +8531,6 @@
}%
\setcolor{\linkcolor}%
\fi
%
% Float references are printed completely differently: "Figure 1.2"
% instead of "[somenode], p.3". We distinguish them by the
% LABEL-title being set to a magic string.
{%
% Have to otherify everything special to allow the \csname to
% include an _ in the xref name, etc.
@ -8538,6 +8539,10 @@
\expandafter\global\expandafter\let\expandafter\Xthisreftitle
\csname XR#1-title\endcsname
}%
%
% Float references are printed completely differently: "Figure 1.2"
% instead of "[somenode], p.3". \iffloat distinguishes them by
% \Xthisreftitle being set to a magic string.
\iffloat\Xthisreftitle
% If the user specified the print name (third arg) to the ref,
% print it instead of our usual "Figure 1.2".

View file

@ -478,7 +478,7 @@ acl_nontrivial (int count, struct acl *entries)
void
free_permission_context (struct permission_context *ctx)
{
#ifdef USE_ACL
#if USE_ACL
# if HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */
if (ctx->acl)
acl_free (ctx->acl);

View file

@ -255,7 +255,7 @@ extern int acl_nontrivial (int count, struct acl *entries);
struct permission_context {
mode_t mode;
#ifdef USE_ACL
#if USE_ACL
# if HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */
acl_t acl;
# if !HAVE_ACL_TYPE_EXTENDED

View file

@ -60,7 +60,7 @@ set_binary_mode (int fd, int mode)
/* SET_BINARY (fd);
changes the file descriptor fd to perform binary I/O. */
#ifdef __DJGPP__
#if defined __DJGPP__ || defined __EMX__
# include <unistd.h> /* declares isatty() */
/* Avoid putting stdin/stdout in binary mode if it is connected to
the console, because that would make it impossible for the user

View file

@ -158,6 +158,13 @@ _GL_WARN_ON_USE (closedir, "closedir is not portable - "
# endif
_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
# ifdef __KLIBC__
/* Gnulib internal hooks needed to maintain the dirfd metadata. */
_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
_GL_ARG_NONNULL ((2));
_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
# endif
# else
# if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
/* dirfd is defined as a macro and not as a function.

View file

@ -22,11 +22,77 @@
#include <dirent.h>
#include <errno.h>
#ifdef __KLIBC__
# include <stdlib.h>
# include <io.h>
static struct dirp_fd_list
{
DIR *dirp;
int fd;
struct dirp_fd_list *next;
} *dirp_fd_start = NULL;
/* Register fd associated with dirp to dirp_fd_list. */
int
_gl_register_dirp_fd (int fd, DIR *dirp)
{
struct dirp_fd_list *new_dirp_fd = malloc (sizeof *new_dirp_fd);
if (!new_dirp_fd)
return -1;
new_dirp_fd->dirp = dirp;
new_dirp_fd->fd = fd;
new_dirp_fd->next = dirp_fd_start;
dirp_fd_start = new_dirp_fd;
return 0;
}
/* Unregister fd from dirp_fd_list with closing it */
void
_gl_unregister_dirp_fd (int fd)
{
struct dirp_fd_list *dirp_fd;
struct dirp_fd_list *dirp_fd_prev;
for (dirp_fd_prev = NULL, dirp_fd = dirp_fd_start; dirp_fd;
dirp_fd_prev = dirp_fd, dirp_fd = dirp_fd->next)
{
if (dirp_fd->fd == fd)
{
if (dirp_fd_prev)
dirp_fd_prev->next = dirp_fd->next;
else /* dirp_fd == dirp_fd_start */
dirp_fd_start = dirp_fd_start->next;
close (fd);
free (dirp_fd);
break;
}
}
}
#endif
int
dirfd (DIR *dir_p)
{
int fd = DIR_TO_FD (dir_p);
if (fd == -1)
#ifndef __KLIBC__
errno = ENOTSUP;
#else
{
struct dirp_fd_list *dirp_fd;
for (dirp_fd = dirp_fd_start; dirp_fd; dirp_fd = dirp_fd->next)
if (dirp_fd->dirp == dir_p)
return dirp_fd->fd;
errno = EINVAL;
}
#endif
return fd;
}

View file

@ -85,6 +85,57 @@ ms_windows_dup2 (int fd, int desired_fd)
# define dup2 ms_windows_dup2
# elif defined __KLIBC__
# include <InnoTekLIBC/backend.h>
static int
klibc_dup2dirfd (int fd, int desired_fd)
{
int tempfd;
int dupfd;
tempfd = open ("NUL", O_RDONLY);
if (tempfd == -1)
return -1;
if (tempfd == desired_fd)
{
close (tempfd);
char path[_MAX_PATH];
if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
return -1;
return open(path, O_RDONLY);
}
dupfd = klibc_dup2dirfd (fd, desired_fd);
close (tempfd);
return dupfd;
}
static int
klibc_dup2 (int fd, int desired_fd)
{
int dupfd;
struct stat sbuf;
dupfd = dup2 (fd, desired_fd);
if (dupfd == -1 && errno == ENOTSUP \
&& !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
{
close (desired_fd);
return klibc_dup2dirfd (fd, desired_fd);
}
return dupfd;
}
# define dup2 klibc_dup2
# endif
int

View file

@ -162,6 +162,93 @@ dupfd (int oldfd, int newfd, int flags)
}
#endif /* W32 */
#ifdef __KLIBC__
# define INCL_DOS
# include <os2.h>
static int
klibc_fcntl (int fd, int action, /* arg */...)
{
va_list arg_ptr;
int arg;
struct stat sbuf;
int result = -1;
va_start (arg_ptr, action);
arg = va_arg (arg_ptr, int);
result = fcntl (fd, action, arg);
/* EPERM for F_DUPFD, ENOTSUP for others */
if (result == -1 && (errno == EPERM || errno == ENOTSUP)
&& !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
{
ULONG ulMode;
switch (action)
{
case F_DUPFD:
/* Find available fd */
while (fcntl (arg, F_GETFL) != -1 || errno != EBADF)
arg++;
result = dup2 (fd, arg);
break;
/* Using underlying APIs is right ? */
case F_GETFD:
if (DosQueryFHState (fd, &ulMode))
break;
result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0;
break;
case F_SETFD:
if (arg & ~FD_CLOEXEC)
break;
if (DosQueryFHState (fd, &ulMode))
break;
if (arg & FD_CLOEXEC)
ulMode |= OPEN_FLAGS_NOINHERIT;
else
ulMode &= ~OPEN_FLAGS_NOINHERIT;
/* Filter supported flags. */
ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR
| OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
if (DosSetFHState (fd, ulMode))
break;
result = 0;
break;
case F_GETFL:
result = 0;
break;
case F_SETFL:
if (arg != 0)
break;
result = 0;
break;
default :
errno = EINVAL;
break;
}
}
va_end (arg_ptr);
return result;
}
# define fcntl klibc_fcntl
#endif
/* Perform the specified ACTION on the file descriptor FD, possibly
using the argument ARG further described below. This replacement
handles the following actions, and forwards all others on to the

View file

@ -62,6 +62,41 @@ static DIR *fd_clone_opendir (int, struct saved_cwd const *);
If this function returns successfully, FD is under control of the
dirent.h system, and the caller should not close or modify the state of
FD other than by the dirent.h functions. */
# ifdef __KLIBC__
# include <InnoTekLIBC/backend.h>
DIR *
fdopendir (int fd)
{
char path[_MAX_PATH];
DIR *dirp;
/* Get a path from fd */
if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
return NULL;
dirp = opendir (path);
if (!dirp)
return NULL;
/* Unregister fd registered by opendir() */
_gl_unregister_dirp_fd (dirfd (dirp));
/* Register our fd */
if (_gl_register_dirp_fd (fd, dirp))
{
int saved_errno = errno;
closedir (dirp);
errno = saved_errno;
dirp = NULL;
}
return dirp;
}
# else
DIR *
fdopendir (int fd)
{
@ -84,6 +119,7 @@ fdopendir (int fd)
return dir;
}
# endif
/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known
to be a dup of FD which is less than FD - 1 and which will be

View file

@ -19,7 +19,7 @@
/* Define this to have a standalone program to test this implementation of
mktime. */
/* #define DEBUG 1 */
/* #define DEBUG_MKTIME 1 */
#ifndef _LIBC
# include <config.h>
@ -38,13 +38,13 @@
#include <string.h> /* For the real memcpy prototype. */
#if defined DEBUG && DEBUG
#if defined DEBUG_MKTIME && DEBUG_MKTIME
# include <stdio.h>
# include <stdlib.h>
/* Make it work even if the system's libc has its own mktime routine. */
# undef mktime
# define mktime my_mktime
#endif /* DEBUG */
#endif /* DEBUG_MKTIME */
/* Some of the code in this file assumes that signed integer overflow
silently wraps around. This assumption can't easily be programmed
@ -600,7 +600,7 @@ libc_hidden_def (mktime)
libc_hidden_weak (timelocal)
#endif
#if defined DEBUG && DEBUG
#if defined DEBUG_MKTIME && DEBUG_MKTIME
static int
not_equal_tm (const struct tm *a, const struct tm *b)
@ -732,10 +732,10 @@ main (int argc, char **argv)
return status;
}
#endif /* DEBUG */
#endif /* DEBUG_MKTIME */
/*
Local Variables:
compile-command: "gcc -DDEBUG -I. -Wall -W -O2 -g mktime.c -o mktime"
compile-command: "gcc -DDEBUG_MKTIME -I. -Wall -W -O2 -g mktime.c -o mktime"
End:
*/

View file

@ -30,24 +30,21 @@
#include <string.h>
#include <unistd.h>
#ifdef __KLIBC__
# include <InnoTekLIBC/backend.h>
#endif
#include "intprops.h"
#define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/%s"
#define PROC_SELF_FD_NAME_SIZE_BOUND(len) \
(sizeof PROC_SELF_FD_FORMAT - sizeof "%d%s" \
+ INT_STRLEN_BOUND (int) + (len) + 1)
/* Set BUF to the expansion of PROC_SELF_FD_FORMAT, using FD and FILE
respectively for %d and %s. If successful, return BUF if the
result fits in BUF, dynamically allocated memory otherwise. But
return NULL if /proc is not reliable, either because the operating
system support is lacking or because memory is low. */
/* Set BUF to the name of the subfile of the directory identified by
FD, where the subfile is named FILE. If successful, return BUF if
the result fits in BUF, dynamically allocated memory otherwise.
Return NULL (setting errno) on error. */
char *
openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
{
static int proc_status = 0;
char *result = buf;
int dirlen;
/* Make sure the caller gets ENOENT when appropriate. */
if (!*file)
@ -56,47 +53,82 @@ openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
return buf;
}
if (! proc_status)
{
/* Set PROC_STATUS to a positive value if /proc/self/fd is
reliable, and a negative value otherwise. Solaris 10
/proc/self/fd mishandles "..", and any file name might expand
to ".." after symbolic link expansion, so avoid /proc/self/fd
if it mishandles "..". Solaris 10 has openat, but this
problem is exhibited on code that built on Solaris 8 and
running on Solaris 10. */
#ifndef __KLIBC__
# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"
{
enum {
PROC_SELF_FD_DIR_SIZE_BOUND
= (sizeof PROC_SELF_FD_FORMAT - (sizeof "%d" - 1)
+ INT_STRLEN_BOUND (int))
};
int proc_self_fd = open ("/proc/self/fd",
O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
if (proc_self_fd < 0)
proc_status = -1;
else
{
/* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
number of a file descriptor open on /proc/self/fd. On Linux,
that name resolves to /proc/self/fd, which was opened above.
However, on Solaris, it may resolve to /proc/self/fd/fd, which
cannot exist, since all names in /proc/self/fd are numeric. */
char dotdot_buf[PROC_SELF_FD_NAME_SIZE_BOUND (sizeof "../fd" - 1)];
sprintf (dotdot_buf, PROC_SELF_FD_FORMAT, proc_self_fd, "../fd");
proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
close (proc_self_fd);
}
}
static int proc_status = 0;
if (! proc_status)
{
/* Set PROC_STATUS to a positive value if /proc/self/fd is
reliable, and a negative value otherwise. Solaris 10
/proc/self/fd mishandles "..", and any file name might expand
to ".." after symbolic link expansion, so avoid /proc/self/fd
if it mishandles "..". Solaris 10 has openat, but this
problem is exhibited on code that built on Solaris 8 and
running on Solaris 10. */
if (proc_status < 0)
return NULL;
else
{
size_t bufsize = PROC_SELF_FD_NAME_SIZE_BOUND (strlen (file));
char *result = buf;
if (OPENAT_BUFFER_SIZE < bufsize)
{
result = malloc (bufsize);
if (! result)
return NULL;
}
sprintf (result, PROC_SELF_FD_FORMAT, fd, file);
return result;
}
int proc_self_fd = open ("/proc/self/fd",
O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
if (proc_self_fd < 0)
proc_status = -1;
else
{
/* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
number of a file descriptor open on /proc/self/fd. On Linux,
that name resolves to /proc/self/fd, which was opened above.
However, on Solaris, it may resolve to /proc/self/fd/fd, which
cannot exist, since all names in /proc/self/fd are numeric. */
char dotdot_buf[PROC_SELF_FD_DIR_SIZE_BOUND + sizeof "../fd" - 1];
sprintf (dotdot_buf, PROC_SELF_FD_FORMAT "../fd", proc_self_fd);
proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
close (proc_self_fd);
}
}
if (proc_status < 0)
return NULL;
else
{
size_t bufsize = PROC_SELF_FD_DIR_SIZE_BOUND + strlen (file);
if (OPENAT_BUFFER_SIZE < bufsize)
{
result = malloc (bufsize);
if (! result)
return NULL;
}
dirlen = sprintf (result, PROC_SELF_FD_FORMAT, fd);
}
}
#else
/* OS/2 kLIBC provides a function to retrieve a path from a fd. */
{
char dir[_MAX_PATH];
size_t bufsize;
if (__libc_Back_ioFHToPath (fd, dir, sizeof dir))
return NULL;
dirlen = strlen (dir);
bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */
if (OPENAT_BUFFER_SIZE < bufsize)
{
result = malloc (bufsize);
if (! result)
return NULL;
}
strcpy (result, dir);
result[dirlen++] = '/';
}
#endif
strcpy (result + dirlen, file);
return result;
}

View file

@ -44,6 +44,8 @@ int str2sig (char const *, int *);
#if defined _sys_nsig
# define SIGNUM_BOUND (_sys_nsig - 1)
#elif defined _SIG_MAXSIG
# define SIGNUM_BOUND (_SIG_MAXSIG - 2) /* FreeBSD >= 7. */
#elif defined NSIG
# define SIGNUM_BOUND (NSIG - 1)
#else

View file

@ -288,12 +288,17 @@ typedef gl_uint_fast32_t gl_uint_fast16_t;
/* 7.18.1.4. Integer types capable of holding object pointers */
/* kLIBC's stdint.h defines _INTPTR_T_DECLARED and needs its own
definitions of intptr_t and uintptr_t (which use int and unsigned)
to avoid clashes with declarations of system functions like sbrk. */
#ifndef _INTPTR_T_DECLARED
#undef intptr_t
#undef uintptr_t
typedef long int gl_intptr_t;
typedef unsigned long int gl_uintptr_t;
#define intptr_t gl_intptr_t
#define uintptr_t gl_uintptr_t
#endif
/* 7.18.1.5. Greatest-width integer types */

View file

@ -1,4 +1,4 @@
# serial 22 -*- Autoconf -*-
# serial 24 -*- Autoconf -*-
dnl Find out how to get the file descriptor associated with an open DIR*.
@ -35,13 +35,15 @@ AC_DEFUN([gl_FUNC_DIRFD],
gl_cv_func_dirfd_macro=yes,
gl_cv_func_dirfd_macro=no)])
# Use the replacement only if we have no function or macro with that name.
if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no; then
if test $ac_cv_have_decl_dirfd = yes; then
# If the system declares dirfd already, let's declare rpl_dirfd instead.
# Use the replacement if we have no function or macro with that name,
# or if OS/2 kLIBC whose dirfd() does not work.
# Replace only if the system declares dirfd already.
case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
no,no,*,yes | *,*,os2*,yes)
REPLACE_DIRFD=1
fi
fi
AC_DEFINE([REPLACE_DIRFD], [1],
[Define to 1 if gnulib's dirfd() replacement is used.]);;
esac
])
dnl Prerequisites of lib/dirfd.c.

View file

@ -1,4 +1,4 @@
#serial 24
#serial 25
dnl Copyright (C) 2002, 2005, 2007, 2009-2016 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@ -62,6 +62,16 @@ AC_DEFUN([gl_FUNC_DUP2],
result |= 32;
dup2 (2, 255);
dup2 (2, 256);
/* On OS/2 kLIBC, dup2() does not work on a directory fd. */
{
int fd = open (".", O_RDONLY);
if (fd == -1)
result |= 64;
else if (dup2 (fd, fd + 1) == -1)
result |= 128;
close (fd);
}
return result;]])
],
[gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
@ -78,6 +88,8 @@ AC_DEFUN([gl_FUNC_DUP2],
gl_cv_func_dup2_works="guessing no" ;;
*-android*) # implemented using dup3(), which fails if oldfd == newfd
gl_cv_func_dup2_works="guessing no" ;;
os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
gl_cv_func_dup2_works="guessing no" ;;
*) gl_cv_func_dup2_works="guessing yes" ;;
esac])
])

View file

@ -1,4 +1,4 @@
# fcntl.m4 serial 8
# fcntl.m4 serial 9
dnl Copyright (C) 2009-2016 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@ -54,6 +54,17 @@ AC_DEFUN([gl_FUNC_FCNTL],
if (errno != EINVAL) result |= 2;
if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
if (errno != EINVAL) result |= 8;
/* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
{
int fd;
fd = open (".", O_RDONLY);
if (fd == -1)
result |= 16;
else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
result |= 32;
close (fd);
}
return result;]])],
[gl_cv_func_fcntl_f_dupfd_works=yes],
[gl_cv_func_fcntl_f_dupfd_works=no],

View file

@ -436,7 +436,8 @@ AC_DEFUN([gl_INIT],
{
if ! $gl_gnulib_enabled_dirfd; then
gl_FUNC_DIRFD
if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no; then
if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no \
|| test $REPLACE_DIRFD = 1; then
AC_LIBOBJ([dirfd])
gl_PREREQ_DIRFD
fi

View file

@ -1,5 +1,5 @@
# Detect some bugs in glibc's implementation of utimes.
# serial 3
# serial 4
dnl Copyright (C) 2003-2005, 2009-2016 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
@ -33,6 +33,7 @@ AC_DEFUN([gl_FUNC_UTIMES],
#include <stdlib.h>
#include <stdio.h>
#include <utime.h>
#include <errno.h>
static int
inorder (time_t a, time_t b, time_t c)
@ -45,7 +46,10 @@ main ()
{
int result = 0;
char const *file = "conftest.utimes";
static struct timeval timeval[2] = {{9, 10}, {999999, 999999}};
/* On OS/2, file timestamps must be on or after 1980 in local time,
with an even number of seconds. */
static struct timeval timeval[2] = {{315620000 + 10, 10},
{315620000 + 1000000, 999998}};
/* Test whether utimes() essentially works. */
{
@ -82,9 +86,19 @@ main ()
result |= 1;
else if (fstat (fd, &st0) != 0)
result |= 1;
else if (utimes (file, timeval) != 0)
else if (utimes (file, timeval) != 0
&& (errno != EACCES
/* OS/2 kLIBC utimes fails on opened files. */
|| close (fd) != 0
|| utimes (file, timeval) != 0
|| (fd = open (file, O_WRONLY)) < 0))
result |= 2;
else if (utimes (file, NULL) != 0)
else if (utimes (file, NULL) != 0
&& (errno != EACCES
/* OS/2 kLIBC utimes fails on opened files. */
|| close (fd) != 0
|| utimes (file, NULL) != 0
|| (fd = open (file, O_WRONLY)) < 0))
result |= 8;
else if (fstat (fd, &st1) != 0)
result |= 1;