1#serial 12
2
3# Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc.
4#
5# This file is free software; the Free Software Foundation
6# gives unlimited permission to copy and/or distribute it,
7# with or without modifications, as long as this notice is preserved.
8
9dnl From Derek Price
10dnl
11dnl Provide getlogin_r when the system lacks it.
12dnl
13
14AC_DEFUN([gl_FUNC_GETLOGIN_R],
15[
16  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
17
18  dnl Persuade glibc <unistd.h> to declare getlogin_r().
19  dnl Persuade Solaris <unistd.h> to provide the POSIX compliant declaration of
20  dnl getlogin_r().
21  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
22
23  AC_CHECK_DECLS_ONCE([getlogin_r])
24  if test $ac_cv_have_decl_getlogin_r = no; then
25    HAVE_DECL_GETLOGIN_R=0
26  fi
27
28  AC_CHECK_FUNCS_ONCE([getlogin_r])
29  if test $ac_cv_func_getlogin_r = no; then
30    HAVE_GETLOGIN_R=0
31  else
32    HAVE_GETLOGIN_R=1
33    dnl On Mac OS X 10.12 and OSF/1 5.1, getlogin_r returns a truncated result
34    dnl if the buffer is not large enough.
35    AC_REQUIRE([AC_CANONICAL_HOST])
36    AC_CACHE_CHECK([whether getlogin_r works with small buffers],
37      [gl_cv_func_getlogin_r_works],
38      [
39        dnl Initial guess, used when cross-compiling.
40changequote(,)dnl
41        case "$host_os" in
42                          # Guess no on Mac OS X, OSF/1.
43          darwin* | osf*) gl_cv_func_getlogin_r_works="guessing no" ;;
44                          # Guess yes otherwise.
45          *)              gl_cv_func_getlogin_r_works="guessing yes" ;;
46        esac
47changequote([,])dnl
48        AC_RUN_IFELSE(
49          [AC_LANG_SOURCE([[
50#include <stddef.h>
51#include <string.h>
52#include <unistd.h>
53#if !HAVE_DECL_GETLOGIN_R
54extern
55# ifdef __cplusplus
56"C"
57# endif
58int getlogin_r (char *, size_t);
59#endif
60int
61main (void)
62{
63  int result = 0;
64  char buf[100];
65
66  if (getlogin_r (buf, 0) == 0)
67    result |= 1;
68  if (getlogin_r (buf, 1) == 0)
69    result |= 2;
70  if (getlogin_r (buf, 100) == 0)
71    {
72      size_t n = strlen (buf);
73      if (getlogin_r (buf, n) == 0)
74        result |= 4;
75    }
76  return result;
77}]])],
78          [gl_cv_func_getlogin_r_works=yes],
79          [gl_cv_func_getlogin_r_works=no],
80          [:])
81      ])
82    case "$gl_cv_func_getlogin_r_works" in
83      *yes) ;;
84      *) REPLACE_GETLOGIN_R=1 ;;
85    esac
86  fi
87])
88
89AC_DEFUN([gl_PREREQ_GETLOGIN_R],
90[
91  AC_CHECK_DECLS_ONCE([getlogin])
92])
93