1 # ttyname_r.m4 serial 10
2 dnl Copyright (C) 2010-2020 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.
7 AC_DEFUN([gl_FUNC_TTYNAME_R],
9 AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
11 dnl Persuade Solaris <unistd.h> to provide the POSIX compliant declaration of
13 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
15 AC_CHECK_DECLS_ONCE([ttyname_r])
16 if test $ac_cv_have_decl_ttyname_r = no; then
20 AC_CHECK_FUNCS([ttyname_r])
21 if test $ac_cv_func_ttyname_r = no; then
25 dnl On Mac OS X 10.4 (and Solaris 10 without gl_USE_SYSTEM_EXTENSIONS)
26 dnl the return type is 'char *', not 'int'.
27 AC_CACHE_CHECK([whether ttyname_r is compatible with its POSIX signature],
28 [gl_cv_func_ttyname_r_posix],
32 #include <unistd.h>]],
33 [[*ttyname_r (0, NULL, 0);]])
35 [gl_cv_func_ttyname_r_posix=no],
36 [gl_cv_func_ttyname_r_posix=yes])
38 if test $gl_cv_func_ttyname_r_posix = no; then
41 AC_DEFINE([HAVE_POSIXDECL_TTYNAME_R], [1],
42 [Define if the ttyname_r function has a POSIX compliant declaration.])
43 dnl On Solaris 10, both ttyname_r functions (the one with the non-POSIX
44 dnl declaration and the one with the POSIX declaration) refuse to do
45 dnl anything when the output buffer is less than 128 bytes large.
46 dnl On OSF/1 5.1, ttyname_r ignores the buffer size and assumes the
47 dnl buffer is large enough.
48 dnl On Android 4.3, ttyname_r is a stub that prints
49 dnl "int ttyname_r(int, char*, size_t)(3) is not implemented on Android"
50 dnl on stderr and returns -ERANGE.
51 AC_REQUIRE([AC_CANONICAL_HOST])
54 AC_CACHE_CHECK([whether ttyname_r works at least minimally],
55 [gl_cv_func_ttyname_r_not_stub],
65 return ttyname_r (-1, buf, sizeof (buf)) == -ERANGE;
67 [gl_cv_func_ttyname_r_not_stub=yes],
68 [gl_cv_func_ttyname_r_not_stub=no],
69 [# Guess no on Android.
70 gl_cv_func_ttyname_r_not_stub="guessing no"
73 case "$gl_cv_func_ttyname_r_not_stub" in
75 *) REPLACE_TTYNAME_R=1 ;;
79 if test $REPLACE_TTYNAME_R = 0; then
80 AC_CACHE_CHECK([whether ttyname_r works with small buffers],
81 [gl_cv_func_ttyname_r_works],
83 dnl Initial guess, used when cross-compiling or when /dev/tty cannot
87 # Guess no on Solaris.
88 solaris*) gl_cv_func_ttyname_r_works="guessing no" ;;
90 osf*) gl_cv_func_ttyname_r_works="guessing no" ;;
91 # Guess yes otherwise.
92 *) gl_cv_func_ttyname_r_works="guessing yes" ;;
104 char buf[31]; /* use any size < 128 here */
106 fd = open ("/dev/tty", O_RDONLY);
109 else if (ttyname_r (fd, buf, sizeof (buf)) != 0)
111 else if (ttyname_r (fd, buf, 1) == 0)
115 [gl_cv_func_ttyname_r_works=yes],
117 17 | 18) gl_cv_func_ttyname_r_works=no ;;
121 case "$gl_cv_func_ttyname_r_works" in
123 *) REPLACE_TTYNAME_R=1 ;;
130 # Prerequisites of lib/ttyname_r.c.
131 AC_DEFUN([gl_PREREQ_TTYNAME_R], [
132 AC_CHECK_FUNCS([ttyname])