summaryrefslogtreecommitdiffstats
path: root/m4/getpass.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/getpass.m4')
-rw-r--r--m4/getpass.m489
1 files changed, 89 insertions, 0 deletions
diff --git a/m4/getpass.m4 b/m4/getpass.m4
new file mode 100644
index 0000000..27a31f8
--- /dev/null
+++ b/m4/getpass.m4
@@ -0,0 +1,89 @@
+# getpass.m4 serial 20
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2023 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Provide a getpass() function if the system doesn't have it.
+AC_DEFUN_ONCE([gl_FUNC_GETPASS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade Solaris <unistd.h> and <stdlib.h> to declare getpass().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl Persuade Android <unistd.h> to not define getpass() as an inline function.
+ AC_DEFINE([NO_INLINE_GETPASS], [1], [Define to 1 on Android.])
+
+ AC_CHECK_FUNCS_ONCE([getpass])
+ if test $ac_cv_func_getpass = no; then
+ HAVE_GETPASS=0
+ fi
+])
+
+# Provide the GNU getpass() implementation. It supports passwords of
+# arbitrary length (not just 8 bytes as on HP-UX).
+AC_DEFUN([gl_FUNC_GETPASS_GNU],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETPASS])
+
+ if test $ac_cv_func_getpass = yes; then
+ AC_CACHE_CHECK([for getpass without length limitations],
+ [gl_cv_func_getpass_good],
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [gl_cv_func_getpass_good=yes],
+ [gl_cv_func_getpass_good=no])
+ ])
+ if test $gl_cv_func_getpass_good != yes; then
+ REPLACE_GETPASS_FOR_GETPASS_GNU=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/getpass.c.
+AC_DEFUN([gl_PREREQ_GETPASS], [
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h termios.h])
+ gl_CHECK_FUNCS_ANDROID([__fsetlocking], [[#include <stdio_ext.h>]])
+ AC_CHECK_DECLS([__fsetlocking],,,
+ [[#include <stdio.h>
+ #if HAVE_STDIO_EXT_H
+ #include <stdio_ext.h>
+ #endif]])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([flockfile])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([funlockfile])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+ gl_HAVE_TCGETATTR
+
+ dnl We can't use AC_CHECK_FUNC here, because tcsetattr() is defined as a
+ dnl static inline function when compiling for Android 4.4 or older.
+ AC_CACHE_CHECK([for tcsetattr], [gl_cv_func_tcsetattr],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <termios.h>
+ struct termios x;
+ ]],
+ [[return tcsetattr(0,0,&x);]])
+ ],
+ [gl_cv_func_tcsetattr=yes],
+ [gl_cv_func_tcsetattr=no])
+ ])
+ if test $gl_cv_func_tcsetattr = yes; then
+ HAVE_TCSETATTR=1
+ else
+ HAVE_TCSETATTR=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_TCSETATTR], [$HAVE_TCSETATTR],
+ [Define to 1 if the system has the 'tcsetattr' function.])
+])