Back to index

glibc  2.9
Defines | Functions
getpass.c File Reference
#include <stdio.h>
#include <stdio_ext.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <wchar.h>
#include <bits/libc-lock.h>

Go to the source code of this file.

Defines

#define flockfile(s)   _IO_flockfile (s)
#define funlockfile(s)   _IO_funlockfile (s)
#define TCSASOFT   0

Functions

static void call_fclose (void *arg)
char * getpass (char *prompt) const

Define Documentation

#define flockfile (   s)    _IO_flockfile (s)

Definition at line 26 of file getpass.c.

#define funlockfile (   s)    _IO_funlockfile (s)

Definition at line 27 of file getpass.c.

#define TCSASOFT   0

Definition at line 36 of file getpass.c.


Function Documentation

static void call_fclose ( void *  arg) [static]

Definition at line 40 of file getpass.c.

{
  if (arg != NULL)
    fclose (arg);
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* getpass ( char *  prompt) const

Definition at line 47 of file getpass.c.

{
  FILE *in, *out;
  struct termios s, t;
  int tty_changed;
  static char *buf;
  static size_t bufsize;
  ssize_t nread;

  /* Try to write to and read from the terminal if we can.
     If we can't open the terminal, use stderr and stdin.  */

  in = fopen ("/dev/tty", "w+c");
  if (in == NULL)
    {
      in = stdin;
      out = stderr;
    }
  else
    {
      /* We do the locking ourselves.  */
      __fsetlocking (in, FSETLOCKING_BYCALLER);

      out = in;
    }

  /* Make sure the stream we opened is closed even if the thread is
     canceled.  */
  __libc_cleanup_push (call_fclose, in == out ? in : NULL);

  flockfile (out);

  /* Turn echoing off if it is on now.  */

  if (__tcgetattr (fileno (in), &t) == 0)
    {
      /* Save the old one. */
      s = t;
      /* Tricky, tricky. */
      t.c_lflag &= ~(ECHO|ISIG);
      tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0);
    }
  else
    tty_changed = 0;

  /* Write the prompt.  */
  __fxprintf (out, "%s", prompt);
  fflush_unlocked (out);

  /* Read the password.  */
  nread = __getline (&buf, &bufsize, in);
  if (buf != NULL)
    {
      if (nread < 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.  */
           __fxprintf (out, "\n");
       }
    }

  /* Restore the original setting.  */
  if (tty_changed)
    (void) tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &s);

  funlockfile (out);

  __libc_cleanup_pop (0);

  if (in != stdin)
    /* We opened the terminal; now close it.  */
    fclose (in);

  return buf;
}

Here is the call graph for this function:

Here is the caller graph for this function: