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