#include #include #include #include #include #include "sys9.h" char * readpassphrase(const char *prompt, char *buf, size_t nbuf, int flags) { int c, cfd; char *p; FILE *fi; void (*sig)(int); if (!(flags & RPP_STDIN) && (fi = fopen("/dev/cons", "r")) != NULL){ setbuf(fi, NULL); if(!(flags & RPP_ECHO_ON)) if((cfd = _OPEN("/dev/consctl", OWRITE)) >= 0) _WRITE(cfd, "rawon", 5); } else { if (flags & RPP_REQUIRE_TTY) { errno = ENOTTY; return NULL; } fi = stdin; } sig = signal(SIGINT, SIG_IGN); if(!(flags & RPP_STDIN)) { fprintf(stderr, "%s", prompt); fflush(stderr); } for (p = buf; (c = getc(fi)) != '\n' && c !=' \r' && c != EOF; ) if (p < buf + nbuf - 1) { if (flags & RPP_SEVENBIT) c &= 0xff; if (isalpha(c)) { if (flags & RPP_FORCELOWER) c = tolower(c); if (flags & RPP_FORCEUPPER) c = toupper(c); } *p++ = c; } *p = '\0'; if (!(flags & RPP_STDIN)) { fprintf(stderr, "\n"); fflush(stderr); } if (!(flags & RPP_ECHO_ON) && cfd) { _WRITE(cfd, "rawoff", 6); _CLOSE(cfd); } signal(SIGINT, sig); if (fi != stdin) fclose(fi); return buf; }