1
0
Fork 0
forked from soccera/rdo

Simplify tty finding process in readpassphrase

This went through a bunch of hoops before to acquire a file descriptor
we already had, this is now ommited.
This commit is contained in:
sw1tchbl4d3 2022-12-17 00:12:03 +01:00
parent c1acb73270
commit 9ce20a62a4

View file

@ -4,8 +4,6 @@
#include <fcntl.h>
char* readpassphrase(const char* prompt, char* buf, size_t bufsz) {
char stdin_path[256];
char tty_link_path[256];
int n;
int ttyfd = -1;
@ -21,42 +19,27 @@ char* readpassphrase(const char* prompt, char* buf, size_t bufsz) {
if (ttyfd < 0)
return NULL;
snprintf(tty_link_path, sizeof(tty_link_path), "/proc/self/fd/%d", ttyfd);
n = readlink(tty_link_path, stdin_path, sizeof(stdin_path));
if (n < 0)
return NULL;
stdin_path[n] = '\0';
int fd = open(stdin_path, O_RDWR);
if (fd < 0)
return NULL;
term.c_lflag &= ~ECHO;
tcsetattr(ttyfd, 0, &term);
term.c_lflag |= ECHO;
if (write(fd, prompt, strlen(prompt)) < 0) {
if (write(ttyfd, prompt, strlen(prompt)) < 0) {
tcsetattr(ttyfd, 0, &term);
close(fd);
return NULL;
}
n = read(fd, buf, bufsz);
n = read(ttyfd, buf, bufsz);
if (n < 0) {
tcsetattr(ttyfd, 0, &term);
n = write(fd, "\n", 1);
close(fd);
n = write(ttyfd, "\n", 1);
return NULL;
}
buf[n-1] = '\0';
// NOTE: As we disabled echo, the enter sent by the user isn't displayed, so we resend it.
n = write(fd, "\n", 1);
n = write(ttyfd, "\n", 1);
close(fd);
tcsetattr(ttyfd, 0, &term);
return buf;