1# getcwd.m4 - check for working getcwd that is compatible with glibc 2 3# Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc. 4# This file is free software; the Free Software Foundation 5# gives unlimited permission to copy and/or distribute it, 6# with or without modifications, as long as this notice is preserved. 7 8# Written by Paul Eggert. 9# serial 19 10 11AC_DEFUN([gl_FUNC_GETCWD_NULL], 12 [ 13 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 14 AC_CHECK_HEADERS_ONCE([unistd.h]) 15 AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result], 16 [gl_cv_func_getcwd_null], 17 [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ 18# include <stdlib.h> 19# if HAVE_UNISTD_H 20# include <unistd.h> 21# else /* on Windows with MSVC */ 22# include <direct.h> 23# endif 24 ]GL_MDA_DEFINES[ 25# ifndef getcwd 26 char *getcwd (); 27# endif 28]], [[ 29#if defined _WIN32 && ! defined __CYGWIN__ 30/* mingw cwd does not start with '/', but _getcwd does allocate. 31 However, mingw fails to honor non-zero size. */ 32#else 33 if (chdir ("/") != 0) 34 return 1; 35 else 36 { 37 char *f = getcwd (NULL, 0); 38 if (! f) 39 return 2; 40 if (f[0] != '/') 41 { free (f); return 3; } 42 if (f[1] != '\0') 43 { free (f); return 4; } 44 free (f); 45 return 0; 46 } 47#endif 48 ]])], 49 [gl_cv_func_getcwd_null=yes], 50 [gl_cv_func_getcwd_null=no], 51 [[case "$host_os" in 52 # Guess yes on glibc systems. 53 *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";; 54 # Guess yes on musl systems. 55 *-musl*) gl_cv_func_getcwd_null="guessing yes";; 56 # Guess yes on Cygwin. 57 cygwin*) gl_cv_func_getcwd_null="guessing yes";; 58 # If we don't know, obey --enable-cross-guesses. 59 *) gl_cv_func_getcwd_null="$gl_cross_guess_normal";; 60 esac 61 ]])]) 62]) 63 64AC_DEFUN([gl_FUNC_GETCWD_SIGNATURE], 65[ 66 AC_CACHE_CHECK([for getcwd with POSIX signature], 67 [gl_cv_func_getcwd_posix_signature], 68 [AC_COMPILE_IFELSE( 69 [AC_LANG_PROGRAM( 70 [[#include <unistd.h> 71 ]GL_MDA_DEFINES], 72 [[extern 73 #ifdef __cplusplus 74 "C" 75 #endif 76 char *getcwd (char *, size_t); 77 ]]) 78 ], 79 [gl_cv_func_getcwd_posix_signature=yes], 80 [gl_cv_func_getcwd_posix_signature=no]) 81 ]) 82]) 83 84dnl Guarantee that getcwd will malloc with a NULL first argument. Assumes 85dnl that either the system getcwd is robust, or that calling code is okay 86dnl with spurious failures when run from a directory with an absolute name 87dnl larger than 4k bytes. 88dnl 89dnl Assumes that getcwd exists; if you are worried about obsolete 90dnl platforms that lacked getcwd(), then you need to use the GPL module. 91AC_DEFUN([gl_FUNC_GETCWD_LGPL], 92[ 93 AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) 94 AC_REQUIRE([gl_FUNC_GETCWD_NULL]) 95 AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE]) 96 97 case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in 98 *yes,yes) ;; 99 *) 100 dnl Minimal replacement lib/getcwd-lgpl.c. 101 REPLACE_GETCWD=1 102 ;; 103 esac 104]) 105 106dnl Check for all known getcwd bugs; useful for a program likely to be 107dnl executed from an arbitrary location. 108AC_DEFUN([gl_FUNC_GETCWD], 109[ 110 AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) 111 AC_REQUIRE([gl_FUNC_GETCWD_NULL]) 112 AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE]) 113 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 114 115 gl_abort_bug=no 116 case "$host_os" in 117 mingw*) 118 gl_cv_func_getcwd_path_max=yes 119 ;; 120 *) 121 gl_FUNC_GETCWD_PATH_MAX 122 case "$gl_cv_func_getcwd_null" in 123 *yes) 124 gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes]) 125 ;; 126 esac 127 ;; 128 esac 129 dnl Define HAVE_MINIMALLY_WORKING_GETCWD and HAVE_PARTLY_WORKING_GETCWD 130 dnl if appropriate. 131 case "$gl_cv_func_getcwd_path_max" in 132 *"no" | *"no, it has the AIX bug") ;; 133 *) 134 AC_DEFINE([HAVE_MINIMALLY_WORKING_GETCWD], [1], 135 [Define to 1 if getcwd minimally works, that is, its result can be 136 trusted when it succeeds.]) 137 ;; 138 esac 139 case "$gl_cv_func_getcwd_path_max" in 140 *"no, but it is partly working") 141 AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1], 142 [Define to 1 if getcwd works, except it sometimes fails when it 143 shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.]) 144 ;; 145 *"yes, but with shorter paths") 146 AC_DEFINE([HAVE_GETCWD_SHORTER], [1], 147 [Define to 1 if getcwd works, but with shorter paths 148 than is generally tested with the replacement.]) 149 ;; 150 esac 151 152 if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \ 153 || test $gl_cv_func_getcwd_posix_signature != yes \ 154 || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \ 155 || test $gl_abort_bug = yes; then 156 REPLACE_GETCWD=1 157 fi 158]) 159 160# Prerequisites of lib/getcwd.c, when full replacement is in effect. 161AC_DEFUN([gl_PREREQ_GETCWD], 162[ 163 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) 164 AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO]) 165 : 166]) 167