xref: /onnv-gate/usr/src/lib/libast/common/uwin/getpass.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #include "FEATURE/uwin"
234887Schin 
244887Schin #if !_UWIN || _lib_getpass
254887Schin 
_STUB_getpass()264887Schin void _STUB_getpass(){}
274887Schin 
284887Schin #else
294887Schin 
304887Schin #pragma prototyped
314887Schin 
324887Schin #define getpass	______getpass
334887Schin 
344887Schin #include	<ast.h>
354887Schin #include	<termios.h>
364887Schin #include	<signal.h>
374887Schin 
384887Schin #undef	getpass
394887Schin 
404887Schin #if defined(__EXPORT__)
414887Schin #define extern		__EXPORT__
424887Schin #endif
434887Schin 
444887Schin static int interrupt;
handler(int sig)454887Schin static void handler(int sig)
464887Schin {
474887Schin 	interrupt++;
484887Schin }
494887Schin 
getpass(const char * prompt)504887Schin extern char*	getpass(const char *prompt)
514887Schin {
524887Schin 	struct termios told,tnew;
534887Schin 	Sfio_t *iop;
544887Schin 	static char *cp, passwd[32];
554887Schin 	void (*savesig)(int);
564887Schin 	if(!(iop = sfopen((Sfio_t*)0, "/dev/tty", "r")))
574887Schin 		return(0);
584887Schin 	if(tcgetattr(sffileno(iop),&told) < 0)
594887Schin 		return(0);
604887Schin 	interrupt = 0;
614887Schin 	tnew = told;
624887Schin 	tnew.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL);
634887Schin 	if(tcsetattr(sffileno(iop),TCSANOW,&tnew) < 0)
644887Schin 		return(0);
654887Schin 	savesig = signal(SIGINT, handler);
664887Schin 	sfputr(sfstderr,prompt,-1);
674887Schin 	if(cp = sfgetr(iop,'\n',1))
684887Schin 		strncpy(passwd,cp,sizeof(passwd)-1);
694887Schin 	tcsetattr(sffileno(iop),TCSANOW,&told);
704887Schin 	sfputc(sfstderr,'\n');
714887Schin 	sfclose(iop);
724887Schin 	signal(SIGINT, savesig);
734887Schin 	if(interrupt)
744887Schin 		kill(getpid(),SIGINT);
754887Schin 	return(cp?passwd:0);
764887Schin }
774887Schin 
784887Schin 
794887Schin #endif
80