[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: PATH_MAX on the Hurd
From: |
Bruno Haible |
Subject: |
Re: PATH_MAX on the Hurd |
Date: |
Fri, 5 Aug 2011 03:02:04 +0200 |
User-agent: |
KMail/1.13.6 (Linux/2.6.37.6-0.5-desktop; KDE/4.6.0; x86_64; ; ) |
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 <address@hidden>
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)
- hurd builds, Simon Josefsson, 2011/08/03
- Re: hurd builds, Paul Eggert, 2011/08/03
- Re: PATH_MAX on the Hurd, Bruno Haible, 2011/08/03
- Re: PATH_MAX on the Hurd, Paul Eggert, 2011/08/03
- Re: PATH_MAX on the Hurd, Simon Josefsson, 2011/08/04
- Re: PATH_MAX on the Hurd,
Bruno Haible <=
- Re: PATH_MAX on the Hurd, Bruno Haible, 2011/08/04
- Re: PATH_MAX on the Hurd, Eric Blake, 2011/08/05
- Re: PATH_MAX on the Hurd, Bruno Haible, 2011/08/05
- Re: PATH_MAX on the Hurd, Paul Eggert, 2011/08/05
- Re: PATH_MAX on the Hurd, Eric Blake, 2011/08/05
- Re: PATH_MAX on the Hurd, Paul Eggert, 2011/08/05
- Re: PATH_MAX on the Hurd, Karl Berry, 2011/08/05