Blame m4/getcwd.m4

Packit aea12f
# getcwd.m4 - check for working getcwd that is compatible with glibc
Packit aea12f
Packit Service 991b93
# Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
Packit aea12f
# This file is free software; the Free Software Foundation
Packit aea12f
# gives unlimited permission to copy and/or distribute it,
Packit aea12f
# with or without modifications, as long as this notice is preserved.
Packit aea12f
Packit aea12f
# Written by Paul Eggert.
Packit Service 991b93
# serial 18
Packit aea12f
Packit aea12f
AC_DEFUN([gl_FUNC_GETCWD_NULL],
Packit aea12f
  [
Packit aea12f
   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit aea12f
   AC_CHECK_HEADERS_ONCE([unistd.h])
Packit aea12f
   AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
Packit aea12f
     [gl_cv_func_getcwd_null],
Packit aea12f
     [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
Packit aea12f
#	 include <stdlib.h>
Packit aea12f
#        if HAVE_UNISTD_H
Packit aea12f
#         include <unistd.h>
Packit aea12f
#        else /* on Windows with MSVC */
Packit aea12f
#         include <direct.h>
Packit aea12f
#        endif
Packit aea12f
#        ifndef getcwd
Packit aea12f
         char *getcwd ();
Packit aea12f
#        endif
Packit aea12f
]], [[
Packit aea12f
#if defined _WIN32 && ! defined __CYGWIN__
Packit aea12f
/* mingw cwd does not start with '/', but getcwd does allocate.
Packit aea12f
   However, mingw fails to honor non-zero size.  */
Packit aea12f
#else
Packit aea12f
           if (chdir ("/") != 0)
Packit aea12f
             return 1;
Packit aea12f
           else
Packit aea12f
             {
Packit aea12f
               char *f = getcwd (NULL, 0);
Packit aea12f
               if (! f)
Packit aea12f
                 return 2;
Packit aea12f
               if (f[0] != '/')
Packit aea12f
                 { free (f); return 3; }
Packit aea12f
               if (f[1] != '\0')
Packit aea12f
                 { free (f); return 4; }
Packit aea12f
               free (f);
Packit aea12f
               return 0;
Packit aea12f
             }
Packit aea12f
#endif
Packit aea12f
         ]])],
Packit aea12f
        [gl_cv_func_getcwd_null=yes],
Packit aea12f
        [gl_cv_func_getcwd_null=no],
Packit aea12f
        [[case "$host_os" in
Packit aea12f
                           # Guess yes on glibc systems.
Packit aea12f
            *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";;
Packit aea12f
                           # Guess yes on musl systems.
Packit aea12f
            *-musl*)       gl_cv_func_getcwd_null="guessing yes";;
Packit aea12f
                           # Guess yes on Cygwin.
Packit aea12f
            cygwin*)       gl_cv_func_getcwd_null="guessing yes";;
Packit Service 991b93
                           # If we don't know, obey --enable-cross-guesses.
Packit Service 991b93
            *)             gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
Packit aea12f
          esac
Packit aea12f
        ]])])
Packit aea12f
])
Packit aea12f
Packit aea12f
AC_DEFUN([gl_FUNC_GETCWD_SIGNATURE],
Packit aea12f
[
Packit aea12f
  AC_CACHE_CHECK([for getcwd with POSIX signature],
Packit aea12f
    [gl_cv_func_getcwd_posix_signature],
Packit aea12f
    [AC_COMPILE_IFELSE(
Packit aea12f
      [AC_LANG_PROGRAM(
Packit aea12f
         [[#include <unistd.h>]],
Packit aea12f
         [[extern
Packit aea12f
           #ifdef __cplusplus
Packit aea12f
           "C"
Packit aea12f
           #endif
Packit aea12f
           char *getcwd (char *, size_t);
Packit aea12f
         ]])
Packit aea12f
      ],
Packit aea12f
      [gl_cv_func_getcwd_posix_signature=yes],
Packit aea12f
      [gl_cv_func_getcwd_posix_signature=no])
Packit aea12f
   ])
Packit aea12f
])
Packit aea12f
Packit aea12f
dnl Guarantee that getcwd will malloc with a NULL first argument.  Assumes
Packit aea12f
dnl that either the system getcwd is robust, or that calling code is okay
Packit aea12f
dnl with spurious failures when run from a directory with an absolute name
Packit aea12f
dnl larger than 4k bytes.
Packit aea12f
dnl
Packit aea12f
dnl Assumes that getcwd exists; if you are worried about obsolete
Packit aea12f
dnl platforms that lacked getcwd(), then you need to use the GPL module.
Packit aea12f
AC_DEFUN([gl_FUNC_GETCWD_LGPL],
Packit aea12f
[
Packit aea12f
  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
Packit aea12f
  AC_REQUIRE([gl_FUNC_GETCWD_NULL])
Packit aea12f
  AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
Packit aea12f
Packit aea12f
  case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
Packit aea12f
  *yes,yes) ;;
Packit aea12f
  *)
Packit aea12f
    dnl Minimal replacement lib/getcwd-lgpl.c.
Packit aea12f
    REPLACE_GETCWD=1
Packit aea12f
    ;;
Packit aea12f
  esac
Packit aea12f
])
Packit aea12f
Packit aea12f
dnl Check for all known getcwd bugs; useful for a program likely to be
Packit aea12f
dnl executed from an arbitrary location.
Packit aea12f
AC_DEFUN([gl_FUNC_GETCWD],
Packit aea12f
[
Packit aea12f
  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
Packit aea12f
  AC_REQUIRE([gl_FUNC_GETCWD_NULL])
Packit aea12f
  AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
Packit aea12f
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit aea12f
Packit aea12f
  gl_abort_bug=no
Packit aea12f
  case "$host_os" in
Packit aea12f
    mingw*)
Packit aea12f
      gl_cv_func_getcwd_path_max=yes
Packit aea12f
      ;;
Packit aea12f
    *)
Packit aea12f
      gl_FUNC_GETCWD_PATH_MAX
Packit aea12f
      case "$gl_cv_func_getcwd_null" in
Packit aea12f
        *yes)
Packit aea12f
          gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes])
Packit aea12f
          ;;
Packit aea12f
      esac
Packit aea12f
      ;;
Packit aea12f
  esac
Packit aea12f
  dnl Define HAVE_MINIMALLY_WORKING_GETCWD and HAVE_PARTLY_WORKING_GETCWD
Packit aea12f
  dnl if appropriate.
Packit aea12f
  case "$gl_cv_func_getcwd_path_max" in
Packit Service 991b93
    *"no" | *"no, it has the AIX bug") ;;
Packit aea12f
    *)
Packit aea12f
      AC_DEFINE([HAVE_MINIMALLY_WORKING_GETCWD], [1],
Packit aea12f
        [Define to 1 if getcwd minimally works, that is, its result can be
Packit aea12f
         trusted when it succeeds.])
Packit aea12f
      ;;
Packit aea12f
  esac
Packit aea12f
  case "$gl_cv_func_getcwd_path_max" in
Packit Service 991b93
    *"no, but it is partly working")
Packit aea12f
      AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1],
Packit aea12f
        [Define to 1 if getcwd works, except it sometimes fails when it
Packit aea12f
         shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.])
Packit aea12f
      ;;
Packit Service 991b93
    *"yes, but with shorter paths")
Packit aea12f
      AC_DEFINE([HAVE_GETCWD_SHORTER], [1],
Packit aea12f
        [Define to 1 if getcwd works, but with shorter paths
Packit aea12f
         than is generally tested with the replacement.])
Packit aea12f
      ;;
Packit aea12f
  esac
Packit aea12f
Packit aea12f
  if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
Packit aea12f
     || test $gl_cv_func_getcwd_posix_signature != yes \
Packit aea12f
     || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
Packit aea12f
     || test $gl_abort_bug = yes; then
Packit aea12f
    REPLACE_GETCWD=1
Packit aea12f
  fi
Packit aea12f
])
Packit aea12f
Packit aea12f
# Prerequisites of lib/getcwd.c, when full replacement is in effect.
Packit aea12f
AC_DEFUN([gl_PREREQ_GETCWD],
Packit aea12f
[
Packit aea12f
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
Packit aea12f
  AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
Packit aea12f
  :
Packit aea12f
])