From 290d23ac868ab45c255654966b2d8fde99e3fa80 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 Oct 2012 22:31:28 -0700 Subject: [PATCH] faccessat, etc.: support AT_FDCWD-only use * lib/at-func.c: If GNULIB_SUPPORT_ONLY_AT_FDCWD, then support this function only if its first argument is AT_FDCWD. Emacs wants faccessat for AT_EACCESS but not for any first-arg values other than AT_FDCWD, so it doesn't want all the openat machinery with fchdir etc. * modules/faccessat, modules/fchmodat, modules/fchownat (Files): * modules/fstatat, modules/mkdirat, modules/openat (Files): * modules/unlinkat (Files): Remove lib/openat-priv.h, as at-internal supplies this file. Removing this file here allows us to support programs like Emacs that avoid at-internal. --- ChangeLog | 13 +++++++++++++ lib/at-func.c | 31 +++++++++++++++++++++++-------- modules/faccessat | 1 - modules/fchmodat | 1 - modules/fchownat | 1 - modules/fstatat | 1 - modules/mkdirat | 1 - modules/openat | 1 - modules/unlinkat | 1 - 9 files changed, 36 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index e340e84a50..45637f3c94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2012-10-14 Paul Eggert + faccessat, etc.: support AT_FDCWD-only use + * lib/at-func.c: If GNULIB_SUPPORT_ONLY_AT_FDCWD, then support + this function only if its first argument is AT_FDCWD. + Emacs wants faccessat for AT_EACCESS but not for any first-arg + values other than AT_FDCWD, so it doesn't want all the openat + machinery with fchdir etc. + * modules/faccessat, modules/fchmodat, modules/fchownat (Files): + * modules/fstatat, modules/mkdirat, modules/openat (Files): + * modules/unlinkat (Files): + Remove lib/openat-priv.h, as at-internal supplies this file. + Removing this file here allows us to support programs like Emacs + that avoid at-internal. + faccessat: speed up 'configure' on mainstream hosts * m4/faccessat.m4 (gl_PREREQ_FACCESSAT): Use AT_CHECK_FUNCS for 'access', not AC_CHECK_FUNCS_ONCE, diff --git a/lib/at-func.c b/lib/at-func.c index b25bc4d819..481eea475a 100644 --- a/lib/at-func.c +++ b/lib/at-func.c @@ -17,9 +17,17 @@ /* written by Jim Meyering */ #include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ -#include "openat.h" -#include "openat-priv.h" -#include "save-cwd.h" + +#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD +# include +# ifndef ENOTSUP +# define ENOTSUP EINVAL +# endif +#else +# include "openat.h" +# include "openat-priv.h" +# include "save-cwd.h" +#endif #ifdef AT_FUNC_USE_F1_COND # define CALL_FUNC(F) \ @@ -61,17 +69,22 @@ FUNC_RESULT AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS) { + VALIDATE_FLAG (flag); + + if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file)) + return CALL_FUNC (file); + +#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD + errno = ENOTSUP; + return FUNC_FAIL; +#else + { /* Be careful to choose names unlikely to conflict with AT_FUNC_POST_FILE_PARAM_DECLS. */ struct saved_cwd saved_cwd; int saved_errno; FUNC_RESULT err; - VALIDATE_FLAG (flag); - - if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file)) - return CALL_FUNC (file); - { char proc_buf[OPENAT_BUFFER_SIZE]; char *proc_file = openat_proc_name (proc_buf, fd, file); @@ -125,6 +138,8 @@ AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS) if (saved_errno) errno = saved_errno; return err; + } +#endif } #undef CALL_FUNC #undef FUNC_RESULT diff --git a/modules/faccessat b/modules/faccessat index 768ec133f9..ee4f2a5a9a 100644 --- a/modules/faccessat +++ b/modules/faccessat @@ -4,7 +4,6 @@ faccessat() function: check user's permissions for a file. Files: lib/faccessat.c lib/at-func.c -lib/openat-priv.h m4/faccessat.m4 Depends-on: diff --git a/modules/fchmodat b/modules/fchmodat index 94fad771a3..44cc919330 100644 --- a/modules/fchmodat +++ b/modules/fchmodat @@ -4,7 +4,6 @@ fchmodat() function: Change access permissions of a file at a directory. Files: lib/fchmodat.c lib/at-func.c -lib/openat-priv.h m4/fchmodat.m4 Depends-on: diff --git a/modules/fchownat b/modules/fchownat index 7fba3edc20..0b16be87e4 100644 --- a/modules/fchownat +++ b/modules/fchownat @@ -4,7 +4,6 @@ fchownat() function: Change the owner of a file at a directory. Files: lib/fchownat.c lib/at-func.c -lib/openat-priv.h m4/fchownat.m4 Depends-on: diff --git a/modules/fstatat b/modules/fstatat index 69e9a7b641..9b260d4b74 100644 --- a/modules/fstatat +++ b/modules/fstatat @@ -4,7 +4,6 @@ fstatat() function: Return information about a file at a directory. Files: lib/fstatat.c lib/at-func.c -lib/openat-priv.h m4/fstatat.m4 m4/lstat.m4 diff --git a/modules/mkdirat b/modules/mkdirat index 0108920049..0fe638ae86 100644 --- a/modules/mkdirat +++ b/modules/mkdirat @@ -4,7 +4,6 @@ mkdirat() function: Create a directory relative to a given directory. Files: lib/mkdirat.c lib/at-func.c -lib/openat-priv.h m4/mkdirat.m4 Depends-on: diff --git a/modules/openat b/modules/openat index 7846401749..0db086a766 100644 --- a/modules/openat +++ b/modules/openat @@ -3,7 +3,6 @@ openat() function: Open a file at a directory. Files: lib/openat.c -lib/openat-priv.h m4/openat.m4 m4/lstat.m4 m4/mode_t.m4 diff --git a/modules/unlinkat b/modules/unlinkat index 4a7b87ed29..97e201cbde 100644 --- a/modules/unlinkat +++ b/modules/unlinkat @@ -4,7 +4,6 @@ unlinkat() function: Remove a file at a directory. Files: lib/unlinkat.c lib/at-func.c -lib/openat-priv.h m4/unlinkat.m4 m4/lstat.m4 -- 2.39.5