Blame m4/gnupg-ttyname.m4

Packit d7e8d0
# gnupg-ttyname.m4
Packit d7e8d0
# Copyright (C) 2010-2012 Free Software Foundation, Inc.
Packit d7e8d0
# This file is free software; the Free Software Foundation
Packit d7e8d0
# gives unlimited permission to copy and/or distribute it,
Packit d7e8d0
# with or without modifications, as long as this notice is preserved.
Packit d7e8d0
#
Packit d7e8d0
# This file is based on gnulib/m4/ttyname_r.m4 serial 8.
Packit d7e8d0
#
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
# gnupg_REPLACE_TTYNAME_R
Packit d7e8d0
#
Packit d7e8d0
# This macro is an extended version of AC_REPLACE_FUNCS(ttyname_r).
Packit d7e8d0
# It takes peculiarities in the implementation of ttyname_r in account.
Packit d7e8d0
#
Packit d7e8d0
# The macro HAVE_TTYNAME_R will be defined to 1 if the function
Packit d7e8d0
# exists; it will be defined to 0 if it does not exists or no
Packit d7e8d0
# declaration is available.
Packit d7e8d0
#
Packit d7e8d0
# The macro HAVE_POSIXDECL_TTYNAME_R is defined if ttyname_r conforms
Packit d7e8d0
# to the Posix declaration.
Packit d7e8d0
#
Packit d7e8d0
# The macro HAVE_BROKEN_TTYNAME_R is defined it ttyname_r does not work
Packit d7e8d0
# correctly with the supplied buffer size.  If this is defined the function
Packit d7e8d0
# will also be replaced.
Packit d7e8d0
#
Packit d7e8d0
# The macro REPLACE_TTYNAME_R is defined if ttyname_r is a replacement
Packit d7e8d0
# function.  This macro is useful for the definition of the prototype.
Packit d7e8d0
#
Packit d7e8d0
# If the macro "have_android_system" has a value of "yes", ttyname_r
Packit d7e8d0
# will also be replaced by our own function.
Packit d7e8d0
#
Packit d7e8d0
AC_DEFUN([gnupg_REPLACE_TTYNAME_R],
Packit d7e8d0
[
Packit d7e8d0
  AC_CHECK_HEADERS([unistd.h])
Packit d7e8d0
Packit d7e8d0
  AC_CHECK_DECLS_ONCE([ttyname_r])
Packit d7e8d0
  if test $ac_cv_have_decl_ttyname_r = no; then
Packit d7e8d0
    HAVE_DECL_TTYNAME_R=0
Packit d7e8d0
  fi
Packit d7e8d0
Packit d7e8d0
  AC_CHECK_FUNCS([ttyname_r])
Packit d7e8d0
  if test $ac_cv_func_ttyname_r = no; then
Packit d7e8d0
    HAVE_TTYNAME_R=0
Packit d7e8d0
    AC_LIBOBJ([ttyname_r])
Packit d7e8d0
    AC_DEFINE([REPLACE_TTYNAME_R],[1],
Packit d7e8d0
              [Define to 1 if ttyname_r is a replacement function.])
Packit d7e8d0
  else
Packit d7e8d0
    HAVE_TTYNAME_R=1
Packit d7e8d0
    dnl On MacOS X 10.4 (and Solaris 10 without __EXTENSIONS__)
Packit d7e8d0
    dnl the return type is 'char *', not 'int'.
Packit d7e8d0
    AC_CACHE_CHECK([whether ttyname_r is compatible with its POSIX signature],
Packit d7e8d0
      [gnupg_cv_func_ttyname_r_posix],
Packit d7e8d0
      [AC_COMPILE_IFELSE(
Packit d7e8d0
         [AC_LANG_PROGRAM(
Packit d7e8d0
            [[#include <stddef.h>
Packit d7e8d0
              #include <unistd.h>]],
Packit d7e8d0
            [[*ttyname_r (0, NULL, 0);]])
Packit d7e8d0
         ],
Packit d7e8d0
         [gnupg_cv_func_ttyname_r_posix=no],
Packit d7e8d0
         [gnupg_cv_func_ttyname_r_posix=yes])
Packit d7e8d0
      ])
Packit d7e8d0
    if test $gnupg_cv_func_ttyname_r_posix = no; then
Packit d7e8d0
      AC_LIBOBJ([ttyname_r])
Packit d7e8d0
      AC_DEFINE([REPLACE_TTYNAME_R],[1])
Packit d7e8d0
    elif test "$have_android_system" = yes; then
Packit d7e8d0
      # Android has ttyname and ttyname_r but they are only stubs and
Packit d7e8d0
      # print an annoying warning message.  Thus we need to replace
Packit d7e8d0
      # ttyname_r with our own dummy function.
Packit d7e8d0
      AC_LIBOBJ([ttyname_r])
Packit d7e8d0
      AC_DEFINE([REPLACE_TTYNAME_R],[1])
Packit d7e8d0
    else
Packit d7e8d0
      AC_DEFINE([HAVE_POSIXDECL_TTYNAME_R], [1],
Packit d7e8d0
        [Define if the ttyname_r function has a POSIX compliant declaration.])
Packit d7e8d0
      dnl On Solaris 10, both ttyname_r functions (the one with the non-POSIX
Packit d7e8d0
      dnl declaration and the one with the POSIX declaration) refuse to do
Packit d7e8d0
      dnl anything when the output buffer is less than 128 bytes large.
Packit d7e8d0
      dnl On OSF/1 5.1, ttyname_r ignores the buffer size and assumes the
Packit d7e8d0
      dnl buffer is large enough.
Packit d7e8d0
      AC_REQUIRE([AC_CANONICAL_HOST])
Packit d7e8d0
      AC_CACHE_CHECK([whether ttyname_r works with small buffers],
Packit d7e8d0
        [gnupg_cv_func_ttyname_r_works],
Packit d7e8d0
        [
Packit d7e8d0
          dnl Initial guess, used when cross-compiling or when /dev/tty cannot
Packit d7e8d0
          dnl be opened.
Packit d7e8d0
changequote(,)dnl
Packit d7e8d0
          case "$host_os" in
Packit d7e8d0
                      # Guess no on Solaris.
Packit d7e8d0
            solaris*) gnupg_cv_func_ttyname_r_works="guessing no" ;;
Packit d7e8d0
                      # Guess no on OSF/1.
Packit d7e8d0
            osf*)     gnupg_cv_func_ttyname_r_works="guessing no" ;;
Packit d7e8d0
                      # Guess yes otherwise.
Packit d7e8d0
            *)        gnupg_cv_func_ttyname_r_works="guessing yes" ;;
Packit d7e8d0
          esac
Packit d7e8d0
changequote([,])dnl
Packit d7e8d0
          AC_RUN_IFELSE(
Packit d7e8d0
            [AC_LANG_SOURCE([[
Packit d7e8d0
#include <fcntl.h>
Packit d7e8d0
#include <unistd.h>
Packit d7e8d0
int
Packit d7e8d0
main (void)
Packit d7e8d0
{
Packit d7e8d0
  int result = 0;
Packit d7e8d0
  int fd;
Packit d7e8d0
  char buf[31]; /* use any size < 128 here */
Packit d7e8d0
Packit d7e8d0
  fd = open ("/dev/tty", O_RDONLY);
Packit d7e8d0
  if (fd < 0)
Packit d7e8d0
    result |= 16;
Packit d7e8d0
  else if (ttyname_r (fd, buf, sizeof (buf)) != 0)
Packit d7e8d0
    result |= 17;
Packit d7e8d0
  else if (ttyname_r (fd, buf, 1) == 0)
Packit d7e8d0
    result |= 18;
Packit d7e8d0
  return result;
Packit d7e8d0
}]])],
Packit d7e8d0
            [gnupg_cv_func_ttyname_r_works=yes],
Packit d7e8d0
            [case $? in
Packit d7e8d0
               17 | 18) gnupg_cv_func_ttyname_r_works=no ;;
Packit d7e8d0
             esac],
Packit d7e8d0
            [:])
Packit d7e8d0
        ])
Packit d7e8d0
      case "$gnupg_cv_func_ttyname_r_works" in
Packit d7e8d0
        *yes) ;;
Packit d7e8d0
        *) AC_LIBOBJ([ttyname_r])
Packit d7e8d0
           AC_DEFINE([REPLACE_TTYNAME_R],[1])
Packit d7e8d0
           AC_DEFINE([HAVE_BROKEN_TTYNAME_R], [1],
Packit d7e8d0
                     [Define if ttyname_r is does not work with small buffers])
Packit d7e8d0
           ;;
Packit d7e8d0
      esac
Packit d7e8d0
    fi
Packit d7e8d0
  fi
Packit d7e8d0
])