/* | |
* A function to read the passphrase either from the terminal or from | |
* an open file descriptor. | |
* | |
* Public domain. | |
*/ | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <sys/ioctl.h> | |
#include <sys/stat.h> | |
#include "c.h" | |
#include "xgetpass.h" | |
char *xgetpass(int pfd, const char *prompt) | |
{ | |
char *pass = NULL; | |
int len = 0, i; | |
if (pfd < 0) /* terminal */ | |
return getpass(prompt); | |
for (i=0; ; i++) { | |
if (i >= len-1) { | |
char *tmppass = pass; | |
len += 128; | |
pass = realloc(tmppass, len); | |
if (!pass) { | |
pass = tmppass; /* the old buffer hasn't changed */ | |
break; | |
} | |
} | |
if (pass && (read(pfd, pass + i, 1) != 1 || | |
pass[i] == '\n' || pass[i] == 0)) | |
break; | |
} | |
if (pass) | |
pass[i] = '\0'; | |
return pass; | |
} | |