aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2012-10-19 12:25:18 -0700
committerPaul Eggert2012-10-19 12:25:18 -0700
commitf0a801750151bee7fdcf96dff272986e627fb3e3 (patch)
tree1374d53fe4cd23a04924db66005e7bb0c66ad2c7
parent8e8083185c417eedbaadf0b33c7089da72fe2250 (diff)
downloademacs-f0a801750151bee7fdcf96dff272986e627fb3e3.tar.gz
emacs-f0a801750151bee7fdcf96dff272986e627fb3e3.zip
Undo faccessat change.
-rw-r--r--ChangeLog13
-rw-r--r--admin/ChangeLog8
-rwxr-xr-xadmin/merge-gnulib13
-rw-r--r--configure.ac4
-rw-r--r--lib/at-func.c146
-rw-r--r--lib/euidaccess.c221
-rw-r--r--lib/faccessat.c45
-rw-r--r--lib/fcntl.in.h347
-rw-r--r--lib/getgroups.c116
-rw-r--r--lib/gnulib.mk97
-rw-r--r--lib/group-member.c119
-rw-r--r--lib/root-uid.h30
-rw-r--r--lib/xalloc-oversized.h38
-rw-r--r--m4/euidaccess.m452
-rw-r--r--m4/faccessat.m428
-rw-r--r--m4/fcntl_h.m450
-rw-r--r--m4/getgroups.m4107
-rw-r--r--m4/gnulib-comp.m4105
-rw-r--r--m4/group-member.m429
-rw-r--r--nt/ChangeLog7
-rw-r--r--nt/inc/ms-w32.h7
-rw-r--r--src/ChangeLog29
-rw-r--r--src/Makefile.in3
-rw-r--r--src/callproc.c4
-rw-r--r--src/charset.c3
-rw-r--r--src/conf_post.h4
-rw-r--r--src/fileio.c97
-rw-r--r--src/lisp.h1
-rw-r--r--src/lread.c56
-rw-r--r--src/process.c36
-rw-r--r--src/sysdep.c6
-rw-r--r--src/term.c4
-rw-r--r--src/w32.c18
-rw-r--r--src/xrdb.c8
34 files changed, 146 insertions, 1705 deletions
diff --git a/ChangeLog b/ChangeLog
index c7fcd319af2..81eddade0a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,3 @@
12012-10-19 Paul Eggert <eggert@cs.ucla.edu>
2
3 Use faccessat, not access, when checking file permissions (Bug#12632).
4 * .bzrignore: Add lib/fcntl.h.
5 * configure.ac (euidaccess): Remove check; gnulib does this for us now.
6 (gl_FCNTL_O_FLAGS): Define a dummy version.
7 * lib/at-func.c, lib/euidaccess.c, lib/faccessat.c, lib/fcntl.in.h:
8 * lib/getgroups.c, lib/group-member.c, lib/root-uid.h:
9 * lib/xalloc-oversized.h, m4/euidaccess.m4, m4/faccessat.m4:
10 * m4/fcntl_h.m4, m4/getgroups.m4, m4/group-member.m4:
11 New files, from gnulib.
12 * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
13
142012-10-18 Stefan Monnier <monnier@iro.umontreal.ca> 12012-10-18 Stefan Monnier <monnier@iro.umontreal.ca>
15 2
16 * Makefile.in ($(MAKEFILE_NAME)): Depend on src/lisp.mk as well. 3 * Makefile.in ($(MAKEFILE_NAME)): Depend on src/lisp.mk as well.
diff --git a/admin/ChangeLog b/admin/ChangeLog
index 6d08bf7c37e..e21293d618d 100644
--- a/admin/ChangeLog
+++ b/admin/ChangeLog
@@ -1,11 +1,3 @@
12012-10-19 Paul Eggert <eggert@cs.ucla.edu>
2
3 Use faccessat, not access, when checking file permissions (Bug#12632).
4 * merge-gnulib (GNULIB_MODULES): Add faccessat.
5 (GNULIB_TOOL_FLAGS): Avoid at-internal, fchdir, malloc-posix,
6 openat-die, openat-h, save-cwd. Do not avoid fcntl-h.
7 Omit gnulib's m4/fcntl-o.m4.
8
92012-10-12 Kenichi Handa <handa@gnu.org> 12012-10-12 Kenichi Handa <handa@gnu.org>
10 2
11 * charsets/Makefile (JISC6226.map): Add missing mappings. 3 * charsets/Makefile (JISC6226.map): Add missing mappings.
diff --git a/admin/merge-gnulib b/admin/merge-gnulib
index 3c4d8e8058d..7fc0b5f4844 100755
--- a/admin/merge-gnulib
+++ b/admin/merge-gnulib
@@ -28,7 +28,7 @@ GNULIB_URL=git://git.savannah.gnu.org/gnulib.git
28GNULIB_MODULES=' 28GNULIB_MODULES='
29 alloca-opt c-ctype c-strcase 29 alloca-opt c-ctype c-strcase
30 careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 30 careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
31 dtoastr dtotimespec dup2 environ execinfo faccessat 31 dtoastr dtotimespec dup2 environ execinfo
32 filemode getloadavg getopt-gnu gettime gettimeofday 32 filemode getloadavg getopt-gnu gettime gettimeofday
33 ignore-value intprops largefile lstat 33 ignore-value intprops largefile lstat
34 manywarnings mktime pselect pthread_sigmask readlink 34 manywarnings mktime pselect pthread_sigmask readlink
@@ -39,12 +39,9 @@ GNULIB_MODULES='
39' 39'
40 40
41GNULIB_TOOL_FLAGS=' 41GNULIB_TOOL_FLAGS='
42 --avoid=at-internal 42 --avoid=errno --avoid=fcntl --avoid=fcntl-h --avoid=fstat
43 --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat 43 --avoid=msvc-inval --avoid=msvc-nothrow
44 --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow 44 --avoid=raise --avoid=select --avoid=sigprocmask --avoid=sys_types
45 --avoid=openat-die --avoid=openat-h
46 --avoid=raise
47 --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types
48 --avoid=threadlib 45 --avoid=threadlib
49 --conditional-dependencies --import --no-changelog --no-vc-files 46 --conditional-dependencies --import --no-changelog --no-vc-files
50 --makefile-name=gnulib.mk 47 --makefile-name=gnulib.mk
@@ -88,7 +85,7 @@ test -x "$gnulib_srcdir"/gnulib-tool || {
88} 85}
89 86
90"$gnulib_srcdir"/gnulib-tool --dir="$src" $GNULIB_TOOL_FLAGS $GNULIB_MODULES && 87"$gnulib_srcdir"/gnulib-tool --dir="$src" $GNULIB_TOOL_FLAGS $GNULIB_MODULES &&
91rm -- "$src"m4/fcntl-o.m4 "$src"m4/gnulib-cache.m4 "$src"m4/warn-on-use.m4 && 88rm -- "$src"m4/gnulib-cache.m4 "$src"m4/warn-on-use.m4 &&
92cp -- "$gnulib_srcdir"/build-aux/texinfo.tex "$src"doc/misc && 89cp -- "$gnulib_srcdir"/build-aux/texinfo.tex "$src"doc/misc &&
93cp -- "$gnulib_srcdir"/build-aux/move-if-change "$src"build-aux && 90cp -- "$gnulib_srcdir"/build-aux/move-if-change "$src"build-aux &&
94autoreconf -i -I m4 -- ${src:+"$src"} 91autoreconf -i -I m4 -- ${src:+"$src"}
diff --git a/configure.ac b/configure.ac
index 6b4c757ced5..5520dd6a903 100644
--- a/configure.ac
+++ b/configure.ac
@@ -572,8 +572,6 @@ else
572 test "x$NON_GCC_TEST_OPTIONS" != x && CC="$CC $NON_GCC_TEST_OPTIONS" 572 test "x$NON_GCC_TEST_OPTIONS" != x && CC="$CC $NON_GCC_TEST_OPTIONS"
573fi 573fi
574 574
575# Avoid gnulib's tests for O_NOATIME and O_NOFOLLOW, as we don't use them.
576AC_DEFUN([gl_FCNTL_O_FLAGS])
577# Avoid gnulib's threadlib module, as we do threads our own way. 575# Avoid gnulib's threadlib module, as we do threads our own way.
578AC_DEFUN([gl_THREADLIB]) 576AC_DEFUN([gl_THREADLIB])
579 577
@@ -2874,7 +2872,7 @@ AC_SUBST(BLESSMAIL_TARGET)
2874AC_CHECK_FUNCS(gethostname \ 2872AC_CHECK_FUNCS(gethostname \
2875closedir getrusage get_current_dir_name \ 2873closedir getrusage get_current_dir_name \
2876lrand48 setsid \ 2874lrand48 setsid \
2877fpathconf select getpagesize setlocale \ 2875fpathconf select euidaccess getpagesize setlocale \
2878utimes getrlimit setrlimit setpgid getcwd shutdown getaddrinfo \ 2876utimes getrlimit setrlimit setpgid getcwd shutdown getaddrinfo \
2879__fpending strsignal setitimer \ 2877__fpending strsignal setitimer \
2880sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \ 2878sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \
diff --git a/lib/at-func.c b/lib/at-func.c
deleted file mode 100644
index 481eea475a1..00000000000
--- a/lib/at-func.c
+++ /dev/null
@@ -1,146 +0,0 @@
1/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
2 Copyright (C) 2006, 2009-2012 Free Software Foundation, Inc.
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
17/* written by Jim Meyering */
18
19#include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
20
21#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
22# include <errno.h>
23# ifndef ENOTSUP
24# define ENOTSUP EINVAL
25# endif
26#else
27# include "openat.h"
28# include "openat-priv.h"
29# include "save-cwd.h"
30#endif
31
32#ifdef AT_FUNC_USE_F1_COND
33# define CALL_FUNC(F) \
34 (flag == AT_FUNC_USE_F1_COND \
35 ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
36 : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
37# define VALIDATE_FLAG(F) \
38 if (flag & ~AT_FUNC_USE_F1_COND) \
39 { \
40 errno = EINVAL; \
41 return FUNC_FAIL; \
42 }
43#else
44# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
45# define VALIDATE_FLAG(F) /* empty */
46#endif
47
48#ifdef AT_FUNC_RESULT
49# define FUNC_RESULT AT_FUNC_RESULT
50#else
51# define FUNC_RESULT int
52#endif
53
54#ifdef AT_FUNC_FAIL
55# define FUNC_FAIL AT_FUNC_FAIL
56#else
57# define FUNC_FAIL -1
58#endif
59
60/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
61 open on descriptor FD. If AT_FUNC_USE_F1_COND is defined to a value,
62 AT_FUNC_POST_FILE_PARAM_DECLS must include a parameter named flag;
63 call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
64 AT_FUNC_USE_F1_COND. Return int and fail with -1 unless AT_FUNC_RESULT
65 or AT_FUNC_FAIL are defined. If possible, do it without changing the
66 working directory. Otherwise, resort to using save_cwd/fchdir,
67 then AT_FUNC_F?/restore_cwd. If either the save_cwd or the restore_cwd
68 fails, then give a diagnostic and exit nonzero. */
69FUNC_RESULT
70AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
71{
72 VALIDATE_FLAG (flag);
73
74 if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
75 return CALL_FUNC (file);
76
77#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
78 errno = ENOTSUP;
79 return FUNC_FAIL;
80#else
81 {
82 /* Be careful to choose names unlikely to conflict with
83 AT_FUNC_POST_FILE_PARAM_DECLS. */
84 struct saved_cwd saved_cwd;
85 int saved_errno;
86 FUNC_RESULT err;
87
88 {
89 char proc_buf[OPENAT_BUFFER_SIZE];
90 char *proc_file = openat_proc_name (proc_buf, fd, file);
91 if (proc_file)
92 {
93 FUNC_RESULT proc_result = CALL_FUNC (proc_file);
94 int proc_errno = errno;
95 if (proc_file != proc_buf)
96 free (proc_file);
97 /* If the syscall succeeds, or if it fails with an unexpected
98 errno value, then return right away. Otherwise, fall through
99 and resort to using save_cwd/restore_cwd. */
100 if (FUNC_FAIL != proc_result)
101 return proc_result;
102 if (! EXPECTED_ERRNO (proc_errno))
103 {
104 errno = proc_errno;
105 return proc_result;
106 }
107 }
108 }
109
110 if (save_cwd (&saved_cwd) != 0)
111 openat_save_fail (errno);
112 if (0 <= fd && fd == saved_cwd.desc)
113 {
114 /* If saving the working directory collides with the user's
115 requested fd, then the user's fd must have been closed to
116 begin with. */
117 free_cwd (&saved_cwd);
118 errno = EBADF;
119 return FUNC_FAIL;
120 }
121
122 if (fchdir (fd) != 0)
123 {
124 saved_errno = errno;
125 free_cwd (&saved_cwd);
126 errno = saved_errno;
127 return FUNC_FAIL;
128 }
129
130 err = CALL_FUNC (file);
131 saved_errno = (err == FUNC_FAIL ? errno : 0);
132
133 if (restore_cwd (&saved_cwd) != 0)
134 openat_restore_fail (errno);
135
136 free_cwd (&saved_cwd);
137
138 if (saved_errno)
139 errno = saved_errno;
140 return err;
141 }
142#endif
143}
144#undef CALL_FUNC
145#undef FUNC_RESULT
146#undef FUNC_FAIL
diff --git a/lib/euidaccess.c b/lib/euidaccess.c
deleted file mode 100644
index ca2ceca5d22..00000000000
--- a/lib/euidaccess.c
+++ /dev/null
@@ -1,221 +0,0 @@
1/* euidaccess -- check if effective user id can access file
2
3 Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2012 Free
4 Software Foundation, Inc.
5
6 This file is part of the GNU C Library.
7
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21/* Written by David MacKenzie and Torbjorn Granlund.
22 Adapted for GNU C library by Roland McGrath. */
23
24#ifndef _LIBC
25# include <config.h>
26#endif
27
28#include <fcntl.h>
29#include <sys/types.h>
30#include <sys/stat.h>
31#include <unistd.h>
32
33#include "root-uid.h"
34
35#if HAVE_LIBGEN_H
36# include <libgen.h>
37#endif
38
39#include <errno.h>
40#ifndef __set_errno
41# define __set_errno(val) errno = (val)
42#endif
43
44#if defined EACCES && !defined EACCESS
45# define EACCESS EACCES
46#endif
47
48#ifndef F_OK
49# define F_OK 0
50# define X_OK 1
51# define W_OK 2
52# define R_OK 4
53#endif
54
55
56#ifdef _LIBC
57
58# define access __access
59# define getuid __getuid
60# define getgid __getgid
61# define geteuid __geteuid
62# define getegid __getegid
63# define group_member __group_member
64# define euidaccess __euidaccess
65# undef stat
66# define stat stat64
67
68#endif
69
70/* Return 0 if the user has permission of type MODE on FILE;
71 otherwise, return -1 and set 'errno'.
72 Like access, except that it uses the effective user and group
73 id's instead of the real ones, and it does not always check for read-only
74 file system, text busy, etc. */
75
76int
77euidaccess (const char *file, int mode)
78{
79#if HAVE_FACCESSAT /* glibc, AIX 7, Solaris 11, Cygwin 1.7 */
80 return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
81#elif defined EFF_ONLY_OK /* IRIX, OSF/1, Interix */
82 return access (file, mode | EFF_ONLY_OK);
83#elif defined ACC_SELF /* AIX */
84 return accessx (file, mode, ACC_SELF);
85#elif HAVE_EACCESS /* FreeBSD */
86 return eaccess (file, mode);
87#else /* Mac OS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, mingw, BeOS */
88
89 uid_t uid = getuid ();
90 gid_t gid = getgid ();
91 uid_t euid = geteuid ();
92 gid_t egid = getegid ();
93 struct stat stats;
94
95# if HAVE_DECL_SETREGID && PREFER_NONREENTRANT_EUIDACCESS
96
97 /* Define PREFER_NONREENTRANT_EUIDACCESS if you prefer euidaccess to
98 return the correct result even if this would make it
99 nonreentrant. Define this only if your entire application is
100 safe even if the uid or gid might temporarily change. If your
101 application uses signal handlers or threads it is probably not
102 safe. */
103
104 if (mode == F_OK)
105 return stat (file, &stats);
106 else
107 {
108 int result;
109 int saved_errno;
110
111 if (uid != euid)
112 setreuid (euid, uid);
113 if (gid != egid)
114 setregid (egid, gid);
115
116 result = access (file, mode);
117 saved_errno = errno;
118
119 /* Restore them. */
120 if (uid != euid)
121 setreuid (uid, euid);
122 if (gid != egid)
123 setregid (gid, egid);
124
125 errno = saved_errno;
126 return result;
127 }
128
129# else
130
131 /* The following code assumes the traditional Unix model, and is not
132 correct on systems that have ACLs or the like. However, it's
133 better than nothing, and it is reentrant. */
134
135 unsigned int granted;
136 if (uid == euid && gid == egid)
137 /* If we are not set-uid or set-gid, access does the same. */
138 return access (file, mode);
139
140 if (stat (file, &stats) != 0)
141 return -1;
142
143 /* The super-user can read and write any file, and execute any file
144 that anyone can execute. */
145 if (euid == ROOT_UID
146 && ((mode & X_OK) == 0
147 || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
148 return 0;
149
150 /* Convert the mode to traditional form, clearing any bogus bits. */
151 if (R_OK == 4 && W_OK == 2 && X_OK == 1 && F_OK == 0)
152 mode &= 7;
153 else
154 mode = ((mode & R_OK ? 4 : 0)
155 + (mode & W_OK ? 2 : 0)
156 + (mode & X_OK ? 1 : 0));
157
158 if (mode == 0)
159 return 0; /* The file exists. */
160
161 /* Convert the file's permission bits to traditional form. */
162 if (S_IRUSR == (4 << 6) && S_IWUSR == (2 << 6) && S_IXUSR == (1 << 6)
163 && S_IRGRP == (4 << 3) && S_IWGRP == (2 << 3) && S_IXGRP == (1 << 3)
164 && S_IROTH == (4 << 0) && S_IWOTH == (2 << 0) && S_IXOTH == (1 << 0))
165 granted = stats.st_mode;
166 else
167 granted = ((stats.st_mode & S_IRUSR ? 4 << 6 : 0)
168 + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
169 + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
170 + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
171 + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
172 + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
173 + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
174 + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
175 + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
176
177 if (euid == stats.st_uid)
178 granted >>= 6;
179 else if (egid == stats.st_gid || group_member (stats.st_gid))
180 granted >>= 3;
181
182 if ((mode & ~granted) == 0)
183 return 0;
184 __set_errno (EACCESS);
185 return -1;
186
187# endif
188#endif
189}
190#undef euidaccess
191#ifdef weak_alias
192weak_alias (__euidaccess, euidaccess)
193#endif
194
195#ifdef TEST
196# include <error.h>
197# include <stdio.h>
198# include <stdlib.h>
199
200char *program_name;
201
202int
203main (int argc, char **argv)
204{
205 char *file;
206 int mode;
207 int err;
208
209 program_name = argv[0];
210 if (argc < 3)
211 abort ();
212 file = argv[1];
213 mode = atoi (argv[2]);
214
215 err = euidaccess (file, mode);
216 printf ("%d\n", err);
217 if (err != 0)
218 error (0, errno, "%s", file);
219 exit (0);
220}
221#endif
diff --git a/lib/faccessat.c b/lib/faccessat.c
deleted file mode 100644
index d11a3efaad6..00000000000
--- a/lib/faccessat.c
+++ /dev/null
@@ -1,45 +0,0 @@
1/* Check the access rights of a file relative to an open directory.
2 Copyright (C) 2009-2012 Free Software Foundation, Inc.
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
16
17/* written by Eric Blake */
18
19#include <config.h>
20
21#include <unistd.h>
22#include <fcntl.h>
23
24#ifndef HAVE_ACCESS
25/* Mingw lacks access, but it also lacks real vs. effective ids, so
26 the gnulib euidaccess module is good enough. */
27# undef access
28# define access euidaccess
29#endif
30
31/* Invoke access or euidaccess on file, FILE, using mode MODE, in the directory
32 open on descriptor FD. If possible, do it without changing the
33 working directory. Otherwise, resort to using save_cwd/fchdir, then
34 (access|euidaccess)/restore_cwd. If either the save_cwd or the
35 restore_cwd fails, then give a diagnostic and exit nonzero.
36 Note that this implementation only supports AT_EACCESS, although some
37 native versions also support AT_SYMLINK_NOFOLLOW. */
38
39#define AT_FUNC_NAME faccessat
40#define AT_FUNC_F1 euidaccess
41#define AT_FUNC_F2 access
42#define AT_FUNC_USE_F1_COND AT_EACCESS
43#define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
44#define AT_FUNC_POST_FILE_ARGS , mode
45#include "at-func.c"
diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h
deleted file mode 100644
index 5fdac2313d0..00000000000
--- a/lib/fcntl.in.h
+++ /dev/null
@@ -1,347 +0,0 @@
1/* Like <fcntl.h>, but with non-working flags defined to 0.
2
3 Copyright (C) 2006-2012 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18/* written by Paul Eggert */
19
20#if __GNUC__ >= 3
21@PRAGMA_SYSTEM_HEADER@
22#endif
23@PRAGMA_COLUMNS@
24
25#if defined __need_system_fcntl_h
26/* Special invocation convention. */
27
28/* Needed before <sys/stat.h>.
29 May also define off_t to a 64-bit type on native Windows. */
30#include <sys/types.h>
31/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
32 <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
33 But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
34 extern "C" { ... } block, which leads to errors in C++ mode with the
35 overridden <sys/stat.h> from gnulib. These errors are known to be gone
36 with g++ version >= 4.3. */
37#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
38# include <sys/stat.h>
39#endif
40#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
41
42#else
43/* Normal invocation convention. */
44
45#ifndef _@GUARD_PREFIX@_FCNTL_H
46
47/* Needed before <sys/stat.h>.
48 May also define off_t to a 64-bit type on native Windows. */
49#include <sys/types.h>
50/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
51 <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
52 But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
53 extern "C" { ... } block, which leads to errors in C++ mode with the
54 overridden <sys/stat.h> from gnulib. These errors are known to be gone
55 with g++ version >= 4.3. */
56#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
57# include <sys/stat.h>
58#endif
59/* The include_next requires a split double-inclusion guard. */
60#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
61
62#ifndef _@GUARD_PREFIX@_FCNTL_H
63#define _@GUARD_PREFIX@_FCNTL_H
64
65#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
66# include <unistd.h>
67#endif
68
69/* Native Windows platforms declare open(), creat() in <io.h>. */
70#if (@GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
71 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
72# include <io.h>
73#endif
74
75
76/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
77
78/* The definition of _GL_ARG_NONNULL is copied here. */
79
80/* The definition of _GL_WARN_ON_USE is copied here. */
81
82
83/* Declare overridden functions. */
84
85#if @GNULIB_FCNTL@
86# if @REPLACE_FCNTL@
87# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
88# undef fcntl
89# define fcntl rpl_fcntl
90# endif
91_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
92_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
93# else
94# if !@HAVE_FCNTL@
95_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
96# endif
97_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
98# endif
99_GL_CXXALIASWARN (fcntl);
100#elif defined GNULIB_POSIXCHECK
101# undef fcntl
102# if HAVE_RAW_DECL_FCNTL
103_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
104 "use gnulib module fcntl for portability");
105# endif
106#endif
107
108#if @GNULIB_OPEN@
109# if @REPLACE_OPEN@
110# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
111# undef open
112# define open rpl_open
113# endif
114_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
115 _GL_ARG_NONNULL ((1)));
116_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
117# else
118_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
119# endif
120/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
121 default argument. _GL_CXXALIASWARN does not work in this case. */
122# if !defined __hpux
123_GL_CXXALIASWARN (open);
124# endif
125#elif defined GNULIB_POSIXCHECK
126# undef open
127/* Assume open is always declared. */
128_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
129 "use gnulib module open for portability");
130#endif
131
132#if @GNULIB_OPENAT@
133# if @REPLACE_OPENAT@
134# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
135# undef openat
136# define openat rpl_openat
137# endif
138_GL_FUNCDECL_RPL (openat, int,
139 (int fd, char const *file, int flags, /* mode_t mode */ ...)
140 _GL_ARG_NONNULL ((2)));
141_GL_CXXALIAS_RPL (openat, int,
142 (int fd, char const *file, int flags, /* mode_t mode */ ...));
143# else
144# if !@HAVE_OPENAT@
145_GL_FUNCDECL_SYS (openat, int,
146 (int fd, char const *file, int flags, /* mode_t mode */ ...)
147 _GL_ARG_NONNULL ((2)));
148# endif
149_GL_CXXALIAS_SYS (openat, int,
150 (int fd, char const *file, int flags, /* mode_t mode */ ...));
151# endif
152_GL_CXXALIASWARN (openat);
153#elif defined GNULIB_POSIXCHECK
154# undef openat
155# if HAVE_RAW_DECL_OPENAT
156_GL_WARN_ON_USE (openat, "openat is not portable - "
157 "use gnulib module openat for portability");
158# endif
159#endif
160
161
162/* Fix up the FD_* macros, only known to be missing on mingw. */
163
164#ifndef FD_CLOEXEC
165# define FD_CLOEXEC 1
166#endif
167
168/* Fix up the supported F_* macros. Intentionally leave other F_*
169 macros undefined. Only known to be missing on mingw. */
170
171#ifndef F_DUPFD_CLOEXEC
172# define F_DUPFD_CLOEXEC 0x40000000
173/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
174# define GNULIB_defined_F_DUPFD_CLOEXEC 1
175#else
176# define GNULIB_defined_F_DUPFD_CLOEXEC 0
177#endif
178
179#ifndef F_DUPFD
180# define F_DUPFD 1
181#endif
182
183#ifndef F_GETFD
184# define F_GETFD 2
185#endif
186
187/* Fix up the O_* macros. */
188
189#if !defined O_DIRECT && defined O_DIRECTIO
190/* Tru64 spells it 'O_DIRECTIO'. */
191# define O_DIRECT O_DIRECTIO
192#endif
193
194#if !defined O_CLOEXEC && defined O_NOINHERIT
195/* Mingw spells it 'O_NOINHERIT'. */
196# define O_CLOEXEC O_NOINHERIT
197#endif
198
199#ifndef O_CLOEXEC
200# define O_CLOEXEC 0
201#endif
202
203#ifndef O_DIRECT
204# define O_DIRECT 0
205#endif
206
207#ifndef O_DIRECTORY
208# define O_DIRECTORY 0
209#endif
210
211#ifndef O_DSYNC
212# define O_DSYNC 0
213#endif
214
215#ifndef O_EXEC
216# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
217#endif
218
219#ifndef O_IGNORE_CTTY
220# define O_IGNORE_CTTY 0
221#endif
222
223#ifndef O_NDELAY
224# define O_NDELAY 0
225#endif
226
227#ifndef O_NOATIME
228# define O_NOATIME 0
229#endif
230
231#ifndef O_NONBLOCK
232# define O_NONBLOCK O_NDELAY
233#endif
234
235/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
236 value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
237 or to 0 as fallback. */
238#if @GNULIB_NONBLOCKING@
239# if O_NONBLOCK
240# define GNULIB_defined_O_NONBLOCK 0
241# else
242# define GNULIB_defined_O_NONBLOCK 1
243# undef O_NONBLOCK
244# define O_NONBLOCK 0x40000000
245# endif
246#endif
247
248#ifndef O_NOCTTY
249# define O_NOCTTY 0
250#endif
251
252#ifndef O_NOFOLLOW
253# define O_NOFOLLOW 0
254#endif
255
256#ifndef O_NOLINK
257# define O_NOLINK 0
258#endif
259
260#ifndef O_NOLINKS
261# define O_NOLINKS 0
262#endif
263
264#ifndef O_NOTRANS
265# define O_NOTRANS 0
266#endif
267
268#ifndef O_RSYNC
269# define O_RSYNC 0
270#endif
271
272#ifndef O_SEARCH
273# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */
274#endif
275
276#ifndef O_SYNC
277# define O_SYNC 0
278#endif
279
280#ifndef O_TTY_INIT
281# define O_TTY_INIT 0
282#endif
283
284#if O_ACCMODE != (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
285# undef O_ACCMODE
286# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
287#endif
288
289/* For systems that distinguish between text and binary I/O.
290 O_BINARY is usually declared in fcntl.h */
291#if !defined O_BINARY && defined _O_BINARY
292 /* For MSC-compatible compilers. */
293# define O_BINARY _O_BINARY
294# define O_TEXT _O_TEXT
295#endif
296
297#if defined __BEOS__ || defined __HAIKU__
298 /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
299# undef O_BINARY
300# undef O_TEXT
301#endif
302
303#ifndef O_BINARY
304# define O_BINARY 0
305# define O_TEXT 0
306#endif
307
308/* Fix up the AT_* macros. */
309
310/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
311 value exceeds INT_MAX, so its use as an int doesn't conform to the
312 C standard, and GCC and Sun C complain in some cases. If the bug
313 is present, undef AT_FDCWD here, so it can be redefined below. */
314#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
315# undef AT_FDCWD
316#endif
317
318/* Use the same bit pattern as Solaris 9, but with the proper
319 signedness. The bit pattern is important, in case this actually is
320 Solaris with the above workaround. */
321#ifndef AT_FDCWD
322# define AT_FDCWD (-3041965)
323#endif
324
325/* Use the same values as Solaris 9. This shouldn't matter, but
326 there's no real reason to differ. */
327#ifndef AT_SYMLINK_NOFOLLOW
328# define AT_SYMLINK_NOFOLLOW 4096
329#endif
330
331#ifndef AT_REMOVEDIR
332# define AT_REMOVEDIR 1
333#endif
334
335/* Solaris 9 lacks these two, so just pick unique values. */
336#ifndef AT_SYMLINK_FOLLOW
337# define AT_SYMLINK_FOLLOW 2
338#endif
339
340#ifndef AT_EACCESS
341# define AT_EACCESS 4
342#endif
343
344
345#endif /* _@GUARD_PREFIX@_FCNTL_H */
346#endif /* _@GUARD_PREFIX@_FCNTL_H */
347#endif
diff --git a/lib/getgroups.c b/lib/getgroups.c
deleted file mode 100644
index f9d36236afe..00000000000
--- a/lib/getgroups.c
+++ /dev/null
@@ -1,116 +0,0 @@
1/* provide consistent interface to getgroups for systems that don't allow N==0
2
3 Copyright (C) 1996, 1999, 2003, 2006-2012 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18/* written by Jim Meyering */
19
20#include <config.h>
21
22#include <unistd.h>
23
24#include <errno.h>
25#include <stdlib.h>
26#include <stdint.h>
27
28#if !HAVE_GETGROUPS
29
30/* Provide a stub that fails with ENOSYS, since there is no group
31 information available on mingw. */
32int
33getgroups (int n _GL_UNUSED, GETGROUPS_T *groups _GL_UNUSED)
34{
35 errno = ENOSYS;
36 return -1;
37}
38
39#else /* HAVE_GETGROUPS */
40
41# undef getgroups
42# ifndef GETGROUPS_ZERO_BUG
43# define GETGROUPS_ZERO_BUG 0
44# endif
45
46/* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always
47 fails. On other systems, it returns the number of supplemental
48 groups for the process. This function handles that special case
49 and lets the system-provided function handle all others. However,
50 it can fail with ENOMEM if memory is tight. It is unspecified
51 whether the effective group id is included in the list. */
52
53int
54rpl_getgroups (int n, gid_t *group)
55{
56 int n_groups;
57 GETGROUPS_T *gbuf;
58 int saved_errno;
59
60 if (n < 0)
61 {
62 errno = EINVAL;
63 return -1;
64 }
65
66 if (n != 0 || !GETGROUPS_ZERO_BUG)
67 {
68 int result;
69 if (sizeof *group == sizeof *gbuf)
70 return getgroups (n, (GETGROUPS_T *) group);
71
72 if (SIZE_MAX / sizeof *gbuf <= n)
73 {
74 errno = ENOMEM;
75 return -1;
76 }
77 gbuf = malloc (n * sizeof *gbuf);
78 if (!gbuf)
79 return -1;
80 result = getgroups (n, gbuf);
81 if (0 <= result)
82 {
83 n = result;
84 while (n--)
85 group[n] = gbuf[n];
86 }
87 saved_errno = errno;
88 free (gbuf);
89 errno == saved_errno;
90 return result;
91 }
92
93 n = 20;
94 while (1)
95 {
96 /* No need to worry about address arithmetic overflow here,
97 since the ancient systems that we're running on have low
98 limits on the number of secondary groups. */
99 gbuf = malloc (n * sizeof *gbuf);
100 if (!gbuf)
101 return -1;
102 n_groups = getgroups (n, gbuf);
103 if (n_groups == -1 ? errno != EINVAL : n_groups < n)
104 break;
105 free (gbuf);
106 n *= 2;
107 }
108
109 saved_errno = errno;
110 free (gbuf);
111 errno = saved_errno;
112
113 return n_groups;
114}
115
116#endif /* HAVE_GETGROUPS */
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
index d2562a4dae1..23749331a83 100644
--- a/lib/gnulib.mk
+++ b/lib/gnulib.mk
@@ -21,7 +21,7 @@
21# the same distribution terms as the rest of that program. 21# the same distribution terms as the rest of that program.
22# 22#
23# Generated by gnulib-tool. 23# Generated by gnulib-tool.
24# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=at-internal --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=openat-die --avoid=openat-h --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat filemode getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings mktime pselect pthread_sigmask readlink socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub utimens warnings 24# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=errno --avoid=fcntl --avoid=fcntl-h --avoid=fstat --avoid=msvc-inval --avoid=msvc-nothrow --avoid=raise --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo filemode getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings mktime pselect pthread_sigmask readlink socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub utimens warnings
25 25
26 26
27MOSTLYCLEANFILES += core *.stackdump 27MOSTLYCLEANFILES += core *.stackdump
@@ -150,17 +150,6 @@ EXTRA_libgnu_a_SOURCES += dup2.c
150 150
151## end gnulib module dup2 151## end gnulib module dup2
152 152
153## begin gnulib module euidaccess
154
155if gl_GNULIB_ENABLED_euidaccess
156
157endif
158EXTRA_DIST += euidaccess.c
159
160EXTRA_libgnu_a_SOURCES += euidaccess.c
161
162## end gnulib module euidaccess
163
164## begin gnulib module execinfo 153## begin gnulib module execinfo
165 154
166BUILT_SOURCES += $(EXECINFO_H) 155BUILT_SOURCES += $(EXECINFO_H)
@@ -186,50 +175,6 @@ EXTRA_libgnu_a_SOURCES += execinfo.c
186 175
187## end gnulib module execinfo 176## end gnulib module execinfo
188 177
189## begin gnulib module faccessat
190
191
192EXTRA_DIST += at-func.c faccessat.c
193
194EXTRA_libgnu_a_SOURCES += at-func.c faccessat.c
195
196## end gnulib module faccessat
197
198## begin gnulib module fcntl-h
199
200BUILT_SOURCES += fcntl.h
201
202# We need the following in order to create <fcntl.h> when the system
203# doesn't have one that works with the given compiler.
204fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
205 $(AM_V_GEN)rm -f $@-t $@ && \
206 { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
207 sed -e 's|@''GUARD_PREFIX''@|GL|g' \
208 -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
209 -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
210 -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
211 -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
212 -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
213 -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
214 -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
215 -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
216 -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
217 -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
218 -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
219 -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
220 -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
221 -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
222 -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
223 -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
224 < $(srcdir)/fcntl.in.h; \
225 } > $@-t && \
226 mv $@-t $@
227MOSTLYCLEANFILES += fcntl.h fcntl.h-t
228
229EXTRA_DIST += fcntl.in.h
230
231## end gnulib module fcntl-h
232
233## begin gnulib module filemode 178## begin gnulib module filemode
234 179
235libgnu_a_SOURCES += filemode.c 180libgnu_a_SOURCES += filemode.c
@@ -238,17 +183,6 @@ EXTRA_DIST += filemode.h
238 183
239## end gnulib module filemode 184## end gnulib module filemode
240 185
241## begin gnulib module getgroups
242
243if gl_GNULIB_ENABLED_getgroups
244
245endif
246EXTRA_DIST += getgroups.c
247
248EXTRA_libgnu_a_SOURCES += getgroups.c
249
250## end gnulib module getgroups
251
252## begin gnulib module getloadavg 186## begin gnulib module getloadavg
253 187
254 188
@@ -308,17 +242,6 @@ EXTRA_libgnu_a_SOURCES += gettimeofday.c
308 242
309## end gnulib module gettimeofday 243## end gnulib module gettimeofday
310 244
311## begin gnulib module group-member
312
313if gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1
314
315endif
316EXTRA_DIST += group-member.c
317
318EXTRA_libgnu_a_SOURCES += group-member.c
319
320## end gnulib module group-member
321
322## begin gnulib module ignore-value 245## begin gnulib module ignore-value
323 246
324 247
@@ -431,15 +354,6 @@ EXTRA_libgnu_a_SOURCES += readlink.c
431 354
432## end gnulib module readlink 355## end gnulib module readlink
433 356
434## begin gnulib module root-uid
435
436if gl_GNULIB_ENABLED_6099e9737f757db36c47fa9d9f02e88c
437
438endif
439EXTRA_DIST += root-uid.h
440
441## end gnulib module root-uid
442
443## begin gnulib module signal-h 357## begin gnulib module signal-h
444 358
445BUILT_SOURCES += signal.h 359BUILT_SOURCES += signal.h
@@ -1398,15 +1312,6 @@ EXTRA_DIST += verify.h
1398 1312
1399## end gnulib module verify 1313## end gnulib module verify
1400 1314
1401## begin gnulib module xalloc-oversized
1402
1403if gl_GNULIB_ENABLED_682e609604ccaac6be382e4ee3a4eaec
1404
1405endif
1406EXTRA_DIST += xalloc-oversized.h
1407
1408## end gnulib module xalloc-oversized
1409
1410 1315
1411mostlyclean-local: mostlyclean-generic 1316mostlyclean-local: mostlyclean-generic
1412 @for dir in '' $(MOSTLYCLEANDIRS); do \ 1317 @for dir in '' $(MOSTLYCLEANDIRS); do \
diff --git a/lib/group-member.c b/lib/group-member.c
deleted file mode 100644
index 5fcc7e01d0c..00000000000
--- a/lib/group-member.c
+++ /dev/null
@@ -1,119 +0,0 @@
1/* group-member.c -- determine whether group id is in calling user's group list
2
3 Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2012 Free Software
4 Foundation, Inc.
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19#include <config.h>
20
21/* Specification. */
22#include <unistd.h>
23
24#include <stdio.h>
25#include <sys/types.h>
26#include <stdlib.h>
27
28#include "xalloc-oversized.h"
29
30/* Most processes have no more than this many groups, and for these
31 processes we can avoid using malloc. */
32enum { GROUPBUF_SIZE = 100 };
33
34struct group_info
35 {
36 gid_t *group;
37 gid_t groupbuf[GROUPBUF_SIZE];
38 };
39
40static void
41free_group_info (struct group_info const *g)
42{
43 if (g->group != g->groupbuf)
44 free (g->group);
45}
46
47static int
48get_group_info (struct group_info *gi)
49{
50 int n_groups = getgroups (GROUPBUF_SIZE, gi->groupbuf);
51 gi->group = gi->groupbuf;
52
53 if (n_groups < 0)
54 {
55 int n_group_slots = getgroups (0, NULL);
56 if (0 <= n_group_slots
57 && ! xalloc_oversized (n_group_slots, sizeof *gi->group))
58 {
59 gi->group = malloc (n_group_slots * sizeof *gi->group);
60 if (gi->group)
61 n_groups = getgroups (n_group_slots, gi->group);
62 }
63 }
64
65 /* In case of error, the user loses. */
66 return n_groups;
67}
68
69/* Return non-zero if GID is one that we have in our groups list.
70 Note that the groups list is not guaranteed to contain the current
71 or effective group ID, so they should generally be checked
72 separately. */
73
74int
75group_member (gid_t gid)
76{
77 int i;
78 int found;
79 struct group_info gi;
80 int n_groups = get_group_info (&gi);
81
82 /* Search through the list looking for GID. */
83 found = 0;
84 for (i = 0; i < n_groups; i++)
85 {
86 if (gid == gi.group[i])
87 {
88 found = 1;
89 break;
90 }
91 }
92
93 free_group_info (&gi);
94
95 return found;
96}
97
98#ifdef TEST
99
100char *program_name;
101
102int
103main (int argc, char **argv)
104{
105 int i;
106
107 program_name = argv[0];
108
109 for (i = 1; i < argc; i++)
110 {
111 gid_t gid;
112
113 gid = atoi (argv[i]);
114 printf ("%d: %s\n", gid, group_member (gid) ? "yes" : "no");
115 }
116 exit (0);
117}
118
119#endif /* TEST */
diff --git a/lib/root-uid.h b/lib/root-uid.h
deleted file mode 100644
index 2379773c291..00000000000
--- a/lib/root-uid.h
+++ /dev/null
@@ -1,30 +0,0 @@
1/* The user ID that always has appropriate privileges in the POSIX sense.
2
3 Copyright 2012 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 Written by Paul Eggert. */
19
20#ifndef ROOT_UID_H_
21#define ROOT_UID_H_
22
23/* The user ID that always has appropriate privileges in the POSIX sense. */
24#ifdef __TANDEM
25# define ROOT_UID 65535
26#else
27# define ROOT_UID 0
28#endif
29
30#endif
diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h
deleted file mode 100644
index ad777d8dd79..00000000000
--- a/lib/xalloc-oversized.h
+++ /dev/null
@@ -1,38 +0,0 @@
1/* xalloc-oversized.h -- memory allocation size checking
2
3 Copyright (C) 1990-2000, 2003-2004, 2006-2012 Free Software Foundation, Inc.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18#ifndef XALLOC_OVERSIZED_H_
19# define XALLOC_OVERSIZED_H_
20
21# include <stddef.h>
22
23/* Return 1 if an array of N objects, each of size S, cannot exist due
24 to size arithmetic overflow. S must be positive and N must be
25 nonnegative. This is a macro, not a function, so that it
26 works correctly even when SIZE_MAX < N.
27
28 By gnulib convention, SIZE_MAX represents overflow in size
29 calculations, so the conservative dividend to use here is
30 SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
31 However, malloc (SIZE_MAX) fails on all known hosts where
32 sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
33 exactly-SIZE_MAX allocations on such hosts; this avoids a test and
34 branch when S is known to be 1. */
35# define xalloc_oversized(n, s) \
36 ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
37
38#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/m4/euidaccess.m4 b/m4/euidaccess.m4
deleted file mode 100644
index 2de95b88ba8..00000000000
--- a/m4/euidaccess.m4
+++ /dev/null
@@ -1,52 +0,0 @@
1# euidaccess.m4 serial 15
2dnl Copyright (C) 2002-2012 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7AC_DEFUN([gl_FUNC_NONREENTRANT_EUIDACCESS],
8[
9 AC_REQUIRE([gl_FUNC_EUIDACCESS])
10 AC_CHECK_DECLS([setregid])
11 AC_DEFINE([PREFER_NONREENTRANT_EUIDACCESS], [1],
12 [Define this if you prefer euidaccess to return the correct result
13 even if this would make it nonreentrant. Define this only if your
14 entire application is safe even if the uid or gid might temporarily
15 change. If your application uses signal handlers or threads it
16 is probably not safe.])
17])
18
19AC_DEFUN([gl_FUNC_EUIDACCESS],
20[
21 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
22
23 dnl Persuade glibc <unistd.h> to declare euidaccess().
24 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
25
26 AC_CHECK_FUNCS([euidaccess])
27 if test $ac_cv_func_euidaccess = no; then
28 HAVE_EUIDACCESS=0
29 fi
30])
31
32# Prerequisites of lib/euidaccess.c.
33AC_DEFUN([gl_PREREQ_EUIDACCESS], [
34 dnl Prefer POSIX faccessat over non-standard euidaccess.
35 AC_CHECK_FUNCS_ONCE([faccessat])
36 dnl Try various other non-standard fallbacks.
37 AC_CHECK_HEADERS([libgen.h])
38 AC_FUNC_GETGROUPS
39
40 # Solaris 9 and 10 need -lgen to get the eaccess function.
41 # Save and restore LIBS so -lgen isn't added to it. Otherwise, *all*
42 # programs in the package would end up linked with that potentially-shared
43 # library, inducing unnecessary run-time overhead.
44 LIB_EACCESS=
45 AC_SUBST([LIB_EACCESS])
46 gl_saved_libs=$LIBS
47 AC_SEARCH_LIBS([eaccess], [gen],
48 [test "$ac_cv_search_eaccess" = "none required" ||
49 LIB_EACCESS=$ac_cv_search_eaccess])
50 AC_CHECK_FUNCS([eaccess])
51 LIBS=$gl_saved_libs
52])
diff --git a/m4/faccessat.m4 b/m4/faccessat.m4
deleted file mode 100644
index 82f3b1f8dde..00000000000
--- a/m4/faccessat.m4
+++ /dev/null
@@ -1,28 +0,0 @@
1# serial 6
2# See if we need to provide faccessat replacement.
3
4dnl Copyright (C) 2009-2012 Free Software Foundation, Inc.
5dnl This file is free software; the Free Software Foundation
6dnl gives unlimited permission to copy and/or distribute it,
7dnl with or without modifications, as long as this notice is preserved.
8
9# Written by Eric Blake.
10
11AC_DEFUN([gl_FUNC_FACCESSAT],
12[
13 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
14
15 dnl Persuade glibc <unistd.h> to declare faccessat().
16 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
17
18 AC_CHECK_FUNCS_ONCE([faccessat])
19 if test $ac_cv_func_faccessat = no; then
20 HAVE_FACCESSAT=0
21 fi
22])
23
24# Prerequisites of lib/faccessat.m4.
25AC_DEFUN([gl_PREREQ_FACCESSAT],
26[
27 AC_CHECK_FUNCS([access])
28])
diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4
deleted file mode 100644
index cac28aeb283..00000000000
--- a/m4/fcntl_h.m4
+++ /dev/null
@@ -1,50 +0,0 @@
1# serial 15
2# Configure fcntl.h.
3dnl Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8dnl Written by Paul Eggert.
9
10AC_DEFUN([gl_FCNTL_H],
11[
12 AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
13 AC_REQUIRE([gl_FCNTL_O_FLAGS])
14 gl_NEXT_HEADERS([fcntl.h])
15
16 dnl Ensure the type pid_t gets defined.
17 AC_REQUIRE([AC_TYPE_PID_T])
18
19 dnl Ensure the type mode_t gets defined.
20 AC_REQUIRE([AC_TYPE_MODE_T])
21
22 dnl Check for declarations of anything we want to poison if the
23 dnl corresponding gnulib module is not in use, if it is not common
24 dnl enough to be declared everywhere.
25 gl_WARN_ON_USE_PREPARE([[#include <fcntl.h>
26 ]], [fcntl openat])
27])
28
29AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
30[
31 dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
32 AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
33 gl_MODULE_INDICATOR_SET_VARIABLE([$1])
34 dnl Define it also as a C macro, for the benefit of the unit tests.
35 gl_MODULE_INDICATOR_FOR_TESTS([$1])
36])
37
38AC_DEFUN([gl_FCNTL_H_DEFAULTS],
39[
40 GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL])
41 GNULIB_NONBLOCKING=0; AC_SUBST([GNULIB_NONBLOCKING])
42 GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN])
43 GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT])
44 dnl Assume proper GNU behavior unless another module says otherwise.
45 HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL])
46 HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT])
47 REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL])
48 REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN])
49 REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT])
50])
diff --git a/m4/getgroups.m4 b/m4/getgroups.m4
deleted file mode 100644
index 17473af486b..00000000000
--- a/m4/getgroups.m4
+++ /dev/null
@@ -1,107 +0,0 @@
1# serial 18
2
3dnl From Jim Meyering.
4dnl A wrapper around AC_FUNC_GETGROUPS.
5
6# Copyright (C) 1996-1997, 1999-2004, 2008-2012 Free Software Foundation, Inc.
7#
8# This file is free software; the Free Software Foundation
9# gives unlimited permission to copy and/or distribute it,
10# with or without modifications, as long as this notice is preserved.
11
12m4_version_prereq([2.70], [] ,[
13
14# This is taken from the following Autoconf patch:
15# http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9
16AC_DEFUN([AC_FUNC_GETGROUPS],
17[
18 AC_REQUIRE([AC_TYPE_GETGROUPS])dnl
19 AC_REQUIRE([AC_TYPE_SIZE_T])dnl
20 AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
21 AC_CHECK_FUNC([getgroups])
22
23 # If we don't yet have getgroups, see if it's in -lbsd.
24 # This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1.
25 ac_save_LIBS=$LIBS
26 if test $ac_cv_func_getgroups = no; then
27 AC_CHECK_LIB(bsd, getgroups, [GETGROUPS_LIB=-lbsd])
28 fi
29
30 # Run the program to test the functionality of the system-supplied
31 # getgroups function only if there is such a function.
32 if test $ac_cv_func_getgroups = yes; then
33 AC_CACHE_CHECK([for working getgroups], [ac_cv_func_getgroups_works],
34 [AC_RUN_IFELSE(
35 [AC_LANG_PROGRAM(
36 [AC_INCLUDES_DEFAULT],
37 [[/* On Ultrix 4.3, getgroups (0, 0) always fails. */
38 return getgroups (0, 0) == -1;]])
39 ],
40 [ac_cv_func_getgroups_works=yes],
41 [ac_cv_func_getgroups_works=no],
42 [case "$host_os" in # ((
43 # Guess yes on glibc systems.
44 *-gnu*) ac_cv_func_getgroups_works="guessing yes" ;;
45 # If we don't know, assume the worst.
46 *) ac_cv_func_getgroups_works="guessing no" ;;
47 esac
48 ])
49 ])
50 else
51 ac_cv_func_getgroups_works=no
52 fi
53 case "$ac_cv_func_getgroups_works" in
54 *yes)
55 AC_DEFINE([HAVE_GETGROUPS], [1],
56 [Define to 1 if your system has a working `getgroups' function.])
57 ;;
58 esac
59 LIBS=$ac_save_LIBS
60])# AC_FUNC_GETGROUPS
61
62])
63
64AC_DEFUN([gl_FUNC_GETGROUPS],
65[
66 AC_REQUIRE([AC_TYPE_GETGROUPS])
67 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
68 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
69
70 AC_FUNC_GETGROUPS
71 if test $ac_cv_func_getgroups != yes; then
72 HAVE_GETGROUPS=0
73 else
74 if test "$ac_cv_type_getgroups" != gid_t \
75 || { case "$ac_cv_func_getgroups_works" in
76 *yes) false;;
77 *) true;;
78 esac
79 }; then
80 REPLACE_GETGROUPS=1
81 AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if
82 getgroups(0,NULL) does not return the number of groups.])
83 else
84 dnl Detect FreeBSD bug; POSIX requires getgroups(-1,ptr) to fail.
85 AC_CACHE_CHECK([whether getgroups handles negative values],
86 [gl_cv_func_getgroups_works],
87 [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
88 [[int size = getgroups (0, 0);
89 gid_t *list = malloc (size * sizeof *list);
90 return getgroups (-1, list) != -1;]])],
91 [gl_cv_func_getgroups_works=yes],
92 [gl_cv_func_getgroups_works=no],
93 [case "$host_os" in
94 # Guess yes on glibc systems.
95 *-gnu*) gl_cv_func_getgroups_works="guessing yes" ;;
96 # If we don't know, assume the worst.
97 *) gl_cv_func_getgroups_works="guessing no" ;;
98 esac
99 ])])
100 case "$gl_cv_func_getgroups_works" in
101 *yes) ;;
102 *) REPLACE_GETGROUPS=1 ;;
103 esac
104 fi
105 fi
106 test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS"
107])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index 9b2dcee1cfa..de2355d87c3 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -53,22 +53,17 @@ AC_DEFUN([gl_EARLY],
53 # Code from module dtotimespec: 53 # Code from module dtotimespec:
54 # Code from module dup2: 54 # Code from module dup2:
55 # Code from module environ: 55 # Code from module environ:
56 # Code from module euidaccess:
57 # Code from module execinfo: 56 # Code from module execinfo:
58 # Code from module extensions: 57 # Code from module extensions:
59 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) 58 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
60 # Code from module extern-inline: 59 # Code from module extern-inline:
61 # Code from module faccessat:
62 # Code from module fcntl-h:
63 # Code from module filemode: 60 # Code from module filemode:
64 # Code from module getgroups:
65 # Code from module getloadavg: 61 # Code from module getloadavg:
66 # Code from module getopt-gnu: 62 # Code from module getopt-gnu:
67 # Code from module getopt-posix: 63 # Code from module getopt-posix:
68 # Code from module gettext-h: 64 # Code from module gettext-h:
69 # Code from module gettime: 65 # Code from module gettime:
70 # Code from module gettimeofday: 66 # Code from module gettimeofday:
71 # Code from module group-member:
72 # Code from module ignore-value: 67 # Code from module ignore-value:
73 # Code from module include_next: 68 # Code from module include_next:
74 # Code from module intprops: 69 # Code from module intprops:
@@ -84,7 +79,6 @@ AC_DEFUN([gl_EARLY],
84 # Code from module pselect: 79 # Code from module pselect:
85 # Code from module pthread_sigmask: 80 # Code from module pthread_sigmask:
86 # Code from module readlink: 81 # Code from module readlink:
87 # Code from module root-uid:
88 # Code from module signal-h: 82 # Code from module signal-h:
89 # Code from module snippet/_Noreturn: 83 # Code from module snippet/_Noreturn:
90 # Code from module snippet/arg-nonnull: 84 # Code from module snippet/arg-nonnull:
@@ -126,7 +120,6 @@ AC_DEFUN([gl_EARLY],
126 # Code from module utimens: 120 # Code from module utimens:
127 # Code from module verify: 121 # Code from module verify:
128 # Code from module warnings: 122 # Code from module warnings:
129 # Code from module xalloc-oversized:
130]) 123])
131 124
132# This macro should be invoked from ./configure.ac, in the section 125# This macro should be invoked from ./configure.ac, in the section
@@ -163,14 +156,6 @@ AC_DEFUN([gl_INIT],
163 gl_UNISTD_MODULE_INDICATOR([environ]) 156 gl_UNISTD_MODULE_INDICATOR([environ])
164 gl_EXECINFO_H 157 gl_EXECINFO_H
165 AC_REQUIRE([gl_EXTERN_INLINE]) 158 AC_REQUIRE([gl_EXTERN_INLINE])
166 gl_FUNC_FACCESSAT
167 if test $HAVE_FACCESSAT = 0; then
168 AC_LIBOBJ([faccessat])
169 gl_PREREQ_FACCESSAT
170 fi
171 gl_MODULE_INDICATOR([faccessat])
172 gl_UNISTD_MODULE_INDICATOR([faccessat])
173 gl_FCNTL_H
174 gl_FILEMODE 159 gl_FILEMODE
175 gl_GETLOADAVG 160 gl_GETLOADAVG
176 if test $HAVE_GETLOADAVG = 0; then 161 if test $HAVE_GETLOADAVG = 0; then
@@ -284,53 +269,18 @@ AC_DEFUN([gl_INIT],
284 gl_UNISTD_H 269 gl_UNISTD_H
285 gl_UTIMENS 270 gl_UTIMENS
286 gl_gnulib_enabled_dosname=false 271 gl_gnulib_enabled_dosname=false
287 gl_gnulib_enabled_euidaccess=false
288 gl_gnulib_enabled_getgroups=false
289 gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=false 272 gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=false
290 gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1=false
291 gl_gnulib_enabled_pathmax=false 273 gl_gnulib_enabled_pathmax=false
292 gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c=false
293 gl_gnulib_enabled_stat=false 274 gl_gnulib_enabled_stat=false
294 gl_gnulib_enabled_strtoll=false 275 gl_gnulib_enabled_strtoll=false
295 gl_gnulib_enabled_strtoull=false 276 gl_gnulib_enabled_strtoull=false
296 gl_gnulib_enabled_verify=false 277 gl_gnulib_enabled_verify=false
297 gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec=false
298 func_gl_gnulib_m4code_dosname () 278 func_gl_gnulib_m4code_dosname ()
299 { 279 {
300 if ! $gl_gnulib_enabled_dosname; then 280 if ! $gl_gnulib_enabled_dosname; then
301 gl_gnulib_enabled_dosname=true 281 gl_gnulib_enabled_dosname=true
302 fi 282 fi
303 } 283 }
304 func_gl_gnulib_m4code_euidaccess ()
305 {
306 if ! $gl_gnulib_enabled_euidaccess; then
307 gl_FUNC_EUIDACCESS
308 if test $HAVE_EUIDACCESS = 0; then
309 AC_LIBOBJ([euidaccess])
310 gl_PREREQ_EUIDACCESS
311 fi
312 gl_UNISTD_MODULE_INDICATOR([euidaccess])
313 gl_gnulib_enabled_euidaccess=true
314 if test $HAVE_EUIDACCESS = 0; then
315 func_gl_gnulib_m4code_a9786850e999ae65a836a6041e8e5ed1
316 fi
317 func_gl_gnulib_m4code_6099e9737f757db36c47fa9d9f02e88c
318 if test $HAVE_EUIDACCESS = 0; then
319 func_gl_gnulib_m4code_stat
320 fi
321 fi
322 }
323 func_gl_gnulib_m4code_getgroups ()
324 {
325 if ! $gl_gnulib_enabled_getgroups; then
326 gl_FUNC_GETGROUPS
327 if test $HAVE_GETGROUPS = 0 || test $REPLACE_GETGROUPS = 1; then
328 AC_LIBOBJ([getgroups])
329 fi
330 gl_UNISTD_MODULE_INDICATOR([getgroups])
331 gl_gnulib_enabled_getgroups=true
332 fi
333 }
334 func_gl_gnulib_m4code_be453cec5eecf5731a274f2de7f2db36 () 284 func_gl_gnulib_m4code_be453cec5eecf5731a274f2de7f2db36 ()
335 { 285 {
336 if ! $gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36; then 286 if ! $gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36; then
@@ -339,24 +289,6 @@ AC_DEFUN([gl_INIT],
339 gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=true 289 gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=true
340 fi 290 fi
341 } 291 }
342 func_gl_gnulib_m4code_a9786850e999ae65a836a6041e8e5ed1 ()
343 {
344 if ! $gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1; then
345 gl_FUNC_GROUP_MEMBER
346 if test $HAVE_GROUP_MEMBER = 0; then
347 AC_LIBOBJ([group-member])
348 gl_PREREQ_GROUP_MEMBER
349 fi
350 gl_UNISTD_MODULE_INDICATOR([group-member])
351 gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1=true
352 if test $HAVE_GROUP_MEMBER = 0; then
353 func_gl_gnulib_m4code_getgroups
354 fi
355 if test $HAVE_GROUP_MEMBER = 0; then
356 func_gl_gnulib_m4code_682e609604ccaac6be382e4ee3a4eaec
357 fi
358 fi
359 }
360 func_gl_gnulib_m4code_pathmax () 292 func_gl_gnulib_m4code_pathmax ()
361 { 293 {
362 if ! $gl_gnulib_enabled_pathmax; then 294 if ! $gl_gnulib_enabled_pathmax; then
@@ -364,12 +296,6 @@ AC_DEFUN([gl_INIT],
364 gl_gnulib_enabled_pathmax=true 296 gl_gnulib_enabled_pathmax=true
365 fi 297 fi
366 } 298 }
367 func_gl_gnulib_m4code_6099e9737f757db36c47fa9d9f02e88c ()
368 {
369 if ! $gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c; then
370 gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c=true
371 fi
372 }
373 func_gl_gnulib_m4code_stat () 299 func_gl_gnulib_m4code_stat ()
374 { 300 {
375 if ! $gl_gnulib_enabled_stat; then 301 if ! $gl_gnulib_enabled_stat; then
@@ -421,18 +347,6 @@ AC_DEFUN([gl_INIT],
421 gl_gnulib_enabled_verify=true 347 gl_gnulib_enabled_verify=true
422 fi 348 fi
423 } 349 }
424 func_gl_gnulib_m4code_682e609604ccaac6be382e4ee3a4eaec ()
425 {
426 if ! $gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec; then
427 gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec=true
428 fi
429 }
430 if test $HAVE_FACCESSAT = 0; then
431 func_gl_gnulib_m4code_dosname
432 fi
433 if test $HAVE_FACCESSAT = 0; then
434 func_gl_gnulib_m4code_euidaccess
435 fi
436 if test $REPLACE_GETOPT = 1; then 350 if test $REPLACE_GETOPT = 1; then
437 func_gl_gnulib_m4code_be453cec5eecf5731a274f2de7f2db36 351 func_gl_gnulib_m4code_be453cec5eecf5731a274f2de7f2db36
438 fi 352 fi
@@ -459,17 +373,12 @@ AC_DEFUN([gl_INIT],
459 fi 373 fi
460 m4_pattern_allow([^gl_GNULIB_ENABLED_]) 374 m4_pattern_allow([^gl_GNULIB_ENABLED_])
461 AM_CONDITIONAL([gl_GNULIB_ENABLED_dosname], [$gl_gnulib_enabled_dosname]) 375 AM_CONDITIONAL([gl_GNULIB_ENABLED_dosname], [$gl_gnulib_enabled_dosname])
462 AM_CONDITIONAL([gl_GNULIB_ENABLED_euidaccess], [$gl_gnulib_enabled_euidaccess])
463 AM_CONDITIONAL([gl_GNULIB_ENABLED_getgroups], [$gl_gnulib_enabled_getgroups])
464 AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36]) 376 AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36])
465 AM_CONDITIONAL([gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1], [$gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1])
466 AM_CONDITIONAL([gl_GNULIB_ENABLED_pathmax], [$gl_gnulib_enabled_pathmax]) 377 AM_CONDITIONAL([gl_GNULIB_ENABLED_pathmax], [$gl_gnulib_enabled_pathmax])
467 AM_CONDITIONAL([gl_GNULIB_ENABLED_6099e9737f757db36c47fa9d9f02e88c], [$gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c])
468 AM_CONDITIONAL([gl_GNULIB_ENABLED_stat], [$gl_gnulib_enabled_stat]) 378 AM_CONDITIONAL([gl_GNULIB_ENABLED_stat], [$gl_gnulib_enabled_stat])
469 AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoll], [$gl_gnulib_enabled_strtoll]) 379 AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoll], [$gl_gnulib_enabled_strtoll])
470 AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoull], [$gl_gnulib_enabled_strtoull]) 380 AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoull], [$gl_gnulib_enabled_strtoull])
471 AM_CONDITIONAL([gl_GNULIB_ENABLED_verify], [$gl_gnulib_enabled_verify]) 381 AM_CONDITIONAL([gl_GNULIB_ENABLED_verify], [$gl_gnulib_enabled_verify])
472 AM_CONDITIONAL([gl_GNULIB_ENABLED_682e609604ccaac6be382e4ee3a4eaec], [$gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec])
473 # End of code from modules 382 # End of code from modules
474 m4_ifval(gl_LIBSOURCES_LIST, [ 383 m4_ifval(gl_LIBSOURCES_LIST, [
475 m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || 384 m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
@@ -618,7 +527,6 @@ AC_DEFUN([gl_FILE_LIST], [
618 lib/alloca.in.h 527 lib/alloca.in.h
619 lib/allocator.c 528 lib/allocator.c
620 lib/allocator.h 529 lib/allocator.h
621 lib/at-func.c
622 lib/c-ctype.c 530 lib/c-ctype.c
623 lib/c-ctype.h 531 lib/c-ctype.h
624 lib/c-strcase.h 532 lib/c-strcase.h
@@ -630,16 +538,12 @@ AC_DEFUN([gl_FILE_LIST], [
630 lib/dtoastr.c 538 lib/dtoastr.c
631 lib/dtotimespec.c 539 lib/dtotimespec.c
632 lib/dup2.c 540 lib/dup2.c
633 lib/euidaccess.c
634 lib/execinfo.c 541 lib/execinfo.c
635 lib/execinfo.in.h 542 lib/execinfo.in.h
636 lib/faccessat.c
637 lib/fcntl.in.h
638 lib/filemode.c 543 lib/filemode.c
639 lib/filemode.h 544 lib/filemode.h
640 lib/ftoastr.c 545 lib/ftoastr.c
641 lib/ftoastr.h 546 lib/ftoastr.h
642 lib/getgroups.c
643 lib/getloadavg.c 547 lib/getloadavg.c
644 lib/getopt.c 548 lib/getopt.c
645 lib/getopt.in.h 549 lib/getopt.in.h
@@ -648,7 +552,6 @@ AC_DEFUN([gl_FILE_LIST], [
648 lib/gettext.h 552 lib/gettext.h
649 lib/gettime.c 553 lib/gettime.c
650 lib/gettimeofday.c 554 lib/gettimeofday.c
651 lib/group-member.c
652 lib/ignore-value.h 555 lib/ignore-value.h
653 lib/intprops.h 556 lib/intprops.h
654 lib/inttypes.in.h 557 lib/inttypes.in.h
@@ -661,7 +564,6 @@ AC_DEFUN([gl_FILE_LIST], [
661 lib/pselect.c 564 lib/pselect.c
662 lib/pthread_sigmask.c 565 lib/pthread_sigmask.c
663 lib/readlink.c 566 lib/readlink.c
664 lib/root-uid.h
665 lib/sha1.c 567 lib/sha1.c
666 lib/sha1.h 568 lib/sha1.h
667 lib/sha256.c 569 lib/sha256.c
@@ -703,28 +605,21 @@ AC_DEFUN([gl_FILE_LIST], [
703 lib/utimens.c 605 lib/utimens.c
704 lib/utimens.h 606 lib/utimens.h
705 lib/verify.h 607 lib/verify.h
706 lib/xalloc-oversized.h
707 m4/00gnulib.m4 608 m4/00gnulib.m4
708 m4/alloca.m4 609 m4/alloca.m4
709 m4/c-strtod.m4 610 m4/c-strtod.m4
710 m4/clock_time.m4 611 m4/clock_time.m4
711 m4/dup2.m4 612 m4/dup2.m4
712 m4/environ.m4 613 m4/environ.m4
713 m4/euidaccess.m4
714 m4/execinfo.m4 614 m4/execinfo.m4
715 m4/extensions.m4 615 m4/extensions.m4
716 m4/extern-inline.m4 616 m4/extern-inline.m4
717 m4/faccessat.m4
718 m4/fcntl-o.m4
719 m4/fcntl_h.m4
720 m4/filemode.m4 617 m4/filemode.m4
721 m4/getgroups.m4
722 m4/getloadavg.m4 618 m4/getloadavg.m4
723 m4/getopt.m4 619 m4/getopt.m4
724 m4/gettime.m4 620 m4/gettime.m4
725 m4/gettimeofday.m4 621 m4/gettimeofday.m4
726 m4/gnulib-common.m4 622 m4/gnulib-common.m4
727 m4/group-member.m4
728 m4/include_next.m4 623 m4/include_next.m4
729 m4/inttypes.m4 624 m4/inttypes.m4
730 m4/largefile.m4 625 m4/largefile.m4
diff --git a/m4/group-member.m4 b/m4/group-member.m4
deleted file mode 100644
index c393b5b1303..00000000000
--- a/m4/group-member.m4
+++ /dev/null
@@ -1,29 +0,0 @@
1# serial 14
2
3# Copyright (C) 1999-2001, 2003-2007, 2009-2012 Free Software Foundation, Inc.
4
5# This file is free software; the Free Software Foundation
6# gives unlimited permission to copy and/or distribute it,
7# with or without modifications, as long as this notice is preserved.
8
9dnl Written by Jim Meyering
10
11AC_DEFUN([gl_FUNC_GROUP_MEMBER],
12[
13 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
14
15 dnl Persuade glibc <unistd.h> to declare group_member().
16 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
17
18 dnl Do this replacement check manually because I want the hyphen
19 dnl (not the underscore) in the filename.
20 AC_CHECK_FUNC([group_member], , [
21 HAVE_GROUP_MEMBER=0
22 ])
23])
24
25# Prerequisites of lib/group-member.c.
26AC_DEFUN([gl_PREREQ_GROUP_MEMBER],
27[
28 AC_REQUIRE([AC_FUNC_GETGROUPS])
29])
diff --git a/nt/ChangeLog b/nt/ChangeLog
index f64cafe2e16..94d2ce18551 100644
--- a/nt/ChangeLog
+++ b/nt/ChangeLog
@@ -1,10 +1,3 @@
12012-10-19 Paul Eggert <eggert@cs.ucla.edu>
2
3 Use faccessat, not access, when checking file permissions (Bug#12632).
4 * inc/ms-w32.h (AT_FDCWD, AT_EACCESS): New symbols.
5 (access): Remove.
6 (faccessat): New macro.
7
82012-10-17 Eli Zaretskii <eliz@gnu.org> 12012-10-17 Eli Zaretskii <eliz@gnu.org>
9 2
10 * inc/pwd.h (getuid, geteuid): Add prototypes. 3 * inc/pwd.h (getuid, geteuid): Add prototypes.
diff --git a/nt/inc/ms-w32.h b/nt/inc/ms-w32.h
index 0f6b51d3915..dd2ae781cb8 100644
--- a/nt/inc/ms-w32.h
+++ b/nt/inc/ms-w32.h
@@ -124,10 +124,6 @@ extern char *getenv ();
124#define MAXPATHLEN _MAX_PATH 124#define MAXPATHLEN _MAX_PATH
125#endif 125#endif
126 126
127/* Use values compatible with gnulib, as there's no reason to differ. */
128#define AT_FDCWD (-3041965)
129#define AT_EACCESS 4
130
131#ifdef HAVE_NTGUI 127#ifdef HAVE_NTGUI
132#define HAVE_WINDOW_SYSTEM 1 128#define HAVE_WINDOW_SYSTEM 1
133#define HAVE_MENUS 1 129#define HAVE_MENUS 1
@@ -149,6 +145,8 @@ extern char *getenv ();
149#endif 145#endif
150 146
151/* Calls that are emulated or shadowed. */ 147/* Calls that are emulated or shadowed. */
148#undef access
149#define access sys_access
152#undef chdir 150#undef chdir
153#define chdir sys_chdir 151#define chdir sys_chdir
154#undef chmod 152#undef chmod
@@ -163,7 +161,6 @@ extern char *getenv ();
163#define dup sys_dup 161#define dup sys_dup
164#undef dup2 162#undef dup2
165#define dup2 sys_dup2 163#define dup2 sys_dup2
166#define faccessat sys_faccessat
167#define fopen sys_fopen 164#define fopen sys_fopen
168#define link sys_link 165#define link sys_link
169#define localtime sys_localtime 166#define localtime sys_localtime
diff --git a/src/ChangeLog b/src/ChangeLog
index ee18650e992..5a1b4a5d8ee 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,32 +1,3 @@
12012-10-19 Paul Eggert <eggert@cs.ucla.edu>
2
3 Use faccessat, not access, when checking file permissions (Bug#12632).
4 * Makefile.in (LIB_EACCESS): New macro.
5 (LIBES): Use it.
6 * callproc.c (init_callproc):
7 * charset.c (init_charset):
8 * fileio.c (check_existing, check_executable):
9 * lread.c (openp, load_path_check):
10 * process.c (allocate_pty):
11 * xrdb.c (file_p):
12 Use faccessat, not access or euidaccess. Use symbolic names
13 instead of integers for the flags, as they're portable now.
14 * charset.c, xrdb.c: Include <fcntl.h>, for the new flags used.
15 * fileio.c (Ffile_readable_p):
16 Use faccessat, not stat + open + close.
17 (file_directory_p): New function, which uses 'stat' on most places
18 but 'access' (for efficiency) if WINDOWSNT.
19 * fileio.c (Ffile_directory_p, Fset_file_times):
20 * xrdb.c (file_p): Use file_directory_p.
21 * lisp.h (file_directory_p): New decl.
22 * lread.c (openp): When opening a file, use fstat rather than
23 stat, as that avoids a permissions race. When not opening a file,
24 use file_directory_p rather than stat.
25 * process.c, sysdep.c, term.c: All uses of '#ifdef O_NONBLOCK'
26 changed to '#if O_NONBLOCK', to accommodate gnulib O_* style.
27 * w32.c (sys_faccessat): Rename from sys_access and switch to
28 faccessat's API. All uses changed.
29
302012-10-19 Kazuhiro Ito <kzhr@d1.dion.ne.jp> (tiny change) 12012-10-19 Kazuhiro Ito <kzhr@d1.dion.ne.jp> (tiny change)
31 2
32 * font.c (Ffont_at): Fix previous change. 3 * font.c (Ffont_at): Fix previous change.
diff --git a/src/Makefile.in b/src/Makefile.in
index d034ad04796..c24e421bbbc 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -150,7 +150,6 @@ M17N_FLT_CFLAGS = @M17N_FLT_CFLAGS@
150M17N_FLT_LIBS = @M17N_FLT_LIBS@ 150M17N_FLT_LIBS = @M17N_FLT_LIBS@
151 151
152LIB_CLOCK_GETTIME=@LIB_CLOCK_GETTIME@ 152LIB_CLOCK_GETTIME=@LIB_CLOCK_GETTIME@
153LIB_EACCESS=@LIB_EACCESS@
154LIB_TIMER_TIME=@LIB_TIMER_TIME@ 153LIB_TIMER_TIME=@LIB_TIMER_TIME@
155 154
156DBUS_CFLAGS = @DBUS_CFLAGS@ 155DBUS_CFLAGS = @DBUS_CFLAGS@
@@ -393,7 +392,7 @@ otherobj= $(TERMCAP_OBJ) $(PRE_ALLOC_OBJ) $(GMALLOC_OBJ) $(RALLOC_OBJ) \
393LIBES = $(LIBS) $(W32_LIBS) $(LIBX_BASE) $(LIBIMAGE) \ 392LIBES = $(LIBS) $(W32_LIBS) $(LIBX_BASE) $(LIBIMAGE) \
394 $(LIBX_OTHER) $(LIBSOUND) \ 393 $(LIBX_OTHER) $(LIBSOUND) \
395 $(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) \ 394 $(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) \
396 $(LIB_EACCESS) $(LIB_TIMER_TIME) $(DBUS_LIBS) \ 395 $(LIB_TIMER_TIME) $(DBUS_LIBS) \
397 $(LIB_EXECINFO) \ 396 $(LIB_EXECINFO) \
398 $(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \ 397 $(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
399 $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \ 398 $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \
diff --git a/src/callproc.c b/src/callproc.c
index 5a9b32f08c3..b33882e54c2 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1597,13 +1597,13 @@ init_callproc (void)
1597#endif 1597#endif
1598 { 1598 {
1599 tempdir = Fdirectory_file_name (Vexec_directory); 1599 tempdir = Fdirectory_file_name (Vexec_directory);
1600 if (faccessat (AT_FDCWD, SSDATA (tempdir), F_OK, AT_EACCESS) != 0) 1600 if (access (SSDATA (tempdir), 0) < 0)
1601 dir_warning ("Warning: arch-dependent data dir (%s) does not exist.\n", 1601 dir_warning ("Warning: arch-dependent data dir (%s) does not exist.\n",
1602 Vexec_directory); 1602 Vexec_directory);
1603 } 1603 }
1604 1604
1605 tempdir = Fdirectory_file_name (Vdata_directory); 1605 tempdir = Fdirectory_file_name (Vdata_directory);
1606 if (faccessat (AT_FDCWD, SSDATA (tempdir), F_OK, AT_EACCESS) != 0) 1606 if (access (SSDATA (tempdir), 0) < 0)
1607 dir_warning ("Warning: arch-independent data dir (%s) does not exist.\n", 1607 dir_warning ("Warning: arch-independent data dir (%s) does not exist.\n",
1608 Vdata_directory); 1608 Vdata_directory);
1609 1609
diff --git a/src/charset.c b/src/charset.c
index fe068e1d3bc..6b999824dab 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -28,7 +28,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
28 28
29#define CHARSET_INLINE EXTERN_INLINE 29#define CHARSET_INLINE EXTERN_INLINE
30 30
31#include <fcntl.h>
32#include <stdio.h> 31#include <stdio.h>
33#include <unistd.h> 32#include <unistd.h>
34#include <limits.h> 33#include <limits.h>
@@ -2294,7 +2293,7 @@ init_charset (void)
2294{ 2293{
2295 Lisp_Object tempdir; 2294 Lisp_Object tempdir;
2296 tempdir = Fexpand_file_name (build_string ("charsets"), Vdata_directory); 2295 tempdir = Fexpand_file_name (build_string ("charsets"), Vdata_directory);
2297 if (faccessat (AT_FDCWD, SSDATA (tempdir), F_OK, AT_EACCESS) != 0) 2296 if (access (SSDATA (tempdir), 0) < 0)
2298 { 2297 {
2299 /* This used to be non-fatal (dir_warning), but it should not 2298 /* This used to be non-fatal (dir_warning), but it should not
2300 happen, and if it does sooner or later it will cause some 2299 happen, and if it does sooner or later it will cause some
diff --git a/src/conf_post.h b/src/conf_post.h
index eade536e6e1..aa008107ba6 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -169,10 +169,6 @@ extern void _DebPrint (const char *fmt, ...);
169#endif 169#endif
170#endif 170#endif
171 171
172/* Tell gnulib to omit support for openat-related functions having a
173 first argument other than AT_FDCWD. */
174#define GNULIB_SUPPORT_ONLY_AT_FDCWD
175
176#include <string.h> 172#include <string.h>
177#include <stdlib.h> 173#include <stdlib.h>
178 174
diff --git a/src/fileio.c b/src/fileio.c
index 3accb58a3eb..d47d7dd9e0b 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2425,7 +2425,15 @@ On Unix, this is a name starting with a `/' or a `~'. */)
2425bool 2425bool
2426check_existing (const char *filename) 2426check_existing (const char *filename)
2427{ 2427{
2428 return faccessat (AT_FDCWD, filename, F_OK, AT_EACCESS) == 0; 2428#ifdef DOS_NT
2429 /* The full emulation of Posix 'stat' is too expensive on
2430 DOS/Windows, when all we want to know is whether the file exists.
2431 So we use 'access' instead, which is much more lightweight. */
2432 return (access (filename, F_OK) >= 0);
2433#else
2434 struct stat st;
2435 return (stat (filename, &st) >= 0);
2436#endif
2429} 2437}
2430 2438
2431/* Return true if file FILENAME exists and can be executed. */ 2439/* Return true if file FILENAME exists and can be executed. */
@@ -2433,7 +2441,21 @@ check_existing (const char *filename)
2433static bool 2441static bool
2434check_executable (char *filename) 2442check_executable (char *filename)
2435{ 2443{
2436 return faccessat (AT_FDCWD, filename, X_OK, AT_EACCESS) == 0; 2444#ifdef DOS_NT
2445 struct stat st;
2446 if (stat (filename, &st) < 0)
2447 return 0;
2448 return ((st.st_mode & S_IEXEC) != 0);
2449#else /* not DOS_NT */
2450#ifdef HAVE_EUIDACCESS
2451 return (euidaccess (filename, 1) >= 0);
2452#else
2453 /* Access isn't quite right because it uses the real uid
2454 and we really want to test with the effective uid.
2455 But Unix doesn't give us a right way to do it. */
2456 return (access (filename, 1) >= 0);
2457#endif
2458#endif /* not DOS_NT */
2437} 2459}
2438 2460
2439/* Return true if file FILENAME exists and can be written. */ 2461/* Return true if file FILENAME exists and can be written. */
@@ -2442,16 +2464,15 @@ static bool
2442check_writable (const char *filename) 2464check_writable (const char *filename)
2443{ 2465{
2444#ifdef MSDOS 2466#ifdef MSDOS
2445 /* FIXME: an faccessat implementation should be added to the
2446 DOS/Windows ports and this #ifdef branch should be removed. */
2447 struct stat st; 2467 struct stat st;
2448 if (stat (filename, &st) < 0) 2468 if (stat (filename, &st) < 0)
2449 return 0; 2469 return 0;
2450 return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode)); 2470 return (st.st_mode & S_IWRITE || S_ISDIR (st.st_mode));
2451#else /* not MSDOS */ 2471#else /* not MSDOS */
2452 bool res = faccessat (AT_FDCWD, filename, W_OK, AT_EACCESS) == 0; 2472#ifdef HAVE_EUIDACCESS
2473 bool res = (euidaccess (filename, 2) >= 0);
2453#ifdef CYGWIN 2474#ifdef CYGWIN
2454 /* faccessat may have returned failure because Cygwin couldn't 2475 /* euidaccess may have returned failure because Cygwin couldn't
2455 determine the file's UID or GID; if so, we return success. */ 2476 determine the file's UID or GID; if so, we return success. */
2456 if (!res) 2477 if (!res)
2457 { 2478 {
@@ -2462,6 +2483,14 @@ check_writable (const char *filename)
2462 } 2483 }
2463#endif /* CYGWIN */ 2484#endif /* CYGWIN */
2464 return res; 2485 return res;
2486#else /* not HAVE_EUIDACCESS */
2487 /* Access isn't quite right because it uses the real uid
2488 and we really want to test with the effective uid.
2489 But Unix doesn't give us a right way to do it.
2490 Opening with O_WRONLY could work for an ordinary file,
2491 but would lose for directories. */
2492 return (access (filename, 2) >= 0);
2493#endif /* not HAVE_EUIDACCESS */
2465#endif /* not MSDOS */ 2494#endif /* not MSDOS */
2466} 2495}
2467 2496
@@ -2518,6 +2547,9 @@ See also `file-exists-p' and `file-attributes'. */)
2518{ 2547{
2519 Lisp_Object absname; 2548 Lisp_Object absname;
2520 Lisp_Object handler; 2549 Lisp_Object handler;
2550 int desc;
2551 int flags;
2552 struct stat statbuf;
2521 2553
2522 CHECK_STRING (filename); 2554 CHECK_STRING (filename);
2523 absname = Fexpand_file_name (filename, Qnil); 2555 absname = Fexpand_file_name (filename, Qnil);
@@ -2529,8 +2561,31 @@ See also `file-exists-p' and `file-attributes'. */)
2529 return call2 (handler, Qfile_readable_p, absname); 2561 return call2 (handler, Qfile_readable_p, absname);
2530 2562
2531 absname = ENCODE_FILE (absname); 2563 absname = ENCODE_FILE (absname);
2532 return (faccessat (AT_FDCWD, SSDATA (absname), R_OK, AT_EACCESS) == 0 2564
2533 ? Qt : Qnil); 2565#if defined (DOS_NT) || defined (macintosh)
2566 /* Under MS-DOS, Windows, and Macintosh, open does not work for
2567 directories. */
2568 if (access (SDATA (absname), 0) == 0)
2569 return Qt;
2570 return Qnil;
2571#else /* not DOS_NT and not macintosh */
2572 flags = O_RDONLY;
2573#ifdef O_NONBLOCK
2574 /* Opening a fifo without O_NONBLOCK can wait.
2575 We don't want to wait. But we don't want to mess wth O_NONBLOCK
2576 except in the case of a fifo, on a system which handles it. */
2577 desc = stat (SSDATA (absname), &statbuf);
2578 if (desc < 0)
2579 return Qnil;
2580 if (S_ISFIFO (statbuf.st_mode))
2581 flags |= O_NONBLOCK;
2582#endif
2583 desc = emacs_open (SSDATA (absname), flags, 0);
2584 if (desc < 0)
2585 return Qnil;
2586 emacs_close (desc);
2587 return Qt;
2588#endif /* not DOS_NT and not macintosh */
2534} 2589}
2535 2590
2536/* Having this before file-symlink-p mysteriously caused it to be forgotten 2591/* Having this before file-symlink-p mysteriously caused it to be forgotten
@@ -2567,7 +2622,7 @@ DEFUN ("file-writable-p", Ffile_writable_p, Sfile_writable_p, 1, 1, 0,
2567 /* The read-only attribute of the parent directory doesn't affect 2622 /* The read-only attribute of the parent directory doesn't affect
2568 whether a file or directory can be created within it. Some day we 2623 whether a file or directory can be created within it. Some day we
2569 should check ACLs though, which do affect this. */ 2624 should check ACLs though, which do affect this. */
2570 return file_directory_p (SDATA (dir)) ? Qt : Qnil; 2625 return (access (SDATA (dir), D_OK) < 0) ? Qnil : Qt;
2571#else 2626#else
2572 return (check_writable (!NILP (dir) ? SSDATA (dir) : "") 2627 return (check_writable (!NILP (dir) ? SSDATA (dir) : "")
2573 ? Qt : Qnil); 2628 ? Qt : Qnil);
@@ -2648,7 +2703,8 @@ Symbolic links to directories count as directories.
2648See `file-symlink-p' to distinguish symlinks. */) 2703See `file-symlink-p' to distinguish symlinks. */)
2649 (Lisp_Object filename) 2704 (Lisp_Object filename)
2650{ 2705{
2651 Lisp_Object absname; 2706 register Lisp_Object absname;
2707 struct stat st;
2652 Lisp_Object handler; 2708 Lisp_Object handler;
2653 2709
2654 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory)); 2710 absname = expand_and_dir_to_file (filename, BVAR (current_buffer, directory));
@@ -2661,20 +2717,9 @@ See `file-symlink-p' to distinguish symlinks. */)
2661 2717
2662 absname = ENCODE_FILE (absname); 2718 absname = ENCODE_FILE (absname);
2663 2719
2664 return file_directory_p (SSDATA (absname)) ? Qt : Qnil; 2720 if (stat (SSDATA (absname), &st) < 0)
2665} 2721 return Qnil;
2666 2722 return S_ISDIR (st.st_mode) ? Qt : Qnil;
2667/* Return true if FILE is a directory or a symlink to a directory. */
2668bool
2669file_directory_p (char const *file)
2670{
2671#ifdef WINDOWSNT
2672 /* This is cheaper than 'stat'. */
2673 return faccessat (AT_FDCWD, file, D_OK, AT_EACCESS) == 0;
2674#else
2675 struct stat st;
2676 return stat (file, &st) == 0 && S_ISDIR (st.st_mode);
2677#endif
2678} 2723}
2679 2724
2680DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p, 2725DEFUN ("file-accessible-directory-p", Ffile_accessible_directory_p,
@@ -2999,8 +3044,10 @@ Use the current time if TIMESTAMP is nil. TIMESTAMP is in the format of
2999 if (set_file_times (-1, SSDATA (encoded_absname), t, t)) 3044 if (set_file_times (-1, SSDATA (encoded_absname), t, t))
3000 { 3045 {
3001#ifdef MSDOS 3046#ifdef MSDOS
3047 struct stat st;
3048
3002 /* Setting times on a directory always fails. */ 3049 /* Setting times on a directory always fails. */
3003 if (file_directory_p (SSDATA (encoded_absname))) 3050 if (stat (SSDATA (encoded_absname), &st) == 0 && S_ISDIR (st.st_mode))
3004 return Qnil; 3051 return Qnil;
3005#endif 3052#endif
3006 report_file_error ("Setting file times", Fcons (absname, Qnil)); 3053 report_file_error ("Setting file times", Fcons (absname, Qnil));
diff --git a/src/lisp.h b/src/lisp.h
index 897757cf462..01f6ca5e57c 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3178,7 +3178,6 @@ extern Lisp_Object close_file_unwind (Lisp_Object);
3178extern Lisp_Object restore_point_unwind (Lisp_Object); 3178extern Lisp_Object restore_point_unwind (Lisp_Object);
3179extern _Noreturn void report_file_error (const char *, Lisp_Object); 3179extern _Noreturn void report_file_error (const char *, Lisp_Object);
3180extern void internal_delete_file (Lisp_Object); 3180extern void internal_delete_file (Lisp_Object);
3181extern bool file_directory_p (const char *);
3182extern void syms_of_fileio (void); 3181extern void syms_of_fileio (void);
3183extern Lisp_Object make_temp_name (Lisp_Object, bool); 3182extern Lisp_Object make_temp_name (Lisp_Object, bool);
3184extern Lisp_Object Qdelete_file; 3183extern Lisp_Object Qdelete_file;
diff --git a/src/lread.c b/src/lread.c
index dedce50de2a..6d4c0d990af 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1404,7 +1404,7 @@ Returns the file's name in absolute form, or nil if not found.
1404If SUFFIXES is non-nil, it should be a list of suffixes to append to 1404If SUFFIXES is non-nil, it should be a list of suffixes to append to
1405file name when searching. 1405file name when searching.
1406If non-nil, PREDICATE is used instead of `file-readable-p'. 1406If non-nil, PREDICATE is used instead of `file-readable-p'.
1407PREDICATE can also be an integer to pass to the faccessat(2) function, 1407PREDICATE can also be an integer to pass to the access(2) function,
1408in which case file-name-handlers are ignored. 1408in which case file-name-handlers are ignored.
1409This function will normally skip directories, so if you want it to find 1409This function will normally skip directories, so if you want it to find
1410directories, make sure the PREDICATE function returns `dir-ok' for them. */) 1410directories, make sure the PREDICATE function returns `dir-ok' for them. */)
@@ -1442,6 +1442,7 @@ static Lisp_Object Qdir_ok;
1442int 1442int
1443openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *storeptr, Lisp_Object predicate) 1443openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *storeptr, Lisp_Object predicate)
1444{ 1444{
1445 int fd;
1445 ptrdiff_t fn_size = 100; 1446 ptrdiff_t fn_size = 100;
1446 char buf[100]; 1447 char buf[100];
1447 char *fn = buf; 1448 char *fn = buf;
@@ -1496,6 +1497,7 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *sto
1496 { 1497 {
1497 ptrdiff_t fnlen, lsuffix = SBYTES (XCAR (tail)); 1498 ptrdiff_t fnlen, lsuffix = SBYTES (XCAR (tail));
1498 Lisp_Object handler; 1499 Lisp_Object handler;
1500 bool exists;
1499 1501
1500 /* Concatenate path element/specified name with the suffix. 1502 /* Concatenate path element/specified name with the suffix.
1501 If the directory starts with /:, remove that. */ 1503 If the directory starts with /:, remove that. */
@@ -1519,7 +1521,6 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *sto
1519 handler = Ffind_file_name_handler (string, Qfile_exists_p); 1521 handler = Ffind_file_name_handler (string, Qfile_exists_p);
1520 if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate)) 1522 if ((!NILP (handler) || !NILP (predicate)) && !NATNUMP (predicate))
1521 { 1523 {
1522 bool exists;
1523 if (NILP (predicate)) 1524 if (NILP (predicate))
1524 exists = !NILP (Ffile_readable_p (string)); 1525 exists = !NILP (Ffile_readable_p (string));
1525 else 1526 else
@@ -1541,40 +1542,37 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object *sto
1541 } 1542 }
1542 else 1543 else
1543 { 1544 {
1544 int fd; 1545#ifndef WINDOWSNT
1546 struct stat st;
1547#endif
1545 const char *pfn; 1548 const char *pfn;
1546 1549
1547 encoded_fn = ENCODE_FILE (string); 1550 encoded_fn = ENCODE_FILE (string);
1548 pfn = SSDATA (encoded_fn); 1551 pfn = SSDATA (encoded_fn);
1549 1552#ifdef WINDOWSNT
1550 /* Check that we can access or open it. */ 1553 exists = access (pfn, F_OK) == 0 && access (pfn, D_OK) < 0;
1551 if (NATNUMP (predicate)) 1554#else
1552 fd = (((XFASTINT (predicate) & ~INT_MAX) == 0 1555 exists = (stat (pfn, &st) == 0 && ! S_ISDIR (st.st_mode));
1553 && (faccessat (AT_FDCWD, pfn, XFASTINT (predicate), 1556#endif
1554 AT_EACCESS) 1557 if (exists)
1555 == 0)
1556 && ! file_directory_p (pfn))
1557 ? 1 : -1);
1558 else
1559 { 1558 {
1560 struct stat st; 1559 /* Check that we can access or open it. */
1561 fd = emacs_open (pfn, O_RDONLY, 0); 1560 if (NATNUMP (predicate))
1562 if (0 <= fd 1561 fd = (((XFASTINT (predicate) & ~INT_MAX) == 0
1563 && (fstat (fd, &st) != 0 || S_ISDIR (st.st_mode))) 1562 && access (pfn, XFASTINT (predicate)) == 0)
1563 ? 1 : -1);
1564 else
1565 fd = emacs_open (pfn, O_RDONLY, 0);
1566
1567 if (fd >= 0)
1564 { 1568 {
1565 emacs_close (fd); 1569 /* We succeeded; return this descriptor and filename. */
1566 fd = -1; 1570 if (storeptr)
1571 *storeptr = string;
1572 UNGCPRO;
1573 return fd;
1567 } 1574 }
1568 } 1575 }
1569
1570 if (fd >= 0)
1571 {
1572 /* We succeeded; return this descriptor and filename. */
1573 if (storeptr)
1574 *storeptr = string;
1575 UNGCPRO;
1576 return fd;
1577 }
1578 } 1576 }
1579 } 1577 }
1580 if (absolute) 1578 if (absolute)
@@ -4090,7 +4088,7 @@ load_path_check (void)
4090 if (STRINGP (dirfile)) 4088 if (STRINGP (dirfile))
4091 { 4089 {
4092 dirfile = Fdirectory_file_name (dirfile); 4090 dirfile = Fdirectory_file_name (dirfile);
4093 if (faccessat (AT_FDCWD, SSDATA (dirfile), F_OK, AT_EACCESS) != 0) 4091 if (access (SSDATA (dirfile), 0) < 0)
4094 dir_warning ("Warning: Lisp directory `%s' does not exist.\n", 4092 dir_warning ("Warning: Lisp directory `%s' does not exist.\n",
4095 XCAR (path_tail)); 4093 XCAR (path_tail));
4096 } 4094 }
diff --git a/src/process.c b/src/process.c
index 572ab83de09..307e82819d6 100644
--- a/src/process.c
+++ b/src/process.c
@@ -204,7 +204,7 @@ static EMACS_INT update_tick;
204#ifndef NON_BLOCKING_CONNECT 204#ifndef NON_BLOCKING_CONNECT
205#ifdef HAVE_SELECT 205#ifdef HAVE_SELECT
206#if defined (HAVE_GETPEERNAME) || defined (GNU_LINUX) 206#if defined (HAVE_GETPEERNAME) || defined (GNU_LINUX)
207#if O_NONBLOCK || O_NDELAY 207#if defined (O_NONBLOCK) || defined (O_NDELAY)
208#if defined (EWOULDBLOCK) || defined (EINPROGRESS) 208#if defined (EWOULDBLOCK) || defined (EINPROGRESS)
209#define NON_BLOCKING_CONNECT 209#define NON_BLOCKING_CONNECT
210#endif /* EWOULDBLOCK || EINPROGRESS */ 210#endif /* EWOULDBLOCK || EINPROGRESS */
@@ -651,7 +651,7 @@ allocate_pty (void)
651 PTY_OPEN; 651 PTY_OPEN;
652#else /* no PTY_OPEN */ 652#else /* no PTY_OPEN */
653 { 653 {
654# if O_NONBLOCK 654# ifdef O_NONBLOCK
655 fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0); 655 fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0);
656# else 656# else
657 fd = emacs_open (pty_name, O_RDWR | O_NDELAY, 0); 657 fd = emacs_open (pty_name, O_RDWR | O_NDELAY, 0);
@@ -668,7 +668,7 @@ allocate_pty (void)
668#else 668#else
669 sprintf (pty_name, "/dev/tty%c%x", c, i); 669 sprintf (pty_name, "/dev/tty%c%x", c, i);
670#endif /* no PTY_TTY_NAME_SPRINTF */ 670#endif /* no PTY_TTY_NAME_SPRINTF */
671 if (faccessat (AT_FDCWD, pty_name, R_OK | W_OK, AT_EACCESS) != 0) 671 if (access (pty_name, 6) != 0)
672 { 672 {
673 emacs_close (fd); 673 emacs_close (fd);
674# ifndef __sgi 674# ifndef __sgi
@@ -1621,7 +1621,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1621#if ! defined (USG) || defined (USG_SUBTTY_WORKS) 1621#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
1622 /* On most USG systems it does not work to open the pty's tty here, 1622 /* On most USG systems it does not work to open the pty's tty here,
1623 then close it and reopen it in the child. */ 1623 then close it and reopen it in the child. */
1624#if O_NOCTTY 1624#ifdef O_NOCTTY
1625 /* Don't let this terminal become our controlling terminal 1625 /* Don't let this terminal become our controlling terminal
1626 (in case we don't have one). */ 1626 (in case we don't have one). */
1627 forkout = forkin = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0); 1627 forkout = forkin = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
@@ -1675,11 +1675,11 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
1675 } 1675 }
1676#endif 1676#endif
1677 1677
1678#if O_NONBLOCK 1678#ifdef O_NONBLOCK
1679 fcntl (inchannel, F_SETFL, O_NONBLOCK); 1679 fcntl (inchannel, F_SETFL, O_NONBLOCK);
1680 fcntl (outchannel, F_SETFL, O_NONBLOCK); 1680 fcntl (outchannel, F_SETFL, O_NONBLOCK);
1681#else 1681#else
1682#if O_NDELAY 1682#ifdef O_NDELAY
1683 fcntl (inchannel, F_SETFL, O_NDELAY); 1683 fcntl (inchannel, F_SETFL, O_NDELAY);
1684 fcntl (outchannel, F_SETFL, O_NDELAY); 1684 fcntl (outchannel, F_SETFL, O_NDELAY);
1685#endif 1685#endif
@@ -1967,7 +1967,7 @@ create_pty (Lisp_Object process)
1967#if ! defined (USG) || defined (USG_SUBTTY_WORKS) 1967#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
1968 /* On most USG systems it does not work to open the pty's tty here, 1968 /* On most USG systems it does not work to open the pty's tty here,
1969 then close it and reopen it in the child. */ 1969 then close it and reopen it in the child. */
1970#if O_NOCTTY 1970#ifdef O_NOCTTY
1971 /* Don't let this terminal become our controlling terminal 1971 /* Don't let this terminal become our controlling terminal
1972 (in case we don't have one). */ 1972 (in case we don't have one). */
1973 int forkout = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0); 1973 int forkout = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
@@ -1987,11 +1987,11 @@ create_pty (Lisp_Object process)
1987 } 1987 }
1988#endif /* HAVE_PTYS */ 1988#endif /* HAVE_PTYS */
1989 1989
1990#if O_NONBLOCK 1990#ifdef O_NONBLOCK
1991 fcntl (inchannel, F_SETFL, O_NONBLOCK); 1991 fcntl (inchannel, F_SETFL, O_NONBLOCK);
1992 fcntl (outchannel, F_SETFL, O_NONBLOCK); 1992 fcntl (outchannel, F_SETFL, O_NONBLOCK);
1993#else 1993#else
1994#if O_NDELAY 1994#ifdef O_NDELAY
1995 fcntl (inchannel, F_SETFL, O_NDELAY); 1995 fcntl (inchannel, F_SETFL, O_NDELAY);
1996 fcntl (outchannel, F_SETFL, O_NDELAY); 1996 fcntl (outchannel, F_SETFL, O_NDELAY);
1997#endif 1997#endif
@@ -2951,7 +2951,7 @@ usage: (make-network-process &rest ARGS) */)
2951 { 2951 {
2952 /* Don't support network sockets when non-blocking mode is 2952 /* Don't support network sockets when non-blocking mode is
2953 not available, since a blocked Emacs is not useful. */ 2953 not available, since a blocked Emacs is not useful. */
2954#if !O_NONBLOCK && !O_NDELAY 2954#if !defined (O_NONBLOCK) && !defined (O_NDELAY)
2955 error ("Network servers not supported"); 2955 error ("Network servers not supported");
2956#else 2956#else
2957 is_server = 1; 2957 is_server = 1;
@@ -3217,7 +3217,7 @@ usage: (make-network-process &rest ARGS) */)
3217#ifdef NON_BLOCKING_CONNECT 3217#ifdef NON_BLOCKING_CONNECT
3218 if (is_non_blocking_client) 3218 if (is_non_blocking_client)
3219 { 3219 {
3220#if O_NONBLOCK 3220#ifdef O_NONBLOCK
3221 ret = fcntl (s, F_SETFL, O_NONBLOCK); 3221 ret = fcntl (s, F_SETFL, O_NONBLOCK);
3222#else 3222#else
3223 ret = fcntl (s, F_SETFL, O_NDELAY); 3223 ret = fcntl (s, F_SETFL, O_NDELAY);
@@ -3434,10 +3434,10 @@ usage: (make-network-process &rest ARGS) */)
3434 3434
3435 chan_process[inch] = proc; 3435 chan_process[inch] = proc;
3436 3436
3437#if O_NONBLOCK 3437#ifdef O_NONBLOCK
3438 fcntl (inch, F_SETFL, O_NONBLOCK); 3438 fcntl (inch, F_SETFL, O_NONBLOCK);
3439#else 3439#else
3440#if O_NDELAY 3440#ifdef O_NDELAY
3441 fcntl (inch, F_SETFL, O_NDELAY); 3441 fcntl (inch, F_SETFL, O_NDELAY);
3442#endif 3442#endif
3443#endif 3443#endif
@@ -4169,10 +4169,10 @@ server_accept_connection (Lisp_Object server, int channel)
4169 4169
4170 chan_process[s] = proc; 4170 chan_process[s] = proc;
4171 4171
4172#if O_NONBLOCK 4172#ifdef O_NONBLOCK
4173 fcntl (s, F_SETFL, O_NONBLOCK); 4173 fcntl (s, F_SETFL, O_NONBLOCK);
4174#else 4174#else
4175#if O_NDELAY 4175#ifdef O_NDELAY
4176 fcntl (s, F_SETFL, O_NDELAY); 4176 fcntl (s, F_SETFL, O_NDELAY);
4177#endif 4177#endif
4178#endif 4178#endif
@@ -4873,11 +4873,11 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
4873#endif 4873#endif
4874 /* ISC 4.1 defines both EWOULDBLOCK and O_NONBLOCK, 4874 /* ISC 4.1 defines both EWOULDBLOCK and O_NONBLOCK,
4875 and Emacs uses O_NONBLOCK, so what we get is EAGAIN. */ 4875 and Emacs uses O_NONBLOCK, so what we get is EAGAIN. */
4876#if O_NONBLOCK 4876#ifdef O_NONBLOCK
4877 else if (nread == -1 && errno == EAGAIN) 4877 else if (nread == -1 && errno == EAGAIN)
4878 ; 4878 ;
4879#else 4879#else
4880#if O_NDELAY 4880#ifdef O_NDELAY
4881 else if (nread == -1 && errno == EAGAIN) 4881 else if (nread == -1 && errno == EAGAIN)
4882 ; 4882 ;
4883 /* Note that we cannot distinguish between no input 4883 /* Note that we cannot distinguish between no input
@@ -7363,7 +7363,7 @@ init_process_emacs (void)
7363#ifdef HAVE_GETSOCKNAME 7363#ifdef HAVE_GETSOCKNAME
7364 ADD_SUBFEATURE (QCservice, Qt); 7364 ADD_SUBFEATURE (QCservice, Qt);
7365#endif 7365#endif
7366#if O_NONBLOCK || O_NDELAY 7366#if defined (O_NONBLOCK) || defined (O_NDELAY)
7367 ADD_SUBFEATURE (QCserver, Qt); 7367 ADD_SUBFEATURE (QCserver, Qt);
7368#endif 7368#endif
7369 7369
diff --git a/src/sysdep.c b/src/sysdep.c
index 8a31957d182..35beeaa7202 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1216,7 +1216,7 @@ reset_sys_modes (struct tty_display_info *tty_out)
1216 old_fcntl_owner[fileno (tty_out->input)]); 1216 old_fcntl_owner[fileno (tty_out->input)]);
1217 } 1217 }
1218#endif /* F_SETOWN */ 1218#endif /* F_SETOWN */
1219#if O_NDELAY 1219#ifdef O_NDELAY
1220 fcntl (fileno (tty_out->input), F_SETFL, 1220 fcntl (fileno (tty_out->input), F_SETFL,
1221 fcntl (fileno (tty_out->input), F_GETFL, 0) & ~O_NDELAY); 1221 fcntl (fileno (tty_out->input), F_GETFL, 0) & ~O_NDELAY);
1222#endif 1222#endif
@@ -2312,12 +2312,12 @@ serial_open (char *port)
2312 2312
2313 fd = emacs_open ((char*) port, 2313 fd = emacs_open ((char*) port,
2314 O_RDWR 2314 O_RDWR
2315#if O_NONBLOCK 2315#ifdef O_NONBLOCK
2316 | O_NONBLOCK 2316 | O_NONBLOCK
2317#else 2317#else
2318 | O_NDELAY 2318 | O_NDELAY
2319#endif 2319#endif
2320#if O_NOCTTY 2320#ifdef O_NOCTTY
2321 | O_NOCTTY 2321 | O_NOCTTY
2322#endif 2322#endif
2323 , 0); 2323 , 0);
diff --git a/src/term.c b/src/term.c
index 87ce5447b76..f7c87b7608d 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3023,7 +3023,7 @@ init_tty (const char *name, const char *terminal_type, int must_succeed)
3023 int fd; 3023 int fd;
3024 FILE *file; 3024 FILE *file;
3025 3025
3026#if O_IGNORE_CTTY 3026#ifdef O_IGNORE_CTTY
3027 if (!ctty) 3027 if (!ctty)
3028 /* Open the terminal device. Don't recognize it as our 3028 /* Open the terminal device. Don't recognize it as our
3029 controlling terminal, and don't make it the controlling tty 3029 controlling terminal, and don't make it the controlling tty
@@ -3054,7 +3054,7 @@ init_tty (const char *name, const char *terminal_type, int must_succeed)
3054 name); 3054 name);
3055 } 3055 }
3056 3056
3057#if !O_IGNORE_CTTY 3057#ifndef O_IGNORE_CTTY
3058 if (!ctty) 3058 if (!ctty)
3059 dissociate_if_controlling_tty (fd); 3059 dissociate_if_controlling_tty (fd);
3060#endif 3060#endif
diff --git a/src/w32.c b/src/w32.c
index 341f4d3fef3..5ac1bc3eb7c 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -1597,7 +1597,7 @@ init_environment (char ** argv)
1597 see if it succeeds. But I think that's too much to ask. */ 1597 see if it succeeds. But I think that's too much to ask. */
1598 1598
1599 /* MSVCRT's _access crashes with D_OK. */ 1599 /* MSVCRT's _access crashes with D_OK. */
1600 if (tmp && sys_faccessat (AT_FDCWD, tmp, D_OK, AT_EACCESS) == 0) 1600 if (tmp && sys_access (tmp, D_OK) == 0)
1601 { 1601 {
1602 char * var = alloca (strlen (tmp) + 8); 1602 char * var = alloca (strlen (tmp) + 8);
1603 sprintf (var, "TMPDIR=%s", tmp); 1603 sprintf (var, "TMPDIR=%s", tmp);
@@ -2714,16 +2714,10 @@ logon_network_drive (const char *path)
2714 long file names. */ 2714 long file names. */
2715 2715
2716int 2716int
2717sys_faccessat (int dirfd, const char * path, int mode, int flags) 2717sys_access (const char * path, int mode)
2718{ 2718{
2719 DWORD attributes; 2719 DWORD attributes;
2720 2720
2721 if (dirfd != AT_FDCWD)
2722 {
2723 errno = EINVAL;
2724 return -1;
2725 }
2726
2727 /* MSVCRT implementation of 'access' doesn't recognize D_OK, and its 2721 /* MSVCRT implementation of 'access' doesn't recognize D_OK, and its
2728 newer versions blow up when passed D_OK. */ 2722 newer versions blow up when passed D_OK. */
2729 path = map_w32_filename (path, NULL); 2723 path = map_w32_filename (path, NULL);
@@ -2966,7 +2960,7 @@ sys_mktemp (char * template)
2966 { 2960 {
2967 int save_errno = errno; 2961 int save_errno = errno;
2968 p[0] = first_char[i]; 2962 p[0] = first_char[i];
2969 if (sys_faccessat (AT_FDCWD, template, F_OK, AT_EACCESS) < 0) 2963 if (sys_access (template, 0) < 0)
2970 { 2964 {
2971 errno = save_errno; 2965 errno = save_errno;
2972 return template; 2966 return template;
@@ -4017,7 +4011,7 @@ symlink (char const *filename, char const *linkname)
4017 { 4011 {
4018 /* Non-absolute FILENAME is understood as being relative to 4012 /* Non-absolute FILENAME is understood as being relative to
4019 LINKNAME's directory. We need to prepend that directory to 4013 LINKNAME's directory. We need to prepend that directory to
4020 FILENAME to get correct results from sys_faccessat below, since 4014 FILENAME to get correct results from sys_access below, since
4021 otherwise it will interpret FILENAME relative to the 4015 otherwise it will interpret FILENAME relative to the
4022 directory where the Emacs process runs. Note that 4016 directory where the Emacs process runs. Note that
4023 make-symbolic-link always makes sure LINKNAME is a fully 4017 make-symbolic-link always makes sure LINKNAME is a fully
@@ -4031,10 +4025,10 @@ symlink (char const *filename, char const *linkname)
4031 strncpy (tem, linkfn, p - linkfn); 4025 strncpy (tem, linkfn, p - linkfn);
4032 tem[p - linkfn] = '\0'; 4026 tem[p - linkfn] = '\0';
4033 strcat (tem, filename); 4027 strcat (tem, filename);
4034 dir_access = sys_faccessat (AT_FDCWD, tem, D_OK, AT_EACCESS); 4028 dir_access = sys_access (tem, D_OK);
4035 } 4029 }
4036 else 4030 else
4037 dir_access = sys_faccessat (AT_FDCWD, filename, D_OK, AT_EACCESS); 4031 dir_access = sys_access (filename, D_OK);
4038 4032
4039 /* Since Windows distinguishes between symlinks to directories and 4033 /* Since Windows distinguishes between symlinks to directories and
4040 to files, we provide a kludgy feature: if FILENAME doesn't 4034 to files, we provide a kludgy feature: if FILENAME doesn't
diff --git a/src/xrdb.c b/src/xrdb.c
index 982a6e46a13..9d056a607e4 100644
--- a/src/xrdb.c
+++ b/src/xrdb.c
@@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 21
22#include <config.h> 22#include <config.h>
23 23
24#include <fcntl.h>
25#include <unistd.h> 24#include <unistd.h>
26#include <errno.h> 25#include <errno.h>
27#include <epaths.h> 26#include <epaths.h>
@@ -262,8 +261,11 @@ gethomedir (void)
262static int 261static int
263file_p (const char *filename) 262file_p (const char *filename)
264{ 263{
265 return (faccessat (AT_FDCWD, filename, R_OK, AT_EACCESS) == 0 264 struct stat status;
266 && ! file_directory_p (filename)); 265
266 return (access (filename, 4) == 0 /* exists and is readable */
267 && stat (filename, &status) == 0 /* get the status */
268 && (S_ISDIR (status.st_mode)) == 0); /* not a directory */
267} 269}
268 270
269 271