projects
/
mmh
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added test-slocal.
[mmh]
/
sbr
/
getpass.c
diff --git
a/sbr/getpass.c
b/sbr/getpass.c
index
cca32f6
..
f3ae829
100644
(file)
--- 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
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@
-29,41
+29,42
@@
* 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.
* 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 <stdio.h>
#include <termios.h>
*/
#include <stdio.h>
#include <termios.h>
+#include <unistd.h> /* 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 *
#ifndef TCSANOW
#define TCSANOW 0
#endif
char *
-getpass(char *prompt)
+nmh_getpass(const char *prompt)
{
struct termios oterm, term;
{
struct termios oterm, term;
- char ch;
- char *p, *ttystring, *buf;
+ int ch;
+ char *p;
FILE *fout, *fin;
FILE *fout, *fin;
-
- if(!(buf = (char *)calloc((size_t)(PASSWORD_LEN+1), sizeof(char))))
- adios(NULL, "unable to allocate string storage");
+ 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) {
+ if (!istty || !(fout = fin = fopen("/dev/tty", "w+"))) {
fout = stderr;
fin = stdin;
}
else /* Reading directly from terminal here */
{
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)tcgetattr(fileno(fin), &oterm);
term = oterm; /* Save original info */
term.c_lflag &= ~ECHO;
@@
-72,16
+73,17
@@
getpass(char *prompt)
(void)tcsetattr(fileno(fin), TCSANOW, &term);
}
(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';
*p = '\0';
- if(ttystring != NULL) {
+ if (istty) {
(void)tcsetattr(fileno(fin), TCSANOW, &oterm);
rewind(fout);
(void)fputc('\n', fout);
(void)fclose(fin);
}
(void)tcsetattr(fileno(fin), TCSANOW, &oterm);
rewind(fout);
(void)fputc('\n', fout);
(void)fclose(fin);
}
- return((char *)buf);
+ return buf;
}
}