summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--lib/openat.h10
-rw-r--r--lib/statat.c2
-rw-r--r--modules/fstatat5
-rw-r--r--modules/statat23
-rw-r--r--modules/statat-tests12
-rw-r--r--tests/test-fstatat.c12
-rw-r--r--tests/test-statat.c27
8 files changed, 97 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 61b629e612..16f8af08e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2013-01-23 Paul Eggert <eggert@cs.ucla.edu>
+
+ statat: new module, split out from fstatat
+ GNU Emacs needs the POSIX-specified fstatat, but not the
+ gnulib-specified statat and lstat. Split the latter two into a
+ new module 'statat'.
+ * lib/openat.h: Depend on GNULIB_STATAT, not GNULIB_FSTATAT.
+ * lib/openat.h, lib/statat.c (STATAT_INLINE):
+ Rename from FSTATAT_INLINE. All uses changed.
+ * modules/fstatat (Files): Remove lib/statat.c.
+ (gl_MODULE_INDICATOR([fstatat])): Remove.
+ (lib_SOURCES): Remove.
+ (Maintainer): Add self.
+ * modules/statat, modules/statat-tests, tests/test-statat.c: New files.
+ * tests/test-fstatat.c (BASE): Don't define if already defined.
+ (do_stat, do_lstat) [!TEST_STATAT]: Test fstatat instead.
+
2013-01-22 Paul Eggert <eggert@cs.ucla.edu>
tests: don't assume fd 99 is closed
diff --git a/lib/openat.h b/lib/openat.h
index bf1e8937fa..eb90990da1 100644
--- a/lib/openat.h
+++ b/lib/openat.h
@@ -89,19 +89,19 @@ lchmodat (int fd, char const *file, mode_t mode)
#endif
-#if GNULIB_FSTATAT
+#if GNULIB_STATAT
-# ifndef FSTATAT_INLINE
-# define FSTATAT_INLINE _GL_INLINE
+# ifndef STATAT_INLINE
+# define STATAT_INLINE _GL_INLINE
# endif
-FSTATAT_INLINE int
+STATAT_INLINE int
statat (int fd, char const *name, struct stat *st)
{
return fstatat (fd, name, st, 0);
}
-FSTATAT_INLINE int
+STATAT_INLINE int
lstatat (int fd, char const *name, struct stat *st)
{
return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
diff --git a/lib/statat.c b/lib/statat.c
index 28e21fecbb..8cdb17e4f4 100644
--- a/lib/statat.c
+++ b/lib/statat.c
@@ -1,3 +1,3 @@
#include <config.h>
-#define FSTATAT_INLINE _GL_EXTERN_INLINE
+#define STATAT_INLINE _GL_EXTERN_INLINE
#include "openat.h"
diff --git a/modules/fstatat b/modules/fstatat
index 7aa99b8f7b..3d25cc8ec4 100644
--- a/modules/fstatat
+++ b/modules/fstatat
@@ -3,7 +3,6 @@ fstatat() function: Return information about a file at a directory.
Files:
lib/fstatat.c
-lib/statat.c
lib/at-func.c
m4/fstatat.m4
m4/lstat.m4
@@ -27,11 +26,9 @@ gl_FUNC_FSTATAT
if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
AC_LIBOBJ([fstatat])
fi
-gl_MODULE_INDICATOR([fstatat]) dnl for lib/openat.h
gl_SYS_STAT_MODULE_INDICATOR([fstatat])
Makefile.am:
-lib_SOURCES += statat.c
Include:
<sys/stat.h>
@@ -40,4 +37,4 @@ License:
GPL
Maintainer:
-Jim Meyering, Eric Blake
+Jim Meyering, Eric Blake, Paul Eggert
diff --git a/modules/statat b/modules/statat
new file mode 100644
index 0000000000..074d342bd8
--- /dev/null
+++ b/modules/statat
@@ -0,0 +1,23 @@
+Description:
+statat() and lstatat() functions: Return info about a file at a directory.
+
+Files:
+lib/statat.c
+
+Depends-on:
+fstatat
+
+configure.ac:
+gl_MODULE_INDICATOR([statat]) dnl for lib/openat.h
+
+Makefile.am:
+lib_SOURCES += statat.c
+
+Include:
+"openat.h"
+
+License:
+GPL
+
+Maintainer:
+Jim Meyering, Eric Blake, Paul Eggert
diff --git a/modules/statat-tests b/modules/statat-tests
new file mode 100644
index 0000000000..3264dd2c7f
--- /dev/null
+++ b/modules/statat-tests
@@ -0,0 +1,12 @@
+Files:
+tests/test-statat.c
+
+Depends-on:
+fstatat-tests
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-statat
+check_PROGRAMS += test-statat
+test_statat_LDADD = $(LDADD) @LIBINTL@
diff --git a/tests/test-fstatat.c b/tests/test-fstatat.c
index 83e184f025..9fdbe2e6eb 100644
--- a/tests/test-fstatat.c
+++ b/tests/test-fstatat.c
@@ -36,7 +36,9 @@ SIGNATURE_CHECK (fstatat, int, (int, char const *, struct stat *, int));
#include "ignore-value.h"
#include "macros.h"
-#define BASE "test-fstatat.t"
+#ifndef BASE
+# define BASE "test-fstatat.t"
+#endif
#include "test-lstat.h"
#include "test-stat.h"
@@ -47,14 +49,22 @@ static int dfd = AT_FDCWD;
static int
do_stat (char const *name, struct stat *st)
{
+#ifdef TEST_STATAT
return statat (dfd, name, st);
+#else
+ return fstatat (dfd, name, st, 0);
+#endif
}
/* Wrapper around fstatat to test lstat behavior. */
static int
do_lstat (char const *name, struct stat *st)
{
+#ifdef TEST_STATAT
return lstatat (dfd, name, st);
+#else
+ return fstatat (dfd, name, st, AT_SYMLINK_NOFOLLOW);
+#endif
}
int
diff --git a/tests/test-statat.c b/tests/test-statat.c
new file mode 100644
index 0000000000..4adb3ab73d
--- /dev/null
+++ b/tests/test-statat.c
@@ -0,0 +1,27 @@
+/* Tests of statat and lstatat.
+ Copyright (C) 2009-2013 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include "signature.h"
+SIGNATURE_CHECK (statat, int, (int, char const *, struct stat *));
+SIGNATURE_CHECK (lstatat, int, (int, char const *, struct stat *));
+
+#define BASE "test-statat.t"
+#define TEST_STATAT
+#include "test-fstatat.c"