bug-gnulib
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]