From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Date: Sat, 14 May 2022 02:52:50 +0800
Subject: _login_log_failure_in_FTMP

Goal: Log login failures to the btmp file
Notes:
 * I'm not sure login should add an entry in the FTMP file when PAM is used.
   (but nothing in /etc/login.defs indicates that the failure is not logged)
---
 lib/getdef.c |  2 +-
 src/login.c  | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/lib/getdef.c b/lib/getdef.c
index 00f6abf..e639593 100644
--- a/lib/getdef.c
+++ b/lib/getdef.c
@@ -60,7 +60,6 @@ struct itemdef {
 	{"ENVIRON_FILE", NULL},			\
 	{"ENV_TZ", NULL},			\
 	{"FAILLOG_ENAB", NULL},			\
-	{"FTMP_FILE", NULL},			\
 	{"ISSUE_FILE", NULL},			\
 	{"LASTLOG_ENAB", NULL},			\
 	{"LOGIN_STRING", NULL},			\
@@ -91,6 +90,7 @@ static struct itemdef def_table[] = {
 	{"ERASECHAR", NULL},
 	{"FAIL_DELAY", NULL},
 	{"FAKE_SHELL", NULL},
+	{"FTMP_FILE", NULL},
 	{"GID_MAX", NULL},
 	{"GID_MIN", NULL},
 	{"HOME_MODE", NULL},
diff --git a/src/login.c b/src/login.c
index 00508cd..ffe65f7 100644
--- a/src/login.c
+++ b/src/login.c
@@ -849,6 +849,24 @@ int main (int argc, char **argv)
 			(void) puts ("");
 			(void) puts (_("Login incorrect"));
 
+			if (getdef_str("FTMP_FILE") != NULL) {
+#ifdef USE_UTMPX
+				struct utmpx *failent =
+					prepare_utmpx (failent_user,
+					               tty,
+					/* FIXME: or fromhost? */hostname,
+					               utent);
+#else				/* !USE_UTMPX */
+				struct utmp *failent =
+					prepare_utmp (failent_user,
+					              tty,
+					              hostname,
+					              utent);
+#endif				/* !USE_UTMPX */
+				failtmp (failent_user, failent);
+				free (failent);
+			}
+
 			if (failcount >= retries) {
 				SYSLOG ((LOG_NOTICE,
 				         "TOO MANY LOGIN TRIES (%u)%s FOR '%s'",
