changeset 15496:451ec8bd8a1c

pathmax: Leave PATH_MAX undefined on the Hurd, and a constant otherwise. * lib/pathmax.h (PATH_MAX): Leave it undefined on GNU/Hurd. * lib/chdir-long.h: Include pathmax.h. * lib/clean-temp.c (PATH_MAX): Remove code that is done by pathmax.h. * lib/getcwd.c: Include pathmax.h instead of <limits.h>. (PATH_MAX): Remove code that is done by pathmax.h. * lib/canonicalize.c (PATH_MAX): Provide a fallback value. * lib/tmpfile.c: Add a comment. * m4/pathmax.m4 (gl_PATHMAX): Don't test for pathconf. * modules/chdir-long (Depends-on): Add pathmax. * modules/getcwd (Depends-on): Add pathmax. * tests/test-getcwd.c (test_abort_bug): Avoid syntax error when PATH_MAX is not defined. * doc/posix-headers/limits.texi: Mention the pathmax module. * NEWS: Mention the change.
author Bruno Haible <bruno@clisp.org>
date Fri, 05 Aug 2011 03:01:01 +0200
parents c619eb6cb037
children f0519932c5eb
files ChangeLog NEWS doc/posix-headers/limits.texi lib/canonicalize.c lib/chdir-long.h lib/clean-temp.c lib/getcwd.c lib/pathmax.h lib/tmpfile.c m4/pathmax.m4 modules/chdir-long modules/getcwd tests/test-getcwd.c
diffstat 13 files changed, 66 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2011-08-04  Bruno Haible  <bruno@clisp.org>
+
+	pathmax: Leave PATH_MAX undefined on the Hurd, and a constant otherwise.
+	* lib/pathmax.h (PATH_MAX): Leave it undefined on GNU/Hurd.
+	* lib/chdir-long.h: Include pathmax.h.
+	* lib/clean-temp.c (PATH_MAX): Remove code that is done by pathmax.h.
+	* lib/getcwd.c: Include pathmax.h instead of <limits.h>.
+	(PATH_MAX): Remove code that is done by pathmax.h.
+	* lib/canonicalize.c (PATH_MAX): Provide a fallback value.
+	* lib/tmpfile.c: Add a comment.
+	* m4/pathmax.m4 (gl_PATHMAX): Don't test for pathconf.
+	* modules/chdir-long (Depends-on): Add pathmax.
+	* modules/getcwd (Depends-on): Add pathmax.
+	* tests/test-getcwd.c (test_abort_bug): Avoid syntax error when PATH_MAX
+	is not defined.
+	* doc/posix-headers/limits.texi: Mention the pathmax module.
+	* NEWS: Mention the change.
+
 2011-08-02  Bruno Haible  <bruno@clisp.org>
 
 	pthread_sigmask: Actually use results of gl_THREADLIB.
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,11 @@
 
 Date        Modules         Changes
 
+2011-08-04  pathmax         The header file "pathmax.h" no longer defines
+                            PATH_MAX on GNU/Hurd. Please use one of the methods
+                            listed in pathmax.h to ensure your package is
+                            portable to GNU/Hurd.
+
 2011-07-24  close           This module no longer pulls in the 'fclose' module.
                             If your code creates a socket descriptor using
                             socket() or accept(), then a FILE stream referring
--- a/doc/posix-headers/limits.texi
+++ b/doc/posix-headers/limits.texi
@@ -15,3 +15,7 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @end itemize
+
+For @code{PATH_MAX}, Gnulib provides a module @code{pathmax} with a header
+file @code{"pathmax.h"}.  It defines @code{PATH_MAX} to a constant on
+platforms with a file name length limit.
--- a/lib/canonicalize.c
+++ b/lib/canonicalize.c
@@ -31,6 +31,12 @@
 #include "xalloc.h"
 #include "xgetcwd.h"
 
+/* In this file, we cannot handle file names longer than PATH_MAX.
+   On systems with no file name length limit, use a fallback.  */
+#ifndef PATH_MAX
+# define PATH_MAX 8192
+#endif
+
 #ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
 # define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
 #endif
--- a/lib/chdir-long.h
+++ b/lib/chdir-long.h
@@ -19,11 +19,7 @@
 #include <unistd.h>
 #include <limits.h>
 
-#ifndef PATH_MAX
-# ifdef MAXPATHLEN
-#  define PATH_MAX MAXPATHLEN
-# endif
-#endif
+#include "pathmax.h"
 
 /* On systems without PATH_MAX, presume that chdir accepts
    arbitrarily long directory names.  */
--- a/lib/clean-temp.c
+++ b/lib/clean-temp.c
@@ -59,13 +59,10 @@
 
 #define _(str) gettext (str)
 
-/* GNU Hurd doesn't have PATH_MAX.  */
+/* GNU Hurd doesn't have PATH_MAX.  Use a fallback.
+   Temporary directory names are usually not that long.  */
 #ifndef PATH_MAX
-# ifdef MAXPATHLEN
-#  define PATH_MAX MAXPATHLEN
-# else
-#  define PATH_MAX 1024
-# endif
+# define PATH_MAX 1024
 #endif
 
 #ifndef uintptr_t
--- a/lib/getcwd.c
+++ b/lib/getcwd.c
@@ -57,8 +57,6 @@
 # endif
 #endif
 
-#include <limits.h>
-
 #ifndef MAX
 # define MAX(a, b) ((a) < (b) ? (b) : (a))
 #endif
@@ -66,12 +64,12 @@
 # define MIN(a, b) ((a) < (b) ? (a) : (b))
 #endif
 
+#include "pathmax.h"
+
+/* In this file, PATH_MAX only serves as a threshold for choosing among two
+   algorithms.  */
 #ifndef PATH_MAX
-# ifdef MAXPATHLEN
-#  define PATH_MAX MAXPATHLEN
-# else
-#  define PATH_MAX 1024
-# endif
+# define PATH_MAX 8192
 #endif
 
 #if D_INO_IN_DIRENT
--- a/lib/pathmax.h
+++ b/lib/pathmax.h
@@ -23,7 +23,22 @@
    including the terminating NUL byte.
    <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html>
    PATH_MAX is not defined on systems which have no limit on filename length,
-   such as GNU/Hurd.  */
+   such as GNU/Hurd.
+
+   This file does *not* define PATH_MAX always.  Programs that use this file
+   can handle the GNU/Hurd case in several ways:
+     - Either with a package-wide handling, or with a per-file handling,
+     - Either through a
+         #ifdef PATH_MAX
+       or through a fallback like
+         #ifndef PATH_MAX
+         # define PATH_MAX 8192
+         #endif
+       or through a fallback like
+         #ifndef PATH_MAX
+         # define PATH_MAX pathconf ("/", _PC_PATH_MAX)
+         #endif
+ */
 
 # include <unistd.h>
 
@@ -33,11 +48,6 @@
 #  define _POSIX_PATH_MAX 256
 # endif
 
-# if !defined PATH_MAX && defined _PC_PATH_MAX && defined HAVE_PATHCONF
-#  define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
-                    : pathconf ("/", _PC_PATH_MAX))
-# endif
-
 /* Don't include sys/param.h if it already has been.  */
 # if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
 #  include <sys/param.h>
@@ -47,10 +57,6 @@
 #  define PATH_MAX MAXPATHLEN
 # endif
 
-# ifndef PATH_MAX
-#  define PATH_MAX _POSIX_PATH_MAX
-# endif
-
 # ifdef __hpux
 /* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename,
    *not* including the terminating NUL byte, and is set to 1023.
--- a/lib/tmpfile.c
+++ b/lib/tmpfile.c
@@ -37,6 +37,9 @@
 #include "tempname.h"
 #include "tmpdir.h"
 
+/* PATH_MAX is guaranteed to be defined, because this replacement is only
+   used on native Windows.  */
+
 /* On Windows, opening a file with _O_TEMPORARY has the effect of passing
    the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
    of deleting the file when it is closed - even when the program crashes.
--- a/m4/pathmax.m4
+++ b/m4/pathmax.m4
@@ -1,4 +1,4 @@
-# pathmax.m4 serial 8
+# pathmax.m4 serial 9
 dnl Copyright (C) 2002-2003, 2005-2006, 2009-2011 Free Software Foundation,
 dnl Inc.
 dnl This file is free software; the Free Software Foundation
@@ -8,6 +8,5 @@
 AC_DEFUN([gl_PATHMAX],
 [
   dnl Prerequisites of lib/pathmax.h.
-  AC_CHECK_FUNCS_ONCE([pathconf])
   AC_CHECK_HEADERS_ONCE([sys/param.h])
 ])
--- a/modules/chdir-long
+++ b/modules/chdir-long
@@ -8,6 +8,7 @@
 
 Depends-on:
 unistd
+pathmax
 atexit          [test $gl_cv_have_arbitrary_file_name_length_limit = yes]
 fchdir          [test $gl_cv_have_arbitrary_file_name_length_limit = yes]
 fcntl-h         [test $gl_cv_have_arbitrary_file_name_length_limit = yes]
--- a/modules/getcwd
+++ b/modules/getcwd
@@ -10,6 +10,7 @@
 Depends-on:
 unistd
 extensions
+pathmax         [test $REPLACE_GETCWD = 1]
 mempcpy         [test $REPLACE_GETCWD = 1]
 d-ino           [test $REPLACE_GETCWD = 1]
 memmove         [test $REPLACE_GETCWD = 1]
--- a/tests/test-getcwd.c
+++ b/tests/test-getcwd.c
@@ -49,10 +49,12 @@
   size_t desired_depth;
   size_t d;
 
+#ifdef PATH_MAX
   /* The bug is triggered when PATH_MAX < getpagesize (), so skip
      this relatively expensive and invasive test if that's not true.  */
   if (getpagesize () <= PATH_MAX)
     return 0;
+#endif
 
   cwd = getcwd (NULL, 0);
   if (cwd == NULL)