| 1 | # getcwd.m4 - check for working getcwd that is compatible with glibc
|
|---|
| 2 |
|
|---|
| 3 | # Copyright (C) 2001, 2003-2007, 2009-2021 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 |
|
|---|
| 11 | AC_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 |
|
|---|
| 64 | AC_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 |
|
|---|
| 84 | dnl Guarantee that getcwd will malloc with a NULL first argument. Assumes
|
|---|
| 85 | dnl that either the system getcwd is robust, or that calling code is okay
|
|---|
| 86 | dnl with spurious failures when run from a directory with an absolute name
|
|---|
| 87 | dnl larger than 4k bytes.
|
|---|
| 88 | dnl
|
|---|
| 89 | dnl Assumes that getcwd exists; if you are worried about obsolete
|
|---|
| 90 | dnl platforms that lacked getcwd(), then you need to use the GPL module.
|
|---|
| 91 | AC_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 |
|
|---|
| 106 | dnl Check for all known getcwd bugs; useful for a program likely to be
|
|---|
| 107 | dnl executed from an arbitrary location.
|
|---|
| 108 | AC_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.
|
|---|
| 161 | AC_DEFUN([gl_PREREQ_GETCWD],
|
|---|
| 162 | [
|
|---|
| 163 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
|---|
| 164 | AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
|
|---|
| 165 | :
|
|---|
| 166 | ])
|
|---|