Home | History | Annotate | Download | only in ftp
      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