X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fgetcwd-path-max.m4;h=4bc8ab70fb340cb0db9265af7c0afa5bcaaedadc;hb=ea7d603eef9c64353a08ffe0243e1e3aac9edd99;hp=ec2063d656c4ca19d043cbc6d102d7e76a6253c2;hpb=f3b23269e922ab27aaa589ec79f24593338c421c;p=gnulib.git diff --git a/m4/getcwd-path-max.m4 b/m4/getcwd-path-max.m4 index ec2063d65..4bc8ab70f 100644 --- a/m4/getcwd-path-max.m4 +++ b/m4/getcwd-path-max.m4 @@ -1,40 +1,29 @@ -#serial 5 -# Check for several getcwd bugs with long paths. +#serial 11 +# Check for several getcwd bugs with long file names. # If so, arrange to compile the wrapper function. # This is necessary for at least GNU libc on linux-2.4.19 and 2.4.20. # I've heard that this is due to a Linux kernel bug, and that it has # been fixed between 2.4.21-pre3 and 2.4.21-pre4. */ -# Copyright (C) 2003, 2004 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. # From Jim Meyering AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX], [ AC_CHECK_DECLS_ONCE(getcwd) - AC_CHECK_HEADERS_ONCE(fcntl.h) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_CACHE_CHECK([whether getcwd handles long paths properly], - gl_cv_func_getcwd_path_max, - [ - # Arrange for deletion of the temporary directory this test creates. - ac_clean_files="$ac_clean_files confdir3" - AC_RUN_IFELSE([AC_LANG_SOURCE([[ + AC_CACHE_CHECK([whether getcwd handles long file names properly], + gl_cv_func_getcwd_path_max, + [# Arrange for deletion of the temporary directory this test creates. + ac_clean_files="$ac_clean_files confdir3" + AC_RUN_IFELSE( + [AC_LANG_SOURCE( + [[ #include #include #include @@ -42,9 +31,7 @@ AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX], #include #include #include -#if HAVE_FCNTL_H -# include -#endif +#include #ifndef AT_FDCWD # define AT_FDCWD 0 @@ -74,7 +61,7 @@ AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX], #define BUF_SLOP 20 int -main (void) +main () { #ifndef PATH_MAX /* The Hurd doesn't define this, so getcwd can't exhibit the bug -- @@ -108,22 +95,31 @@ main (void) char *c = NULL; cwd_len += DIR_NAME_SIZE; - /* If mkdir or chdir fails, be pessimistic and consider that - as a failure, too. */ + /* If mkdir or chdir fails, it could be that this system cannot create + any file with an absolute name longer than PATH_MAX, such as cygwin. + If so, leave fail as 0, because the current working directory can't + be too long for getcwd if it can't even be created. For other + errors, be pessimistic and consider that as a failure, too. */ if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0) { - fail = 1; + if (! (errno == ERANGE || is_ENAMETOOLONG (errno))) + fail = 2; break; } if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE) { c = getcwd (buf, PATH_MAX); - if (c || errno != ERANGE) + if (!c && errno == ENOENT) { fail = 1; break; } + if (c || ! (errno == ERANGE || is_ENAMETOOLONG (errno))) + { + fail = 2; + break; + } } if (dotdot_max <= cwd_len - initial_cwd_len) @@ -131,16 +127,25 @@ main (void) if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len) break; c = getcwd (buf, cwd_len + 1); - if (!c && (AT_FDCWD || !is_ENAMETOOLONG (errno))) + if (!c) { - fail = 1; - break; + if (! (errno == ERANGE || errno == ENOENT + || is_ENAMETOOLONG (errno))) + { + fail = 2; + break; + } + if (AT_FDCWD || errno == ERANGE || errno == ENOENT) + { + fail = 1; + break; + } } } if (c && strlen (c) != cwd_len) { - fail = 1; + fail = 2; break; } ++n_chdirs; @@ -165,8 +170,20 @@ main (void) exit (fail); #endif } - ]])], - [gl_cv_func_getcwd_path_max=yes], - [gl_cv_func_getcwd_path_max=no], - [gl_cv_func_getcwd_path_max=no])]) + ]])], + [gl_cv_func_getcwd_path_max=yes], + [case $? in + 1) gl_cv_func_getcwd_path_max='no, but it is partly working';; + *) gl_cv_func_getcwd_path_max=no;; + esac], + [gl_cv_func_getcwd_path_max=no]) + ]) + case $gl_cv_func_getcwd_path_max in + no,*) + AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], 1, + [Define to 1 if getcwd works, except it sometimes fails when it shouldn't, + setting errno to ERANGE, ENAMETOOLONG, or ENOENT. If __GETCWD_PREFIX + is not defined, it doesn't matter whether HAVE_PARTLY_WORKING_GETCWD + is defined.]);; + esac ])