forked from soccera/rdo
This went through a bunch of hoops before to acquire a file descriptor we already had, this is now ommited.
46 lines
935 B
C
46 lines
935 B
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <termios.h>
|
|
#include <fcntl.h>
|
|
|
|
char* readpassphrase(const char* prompt, char* buf, size_t bufsz) {
|
|
int n;
|
|
int ttyfd = -1;
|
|
|
|
struct termios term;
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
if (tcgetattr(i, &term) == 0) {
|
|
ttyfd = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ttyfd < 0)
|
|
return NULL;
|
|
|
|
term.c_lflag &= ~ECHO;
|
|
tcsetattr(ttyfd, 0, &term);
|
|
term.c_lflag |= ECHO;
|
|
|
|
if (write(ttyfd, prompt, strlen(prompt)) < 0) {
|
|
tcsetattr(ttyfd, 0, &term);
|
|
return NULL;
|
|
}
|
|
|
|
n = read(ttyfd, buf, bufsz);
|
|
if (n < 0) {
|
|
tcsetattr(ttyfd, 0, &term);
|
|
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(ttyfd, "\n", 1);
|
|
|
|
tcsetattr(ttyfd, 0, &term);
|
|
|
|
return buf;
|
|
}
|