1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2001 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* 31 * University Copyright- Copyright (c) 1982, 1986, 1988 32 * The Regents of the University of California 33 * All Rights Reserved 34 * 35 * University Acknowledgment- Portions of this document are derived from 36 * software developed by the University of California, Berkeley, and its 37 * contributors. 38 */ 39 40 #pragma ident "%Z%%M% %I% %E% SMI" 41 42 #include "ftp_var.h" 43 44 static struct termios termios_b; 45 static tcflag_t flags; 46 static FILE *fi; 47 48 /* ARGSUSED */ 49 static void 50 intfix(int sig) 51 { 52 termios_b.c_lflag = flags; 53 (void) tcsetattr(fileno(fi), TCSADRAIN, &termios_b); 54 exit(EXIT_FAILURE); 55 } 56 57 char * 58 mygetpass(char *prompt) 59 { 60 register char *p; 61 register int c; 62 static char pbuf[50+1]; 63 void (*sig)(); 64 65 stop_timer(); 66 if ((fi = fopen("/dev/tty", "r")) == NULL) 67 fi = stdin; 68 else 69 setbuf(fi, (char *)NULL); 70 71 if (tcgetattr(fileno(fi), &termios_b) < 0) 72 perror("ftp: tcgetattr"); /* go ahead, anyway */ 73 flags = termios_b.c_lflag; 74 75 sig = signal(SIGINT, intfix); 76 77 termios_b.c_lflag &= ~ECHO; 78 (void) tcsetattr(fileno(fi), TCSADRAIN, &termios_b); 79 (void) fprintf(stderr, "%s", prompt); 80 (void) fflush(stderr); 81 p = pbuf; 82 while ((c = getc(fi)) != '\n' && c != EOF) { 83 if (p < &pbuf[sizeof (pbuf)-1]) 84 *p++ = c; 85 } 86 *p = '\0'; 87 (void) fprintf(stderr, "\n"); 88 (void) fflush(stderr); 89 termios_b.c_lflag = flags; 90 (void) tcsetattr(fileno(fi), TCSADRAIN, &termios_b); 91 (void) signal(SIGINT, sig); 92 if (fi != stdin) 93 (void) fclose(fi); 94 reset_timer(); 95 return (pbuf); 96 } 97