* 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 e340e84..45637f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2012-10-14 Paul Eggert <egg...@cs.ucla.edu> + 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 b25bc4d..481eea4 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 <errno.h> +# 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 768ec13..ee4f2a5 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 94fad77..44cc919 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 7fba3ed..0b16be8 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 69e9a7b..9b260d4 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 0108920..0fe638a 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 7846401..0db086a 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 4a7b87e..97e201c 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 -- 1.7.11.7