]> granicus.if.org Git - sudo/commitdiff
Initial revision
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Feb 1993 18:57:44 +0000 (18:57 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Feb 1993 18:57:44 +0000 (18:57 +0000)
getpass.c [new file with mode: 0644]

diff --git a/getpass.c b/getpass.c
new file mode 100644 (file)
index 0000000..839d454
--- /dev/null
+++ b/getpass.c
@@ -0,0 +1,77 @@
+#ifdef BROKEN_GETPASS
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getpass.c  based on 5.3 (Berkeley) 9/22/88";
+#endif /* LIBC_SCCS and not lint */
+
+#include <fcntl.h>
+#include <sgtty.h>
+#ifdef sgi
+#include <curses.h>
+#endif
+#include <sys/ioctl.h>
+#include <sys/signal.h>
+#include <stdio.h>
+
+char *
+getpass(prompt)
+       char *prompt;
+{
+       struct sgttyb ttyb;
+       register int ch;
+       register char *p;
+       FILE *fp, *outfp;
+       long omask;
+       int fd_tmp;
+       int svflagval;
+#define        PASSWD_LEN      8
+       static char buf[PASSWD_LEN + 1];
+
+       /*
+        * read and write to /dev/tty if possible; else read from
+        * stdin and write to stderr.
+        */
+       fd_tmp = open("/dev/tty", O_RDWR);
+       if (fd_tmp < 0 || (outfp = fp = fdopen(fd_tmp, "r+")) == NULL) {
+               outfp = stderr;
+               fp = stdin;
+       }
+
+       (void)ioctl(fileno(fp), TIOCGETP, &ttyb);
+       svflagval = ttyb.sg_flags;
+       ttyb.sg_flags &= ~ECHO;
+       omask = sigblock(sigmask(SIGINT));
+       (void)ioctl(fileno(fp), TIOCSETP, &ttyb);
+
+       fprintf(outfp, "%s", prompt);
+       rewind(outfp);                  /* implied flush */
+       for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
+               if (p < buf + PASSWD_LEN)
+                       *p++ = ch;
+       *p = '\0';
+       (void)write(fileno(outfp), "\n", 1);
+
+       ttyb.sg_flags = svflagval;
+       (void)ioctl(fileno(fp), TIOCSETP, &ttyb);
+       (void)sigsetmask(omask);
+       if (fp != stdin)
+               (void)fclose(fp);
+       return(buf);
+}
+#endif