* 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-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.
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
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.
#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
#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. */
#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
# endif
#endif
-#include <limits.h>
-
#ifndef MAX
# define MAX(a, b) ((a) < (b) ? (b) : (a))
#endif
# 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
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>
# 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>
# 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.
#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.
-# 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
AC_DEFUN([gl_PATHMAX],
[
dnl Prerequisites of lib/pathmax.h.
- AC_CHECK_FUNCS_ONCE([pathconf])
AC_CHECK_HEADERS_ONCE([sys/param.h])
])
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]
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]
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)