|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)getpass.c 5.6 (Berkeley) 6/29/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include <stdio.h> ! 23: #include <signal.h> ! 24: #include <sgtty.h> ! 25: ! 26: static struct sgttyb ttyb; ! 27: static int flags; ! 28: static FILE *fi; ! 29: ! 30: static intfix() ! 31: { ! 32: ttyb.sg_flags = flags; ! 33: if (fi != NULL) ! 34: (void) stty(fileno(fi), &ttyb); ! 35: exit(SIGINT); ! 36: } ! 37: ! 38: char * ! 39: mygetpass(prompt) ! 40: char *prompt; ! 41: { ! 42: register char *p; ! 43: register c; ! 44: static char pbuf[50+1]; ! 45: int (*signal())(); ! 46: int (*sig)(); ! 47: ! 48: if ((fi = fopen("/dev/tty", "r")) == NULL) ! 49: fi = stdin; ! 50: else ! 51: setbuf(fi, (char *)NULL); ! 52: sig = signal(SIGINT, intfix); ! 53: (void) gtty(fileno(fi), &ttyb); ! 54: flags = ttyb.sg_flags; ! 55: ttyb.sg_flags &= ~ECHO; ! 56: (void) stty(fileno(fi), &ttyb); ! 57: fprintf(stderr, "%s", prompt); (void) fflush(stderr); ! 58: for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) { ! 59: if (p < &pbuf[sizeof(pbuf)-1]) ! 60: *p++ = c; ! 61: } ! 62: *p = '\0'; ! 63: fprintf(stderr, "\n"); (void) fflush(stderr); ! 64: ttyb.sg_flags = flags; ! 65: (void) stty(fileno(fi), &ttyb); ! 66: (void) signal(SIGINT, sig); ! 67: if (fi != stdin) ! 68: (void) fclose(fi); ! 69: return(pbuf); ! 70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.