X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgetpass.c;h=43d0d5947efd2f61dfaee273f96582f4fab475a2;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=f0b3184eeb219eef51d203ecf141f6a87b9fa1ad;hpb=222b0486b7db1b09293e05512873d633440efcb3;p=gnulib.git diff --git a/lib/getpass.c b/lib/getpass.c index f0b3184ee..43d0d5947 100644 --- a/lib/getpass.c +++ b/lib/getpass.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1992-2001, 2003, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 1992-2001, 2003-2007, 2009-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify @@ -12,10 +13,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + with this program; if not, see . */ -#ifdef HAVE_CONFIG_H +#ifndef _LIBC # include #endif @@ -23,56 +23,55 @@ #include -#if !defined _WIN32 - -#include - -#if HAVE_STDIO_EXT_H -# include -#endif -#if !HAVE___FSETLOCKING -# define __fsetlocking(stream, type) /* empty */ -#endif +#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) -#if HAVE_TERMIOS_H -# include -#endif +# include -#include "getline.h" - -#if USE_UNLOCKED_IO -# include "unlocked-io.h" -#else -# if !HAVE_DECL_FFLUSH_UNLOCKED -# undef fflush_unlocked -# define fflush_unlocked(x) fflush (x) -# endif -# if !HAVE_DECL_FLOCKFILE -# undef flockfile -# define flockfile(x) ((void) 0) -# endif -# if !HAVE_DECL_FUNLOCKFILE -# undef funlockfile -# define funlockfile(x) ((void) 0) +# if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING +# if HAVE_STDIO_EXT_H +# include +# endif +# else +# define __fsetlocking(stream, type) /* empty */ # endif -# if !HAVE_DECL_FPUTS_UNLOCKED -# undef fputs_unlocked -# define fputs_unlocked(str,stream) fputs (str, stream) + +# if HAVE_TERMIOS_H +# include # endif -# if !HAVE_DECL_PUTC_UNLOCKED -# undef putc_unlocked -# define putc_unlocked(c,stream) putc (c, stream) + +# if USE_UNLOCKED_IO +# include "unlocked-io.h" +# else +# if !HAVE_DECL_FFLUSH_UNLOCKED +# undef fflush_unlocked +# define fflush_unlocked(x) fflush (x) +# endif +# if !HAVE_DECL_FLOCKFILE +# undef flockfile +# define flockfile(x) ((void) 0) +# endif +# if !HAVE_DECL_FUNLOCKFILE +# undef funlockfile +# define funlockfile(x) ((void) 0) +# endif +# if !HAVE_DECL_FPUTS_UNLOCKED +# undef fputs_unlocked +# define fputs_unlocked(str,stream) fputs (str, stream) +# endif +# if !HAVE_DECL_PUTC_UNLOCKED +# undef putc_unlocked +# define putc_unlocked(c,stream) putc (c, stream) +# endif # endif -#endif /* It is desirable to use this bit on systems that have it. The only bit of terminal state we want to twiddle is echoing, which is done in software; there is no need to change the state of the terminal hardware. */ -#ifndef TCSASOFT -# define TCSASOFT 0 -#endif +# ifndef TCSASOFT +# define TCSASOFT 0 +# endif static void call_fclose (void *arg) @@ -112,7 +111,7 @@ getpass (const char *prompt) flockfile (out); /* Turn echoing off if it is on now. */ -#if HAVE_TCGETATTR +# if HAVE_TCGETATTR if (tcgetattr (fileno (in), &t) == 0) { /* Save the old one. */ @@ -121,7 +120,7 @@ getpass (const char *prompt) t.c_lflag &= ~(ECHO | ISIG); tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0); } -#endif +# endif /* Write the prompt. */ fputs_unlocked (prompt, out); @@ -139,29 +138,29 @@ getpass (const char *prompt) == fileno (out). The POSIX restrictions are tricky and change from POSIX version to POSIX version, so play it safe and invoke fseek even if in != out. */ - fseek (out, 0, SEEK_CUR); + fseeko (out, 0, SEEK_CUR); if (buf != NULL) { if (nread < 0) - buf[0] = '\0'; + buf[0] = '\0'; else if (buf[nread - 1] == '\n') - { - /* Remove the newline. */ - buf[nread - 1] = '\0'; - if (tty_changed) - { - /* Write the newline that was not echoed. */ - putc_unlocked ('\n', out); - } - } + { + /* Remove the newline. */ + buf[nread - 1] = '\0'; + if (tty_changed) + { + /* Write the newline that was not echoed. */ + putc_unlocked ('\n', out); + } + } } /* Restore the original setting. */ -#if HAVE_TCSETATTR +# if HAVE_TCSETATTR if (tty_changed) tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s); -#endif +# endif funlockfile (out); @@ -170,17 +169,21 @@ getpass (const char *prompt) return buf; } -#else /* WIN32 */ +#else /* W32 native */ /* Windows implementation by Martin Lambers , improved by Simon Josefsson. */ /* For PASS_MAX. */ -#include - -#ifndef PASS_MAX -# define PASS_MAX 512 -#endif +# include +/* For _getch(). */ +# include +/* For strdup(). */ +# include + +# ifndef PASS_MAX +# define PASS_MAX 512 +# endif char * getpass (const char *prompt) @@ -199,20 +202,20 @@ getpass (const char *prompt) { c = _getch (); if (c == '\r') - { - getpassbuf[i] = '\0'; - break; - } + { + getpassbuf[i] = '\0'; + break; + } else if (i < PASS_MAX) - { - getpassbuf[i++] = c; - } + { + getpassbuf[i++] = c; + } if (i >= PASS_MAX) - { - getpassbuf[i] = '\0'; - break; - } + { + getpassbuf[i] = '\0'; + break; + } } if (prompt)