Blame m4/getcwd.m4

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