aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2015-06-17 10:41:22 -0400
committerNick Mathewson <nickm@torproject.org>2015-06-17 10:41:22 -0400
commitb9b658e727520d947e6c14475ee22e8606e9f062 (patch)
tree76a1997f4787d5879b2e3a57ac25f865fe426a60
parent8d44ce910ddb00d6a9c18b912f2b027f822e5dc1 (diff)
downloadtor-b9b658e727520d947e6c14475ee22e8606e9f062.tar.gz
tor-b9b658e727520d947e6c14475ee22e8606e9f062.zip
Add the openssh 6.8p1 readpassphrase implementation
This way glibc users don't have to fall back to getpass. Windows users are still out of luck
-rw-r--r--configure.ac2
-rw-r--r--src/common/compat.c2
-rw-r--r--src/common/include.am9
-rw-r--r--src/ext/readpassphrase.c13
-rw-r--r--src/ext/readpassphrase.h4
5 files changed, 25 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac
index 195e56fc93..23d4c98f5d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -423,6 +423,8 @@ if test "$bwin32" != true; then
AC_CHECK_FUNCS(pthread_create)
fi
+AM_CONDITIONAL(BUILD_READPASSPHRASE_C, test x$ac_cv_func_readpassphrase = xno && test $bwin32 = false)
+
dnl ------------------------------------------------------
dnl Where do you live, libevent? And how do we call you?
diff --git a/src/common/compat.c b/src/common/compat.c
index 701027523e..a931f0a229 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -69,6 +69,8 @@
#endif
#ifdef HAVE_READPASSPHRASE_H
#include <readpassphrase.h>
+#elif !defined(_WIN32)
+#include "readpassphrase.h"
#endif
#ifndef HAVE_GETTIMEOFDAY
diff --git a/src/common/include.am b/src/common/include.am
index b782310663..789f4003c9 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -51,6 +51,12 @@ if THREADS_WIN32
threads_impl_source=src/common/compat_winthreads.c
endif
+if BUILD_READPASSPHRASE_C
+readpassphrase_source=src/ext/readpassphrase.c
+else
+readpassphrase_source=
+endif
+
LIBOR_A_SOURCES = \
src/common/address.c \
src/common/backtrace.c \
@@ -67,7 +73,8 @@ LIBOR_A_SOURCES = \
src/ext/csiphash.c \
src/ext/trunnel/trunnel.c \
$(libor_extra_source) \
- $(threads_impl_source)
+ $(threads_impl_source) \
+ $(readpassphrase_source)
src/common/log.o: micro-revision.i
diff --git a/src/ext/readpassphrase.c b/src/ext/readpassphrase.c
index d63cdf2f0e..7bdecaf637 100644
--- a/src/ext/readpassphrase.c
+++ b/src/ext/readpassphrase.c
@@ -22,7 +22,7 @@
/* OPENBSD ORIGINAL: lib/libc/gen/readpassphrase.c */
-#include "includes.h"
+#include "orconfig.h"
#ifndef HAVE_READPASSPHRASE
@@ -35,6 +35,10 @@
#include <string.h>
#include <unistd.h>
+#ifndef _PATH_TTY
+# define _PATH_TTY "/dev/tty"
+#endif
+
#ifdef TCSASOFT
# define _T_FLUSH (TCSAFLUSH|TCSASOFT)
#else
@@ -61,6 +65,7 @@ static void handler(int);
char *
readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags)
{
+ ssize_t bytes_written = 0;
ssize_t nr;
int input, output, save_errno, i, need_restart;
char ch, *p, *end;
@@ -132,7 +137,7 @@ restart:
/* No I/O if we are already backgrounded. */
if (signo[SIGTTOU] != 1 && signo[SIGTTIN] != 1) {
if (!(flags & RPP_STDIN))
- (void)write(output, prompt, strlen(prompt));
+ bytes_written = write(output, prompt, strlen(prompt));
end = buf + bufsiz - 1;
p = buf;
while ((nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r') {
@@ -151,9 +156,11 @@ restart:
*p = '\0';
save_errno = errno;
if (!(term.c_lflag & ECHO))
- (void)write(output, "\n", 1);
+ bytes_written = write(output, "\n", 1);
}
+ (void) bytes_written;
+
/* Restore old terminal settings and signals. */
if (memcmp(&term, &oterm, sizeof(term)) != 0) {
while (tcsetattr(input, _T_FLUSH, &oterm) == -1 &&
diff --git a/src/ext/readpassphrase.h b/src/ext/readpassphrase.h
index 5fd7c5d77a..83ae1f20a8 100644
--- a/src/ext/readpassphrase.h
+++ b/src/ext/readpassphrase.h
@@ -25,7 +25,7 @@
#ifndef _READPASSPHRASE_H_
#define _READPASSPHRASE_H_
-#include "includes.h"
+#include "orconfig.h"
#ifndef HAVE_READPASSPHRASE
@@ -39,6 +39,8 @@
char * readpassphrase(const char *, char *, size_t, int);
+#define HAVE_READPASSPHRASE
+
#endif /* HAVE_READPASSPHRASE */
#endif /* !_READPASSPHRASE_H_ */