/* * A function to read the passphrase either from the terminal or from * an open file descriptor. * * Public domain. */ #include #include #include #include #include #include #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; }