1/* getpass.c -- get password from user */ 2/* $OpenLDAP$ */ 3/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 4 * 5 * Copyright 1998-2011 The OpenLDAP Foundation. 6 * Portions Copyright 1998-2003 Kurt D. Zeilenga. 7 * Portions Copyright 2009 Howard Chu. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted only as authorized by the OpenLDAP 12 * Public License. 13 * 14 * A copy of this license is available in the file LICENSE in the 15 * top-level directory of the distribution or, alternatively, at 16 * <http://www.OpenLDAP.org/license.html>. 17 */ 18/* Portions Copyright (c) 1992, 1993 Regents of the University of Michigan. 19 * All rights reserved. 20 * 21 * Redistribution and use in source and binary forms are permitted 22 * provided that this notice is preserved and that due credit is given 23 * to the University of Michigan at Ann Arbor. The name of the University 24 * may not be used to endorse or promote products derived from this 25 * software without specific prior written permission. This software 26 * is provided ``as is'' without express or implied warranty. 27 */ 28/* This work was originally developed by the University of Michigan 29 * and distributed as part of U-MICH LDAP. It was adapted for use in 30 * -llutil by Kurt D. Zeilenga and subsequently rewritten by Howard Chu. 31 */ 32 33#include "portable.h" 34 35#include <stdio.h> 36 37#include <ac/stdlib.h> 38 39#include <ac/ctype.h> 40#include <ac/signal.h> 41#include <ac/string.h> 42#include <ac/termios.h> 43#include <ac/time.h> 44#include <ac/unistd.h> 45 46#ifndef HAVE_GETPASSPHRASE 47 48#ifdef HAVE_FCNTL_H 49#include <fcntl.h> 50#endif 51 52#ifdef HAVE_CONIO_H 53#include <conio.h> 54#endif 55 56#include <lber.h> 57#include <ldap.h> 58 59#include "ldap_defaults.h" 60 61#define PBUF 512 62 63#ifdef HAVE_WINSOCK 64#define TTY "con:" 65#else 66#define TTY "/dev/tty" 67#endif 68 69char * 70lutil_getpass( const char *prompt ) 71{ 72 static char pbuf[PBUF]; 73 FILE *fi; 74 int c; 75 unsigned i; 76#if defined(HAVE_TERMIOS_H) || defined(HAVE_SGTTY_H) 77 TERMIO_TYPE ttyb; 78 TERMFLAG_TYPE flags; 79 RETSIGTYPE (*sig)( int sig ); 80#endif 81 82 if( prompt == NULL ) prompt = _("Password: "); 83 84#ifdef DEBUG 85 if (debug & D_TRACE) 86 printf("->getpass(%s)\n", prompt); 87#endif 88 89#if defined(HAVE_TERMIOS_H) || defined(HAVE_SGTTY_H) 90 if ((fi = fopen(TTY, "r")) == NULL) 91 fi = stdin; 92 else 93 setbuf(fi, (char *)NULL); 94 if (fi != stdin) { 95 if (GETATTR(fileno(fi), &ttyb) < 0) 96 perror("GETATTR"); 97 sig = SIGNAL (SIGINT, SIG_IGN); 98 flags = GETFLAGS( ttyb ); 99 SETFLAGS( ttyb, flags & ~ECHO ); 100 if (SETATTR(fileno(fi), &ttyb) < 0) 101 perror("SETATTR"); 102 } 103#else 104 fi = stdin; 105#endif 106 fprintf(stderr, "%s", prompt); 107 fflush(stderr); 108 i = 0; 109 while ( (c = getc(fi)) != EOF && c != '\n' && c != '\r' ) 110 if ( i < (sizeof(pbuf)-1) ) 111 pbuf[i++] = c; 112#if defined(HAVE_TERMIOS_H) || defined(HAVE_SGTTY_H) 113 /* tidy up */ 114 if (fi != stdin) { 115 fprintf(stderr, "\n"); 116 fflush(stderr); 117 SETFLAGS( ttyb, flags ); 118 if (SETATTR(fileno(fi), &ttyb) < 0) 119 perror("SETATTR"); 120 (void) SIGNAL (SIGINT, sig); 121 (void) fclose(fi); 122 } 123#endif 124 if ( c == EOF ) 125 return( NULL ); 126 pbuf[i] = '\0'; 127 return (pbuf); 128} 129 130#endif /* !NEED_GETPASSPHRASE */ 131