Annotation of embedaddon/rsync/lib/getpass.c, revision 1.1
1.1 ! misho 1: /*
! 2: * An implementation of getpass for systems that lack one.
! 3: *
! 4: * Copyright (C) 2013 Roman Donchenko
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify
! 7: * it under the terms of the GNU General Public License as published by
! 8: * the Free Software Foundation; either version 3 of the License, or
! 9: * (at your option) any later version.
! 10: *
! 11: * This program is distributed in the hope that it will be useful,
! 12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 14: * GNU General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU General Public License along
! 17: * with this program; if not, visit the http://fsf.org website.
! 18: */
! 19:
! 20: #include <stdio.h>
! 21: #include <string.h>
! 22: #include <termios.h>
! 23:
! 24: #include "rsync.h"
! 25:
! 26: char *getpass(const char *prompt)
! 27: {
! 28: static char password[256];
! 29:
! 30: BOOL tty_changed = False, read_success;
! 31: struct termios tty_old, tty_new;
! 32: FILE *in = stdin, *out = stderr;
! 33: FILE *tty = fopen("/dev/tty", "w+");
! 34:
! 35: if (tty)
! 36: in = out = tty;
! 37:
! 38: if (tcgetattr(fileno(in), &tty_old) == 0) {
! 39: tty_new = tty_old;
! 40: tty_new.c_lflag &= ~(ECHO | ISIG);
! 41:
! 42: if (tcsetattr(fileno(in), TCSAFLUSH, &tty_new) == 0)
! 43: tty_changed = True;
! 44: }
! 45:
! 46: if (!tty_changed)
! 47: fputs("(WARNING: will be visible) ", out);
! 48: fputs(prompt, out);
! 49: fflush(out);
! 50:
! 51: read_success = fgets(password, sizeof password, in) != NULL;
! 52:
! 53: /* Print the newline that hasn't been echoed. */
! 54: fputc('\n', out);
! 55:
! 56: if (tty_changed)
! 57: tcsetattr(fileno(in), TCSAFLUSH, &tty_old);
! 58:
! 59: if (tty)
! 60: fclose(tty);
! 61:
! 62: if (read_success) {
! 63: /* Remove the trailing newline. */
! 64: size_t password_len = strlen(password);
! 65: if (password_len && password[password_len - 1] == '\n')
! 66: password[password_len - 1] = '\0';
! 67:
! 68: return password;
! 69: }
! 70:
! 71: return NULL;
! 72: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>