changeset 17134:af797cb33018

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.
author Paul Eggert <eggert@cs.ucla.edu>
date Sun, 14 Oct 2012 22:31:28 -0700
parents 229b0ba52946
children 3ae14a5da4df
files ChangeLog lib/at-func.c modules/faccessat modules/fchmodat modules/fchownat modules/fstatat modules/mkdirat modules/openat modules/unlinkat
diffstat 9 files changed, 36 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2012-10-14  Paul Eggert  <eggert@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,
--- 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 @@
   if (saved_errno)
     errno = saved_errno;
   return err;
+  }
+#endif
 }
 #undef CALL_FUNC
 #undef FUNC_RESULT
--- a/modules/faccessat
+++ b/modules/faccessat
@@ -4,7 +4,6 @@
 Files:
 lib/faccessat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/faccessat.m4
 
 Depends-on:
--- a/modules/fchmodat
+++ b/modules/fchmodat
@@ -4,7 +4,6 @@
 Files:
 lib/fchmodat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/fchmodat.m4
 
 Depends-on:
--- a/modules/fchownat
+++ b/modules/fchownat
@@ -4,7 +4,6 @@
 Files:
 lib/fchownat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/fchownat.m4
 
 Depends-on:
--- a/modules/fstatat
+++ b/modules/fstatat
@@ -4,7 +4,6 @@
 Files:
 lib/fstatat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/fstatat.m4
 m4/lstat.m4
 
--- a/modules/mkdirat
+++ b/modules/mkdirat
@@ -4,7 +4,6 @@
 Files:
 lib/mkdirat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/mkdirat.m4
 
 Depends-on:
--- a/modules/openat
+++ b/modules/openat
@@ -3,7 +3,6 @@
 
 Files:
 lib/openat.c
-lib/openat-priv.h
 m4/openat.m4
 m4/lstat.m4
 m4/mode_t.m4
--- a/modules/unlinkat
+++ b/modules/unlinkat
@@ -4,7 +4,6 @@
 Files:
 lib/unlinkat.c
 lib/at-func.c
-lib/openat-priv.h
 m4/unlinkat.m4
 m4/lstat.m4