/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2009 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #include "FEATURE/uwin" #if !_UWIN || _lib_getpass void _STUB_getpass(){} #else #pragma prototyped #define getpass ______getpass #include #include #include #undef getpass #if defined(__EXPORT__) #define extern __EXPORT__ #endif static int interrupt; static void handler(int sig) { interrupt++; } extern char* getpass(const char *prompt) { struct termios told,tnew; Sfio_t *iop; static char *cp, passwd[32]; void (*savesig)(int); if(!(iop = sfopen((Sfio_t*)0, "/dev/tty", "r"))) return(0); if(tcgetattr(sffileno(iop),&told) < 0) return(0); interrupt = 0; tnew = told; tnew.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL); if(tcsetattr(sffileno(iop),TCSANOW,&tnew) < 0) return(0); savesig = signal(SIGINT, handler); sfputr(sfstderr,prompt,-1); if(cp = sfgetr(iop,'\n',1)) strncpy(passwd,cp,sizeof(passwd)-1); tcsetattr(sffileno(iop),TCSANOW,&told); sfputc(sfstderr,'\n'); sfclose(iop); signal(SIGINT, savesig); if(interrupt) kill(getpid(),SIGINT); return(cp?passwd:0); } #endif