Simon Josefsson wrote: > After applying it, getcwd builds and passes > selftests [1], so please push it.
Great! Thanks for the testing. Paul Eggert wrote: > the pathmax.h comment suggests a fallback of 8192, > but the code uses 1024; I suggest making them consistent. Good point. Actually the best value depends on the use of this value: as a bounds or array size or threshold. I've added comments at each point. 2011-08-04 Bruno Haible <br...@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. --- NEWS.orig Fri Aug 5 02:50:42 2011 +++ NEWS Thu Aug 4 03:39:55 2011 @@ -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 --- doc/posix-headers/limits.texi.orig Fri Aug 5 02:50:42 2011 +++ doc/posix-headers/limits.texi Thu Aug 4 03:58:33 2011 @@ -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. --- lib/canonicalize.c.orig Fri Aug 5 02:50:42 2011 +++ lib/canonicalize.c Thu Aug 4 12:28:55 2011 @@ -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 --- lib/chdir-long.h.orig Fri Aug 5 02:50:42 2011 +++ lib/chdir-long.h Thu Aug 4 03:31:35 2011 @@ -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. */ --- lib/clean-temp.c.orig Fri Aug 5 02:50:42 2011 +++ lib/clean-temp.c Thu Aug 4 12:32:13 2011 @@ -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 --- lib/getcwd.c.orig Fri Aug 5 02:50:42 2011 +++ lib/getcwd.c Thu Aug 4 12:33:39 2011 @@ -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 --- lib/pathmax.h.orig Fri Aug 5 02:50:42 2011 +++ lib/pathmax.h Thu Aug 4 03:29:29 2011 @@ -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. --- lib/tmpfile.c.orig Fri Aug 5 02:50:42 2011 +++ lib/tmpfile.c Thu Aug 4 12:43:24 2011 @@ -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. --- m4/pathmax.m4.orig Fri Aug 5 02:50:42 2011 +++ m4/pathmax.m4 Thu Aug 4 03:18:49 2011 @@ -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]) ]) --- modules/chdir-long.orig Fri Aug 5 02:50:42 2011 +++ modules/chdir-long Thu Aug 4 03:31:23 2011 @@ -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] --- modules/getcwd.orig Fri Aug 5 02:50:42 2011 +++ modules/getcwd Thu Aug 4 03:34:12 2011 @@ -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] --- tests/test-getcwd.c.orig Fri Aug 5 02:50:42 2011 +++ tests/test-getcwd.c Thu Aug 4 03:37:48 2011 @@ -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)