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