From a9af141b52f63595a66621950a764608d0edcbc5 Mon Sep 17 00:00:00 2001 From: Egor Date: Thu, 12 Jun 2025 08:53:46 +0300 Subject: [PATCH] setpass: replace getpass with my own impl --- src/setpass.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/setpass.cpp b/src/setpass.cpp index d33053c..0bab3ac 100644 --- a/src/setpass.cpp +++ b/src/setpass.cpp @@ -1,12 +1,40 @@ // Copyright (c) 2022-2023, 2025 Egor // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include #include #include "passwd.h" + +char *read_password(const char *prompt) +{ + static char buffer[256]; + struct termios oldattr, newattr; + + if (tcgetattr(0, &oldattr) == -1) + return 0; + newattr = oldattr; + newattr.c_lflag &= ~(ECHO|ISIG); + tcsetattr(0, TCSAFLUSH, &newattr); + + write(0, prompt, strlen(prompt)); + ssize_t n = read(0, buffer, 256); + if (n < 0) + n = 0; + else if (n > 0 && buffer[n-1] == '\n') + n--; + buffer[n] = '\0'; + + tcsetattr(0, TCSAFLUSH, &oldattr); + write(0, "\n", 1); + + return n ? buffer : 0; +} + int main(int argc, char **argv) { if (argc < 3) return 1; - char *pass = getpass("password: "); + char *pass = read_password("password: "); if (!pass) return 1; return -password_set(argv[1], pass, argv[2], "setpass.tmp"); -- 2.56.0