X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=m4%2Fgetcwd-path-max.m4;h=4630a591f7570efa1ec3e705f8672a8c2d228ece;hb=34b42e86af9d37c366a44280d2ba06ad2e2971df;hp=ecf6192842e11b38144840c6869d8c02b2c21657;hpb=29ece34f44a27750bbfd76154ad9882580453dc7;p=debian%2Ftar diff --git a/m4/getcwd-path-max.m4 b/m4/getcwd-path-max.m4 index ecf61928..4630a591 100644 --- a/m4/getcwd-path-max.m4 +++ b/m4/getcwd-path-max.m4 @@ -1,12 +1,12 @@ -# serial 14 +# serial 19 # 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. */ +# been fixed between 2.4.21-pre3 and 2.4.21-pre4. -# Copyright (C) 2003-2007, 2009-2010 Free Software Foundation, Inc. +# Copyright (C) 2003-2007, 2009-2015 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. @@ -16,23 +16,33 @@ AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX], [ AC_CHECK_DECLS_ONCE([getcwd]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + AC_CHECK_HEADERS_ONCE([unistd.h]) + AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ]) 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" + dnl Please keep this in sync with tests/test-getcwd.c. AC_RUN_IFELSE( [AC_LANG_SOURCE( [[ #include #include -#include +#if HAVE_UNISTD_H +# include +#else +# include +#endif #include #include #include #include #include +]gl_PATHMAX_SNIPPET[ + #ifndef AT_FDCWD # define AT_FDCWD 0 #endif @@ -42,6 +52,9 @@ AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX], # define is_ENAMETOOLONG(x) 0 #endif +/* Use the getcwd function, not any macro. */ +#undef getcwd + /* Don't get link errors because mkdir is redefined to rpl_mkdir. */ #undef mkdir @@ -85,7 +98,7 @@ main () size_t n_chdirs = 0; if (cwd == NULL) - exit (1); + exit (10); cwd_len = initial_cwd_len = strlen (cwd); @@ -103,21 +116,38 @@ main () if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0) { if (! (errno == ERANGE || is_ENAMETOOLONG (errno))) - fail = 2; + fail = 20; break; } if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE) { + struct stat sb; + c = getcwd (buf, PATH_MAX); if (!c && errno == ENOENT) { - fail = 1; + fail = 11; + break; + } + if (c) + { + fail = 31; break; } - if (c || ! (errno == ERANGE || is_ENAMETOOLONG (errno))) + if (! (errno == ERANGE || is_ENAMETOOLONG (errno))) + { + fail = 21; + break; + } + + /* Our replacement needs to be able to stat() long ../../paths, + so generate a path larger than PATH_MAX to check, + avoiding the replacement if we can't stat(). */ + c = getcwd (buf, cwd_len + 1); + if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno)) { - fail = 2; + fail = 32; break; } } @@ -132,12 +162,12 @@ main () if (! (errno == ERANGE || errno == ENOENT || is_ENAMETOOLONG (errno))) { - fail = 2; + fail = 22; break; } if (AT_FDCWD || errno == ERANGE || errno == ENOENT) { - fail = 1; + fail = 12; break; } } @@ -145,7 +175,7 @@ main () if (c && strlen (c) != cwd_len) { - fail = 2; + fail = 23; break; } ++n_chdirs; @@ -174,17 +204,14 @@ main () ]])], [gl_cv_func_getcwd_path_max=yes], [case $? in - 1) gl_cv_func_getcwd_path_max='no, but it is partly working';; + 10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';; + 31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';; + 32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';; *) gl_cv_func_getcwd_path_max=no;; esac], - [gl_cv_func_getcwd_path_max=no]) + [case "$host_os" in + aix*) gl_cv_func_getcwd_path_max='no, it has the AIX bug';; + *) gl_cv_func_getcwd_path_max=no;; + esac]) ]) - 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 ])