From: Paul Eggert Date: Mon, 15 Oct 2012 05:31:28 +0000 (-0700) Subject: faccessat, etc.: support AT_FDCWD-only use X-Git-Tag: v0.1~395 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=290d23ac868ab45c255654966b2d8fde99e3fa80;hp=f395c21b24576a9b50392f4556f9caf0335df218;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index e340e84a5..45637f3c9 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 b25bc4d81..481eea475 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 768ec133f..ee4f2a5a9 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 94fad771a..44cc91933 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 7fba3edc2..0b16be87e 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 69e9a7b64..9b260d4b7 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 010892004..0fe638ae8 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 784640174..0db086a76 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 4a7b87ed2..97e201cbd 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