From: Shantonu Sen Date: Sun, 7 May 2000 06:16:43 +0000 (+0000) Subject: An nmh-specific getpass, to remove dependency on system X-Git-Tag: nmh-1_0~9 X-Git-Url: http://git.marmaro.de/?a=commitdiff_plain;h=56bd3c9f2bf7b6061fa302c57250612f852bd92e;p=mmh An nmh-specific getpass, to remove dependency on system getpass()es, which may or may not do what we want (including flushing input streams, and taking input from stdin in the absence of a controlling tty). --- diff --git a/sbr/getpass.c b/sbr/getpass.c new file mode 100644 index 0000000..6a53b72 --- /dev/null +++ b/sbr/getpass.c @@ -0,0 +1,84 @@ +/* + * 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 + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * 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 + +#define PASSWORD_LEN 128 + +#ifndef TCSANOW +#define TCSANOW 0 +#endif + +char *getpass(const char *prompt) +{ + struct termios oterm, term; + int ch; + char *p, *ttystring, buf[PASSWORD_LEN+1]; + FILE *fout, *fin; + + /* 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) { + 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); + } + + for (p = buf; (ch = getc(fin)) != EOF && ch != '\n';) + if (p < buf + 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(buf); +}