X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fgetpass.c;h=865a6c93b0abf6f7b4b2833660c5dc34cf00053e;hb=b067ff5c465a5d243ce5a19e562085a9a1a97215;hp=cca32f621c182afd39877afb387be1c4761aa855;hpb=966e60efa721d87e5f1cd475de08c26e3bac967e;p=mmh diff --git a/sbr/getpass.c b/sbr/getpass.c index cca32f6..865a6c9 100644 --- a/sbr/getpass.c +++ b/sbr/getpass.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. + * Portions of this code are Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -12,8 +12,8 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. + * This product includes software developed by the University of + * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -29,59 +29,58 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $Id$ */ #include #include +#include /* for isatty() */ +#include "h/mh.h" /* for adios() */ -#define PASSWORD_LEN 128 +/* We don't use MAX_PASS here because the maximum password length on a remote + POP daemon will have nothing to do with the length on our OS. 256 is + arbitrary but hopefully big enough to accomodate everyone. */ +#define MAX_PASSWORD_LEN 256 #ifndef TCSANOW -#define TCSANOW 0 +# define TCSANOW 0 #endif char * -getpass(char *prompt) +nmh_getpass(const char *prompt) { - struct termios oterm, term; - char ch; - char *p, *ttystring, *buf; - FILE *fout, *fin; - - if(!(buf = (char *)calloc((size_t)(PASSWORD_LEN+1), sizeof(char)))) - adios(NULL, "unable to allocate string storage"); + struct termios oterm, term; + int ch; + char *p; + FILE *fout, *fin; + static char buf[MAX_PASSWORD_LEN + 1]; + int istty = isatty(fileno(stdin)); - /* Find if stdin is connect to a terminal. If so, read directly from - * the terminal, and turn off echo. Otherwise read from stdin. - */ + /* Find if stdin is connect to a terminal. If so, read directly from + * the terminal, and turn off echo. Otherwise read from stdin. + */ - if((ttystring = (char *)ttyname(fileno(stdin))) == NULL) { - fout = stderr; - fin = stdin; - } - else /* Reading directly from terminal here */ - { - fout = fin = fopen(ttystring, "w+"); - (void)tcgetattr(fileno(fin), &oterm); - term = oterm; /* Save original info */ - term.c_lflag &= ~ECHO; - (void)fputs(prompt, fout); - rewind(fout); /* implied flush */ - (void)tcsetattr(fileno(fin), TCSANOW, &term); - } + if (!istty || !(fout = fin = fopen("/dev/tty", "w+"))) { + fout = stderr; + fin = stdin; + } else { /* Reading directly from terminal here */ + (void)tcgetattr(fileno(fin), &oterm); + term = oterm; /* Save original info */ + term.c_lflag &= ~ECHO; + (void)fputs(prompt, fout); + rewind(fout); /* implied flush */ + (void)tcsetattr(fileno(fin), TCSANOW, &term); + } - for (p = buf; (ch = getc(fin)) != EOF && ch != '\n';) - if (p < buf + PASSWORD_LEN) - *p++ = ch; - *p = '\0'; + for (p = buf; (ch = getc(fin)) != EOF && ch != '\n' && + p < buf + MAX_PASSWORD_LEN;) + *p++ = ch; + *p = '\0'; - if(ttystring != NULL) { - (void)tcsetattr(fileno(fin), TCSANOW, &oterm); - rewind(fout); - (void)fputc('\n', fout); - (void)fclose(fin); - } - return((char *)buf); + if (istty) { + (void)tcsetattr(fileno(fin), TCSANOW, &oterm); + rewind(fout); + (void)fputc('\n', fout); + (void)fclose(fin); + } + return buf; }