Home | History | Annotate | Line # | Download | only in m4
      1 # readlink.m4 serial 16
      2 dnl Copyright (C) 2003, 2007, 2009-2022 Free Software Foundation, Inc.
      3 dnl This file is free software; the Free Software Foundation
      4 dnl gives unlimited permission to copy and/or distribute it,
      5 dnl with or without modifications, as long as this notice is preserved.
      6 
      7 AC_DEFUN([gl_FUNC_READLINK],
      8 [
      9   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
     10   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
     11   AC_CHECK_FUNCS_ONCE([readlink])
     12   if test $ac_cv_func_readlink = no; then
     13     HAVE_READLINK=0
     14   else
     15     AC_CACHE_CHECK([whether readlink signature is correct],
     16       [gl_cv_decl_readlink_works],
     17       [AC_COMPILE_IFELSE(
     18          [AC_LANG_PROGRAM(
     19            [[#include <unistd.h>
     20       /* Cause compilation failure if original declaration has wrong type.  */
     21       ssize_t readlink (const char *, char *, size_t);]])],
     22          [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])])
     23     dnl Solaris 9 ignores trailing slash.
     24     dnl FreeBSD 7.2 dereferences only one level of links with trailing slash.
     25     AC_CACHE_CHECK([whether readlink handles trailing slash correctly],
     26       [gl_cv_func_readlink_trailing_slash],
     27       [# We have readlink, so assume ln -s works.
     28        ln -s conftest.no-such conftest.link
     29        ln -s conftest.link conftest.lnk2
     30        AC_RUN_IFELSE(
     31          [AC_LANG_PROGRAM(
     32            [[#include <unistd.h>
     33 ]], [[char buf[20];
     34       return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])],
     35          [gl_cv_func_readlink_trailing_slash=yes],
     36          [gl_cv_func_readlink_trailing_slash=no],
     37          [case "$host_os" in
     38             # Guess yes on Linux or glibc systems.
     39             linux-* | linux | *-gnu* | gnu*)
     40               gl_cv_func_readlink_trailing_slash="guessing yes" ;;
     41             # Guess no on AIX or HP-UX.
     42             aix* | hpux*)
     43               gl_cv_func_readlink_trailing_slash="guessing no" ;;
     44             # If we don't know, obey --enable-cross-guesses.
     45             *)
     46               gl_cv_func_readlink_trailing_slash="$gl_cross_guess_normal" ;;
     47           esac
     48          ])
     49       rm -f conftest.link conftest.lnk2])
     50     case "$gl_cv_func_readlink_trailing_slash" in
     51       *yes)
     52         if test "$gl_cv_decl_readlink_works" != yes; then
     53           REPLACE_READLINK=1
     54         fi
     55         ;;
     56       *)
     57         AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink
     58           fails to recognize a trailing slash.])
     59         REPLACE_READLINK=1
     60         ;;
     61     esac
     62 
     63     AC_CACHE_CHECK([whether readlink truncates results correctly],
     64       [gl_cv_func_readlink_truncate],
     65       [# We have readlink, so assume ln -s works.
     66        ln -s ab conftest.link
     67        AC_RUN_IFELSE(
     68          [AC_LANG_PROGRAM(
     69            [[#include <unistd.h>
     70 ]], [[char c;
     71       return readlink ("conftest.link", &c, 1) != 1;]])],
     72          [gl_cv_func_readlink_truncate=yes],
     73          [gl_cv_func_readlink_truncate=no],
     74          [case "$host_os" in
     75             # Guess yes on Linux or glibc systems.
     76             linux-* | linux | *-gnu* | gnu*)
     77               gl_cv_func_readlink_truncate="guessing yes" ;;
     78             # Guess no on AIX or HP-UX.
     79             aix* | hpux*)
     80               gl_cv_func_readlink_truncate="guessing no" ;;
     81             # If we don't know, obey --enable-cross-guesses.
     82             *)
     83               gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
     84           esac
     85          ])
     86       rm -f conftest.link conftest.lnk2])
     87     case $gl_cv_func_readlink_truncate in
     88       *yes)
     89         if test "$gl_cv_decl_readlink_works" != yes; then
     90           REPLACE_READLINK=1
     91         fi
     92         ;;
     93       *)
     94         AC_DEFINE([READLINK_TRUNCATE_BUG], [1], [Define to 1 if readlink
     95           sets errno instead of truncating a too-long link.])
     96         REPLACE_READLINK=1
     97         ;;
     98     esac
     99   fi
    100 ])
    101 
    102 # Like gl_FUNC_READLINK, except prepare for separate compilation
    103 # (no REPLACE_READLINK, no AC_LIBOBJ).
    104 AC_DEFUN([gl_FUNC_READLINK_SEPARATE],
    105 [
    106   AC_CHECK_FUNCS_ONCE([readlink])
    107   gl_PREREQ_READLINK
    108 ])
    109 
    110 # Prerequisites of lib/readlink.c.
    111 AC_DEFUN([gl_PREREQ_READLINK],
    112 [
    113   :
    114 ])
    115