I had to implement BSD's readpassprase for my openssh port. I think it's good to have it since tcsetattr is broken, hence getpass(), which uses /sys/src/ape/lib/v/plan9/tty.c doesn't work. so, here it is :) thanks Federico G. Benavento Notes: Mon Jan 21 00:25:59 EST 2008 geoff I think I'd rather fix tcsetattr. What's broken about it? Wed Feb 6 14:38:02 EST 2008 geoff I rewrote getpass, tty_echoon and tty_echooff instead. Reference: /n/sources/patch/sorry/ape-readpassphrase Date: Mon Jan 21 06:12:43 CET 2008 Signed-off-by: benavento@gmail.com Reviewed-by: geoff --- /sys/include/ape/readpassphrase.h Thu Jan 1 00:00:00 1970 +++ /sys/include/ape/readpassphrase.h Mon Jan 21 06:12:43 2008 @@ -0,0 +1,17 @@ +#ifndef _READPASSPHRASE_H +#define _READPASSPHRASE_H +#ifndef _BSD_EXTENSION + This header file is an extension to ANSI/POSIX +#endif + +#define RPP_ECHO_OFF 0x00 +#define RPP_ECHO_ON 0x01 +#define RPP_REQUIRE_TTY 0x02 +#define RPP_FORCELOWER 0x04 +#define RPP_FORCEUPPER 0x08 +#define RPP_SEVENBIT 0x10 +#define RPP_STDIN 0x20 + +extern char * readpassphrase(const char *, char *, size_t, int); + +#endif /* _READPASSPHRASE_H */ --- /sys/src/ape/lib/bsd/mkfile Mon Jan 21 06:12:43 2008 +++ /sys/src/ape/lib/bsd/mkfile Mon Jan 21 06:12:43 2008 @@ -31,6 +31,7 @@ popen.$O\ putenv.$O\ rcmd.$O\ + readpassphrase.$O\ readv.$O\ rresvport.$O\ send.$O\ --- /sys/src/ape/lib/bsd/readpassphrase.c Thu Jan 1 00:00:00 1970 +++ /sys/src/ape/lib/bsd/readpassphrase.c Wed Feb 6 20:03:44 2008 @@ -0,0 +1,60 @@ +#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; +}