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 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; 454887Schin static void handler(int sig) 464887Schin { 474887Schin interrupt++; 484887Schin } 494887Schin 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