X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fgetpass.c;h=6bc2cb8af0eaf62ff1264b6f11522f5adba96e89;hp=6a53b72f06e8db09777fe9cf0e21e68bd1165da8;hb=fb49dd82ec42997b9df97f221c920f6596102c0a;hpb=56bd3c9f2bf7b6061fa302c57250612f852bd92e diff --git a/sbr/getpass.c b/sbr/getpass.c index 6a53b72..6bc2cb8 100644 --- a/sbr/getpass.c +++ b/sbr/getpass.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1988, 1993 + * 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 @@ -30,37 +30,43 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $ID$ + * $Id$ */ #include -#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 #endif -char *getpass(const char *prompt) +char * +nmh_getpass(const char *prompt) { struct termios oterm, term; int ch; - char *p, *ttystring, buf[PASSWORD_LEN+1]; + 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. */ - if((ttystring = ttyname(fileno(stdin))) == NULL) { + if (!istty || !(fout = fin = fopen("/dev/tty", "w+"))) { 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; @@ -69,16 +75,17 @@ char *getpass(const char *prompt) (void)tcsetattr(fileno(fin), TCSANOW, &term); } - for (p = buf; (ch = getc(fin)) != EOF && ch != '\n';) - if (p < buf + PASSWORD_LEN) - *p++ = ch; + for (p = buf; (ch = getc(fin)) != EOF && + ch != '\n' && + p < buf + MAX_PASSWORD_LEN;) + *p++ = ch; *p = '\0'; - if(ttystring != NULL) { + if (istty) { (void)tcsetattr(fileno(fin), TCSANOW, &oterm); rewind(fout); (void)fputc('\n', fout); (void)fclose(fin); } - return(buf); + return buf; }