Blame m4/fopen.m4

Packit Service 4684c1
# fopen.m4 serial 11
Packit Service 4684c1
dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
Packit Service 4684c1
dnl This file is free software; the Free Software Foundation
Packit Service 4684c1
dnl gives unlimited permission to copy and/or distribute it,
Packit Service 4684c1
dnl with or without modifications, as long as this notice is preserved.
Packit Service 4684c1
Packit Service 4684c1
AC_DEFUN([gl_FUNC_FOPEN],
Packit Service 4684c1
[
Packit Service 4684c1
  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 4684c1
  case "$host_os" in
Packit Service 4684c1
    mingw* | pw*)
Packit Service 4684c1
      dnl Replace fopen, for handling of "/dev/null".
Packit Service 4684c1
      REPLACE_FOPEN=1
Packit Service 4684c1
      dnl fopen on mingw also has the trailing slash bug.
Packit Service 4684c1
      gl_cv_func_fopen_slash="guessing no"
Packit Service 4684c1
      ;;
Packit Service 4684c1
    *)
Packit Service 4684c1
      dnl fopen("foo/", "w") should not create a file when the file name has a
Packit Service 4684c1
      dnl trailing slash.
Packit Service 4684c1
      AC_CACHE_CHECK([whether fopen recognizes a trailing slash],
Packit Service 4684c1
        [gl_cv_func_fopen_slash],
Packit Service 4684c1
        [
Packit Service 4684c1
          AC_RUN_IFELSE(
Packit Service 4684c1
            [AC_LANG_SOURCE([[
Packit Service 4684c1
#include <stddef.h>
Packit Service 4684c1
#include <stdio.h>
Packit Service 4684c1
int main ()
Packit Service 4684c1
{
Packit Service 4684c1
  FILE *fp = fopen ("conftest.sl/", "w");
Packit Service 4684c1
  int result = (fp != NULL);
Packit Service 4684c1
  if (fp != NULL)
Packit Service 4684c1
    fclose (fp);
Packit Service 4684c1
  return result;
Packit Service 4684c1
}]])],
Packit Service 4684c1
            [gl_cv_func_fopen_slash=yes],
Packit Service 4684c1
            [gl_cv_func_fopen_slash=no],
Packit Service 4684c1
            [
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
             case "$host_os" in
Packit Service 4684c1
               aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
Packit Service 4684c1
                 gl_cv_func_fopen_slash="guessing no" ;;
Packit Service 4684c1
               *)
Packit Service 4684c1
                 gl_cv_func_fopen_slash="guessing yes" ;;
Packit Service 4684c1
             esac
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
            ])
Packit Service 4684c1
          rm -f conftest.sl
Packit Service 4684c1
        ])
Packit Service 4684c1
      ;;
Packit Service 4684c1
  esac
Packit Service 4684c1
  case "$gl_cv_func_fopen_slash" in
Packit Service 4684c1
    *no)
Packit Service 4684c1
      AC_DEFINE([FOPEN_TRAILING_SLASH_BUG], [1],
Packit Service 4684c1
        [Define to 1 if fopen() fails to recognize a trailing slash.])
Packit Service 4684c1
      REPLACE_FOPEN=1
Packit Service 4684c1
      ;;
Packit Service 4684c1
  esac
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
AC_DEFUN([gl_FUNC_FOPEN_GNU],
Packit Service 4684c1
[
Packit Service 4684c1
  AC_REQUIRE([gl_FUNC_FOPEN])
Packit Service 4684c1
  AC_CACHE_CHECK([whether fopen supports the mode character 'x'],
Packit Service 4684c1
    [gl_cv_func_fopen_mode_x],
Packit Service 4684c1
    [rm -f conftest.x
Packit Service 4684c1
     AC_RUN_IFELSE(
Packit Service 4684c1
       [AC_LANG_SOURCE([[
Packit Service 4684c1
#include <stdio.h>
Packit Service 4684c1
#include <errno.h>
Packit Service 4684c1
int main ()
Packit Service 4684c1
{
Packit Service 4684c1
  FILE *fp;
Packit Service 4684c1
  fp = fopen ("conftest.x", "w");
Packit Service 4684c1
  fclose (fp);
Packit Service 4684c1
  fp = fopen ("conftest.x", "wx");
Packit Service 4684c1
  if (fp != NULL)
Packit Service 4684c1
    /* 'x' ignored */
Packit Service 4684c1
    return 1;
Packit Service 4684c1
  else if (errno == EEXIST)
Packit Service 4684c1
    return 0;
Packit Service 4684c1
  else
Packit Service 4684c1
    /* 'x' rejected */
Packit Service 4684c1
    return 2;
Packit Service 4684c1
}]])],
Packit Service 4684c1
       [gl_cv_func_fopen_mode_x=yes],
Packit Service 4684c1
       [gl_cv_func_fopen_mode_x=no],
Packit Service 4684c1
       [case "$host_os" in
Packit Service 4684c1
          # Guess yes on glibc and musl systems.
Packit Service 4684c1
          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
Packit Service 4684c1
            gl_cv_func_fopen_mode_x="guessing yes" ;;
Packit Service 4684c1
          # If we don't know, obey --enable-cross-guesses.
Packit Service 4684c1
          *)
Packit Service 4684c1
            gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;;
Packit Service 4684c1
        esac
Packit Service 4684c1
       ])
Packit Service 4684c1
     rm -f conftest.x
Packit Service 4684c1
    ])
Packit Service 4684c1
  AC_CACHE_CHECK([whether fopen supports the mode character 'e'],
Packit Service 4684c1
    [gl_cv_func_fopen_mode_e],
Packit Service 4684c1
    [echo foo > conftest.x
Packit Service 4684c1
     AC_RUN_IFELSE(
Packit Service 4684c1
       [AC_LANG_SOURCE([[
Packit Service 4684c1
#include <stdio.h>
Packit Service 4684c1
#include <errno.h>
Packit Service 4684c1
#include <fcntl.h>
Packit Service 4684c1
int main ()
Packit Service 4684c1
{
Packit Service 4684c1
  FILE *fp = fopen ("conftest.x", "re");
Packit Service 4684c1
  if (fp != NULL)
Packit Service 4684c1
    {
Packit Service 4684c1
      if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC)
Packit Service 4684c1
        return 0;
Packit Service 4684c1
      else
Packit Service 4684c1
        /* 'e' ignored */
Packit Service 4684c1
        return 1;
Packit Service 4684c1
    }
Packit Service 4684c1
  else
Packit Service 4684c1
    /* 'e' rejected */
Packit Service 4684c1
    return 2;
Packit Service 4684c1
}]])],
Packit Service 4684c1
       [gl_cv_func_fopen_mode_e=yes],
Packit Service 4684c1
       [gl_cv_func_fopen_mode_e=no],
Packit Service 4684c1
       [case "$host_os" in
Packit Service 4684c1
          # Guess yes on glibc and musl systems.
Packit Service 4684c1
          linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
Packit Service 4684c1
            gl_cv_func_fopen_mode_e="guessing yes" ;;
Packit Service 4684c1
          # Guess no on native Windows.
Packit Service 4684c1
          mingw*)
Packit Service 4684c1
            gl_cv_func_fopen_mode_e="guessing no" ;;
Packit Service 4684c1
          # If we don't know, obey --enable-cross-guesses.
Packit Service 4684c1
          *)
Packit Service 4684c1
            gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;;
Packit Service 4684c1
        esac
Packit Service 4684c1
       ])
Packit Service 4684c1
     rm -f conftest.x
Packit Service 4684c1
    ])
Packit Service 4684c1
  case "$gl_cv_func_fopen_mode_x" in
Packit Service 4684c1
    *no) REPLACE_FOPEN=1 ;;
Packit Service 4684c1
  esac
Packit Service 4684c1
  case "$gl_cv_func_fopen_mode_e" in
Packit Service 4684c1
    *no) REPLACE_FOPEN=1 ;;
Packit Service 4684c1
  esac
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
# Prerequisites of lib/fopen.c.
Packit Service 4684c1
AC_DEFUN([gl_PREREQ_FOPEN], [:])