X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fgetpass.c;h=14f2242ac606786cc04a1a3a75726845fe375d43;hp=a8238fb2b0f36a930f67aea1c18014c2f9a2aed1;hb=ced6090a330d3d83d0bce709f756aa3d7d65fea4;hpb=09470876aa753a96fa312296ed3c39ba761f3dd2 diff --git a/sbr/getpass.c b/sbr/getpass.c index a8238fb..14f2242 100644 --- a/sbr/getpass.c +++ b/sbr/getpass.c @@ -1,90 +1,89 @@ /* - * 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$ - */ +** 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 +** 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. +*/ #include -#include /* for calloc() */ #include -#include /* for ttyname() */ +#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(const char *prompt) +nmh_getpass(const char *prompt) { - struct termios oterm, term; - int 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; }