diff --git a/ChangeLog b/ChangeLog index b630bd541..67c16acbb 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 a76a1dc13..391b2dd81 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 @@ -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 @@ -70,7 +70,7 @@ dirname(path) } 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 269af413c..c85bb240c 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 @@ struct { \ (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 9ed1bc80f..d69dc5c24 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 @@ _gettemp(path, doopen, domkdir, slen) { 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 fdef15809..4e63b6189 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 * 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 @@ static char rcsid[] = "$OpenBSD: readpassphrase.c,v 1.5 2001/06/27 13:23:30 djm # 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 @@ readpassphrase(prompt, buf, bufsiz, flags) 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 @@ readpassphrase(prompt, buf, bufsiz, flags) } /* - * 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 @@ readpassphrase(prompt, buf, bufsiz, flags) } } *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 ec801d498..b4a05db95 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 @@ -74,6 +74,10 @@ realpath(const char *path, char *resolved) } 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 @@ loop: 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 ac9670baf..6c2d5cd31 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 @@ -101,7 +101,8 @@ setenv(name, value, rewrite) 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 38eca9ad7..e165dd13c 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"