ad760703ca78e1023e0f5060517f75f1dac77125
[gnulib.git] / m4 / ttyname_r.m4
1 # ttyname_r.m4 serial 6
2 dnl Copyright (C) 2010 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_TTYNAME_R],
8 [
9   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
10
11   dnl Persuade Solaris <unistd.h> to provide the POSIX compliant declaration of
12   dnl ttyname_r().
13   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
14
15   AC_CHECK_DECLS_ONCE([ttyname_r])
16   if test $ac_cv_have_decl_ttyname_r = no; then
17     HAVE_DECL_TTYNAME_R=0
18   fi
19
20   AC_CHECK_FUNCS([ttyname_r])
21   if test $ac_cv_func_ttyname_r = no; then
22     HAVE_TTYNAME_R=0
23   else
24     HAVE_TTYNAME_R=1
25     dnl On MacOS 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],
29       [AC_COMPILE_IFELSE(
30          [AC_LANG_PROGRAM(
31             [[#include <stddef.h>
32               #include <unistd.h>]],
33             [[*ttyname_r (0, NULL, 0);]])
34          ],
35          [gl_cv_func_ttyname_r_posix=no],
36          [gl_cv_func_ttyname_r_posix=yes])
37       ])
38     if test $gl_cv_func_ttyname_r_posix = no; then
39       REPLACE_TTYNAME_R=1
40     else
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       AC_REQUIRE([AC_CANONICAL_HOST])
47       AC_CACHE_CHECK([whether ttyname_r works with small buffers],
48         [gl_cv_func_ttyname_r_works],
49         [
50           dnl Initial guess, used when cross-compiling or when /dev/tty cannot
51           dnl be opened.
52 changequote(,)dnl
53           case "$host_os" in
54                       # Guess no on Solaris.
55             solaris*) gl_cv_func_ttyname_r_works="guessing no" ;;
56                       # Guess yes otherwise.
57             *)        gl_cv_func_ttyname_r_works="guessing yes" ;;
58           esac
59 changequote([,])dnl
60           AC_RUN_IFELSE(
61             [AC_LANG_SOURCE([[
62 #include <fcntl.h>
63 #include <unistd.h>
64 int
65 main (void)
66 {
67   int result = 0;
68   int fd;
69   char buf[31]; /* use any size < 128 here */
70
71   fd = open ("/dev/tty", O_RDONLY);
72   if (fd < 0)
73     result |= 1;
74   else if (ttyname_r (fd, buf, sizeof (buf)) != 0)
75     result |= 2;
76   return result;
77 }]])],
78             [gl_cv_func_ttyname_r_works=yes],
79             [:],
80             [:])
81         ])
82       case "$gl_cv_func_ttyname_r_works" in
83         *yes) ;;
84         *) REPLACE_TTYNAME_R=1 ;;
85       esac
86     fi
87   fi
88   if test $HAVE_TTYNAME_R = 0 || test $REPLACE_TTYNAME_R = 1; then
89     AC_LIBOBJ([ttyname_r])
90     gl_PREREQ_TTYNAME_R
91   fi
92 ])
93
94 # Prerequisites of lib/ttyname_r.c.
95 AC_DEFUN([gl_PREREQ_TTYNAME_R], [
96   AC_CHECK_FUNCS([ttyname])
97 ])