- (djm) Sync openbsd-compat with OpenBSD CVS too
diff --git a/ChangeLog b/ChangeLog
index b630bd5..67c16ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -34,6 +34,7 @@
      [sftp-client.c sftp-client.h sftp-glob.c sftp-glob.h sftp.h]
      [sftp-int.c sftp-int.h]
      API cleanup and backwards compat for filexfer v.0 servers; ok markus@
+ - (djm) Sync openbsd-compat with OpenBSD CVS too
 
 20020210
  - (djm) OpenBSD CVS Sync
@@ -7581,4 +7582,4 @@
  - Wrote replacements for strlcpy and mkdtemp
  - Released 1.0pre1
 
-$Id: ChangeLog,v 1.1848 2002/02/13 03:10:32 djm Exp $
+$Id: ChangeLog,v 1.1849 2002/02/13 05:00:15 djm Exp $
diff --git a/openbsd-compat/dirname.c b/openbsd-compat/dirname.c
index a76a1dc..391b2dd 100644
--- a/openbsd-compat/dirname.c
+++ b/openbsd-compat/dirname.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: dirname.c,v 1.5 2001/06/27 00:58:54 lebel Exp $	*/
+/*	$OpenBSD: dirname.c,v 1.6 2001/06/28 04:27:19 pjanzen Exp $	*/
 
 /*
  * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -31,7 +31,7 @@
 #ifndef HAVE_DIRNAME
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: dirname.c,v 1.5 2001/06/27 00:58:54 lebel Exp $";
+static char rcsid[] = "$OpenBSD: dirname.c,v 1.6 2001/06/28 04:27:19 pjanzen Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <errno.h>
@@ -70,7 +70,7 @@
 		} while (endp > path && *endp == '/');
 	}
 
-	if (endp - path + 1 > sizeof(bname)) {
+	if (endp - path + 2 > sizeof(bname)) {
 		errno = ENAMETOOLONG;
 		return(NULL);
 	}
diff --git a/openbsd-compat/fake-queue.h b/openbsd-compat/fake-queue.h
index 269af41..c85bb24 100644
--- a/openbsd-compat/fake-queue.h
+++ b/openbsd-compat/fake-queue.h
@@ -1,4 +1,4 @@
-/*	$OpenBSD: queue.h,v 1.16 2000/09/07 19:47:59 art Exp $	*/
+/*	$OpenBSD: queue.h,v 1.22 2001/06/23 04:39:35 angelos Exp $	*/
 /*	$NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $	*/
 
 /*
@@ -136,6 +136,19 @@
 	(head)->slh_first = (head)->slh_first->field.sle_next;		\
 } while (0)
 
+#define SLIST_REMOVE(head, elm, type, field) do {			\
+	if ((head)->slh_first == (elm)) {				\
+		SLIST_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = (head)->slh_first;		\
+		while( curelm->field.sle_next != (elm) )		\
+			curelm = curelm->field.sle_next;		\
+		curelm->field.sle_next =				\
+		    curelm->field.sle_next->field.sle_next;		\
+	}								\
+} while (0)
+
 /*
  * List definitions.
  */
diff --git a/openbsd-compat/mktemp.c b/openbsd-compat/mktemp.c
index 9ed1bc8..d69dc5c 100644
--- a/openbsd-compat/mktemp.c
+++ b/openbsd-compat/mktemp.c
@@ -39,7 +39,7 @@
 #ifndef HAVE_MKDTEMP
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: mktemp.c,v 1.13 1998/06/30 23:03:13 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: mktemp.c,v 1.14 2002/01/02 20:18:32 deraadt Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #ifdef HAVE_CYGWIN
@@ -84,7 +84,8 @@
 {
 	register char *start, *trv, *suffp;
 	struct stat sbuf;
-	int pid, rval;
+	int rval;
+	pid_t pid;
 
 	if (doopen && domkdir) {
 		errno = EINVAL;
diff --git a/openbsd-compat/readpassphrase.c b/openbsd-compat/readpassphrase.c
index fdef158..4e63b61 100644
--- a/openbsd-compat/readpassphrase.c
+++ b/openbsd-compat/readpassphrase.c
@@ -1,3 +1,5 @@
+/*	$OpenBSD: readpassphrase.c,v 1.12 2001/12/15 05:41:00 millert Exp $	*/
+
 /*
  * Copyright (c) 2000 Todd C. Miller <Todd.Miller@courtesan.com>
  * All rights reserved.
@@ -26,7 +28,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: readpassphrase.c,v 1.5 2001/06/27 13:23:30 djm Exp $";
+static const char rcsid[] = "$OpenBSD: readpassphrase.c,v 1.12 2001/12/15 05:41:00 millert Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include "includes.h"
@@ -47,20 +49,19 @@
 #  define _POSIX_VDISABLE       VDISABLE
 #endif
 
+static volatile sig_atomic_t signo;
+
+static void handler(int);
+
 char *
-readpassphrase(prompt, buf, bufsiz, flags)
-	const char *prompt;
-	char *buf;
-	size_t bufsiz;
-	int flags;
+readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags)
 {
-	struct termios term;
+	ssize_t nr;
+	int input, output, save_errno;
 	char ch, *p, *end;
-#ifdef _POSIX_VDISABLE
-	u_char status;
-#endif
-	int echo, input, output;
-	sigset_t oset, nset;
+	struct termios term, oterm;
+	struct sigaction sa, saveint, savehup, savequit, saveterm;
+	struct sigaction savetstp, savettin, savettou;
 
 	/* I suppose we could alloc on demand in this case (XXX). */
 	if (bufsiz == 0) {
@@ -68,6 +69,7 @@
 		return(NULL);
 	}
 
+restart:
 	/*
 	 * Read and write to /dev/tty if available.  If not, read from
 	 * stdin and write to stderr unless a tty is required.
@@ -82,44 +84,39 @@
 	}
 
 	/*
-	 * We block SIGINT and SIGTSTP so the terminal is not left
-	 * in an inconsistent state (ie: no echo).  It would probably
-	 * be better to simply catch these though.
+	 * Catch signals that would otherwise cause the user to end
+	 * up with echo turned off in the shell.  Don't worry about
+	 * things like SIGALRM and SIGPIPE for now.
 	 */
-	sigemptyset(&nset);
-	sigaddset(&nset, SIGINT);
-	sigaddset(&nset, SIGTSTP);
-	(void)sigprocmask(SIG_BLOCK, &nset, &oset);
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = 0;		/* don't restart system calls */
+	sa.sa_handler = handler;
+	(void)sigaction(SIGINT, &sa, &saveint);
+	(void)sigaction(SIGHUP, &sa, &savehup);
+	(void)sigaction(SIGQUIT, &sa, &savequit);
+	(void)sigaction(SIGTERM, &sa, &saveterm);
+	(void)sigaction(SIGTSTP, &sa, &savetstp);
+	(void)sigaction(SIGTTIN, &sa, &savettin);
+	(void)sigaction(SIGTTOU, &sa, &savettou);
 
 	/* Turn off echo if possible. */
-	echo = 0;
-#ifdef _POSIX_VDISABLE
-	status = _POSIX_VDISABLE;
-#endif
-	if (tcgetattr(input, &term) == 0) {
-		if (!(flags & RPP_ECHO_ON) && (term.c_lflag & ECHO)) {
-			echo = 1;
-			term.c_lflag &= ~ECHO;
-		}
+	if (tcgetattr(input, &oterm) == 0) {
+		memcpy(&term, &oterm, sizeof(term));
+		if (!(flags & RPP_ECHO_ON))
+			term.c_lflag &= ~(ECHO | ECHONL);
 #ifdef VSTATUS
-		if (term.c_cc[VSTATUS] != _POSIX_VDISABLE) {
-			status = term.c_cc[VSTATUS];
+		if (term.c_cc[VSTATUS] != _POSIX_VDISABLE)
 			term.c_cc[VSTATUS] = _POSIX_VDISABLE;
-		}
 #endif
 		(void)tcsetattr(input, _T_FLUSH, &term);
-	}
-	if (!(flags & RPP_ECHO_ON)) {
-		if (tcgetattr(input, &term) == 0 && (term.c_lflag & ECHO)) {
-			echo = 1;
-			term.c_lflag &= ~ECHO;
-			(void)tcsetattr(input, _T_FLUSH, &term);
-		}
+	} else {
+		memset(&term, 0, sizeof(term));
+		memset(&oterm, 0, sizeof(oterm));
 	}
 
 	(void)write(output, prompt, strlen(prompt));
 	end = buf + bufsiz - 1;
-	for (p = buf; read(input, &ch, 1) == 1 && ch != '\n' && ch != '\r';) {
+	for (p = buf; (nr = read(input, &ch, 1)) == 1 && ch != '\n' && ch != '\r';) {
 		if (p < end) {
 			if ((flags & RPP_SEVENBIT))
 				ch &= 0x7f;
@@ -133,35 +130,55 @@
 		}
 	}
 	*p = '\0';
-#ifdef _POSIX_VDISABLE
-	if (echo || status != _POSIX_VDISABLE) {
-#else
-	if (echo) {
-#endif
-		if (echo) {
-			(void)write(output, "\n", 1);
-			term.c_lflag |= ECHO;
-		}
-#ifdef VSTATUS
-		if (status != _POSIX_VDISABLE)
-			term.c_cc[VSTATUS] = status;
-#endif
+	save_errno = errno;
+	if (!(term.c_lflag & ECHO))
+		(void)write(output, "\n", 1);
+
+	/* Restore old terminal settings and signals. */
+	if (memcmp(&term, &oterm, sizeof(term)) != 0)
 		(void)tcsetattr(input, _T_FLUSH, &term);
-	}
-	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
+	(void)sigaction(SIGINT, &saveint, NULL);
+	(void)sigaction(SIGHUP, &savehup, NULL);
+	(void)sigaction(SIGQUIT, &savequit, NULL);
+	(void)sigaction(SIGTERM, &saveterm, NULL);
+	(void)sigaction(SIGTSTP, &savetstp, NULL);
+	(void)sigaction(SIGTTIN, &savettin, NULL);
+	(void)sigaction(SIGTTOU, &savettou, NULL);
 	if (input != STDIN_FILENO)
 		(void)close(input);
-	return(buf);
+
+	/*
+	 * If we were interrupted by a signal, resend it to ourselves
+	 * now that we have restored the signal handlers.
+	 */
+	if (signo) {
+		kill(getpid(), signo); 
+		switch (signo) {
+		case SIGTSTP:
+		case SIGTTIN:
+		case SIGTTOU:
+			signo = 0;
+			goto restart;
+		}
+	}
+
+	errno = save_errno;
+	return(nr == -1 ? NULL : buf);
 }
 #endif /* HAVE_READPASSPHRASE */
-
+  
 #if 0
 char *
-getpass(prompt)
-        const char *prompt;
+getpass(const char *prompt)
 {
 	static char buf[_PASSWORD_LEN + 1];
 
 	return(readpassphrase(prompt, buf, sizeof(buf), RPP_ECHO_OFF));
 }
 #endif
+
+static void handler(int s)
+{
+
+	signo = s;
+}
diff --git a/openbsd-compat/realpath.c b/openbsd-compat/realpath.c
index ec801d4..b4a05db 100644
--- a/openbsd-compat/realpath.c
+++ b/openbsd-compat/realpath.c
@@ -32,7 +32,7 @@
 #if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH)
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: realpath.c,v 1.5 2001/06/27 00:58:56 lebel Exp $";
+static char *rcsid = "$OpenBSD: realpath.c,v 1.6 2002/01/12 16:24:35 millert Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/param.h>
@@ -74,6 +74,10 @@
 	}
 	close(fd);
 
+	/* Convert "." -> "" to optimize away a needless lstat() and chdir() */
+	if (path[0] == '.' && path[1] == '\0')
+		path = "";
+
 	/*
 	 * Find the dirname and basename from the path to be resolved.
 	 * Change directory to the dirname component.
@@ -102,7 +106,7 @@
 		p = resolved;
 
 	/* Deal with the last component. */
-	if (lstat(p, &sb) == 0) {
+	if (*p != '\0' && lstat(p, &sb) == 0) {
 		if (S_ISLNK(sb.st_mode)) {
 			if (++symlinks > MAXSYMLINKS) {
 				serrno = ELOOP;
diff --git a/openbsd-compat/setenv.c b/openbsd-compat/setenv.c
index ac9670b..6c2d5cd 100644
--- a/openbsd-compat/setenv.c
+++ b/openbsd-compat/setenv.c
@@ -35,7 +35,7 @@
 #ifndef HAVE_SETENV
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char *rcsid = "$OpenBSD: setenv.c,v 1.3 1998/02/02 22:44:53 millert Exp $";
+static char *rcsid = "$OpenBSD: setenv.c,v 1.4 2001/07/09 06:57:45 deraadt Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <stdlib.h>
@@ -101,7 +101,8 @@
 		if (!rewrite)
 			return (0);
 		if (strlen(C) >= l_value) {	/* old larger; copy over */
-			while ((*C++ = *value++));
+			while ((*C++ = *value++))
+				;
 			return (0);
 		}
 	} else {					/* create new slot */
diff --git a/openbsd-compat/setproctitle.c b/openbsd-compat/setproctitle.c
index 38eca9a..e165dd1 100644
--- a/openbsd-compat/setproctitle.c
+++ b/openbsd-compat/setproctitle.c
@@ -35,7 +35,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: setproctitle.c,v 1.7 1999/02/25 22:10:12 art Exp $";
+static char rcsid[] = "$OpenBSD: setproctitle.c,v 1.8 2001/11/06 19:21:40 art Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include "includes.h"