summaryrefslogtreecommitdiff
path: root/openbsd-compat
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2008-07-22 19:45:18 +0000
committerColin Watson <cjwatson@debian.org>2008-07-22 19:45:18 +0000
commit137d76ba65883aa8143af1fcad83b57e7badef0c (patch)
treef426e804bb5248ceafedfab7bb78ae6e6752942c /openbsd-compat
parentdac7d049dad31f5f84d421d4eb628a7e13f977d7 (diff)
parentef94e5613d37bcbf880f21ee6094e4b1c7683a4c (diff)
* New upstream release (closes: #474301). Important changes not previously
backported to 4.7p1: - 4.9/4.9p1 (http://www.openssh.com/txt/release-4.9): + Added chroot(2) support for sshd(8), controlled by a new option "ChrootDirectory" (closes: #139047, LP: #24777). + Linked sftp-server(8) into sshd(8). The internal sftp server is used when the command "internal-sftp" is specified in a Subsystem or ForceCommand declaration. When used with ChrootDirectory, the internal sftp server requires no special configuration of files inside the chroot environment. + Added a protocol extension method "posix-rename@openssh.com" for sftp-server(8) to perform POSIX atomic rename() operations; sftp(1) prefers this if available (closes: #308561). + Removed the fixed limit of 100 file handles in sftp-server(8). + ssh(8) will now skip generation of SSH protocol 1 ephemeral server keys when in inetd mode and protocol 2 connections are negotiated. This speeds up protocol 2 connections to inetd-mode servers that also allow Protocol 1. + Accept the PermitRootLogin directive in a sshd_config(5) Match block. Allows for, e.g. permitting root only from the local network. + Reworked sftp(1) argument splitting and escaping to be more internally consistent (i.e. between sftp commands) and more consistent with sh(1). Please note that this will change the interpretation of some quoted strings, especially those with embedded backslash escape sequences. + Support "Banner=none" in sshd_config(5) to disable sending of a pre-login banner (e.g. in a Match block). + ssh(1) ProxyCommands are now executed with $SHELL rather than /bin/sh. + ssh(1)'s ConnectTimeout option is now applied to both the TCP connection and the SSH banner exchange (previously it just covered the TCP connection). This allows callers of ssh(1) to better detect and deal with stuck servers that accept a TCP connection but don't progress the protocol, and also makes ConnectTimeout useful for connections via a ProxyCommand. + scp(1) incorrectly reported "stalled" on slow copies (closes: #140828). + scp(1) date underflow for timestamps before epoch. + ssh(1) used the obsolete SIG DNS RRtype for host keys in DNS, instead of the current standard RRSIG. + Correctly drain ACKs when a sftp(1) upload write fails midway, avoids a fatal() exit from what should be a recoverable condition. + Fixed ssh-keygen(1) selective host key hashing (i.e. "ssh-keygen -HF hostname") to not include any IP address in the data to be hashed. + Make ssh(1) skip listening on the IPv6 wildcard address when a binding address of 0.0.0.0 is used against an old SSH server that does not support the RFC4254 syntax for wildcard bind addresses. + Enable IPV6_V6ONLY socket option on sshd(8) listen socket, as is already done for X11/TCP forwarding sockets (closes: #439661). + Fix FD leak that could hang a ssh(1) connection multiplexing master. + Make ssh(1) -q option documentation consistent with reality. + Fixed sshd(8) PAM support not calling pam_session_close(), or failing to call it with root privileges (closes: #372680). + Fix activation of OpenSSL engine support when requested in configure (LP: #119295). - 5.1/5.1p1 (http://www.openssh.com/txt/release-5.1): + Introduce experimental SSH Fingerprint ASCII Visualisation to ssh(1) and ssh-keygen(1). Visual fingerprint display is controlled by a new ssh_config(5) option "VisualHostKey". The intent is to render SSH host keys in a visual form that is amenable to easy recall and rejection of changed host keys. + sshd_config(5) now supports CIDR address/masklen matching in "Match address" blocks, with a fallback to classic wildcard matching. + sshd(8) now supports CIDR matching in ~/.ssh/authorized_keys from="..." restrictions, also with a fallback to classic wildcard matching. + Added an extended test mode (-T) to sshd(8) to request that it write its effective configuration to stdout and exit. Extended test mode also supports the specification of connection parameters (username, source address and hostname) to test the application of sshd_config(5) Match rules. + ssh(1) now prints the number of bytes transferred and the overall connection throughput for SSH protocol 2 sessions when in verbose mode (previously these statistics were displayed for protocol 1 connections only). + sftp-server(8) now supports extension methods statvfs@openssh.com and fstatvfs@openssh.com that implement statvfs(2)-like operations. + sftp(1) now has a "df" command to the sftp client that uses the statvfs@openssh.com to produce a df(1)-like display of filesystem space and inode utilisation (requires statvfs@openssh.com support on the server). + Added a MaxSessions option to sshd_config(5) to allow control of the number of multiplexed sessions supported over a single TCP connection. This allows increasing the number of allowed sessions above the previous default of 10, disabling connection multiplexing (MaxSessions=1) or disallowing login/shell/subsystem sessions entirely (MaxSessions=0). + Added a no-more-sessions@openssh.com global request extension that is sent from ssh(1) to sshd(8) when the client knows that it will never request another session (i.e. when session multiplexing is disabled). This allows a server to disallow further session requests and terminate the session in cases where the client has been hijacked. + ssh-keygen(1) now supports the use of the -l option in combination with -F to search for a host in ~/.ssh/known_hosts and display its fingerprint. + ssh-keyscan(1) now defaults to "rsa" (protocol 2) keys, instead of "rsa1". + Added an AllowAgentForwarding option to sshd_config(8) to control whether authentication agent forwarding is permitted. Note that this is a loose control, as a client may install their own unofficial forwarder. + ssh(1) and sshd(8): avoid unnecessary malloc/copy/free when receiving network data, resulting in a ~10% speedup. + ssh(1) and sshd(8) will now try additional addresses when connecting to a port forward destination whose DNS name resolves to more than one address. The previous behaviour was to try the only first address and give up if that failed. + ssh(1) and sshd(8) now support signalling that channels are half-closed for writing, through a channel protocol extension notification "eow@openssh.com". This allows propagation of closed file descriptors, so that commands such as "ssh -2 localhost od /bin/ls | true" do not send unnecessary data over the wire. + sshd(8): increased the default size of ssh protocol 1 ephemeral keys from 768 to 1024 bits. + When ssh(1) has been requested to fork after authentication ("ssh -f") with ExitOnForwardFailure enabled, delay the fork until after replies for any -R forwards have been seen. Allows for robust detection of -R forward failure when using -f. + "Match group" blocks in sshd_config(5) now support negation of groups. E.g. "Match group staff,!guests". + sftp(1) and sftp-server(8) now allow chmod-like operations to set set[ug]id/sticky bits. + The MaxAuthTries option is now permitted in sshd_config(5) match blocks. + Multiplexed ssh(1) sessions now support a subset of the ~ escapes that are available to a primary connection. + ssh(1) connection multiplexing will now fall back to creating a new connection in most error cases (closes: #352830). + Make ssh(1) deal more gracefully with channel requests that fail. Previously it would optimistically assume that requests would always succeed, which could cause hangs if they did not (e.g. when the server runs out of file descriptors). + ssh(1) now reports multiplexing errors via the multiplex slave's stderr where possible (subject to LogLevel in the mux master). + Prevent sshd(8) from erroneously applying public key restrictions leaned from ~/.ssh/authorized_keys to other authentication methods when public key authentication subsequently fails (LP: #161047). + Fixed an UMAC alignment problem that manifested on Itanium platforms.
Diffstat (limited to 'openbsd-compat')
-rw-r--r--openbsd-compat/Makefile.in6
-rw-r--r--openbsd-compat/base64.c12
-rw-r--r--openbsd-compat/bindresvport.c14
-rw-r--r--openbsd-compat/bsd-arc4random.c66
-rw-r--r--openbsd-compat/bsd-asprintf.c1
-rw-r--r--openbsd-compat/bsd-cygwin_util.c40
-rw-r--r--openbsd-compat/bsd-poll.c5
-rw-r--r--openbsd-compat/bsd-statvfs.c37
-rw-r--r--openbsd-compat/bsd-statvfs.h68
-rw-r--r--openbsd-compat/fake-rfc2553.c7
-rw-r--r--openbsd-compat/fake-rfc2553.h8
-rw-r--r--openbsd-compat/fmt_scaled.c274
-rw-r--r--openbsd-compat/getrrsetbyname.c6
-rw-r--r--openbsd-compat/getrrsetbyname.h4
-rw-r--r--openbsd-compat/glob.c15
-rw-r--r--openbsd-compat/glob.h20
-rw-r--r--openbsd-compat/openbsd-compat.h16
-rw-r--r--openbsd-compat/openssl-compat.c2
-rw-r--r--openbsd-compat/openssl-compat.h11
-rw-r--r--openbsd-compat/port-aix.c45
-rw-r--r--openbsd-compat/port-aix.h14
-rw-r--r--openbsd-compat/port-linux.c4
-rw-r--r--openbsd-compat/port-linux.h3
-rw-r--r--openbsd-compat/port-tun.c1
-rw-r--r--openbsd-compat/regress/closefromtest.c1
-rw-r--r--openbsd-compat/regress/strtonumtest.c14
-rw-r--r--openbsd-compat/rresvport.c1
-rw-r--r--openbsd-compat/setenv.c6
-rw-r--r--openbsd-compat/setproctitle.c12
-rw-r--r--openbsd-compat/sigact.c50
-rw-r--r--openbsd-compat/sys-queue.h31
-rw-r--r--openbsd-compat/sys-tree.h16
32 files changed, 681 insertions, 129 deletions
diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
index b44a7851e..a60e5a68d 100644
--- a/openbsd-compat/Makefile.in
+++ b/openbsd-compat/Makefile.in
@@ -1,4 +1,4 @@
1# $Id: Makefile.in,v 1.41 2007/06/25 12:15:13 dtucker Exp $ 1# $Id: Makefile.in,v 1.43 2008/06/08 17:32:29 dtucker Exp $
2 2
3sysconfdir=@sysconfdir@ 3sysconfdir=@sysconfdir@
4piddir=@piddir@ 4piddir=@piddir@
@@ -16,9 +16,9 @@ RANLIB=@RANLIB@
16INSTALL=@INSTALL@ 16INSTALL=@INSTALL@
17LDFLAGS=-L. @LDFLAGS@ 17LDFLAGS=-L. @LDFLAGS@
18 18
19OPENBSD=base64.o basename.o bindresvport.o daemon.o dirname.o getcwd.o getgrouplist.o getopt.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o readpassphrase.o realpath.o rresvport.o setenv.o setproctitle.o sha2.o sigact.o strlcat.o strlcpy.o strmode.o strsep.o strtonum.o strtoll.o strtoul.o vis.o 19OPENBSD=base64.o basename.o bindresvport.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o readpassphrase.o realpath.o rresvport.o setenv.o setproctitle.o sha2.o sigact.o strlcat.o strlcpy.o strmode.o strsep.o strtonum.o strtoll.o strtoul.o vis.o
20 20
21COMPAT=bsd-arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-snprintf.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o 21COMPAT=bsd-arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o
22 22
23PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o 23PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o
24 24
diff --git a/openbsd-compat/base64.c b/openbsd-compat/base64.c
index 9a60f583b..9e7466716 100644
--- a/openbsd-compat/base64.c
+++ b/openbsd-compat/base64.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: base64.c,v 1.4 2002/01/02 23:00:10 deraadt Exp $ */ 1/* $OpenBSD: base64.c,v 1.5 2006/10/21 09:55:03 otto Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1996 by Internet Software Consortium. 4 * Copyright (c) 1996 by Internet Software Consortium.
@@ -62,9 +62,6 @@
62 62
63#include "base64.h" 63#include "base64.h"
64 64
65/* XXX abort illegal in library */
66#define Assert(Cond) if (!(Cond)) abort()
67
68static const char Base64[] = 65static const char Base64[] =
69 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 66 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
70static const char Pad64 = '='; 67static const char Pad64 = '=';
@@ -151,10 +148,6 @@ b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize)
151 output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); 148 output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
152 output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); 149 output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
153 output[3] = input[2] & 0x3f; 150 output[3] = input[2] & 0x3f;
154 Assert(output[0] < 64);
155 Assert(output[1] < 64);
156 Assert(output[2] < 64);
157 Assert(output[3] < 64);
158 151
159 if (datalength + 4 > targsize) 152 if (datalength + 4 > targsize)
160 return (-1); 153 return (-1);
@@ -174,9 +167,6 @@ b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize)
174 output[0] = input[0] >> 2; 167 output[0] = input[0] >> 2;
175 output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); 168 output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
176 output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); 169 output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
177 Assert(output[0] < 64);
178 Assert(output[1] < 64);
179 Assert(output[2] < 64);
180 170
181 if (datalength + 4 > targsize) 171 if (datalength + 4 > targsize)
182 return (-1); 172 return (-1);
diff --git a/openbsd-compat/bindresvport.c b/openbsd-compat/bindresvport.c
index 65afed1e3..c0d5bdb5c 100644
--- a/openbsd-compat/bindresvport.c
+++ b/openbsd-compat/bindresvport.c
@@ -1,6 +1,6 @@
1/* This file has be substantially modified from the original OpenBSD source */ 1/* This file has be substantially modified from the original OpenBSD source */
2 2
3/* $OpenBSD: bindresvport.c,v 1.16 2005/04/01 07:44:03 otto Exp $ */ 3/* $OpenBSD: bindresvport.c,v 1.17 2005/12/21 01:40:22 millert Exp $ */
4 4
5/* 5/*
6 * Copyright 1996, Jason Downs. All rights reserved. 6 * Copyright 1996, Jason Downs. All rights reserved.
@@ -54,8 +54,8 @@ bindresvport_sa(int sd, struct sockaddr *sa)
54{ 54{
55 int error, af; 55 int error, af;
56 struct sockaddr_storage myaddr; 56 struct sockaddr_storage myaddr;
57 struct sockaddr_in *sin; 57 struct sockaddr_in *in;
58 struct sockaddr_in6 *sin6; 58 struct sockaddr_in6 *in6;
59 u_int16_t *portp; 59 u_int16_t *portp;
60 u_int16_t port; 60 u_int16_t port;
61 socklen_t salen; 61 socklen_t salen;
@@ -74,13 +74,13 @@ bindresvport_sa(int sd, struct sockaddr *sa)
74 af = sa->sa_family; 74 af = sa->sa_family;
75 75
76 if (af == AF_INET) { 76 if (af == AF_INET) {
77 sin = (struct sockaddr_in *)sa; 77 in = (struct sockaddr_in *)sa;
78 salen = sizeof(struct sockaddr_in); 78 salen = sizeof(struct sockaddr_in);
79 portp = &sin->sin_port; 79 portp = &in->sin_port;
80 } else if (af == AF_INET6) { 80 } else if (af == AF_INET6) {
81 sin6 = (struct sockaddr_in6 *)sa; 81 in6 = (struct sockaddr_in6 *)sa;
82 salen = sizeof(struct sockaddr_in6); 82 salen = sizeof(struct sockaddr_in6);
83 portp = &sin6->sin6_port; 83 portp = &in6->sin6_port;
84 } else { 84 } else {
85 errno = EPFNOSUPPORT; 85 errno = EPFNOSUPPORT;
86 return (-1); 86 return (-1);
diff --git a/openbsd-compat/bsd-arc4random.c b/openbsd-compat/bsd-arc4random.c
index d45fb182a..9d4c8690e 100644
--- a/openbsd-compat/bsd-arc4random.c
+++ b/openbsd-compat/bsd-arc4random.c
@@ -19,6 +19,7 @@
19#include <sys/types.h> 19#include <sys/types.h>
20 20
21#include <string.h> 21#include <string.h>
22#include <stdlib.h>
22#include <stdarg.h> 23#include <stdarg.h>
23 24
24#include "log.h" 25#include "log.h"
@@ -82,3 +83,68 @@ arc4random_stir(void)
82 rc4_ready = REKEY_BYTES; 83 rc4_ready = REKEY_BYTES;
83} 84}
84#endif /* !HAVE_ARC4RANDOM */ 85#endif /* !HAVE_ARC4RANDOM */
86
87#ifndef ARC4RANDOM_BUF
88void
89arc4random_buf(void *_buf, size_t n)
90{
91 size_t i;
92 u_int32_t r = 0;
93 char *buf = (char *)_buf;
94
95 for (i = 0; i < n; i++) {
96 if (i % 4 == 0)
97 r = arc4random();
98 buf[i] = r & 0xff;
99 r >>= 8;
100 }
101 i = r = 0;
102}
103#endif /* !HAVE_ARC4RANDOM_BUF */
104
105#ifndef ARC4RANDOM_UNIFORM
106/*
107 * Calculate a uniformly distributed random number less than upper_bound
108 * avoiding "modulo bias".
109 *
110 * Uniformity is achieved by generating new random numbers until the one
111 * returned is outside the range [0, 2**32 % upper_bound). This
112 * guarantees the selected random number will be inside
113 * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
114 * after reduction modulo upper_bound.
115 */
116u_int32_t
117arc4random_uniform(u_int32_t upper_bound)
118{
119 u_int32_t r, min;
120
121 if (upper_bound < 2)
122 return 0;
123
124#if (ULONG_MAX > 0xffffffffUL)
125 min = 0x100000000UL % upper_bound;
126#else
127 /* Calculate (2**32 % upper_bound) avoiding 64-bit math */
128 if (upper_bound > 0x80000000)
129 min = 1 + ~upper_bound; /* 2**32 - upper_bound */
130 else {
131 /* (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31 */
132 min = ((0xffffffff - (upper_bound * 2)) + 1) % upper_bound;
133 }
134#endif
135
136 /*
137 * This could theoretically loop forever but each retry has
138 * p > 0.5 (worst case, usually far better) of selecting a
139 * number inside the range we need, so it should rarely need
140 * to re-roll.
141 */
142 for (;;) {
143 r = arc4random();
144 if (r >= min)
145 break;
146 }
147
148 return r % upper_bound;
149}
150#endif /* !HAVE_ARC4RANDOM_UNIFORM */
diff --git a/openbsd-compat/bsd-asprintf.c b/openbsd-compat/bsd-asprintf.c
index 00fa0dfd8..3368195d4 100644
--- a/openbsd-compat/bsd-asprintf.c
+++ b/openbsd-compat/bsd-asprintf.c
@@ -55,6 +55,7 @@ vasprintf(char **str, const char *fmt, va_list ap)
55 if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */ 55 if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */
56 *str = string; 56 *str = string;
57 } else if (ret == INT_MAX || ret < 0) { /* Bad length */ 57 } else if (ret == INT_MAX || ret < 0) { /* Bad length */
58 free(string);
58 goto fail; 59 goto fail;
59 } else { /* bigger than initial, realloc allowing for nul */ 60 } else { /* bigger than initial, realloc allowing for nul */
60 len = (size_t)ret + 1; 61 len = (size_t)ret + 1;
diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c
index dbf8176b6..38be7e350 100644
--- a/openbsd-compat/bsd-cygwin_util.c
+++ b/openbsd-compat/bsd-cygwin_util.c
@@ -175,45 +175,7 @@ check_nt_auth(int pwd_authenticated, struct passwd *pw)
175int 175int
176check_ntsec(const char *filename) 176check_ntsec(const char *filename)
177{ 177{
178 char *cygwin; 178 return (pathconf(filename, _PC_POSIX_PERMISSIONS));
179 int allow_ntea = 0, allow_ntsec = 0;
180 struct statfs fsstat;
181
182 /* Windows 95/98/ME don't support file system security at all. */
183 if (!is_winnt)
184 return (0);
185
186 /* Evaluate current CYGWIN settings. */
187 cygwin = getenv("CYGWIN");
188 allow_ntea = ntea_on(cygwin);
189 allow_ntsec = ntsec_on(cygwin) ||
190 (has_capability(HAS_NTSEC_BY_DEFAULT) && !ntsec_off(cygwin));
191
192 /*
193 * `ntea' is an emulation of POSIX attributes. It doesn't support
194 * real file level security as ntsec on NTFS file systems does
195 * but it supports FAT filesystems. `ntea' is minimum requirement
196 * for security checks.
197 */
198 if (allow_ntea)
199 return (1);
200
201 /*
202 * Retrieve file system flags. In Cygwin, file system flags are
203 * copied to f_type which has no meaning in Win32 itself.
204 */
205 if (statfs(filename, &fsstat))
206 return (1);
207
208 /*
209 * Only file systems supporting ACLs are able to set permissions.
210 * `ntsec' is the setting in Cygwin which switches using of NTFS
211 * ACLs to support POSIX permissions on files.
212 */
213 if (fsstat.f_type & FS_PERSISTENT_ACLS)
214 return (allow_ntsec);
215
216 return (0);
217} 179}
218 180
219void 181void
diff --git a/openbsd-compat/bsd-poll.c b/openbsd-compat/bsd-poll.c
index 836882eea..284db3a1f 100644
--- a/openbsd-compat/bsd-poll.c
+++ b/openbsd-compat/bsd-poll.c
@@ -1,4 +1,4 @@
1/* $Id: bsd-poll.c,v 1.1 2007/06/25 12:15:13 dtucker Exp $ */ 1/* $Id: bsd-poll.c,v 1.3 2008/04/04 05:16:36 djm Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2004, 2005, 2007 Darren Tucker (dtucker at zip com au). 4 * Copyright (c) 2004, 2005, 2007 Darren Tucker (dtucker at zip com au).
@@ -17,12 +17,13 @@
17 */ 17 */
18 18
19#include "includes.h" 19#include "includes.h"
20#if !defined(HAVE_POLL) && defined(HAVE_SELECT) 20#if !defined(HAVE_POLL)
21 21
22#ifdef HAVE_SYS_SELECT_H 22#ifdef HAVE_SYS_SELECT_H
23# include <sys/select.h> 23# include <sys/select.h>
24#endif 24#endif
25 25
26#include <stdlib.h>
26#include <errno.h> 27#include <errno.h>
27#include "bsd-poll.h" 28#include "bsd-poll.h"
28 29
diff --git a/openbsd-compat/bsd-statvfs.c b/openbsd-compat/bsd-statvfs.c
new file mode 100644
index 000000000..844d5b464
--- /dev/null
+++ b/openbsd-compat/bsd-statvfs.c
@@ -0,0 +1,37 @@
1/* $Id: bsd-statvfs.c,v 1.1 2008/06/08 17:32:29 dtucker Exp $ */
2
3/*
4 * Copyright (c) 2008 Darren Tucker <dtucker@zip.com.au>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include "includes.h"
20
21#include <errno.h>
22
23#ifndef HAVE_STATVFS
24int statvfs(const char *path, struct statvfs *buf)
25{
26 errno = ENOSYS;
27 return -1;
28}
29#endif
30
31#ifndef HAVE_FSTATVFS
32int fstatvfs(int fd, struct statvfs *buf)
33{
34 errno = ENOSYS;
35 return -1;
36}
37#endif
diff --git a/openbsd-compat/bsd-statvfs.h b/openbsd-compat/bsd-statvfs.h
new file mode 100644
index 000000000..da215ffc6
--- /dev/null
+++ b/openbsd-compat/bsd-statvfs.h
@@ -0,0 +1,68 @@
1/* $Id: bsd-statvfs.h,v 1.1 2008/06/08 17:32:29 dtucker Exp $ */
2
3/*
4 * Copyright (c) 2008 Darren Tucker <dtucker@zip.com.au>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include "includes.h"
20
21#include <sys/types.h>
22
23#ifdef HAVE_SYS_STATFS_H
24#include <sys/statfs.h>
25#endif
26
27#ifndef HAVE_STATVFS
28
29#ifndef HAVE_FSBLKCNT_T
30typedef unsigned long fsblkcnt_t;
31#endif
32#ifndef HAVE_FSFILCNT_T
33typedef unsigned long fsfilcnt_t;
34#endif
35
36#ifndef ST_RDONLY
37#define ST_RDONLY 1
38#endif
39#ifndef ST_NOSUID
40#define ST_NOSUID 2
41#endif
42
43 /* as defined in IEEE Std 1003.1, 2004 Edition */
44struct statvfs {
45 unsigned long f_bsize; /* File system block size. */
46 unsigned long f_frsize; /* Fundamental file system block size. */
47 fsblkcnt_t f_blocks; /* Total number of blocks on file system in */
48 /* units of f_frsize. */
49 fsblkcnt_t f_bfree; /* Total number of free blocks. */
50 fsblkcnt_t f_bavail; /* Number of free blocks available to */
51 /* non-privileged process. */
52 fsfilcnt_t f_files; /* Total number of file serial numbers. */
53 fsfilcnt_t f_ffree; /* Total number of free file serial numbers. */
54 fsfilcnt_t f_favail; /* Number of file serial numbers available to */
55 /* non-privileged process. */
56 unsigned long f_fsid; /* File system ID. */
57 unsigned long f_flag; /* BBit mask of f_flag values. */
58 unsigned long f_namemax;/* Maximum filename length. */
59};
60#endif
61
62#ifndef HAVE_STATVFS
63int statvfs(const char *, struct statvfs *);
64#endif
65
66#ifndef HAVE_FSTATVFS
67int fstatvfs(int, struct statvfs *);
68#endif
diff --git a/openbsd-compat/fake-rfc2553.c b/openbsd-compat/fake-rfc2553.c
index b6ea3d21e..096d9e092 100644
--- a/openbsd-compat/fake-rfc2553.c
+++ b/openbsd-compat/fake-rfc2553.c
@@ -51,6 +51,8 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
51 struct hostent *hp; 51 struct hostent *hp;
52 char tmpserv[16]; 52 char tmpserv[16];
53 53
54 if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET)
55 return (EAI_FAMILY);
54 if (serv != NULL) { 56 if (serv != NULL) {
55 snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port)); 57 snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
56 if (strlcpy(serv, tmpserv, servlen) >= servlen) 58 if (strlcpy(serv, tmpserv, servlen) >= servlen)
@@ -95,6 +97,8 @@ gai_strerror(int err)
95 return ("memory allocation failure."); 97 return ("memory allocation failure.");
96 case EAI_NONAME: 98 case EAI_NONAME:
97 return ("nodename nor servname provided, or not known"); 99 return ("nodename nor servname provided, or not known");
100 case EAI_FAMILY:
101 return ("ai_family not supported");
98 default: 102 default:
99 return ("unknown/invalid error."); 103 return ("unknown/invalid error.");
100 } 104 }
@@ -159,6 +163,9 @@ getaddrinfo(const char *hostname, const char *servname,
159 u_long addr; 163 u_long addr;
160 164
161 port = 0; 165 port = 0;
166 if (hints && hints->ai_family != AF_UNSPEC &&
167 hints->ai_family != AF_INET)
168 return (EAI_FAMILY);
162 if (servname != NULL) { 169 if (servname != NULL) {
163 char *cp; 170 char *cp;
164 171
diff --git a/openbsd-compat/fake-rfc2553.h b/openbsd-compat/fake-rfc2553.h
index 5c2ce5b1b..3e9090fc8 100644
--- a/openbsd-compat/fake-rfc2553.h
+++ b/openbsd-compat/fake-rfc2553.h
@@ -1,4 +1,4 @@
1/* $Id: fake-rfc2553.h,v 1.13 2006/07/24 03:51:52 djm Exp $ */ 1/* $Id: fake-rfc2553.h,v 1.16 2008/07/14 11:37:37 djm Exp $ */
2 2
3/* 3/*
4 * Copyright (C) 2000-2003 Damien Miller. All rights reserved. 4 * Copyright (C) 2000-2003 Damien Miller. All rights reserved.
@@ -77,6 +77,7 @@ struct sockaddr_in6 {
77 u_int16_t sin6_port; 77 u_int16_t sin6_port;
78 u_int32_t sin6_flowinfo; 78 u_int32_t sin6_flowinfo;
79 struct in6_addr sin6_addr; 79 struct in6_addr sin6_addr;
80 u_int32_t sin6_scope_id;
80}; 81};
81#endif /* !HAVE_STRUCT_SOCKADDR_IN6 */ 82#endif /* !HAVE_STRUCT_SOCKADDR_IN6 */
82 83
@@ -128,6 +129,9 @@ struct sockaddr_in6 {
128#ifndef EAI_SYSTEM 129#ifndef EAI_SYSTEM
129# define EAI_SYSTEM (INT_MAX - 4) 130# define EAI_SYSTEM (INT_MAX - 4)
130#endif 131#endif
132#ifndef EAI_FAMILY
133# define EAI_FAMILY (INT_MAX - 5)
134#endif
131 135
132#ifndef HAVE_STRUCT_ADDRINFO 136#ifndef HAVE_STRUCT_ADDRINFO
133struct addrinfo { 137struct addrinfo {
@@ -152,7 +156,7 @@ int getaddrinfo(const char *, const char *,
152#endif /* !HAVE_GETADDRINFO */ 156#endif /* !HAVE_GETADDRINFO */
153 157
154#if !defined(HAVE_GAI_STRERROR) && !defined(HAVE_CONST_GAI_STRERROR_PROTO) 158#if !defined(HAVE_GAI_STRERROR) && !defined(HAVE_CONST_GAI_STRERROR_PROTO)
155#define gai_strerror(a) (ssh_gai_strerror(a)) 159#define gai_strerror(a) (_ssh_compat_gai_strerror(a))
156char *gai_strerror(int); 160char *gai_strerror(int);
157#endif /* !HAVE_GAI_STRERROR */ 161#endif /* !HAVE_GAI_STRERROR */
158 162
diff --git a/openbsd-compat/fmt_scaled.c b/openbsd-compat/fmt_scaled.c
new file mode 100644
index 000000000..edd682a49
--- /dev/null
+++ b/openbsd-compat/fmt_scaled.c
@@ -0,0 +1,274 @@
1/* $OpenBSD: fmt_scaled.c,v 1.9 2007/03/20 03:42:52 tedu Exp $ */
2
3/*
4 * Copyright (c) 2001, 2002, 2003 Ian F. Darwin. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/* OPENBSD ORIGINAL: lib/libutil/fmt_scaled.c */
30
31/*
32 * fmt_scaled: Format numbers scaled for human comprehension
33 * scan_scaled: Scan numbers in this format.
34 *
35 * "Human-readable" output uses 4 digits max, and puts a unit suffix at
36 * the end. Makes output compact and easy-to-read esp. on huge disks.
37 * Formatting code was originally in OpenBSD "df", converted to library routine.
38 * Scanning code written for OpenBSD libutil.
39 */
40
41#include "includes.h"
42
43#ifndef HAVE_FMT_SCALED
44
45#include <stdio.h>
46#include <stdlib.h>
47#include <errno.h>
48#include <string.h>
49#include <ctype.h>
50#include <limits.h>
51
52typedef enum {
53 NONE = 0, KILO = 1, MEGA = 2, GIGA = 3, TERA = 4, PETA = 5, EXA = 6
54} unit_type;
55
56/* These three arrays MUST be in sync! XXX make a struct */
57static unit_type units[] = { NONE, KILO, MEGA, GIGA, TERA, PETA, EXA };
58static char scale_chars[] = "BKMGTPE";
59static long long scale_factors[] = {
60 1LL,
61 1024LL,
62 1024LL*1024,
63 1024LL*1024*1024,
64 1024LL*1024*1024*1024,
65 1024LL*1024*1024*1024*1024,
66 1024LL*1024*1024*1024*1024*1024,
67};
68#define SCALE_LENGTH (sizeof(units)/sizeof(units[0]))
69
70#define MAX_DIGITS (SCALE_LENGTH * 3) /* XXX strlen(sprintf("%lld", -1)? */
71
72/** Convert the given input string "scaled" into numeric in "result".
73 * Return 0 on success, -1 and errno set on error.
74 */
75int
76scan_scaled(char *scaled, long long *result)
77{
78 char *p = scaled;
79 int sign = 0;
80 unsigned int i, ndigits = 0, fract_digits = 0;
81 long long scale_fact = 1, whole = 0, fpart = 0;
82
83 /* Skip leading whitespace */
84 while (isascii(*p) && isspace(*p))
85 ++p;
86
87 /* Then at most one leading + or - */
88 while (*p == '-' || *p == '+') {
89 if (*p == '-') {
90 if (sign) {
91 errno = EINVAL;
92 return -1;
93 }
94 sign = -1;
95 ++p;
96 } else if (*p == '+') {
97 if (sign) {
98 errno = EINVAL;
99 return -1;
100 }
101 sign = +1;
102 ++p;
103 }
104 }
105
106 /* Main loop: Scan digits, find decimal point, if present.
107 * We don't allow exponentials, so no scientific notation
108 * (but note that E for Exa might look like e to some!).
109 * Advance 'p' to end, to get scale factor.
110 */
111 for (; isascii(*p) && (isdigit(*p) || *p=='.'); ++p) {
112 if (*p == '.') {
113 if (fract_digits > 0) { /* oops, more than one '.' */
114 errno = EINVAL;
115 return -1;
116 }
117 fract_digits = 1;
118 continue;
119 }
120
121 i = (*p) - '0'; /* whew! finally a digit we can use */
122 if (fract_digits > 0) {
123 if (fract_digits >= MAX_DIGITS-1)
124 /* ignore extra fractional digits */
125 continue;
126 fract_digits++; /* for later scaling */
127 fpart *= 10;
128 fpart += i;
129 } else { /* normal digit */
130 if (++ndigits >= MAX_DIGITS) {
131 errno = ERANGE;
132 return -1;
133 }
134 whole *= 10;
135 whole += i;
136 }
137 }
138
139 if (sign) {
140 whole *= sign;
141 fpart *= sign;
142 }
143
144 /* If no scale factor given, we're done. fraction is discarded. */
145 if (!*p) {
146 *result = whole;
147 return 0;
148 }
149
150 /* Validate scale factor, and scale whole and fraction by it. */
151 for (i = 0; i < SCALE_LENGTH; i++) {
152
153 /** Are we there yet? */
154 if (*p == scale_chars[i] ||
155 *p == tolower(scale_chars[i])) {
156
157 /* If it ends with alphanumerics after the scale char, bad. */
158 if (isalnum(*(p+1))) {
159 errno = EINVAL;
160 return -1;
161 }
162 scale_fact = scale_factors[i];
163
164 /* scale whole part */
165 whole *= scale_fact;
166
167 /* truncate fpart so it does't overflow.
168 * then scale fractional part.
169 */
170 while (fpart >= LLONG_MAX / scale_fact) {
171 fpart /= 10;
172 fract_digits--;
173 }
174 fpart *= scale_fact;
175 if (fract_digits > 0) {
176 for (i = 0; i < fract_digits -1; i++)
177 fpart /= 10;
178 }
179 whole += fpart;
180 *result = whole;
181 return 0;
182 }
183 }
184 errno = ERANGE;
185 return -1;
186}
187
188/* Format the given "number" into human-readable form in "result".
189 * Result must point to an allocated buffer of length FMT_SCALED_STRSIZE.
190 * Return 0 on success, -1 and errno set if error.
191 */
192int
193fmt_scaled(long long number, char *result)
194{
195 long long abval, fract = 0;
196 unsigned int i;
197 unit_type unit = NONE;
198
199 abval = (number < 0LL) ? -number : number; /* no long long_abs yet */
200
201 /* Not every negative long long has a positive representation.
202 * Also check for numbers that are just too darned big to format
203 */
204 if (abval < 0 || abval / 1024 >= scale_factors[SCALE_LENGTH-1]) {
205 errno = ERANGE;
206 return -1;
207 }
208
209 /* scale whole part; get unscaled fraction */
210 for (i = 0; i < SCALE_LENGTH; i++) {
211 if (abval/1024 < scale_factors[i]) {
212 unit = units[i];
213 fract = (i == 0) ? 0 : abval % scale_factors[i];
214 number /= scale_factors[i];
215 if (i > 0)
216 fract /= scale_factors[i - 1];
217 break;
218 }
219 }
220
221 fract = (10 * fract + 512) / 1024;
222 /* if the result would be >= 10, round main number */
223 if (fract == 10) {
224 if (number >= 0)
225 number++;
226 else
227 number--;
228 fract = 0;
229 }
230
231 if (number == 0)
232 strlcpy(result, "0B", FMT_SCALED_STRSIZE);
233 else if (unit == NONE || number >= 100 || number <= -100) {
234 if (fract >= 5) {
235 if (number >= 0)
236 number++;
237 else
238 number--;
239 }
240 (void)snprintf(result, FMT_SCALED_STRSIZE, "%lld%c",
241 number, scale_chars[unit]);
242 } else
243 (void)snprintf(result, FMT_SCALED_STRSIZE, "%lld.%1lld%c",
244 number, fract, scale_chars[unit]);
245
246 return 0;
247}
248
249#ifdef MAIN
250/*
251 * This is the original version of the program in the man page.
252 * Copy-and-paste whatever you need from it.
253 */
254int
255main(int argc, char **argv)
256{
257 char *cinput = "1.5K", buf[FMT_SCALED_STRSIZE];
258 long long ninput = 10483892, result;
259
260 if (scan_scaled(cinput, &result) == 0)
261 printf("\"%s\" -> %lld\n", cinput, result);
262 else
263 perror(cinput);
264
265 if (fmt_scaled(ninput, buf) == 0)
266 printf("%lld -> \"%s\"\n", ninput, buf);
267 else
268 fprintf(stderr, "%lld invalid (%s)\n", ninput, strerror(errno));
269
270 return 0;
271}
272#endif
273
274#endif /* HAVE_FMT_SCALED */
diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c
index 80af3f542..785b22569 100644
--- a/openbsd-compat/getrrsetbyname.c
+++ b/openbsd-compat/getrrsetbyname.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getrrsetbyname.c,v 1.10 2005/03/30 02:58:28 tedu Exp $ */ 1/* $OpenBSD: getrrsetbyname.c,v 1.11 2007/10/11 18:36:41 jakob Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2001 Jakob Schlyter. All rights reserved. 4 * Copyright (c) 2001 Jakob Schlyter. All rights reserved.
@@ -288,7 +288,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
288 rrset->rri_nrdatas = count_dns_rr(response->answer, rrset->rri_rdclass, 288 rrset->rri_nrdatas = count_dns_rr(response->answer, rrset->rri_rdclass,
289 rrset->rri_rdtype); 289 rrset->rri_rdtype);
290 rrset->rri_nsigs = count_dns_rr(response->answer, rrset->rri_rdclass, 290 rrset->rri_nsigs = count_dns_rr(response->answer, rrset->rri_rdclass,
291 T_SIG); 291 T_RRSIG);
292 292
293 /* allocate memory for answers */ 293 /* allocate memory for answers */
294 rrset->rri_rdatas = calloc(rrset->rri_nrdatas, 294 rrset->rri_rdatas = calloc(rrset->rri_nrdatas,
@@ -318,7 +318,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
318 rdata = &rrset->rri_rdatas[index_ans++]; 318 rdata = &rrset->rri_rdatas[index_ans++];
319 319
320 if (rr->class == rrset->rri_rdclass && 320 if (rr->class == rrset->rri_rdclass &&
321 rr->type == T_SIG) 321 rr->type == T_RRSIG)
322 rdata = &rrset->rri_sigs[index_sig++]; 322 rdata = &rrset->rri_sigs[index_sig++];
323 323
324 if (rdata) { 324 if (rdata) {
diff --git a/openbsd-compat/getrrsetbyname.h b/openbsd-compat/getrrsetbyname.h
index 39995b63f..1283f5506 100644
--- a/openbsd-compat/getrrsetbyname.h
+++ b/openbsd-compat/getrrsetbyname.h
@@ -62,8 +62,8 @@
62#define HFIXEDSZ 12 62#define HFIXEDSZ 12
63#endif 63#endif
64 64
65#ifndef T_SIG 65#ifndef T_RRSIG
66#define T_SIG 24 66#define T_RRSIG 46
67#endif 67#endif
68 68
69/* 69/*
diff --git a/openbsd-compat/glob.c b/openbsd-compat/glob.c
index b3dd2b171..74b506403 100644
--- a/openbsd-compat/glob.c
+++ b/openbsd-compat/glob.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: glob.c,v 1.25 2005/08/08 08:05:34 espie Exp $ */ 1/* $OpenBSD: glob.c,v 1.26 2005/11/28 17:50:12 deraadt Exp $ */
2/* 2/*
3 * Copyright (c) 1989, 1993 3 * Copyright (c) 1989, 1993
4 * The Regents of the University of California. All rights reserved. 4 * The Regents of the University of California. All rights reserved.
@@ -48,7 +48,8 @@
48 48
49#if !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) || \ 49#if !defined(HAVE_GLOB) || !defined(GLOB_HAS_ALTDIRFUNC) || \
50 !defined(GLOB_HAS_GL_MATCHC) || \ 50 !defined(GLOB_HAS_GL_MATCHC) || \
51 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 51 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \
52 defined(BROKEN_GLOB)
52 53
53static long 54static long
54get_arg_max(void) 55get_arg_max(void)
@@ -149,7 +150,7 @@ static int glob0(const Char *, glob_t *);
149static int glob1(Char *, Char *, glob_t *, size_t *); 150static int glob1(Char *, Char *, glob_t *, size_t *);
150static int glob2(Char *, Char *, Char *, Char *, Char *, Char *, 151static int glob2(Char *, Char *, Char *, Char *, Char *, Char *,
151 glob_t *, size_t *); 152 glob_t *, size_t *);
152static int glob3(Char *, Char *, Char *, Char *, Char *, Char *, 153static int glob3(Char *, Char *, Char *, Char *, Char *,
153 Char *, Char *, glob_t *, size_t *); 154 Char *, Char *, glob_t *, size_t *);
154static int globextend(const Char *, glob_t *, size_t *); 155static int globextend(const Char *, glob_t *, size_t *);
155static const Char * 156static const Char *
@@ -571,16 +572,16 @@ glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
571 } else 572 } else
572 /* Need expansion, recurse. */ 573 /* Need expansion, recurse. */
573 return(glob3(pathbuf, pathbuf_last, pathend, 574 return(glob3(pathbuf, pathbuf_last, pathend,
574 pathend_last, pattern, pattern_last, 575 pathend_last, pattern, p, pattern_last,
575 p, pattern_last, pglob, limitp)); 576 pglob, limitp));
576 } 577 }
577 /* NOTREACHED */ 578 /* NOTREACHED */
578} 579}
579 580
580static int 581static int
581glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, 582glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
582 Char *pattern, Char *pattern_last, Char *restpattern, 583 Char *pattern, Char *restpattern, Char *restpattern_last, glob_t *pglob,
583 Char *restpattern_last, glob_t *pglob, size_t *limitp) 584 size_t *limitp)
584{ 585{
585 struct dirent *dp; 586 struct dirent *dp;
586 DIR *dirp; 587 DIR *dirp;
diff --git a/openbsd-compat/glob.h b/openbsd-compat/glob.h
index 9ba07f76e..a2b36f974 100644
--- a/openbsd-compat/glob.h
+++ b/openbsd-compat/glob.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: glob.h,v 1.9 2004/10/07 16:56:11 millert Exp $ */ 1/* $OpenBSD: glob.h,v 1.10 2005/12/13 00:35:22 millert Exp $ */
2/* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */ 2/* $NetBSD: glob.h,v 1.5 1994/10/26 00:55:56 cgd Exp $ */
3 3
4/* 4/*
@@ -39,7 +39,8 @@
39 39
40#if !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) || \ 40#if !defined(HAVE_GLOB_H) || !defined(GLOB_HAS_ALTDIRFUNC) || \
41 !defined(GLOB_HAS_GL_MATCHC) || \ 41 !defined(GLOB_HAS_GL_MATCHC) || \
42 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 42 !defined(HAVE_DECL_GLOB_NOMATCH) || HAVE_DECL_GLOB_NOMATCH == 0 || \
43 defined(BROKEN_GLOB)
43 44
44#ifndef _GLOB_H_ 45#ifndef _GLOB_H_
45#define _GLOB_H_ 46#define _GLOB_H_
@@ -66,7 +67,6 @@ typedef struct {
66 int (*gl_stat)(const char *, struct stat *); 67 int (*gl_stat)(const char *, struct stat *);
67} glob_t; 68} glob_t;
68 69
69/* Flags */
70#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ 70#define GLOB_APPEND 0x0001 /* Append to output from previous call. */
71#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ 71#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */
72#define GLOB_ERR 0x0004 /* Return on error. */ 72#define GLOB_ERR 0x0004 /* Return on error. */
@@ -75,6 +75,13 @@ typedef struct {
75#define GLOB_NOSORT 0x0020 /* Don't sort. */ 75#define GLOB_NOSORT 0x0020 /* Don't sort. */
76#define GLOB_NOESCAPE 0x1000 /* Disable backslash escaping. */ 76#define GLOB_NOESCAPE 0x1000 /* Disable backslash escaping. */
77 77
78/* Error values returned by glob(3) */
79#define GLOB_NOSPACE (-1) /* Malloc call failed. */
80#define GLOB_ABORTED (-2) /* Unignored error. */
81#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK not set. */
82#define GLOB_NOSYS (-4) /* Function not supported. */
83#define GLOB_ABEND GLOB_ABORTED
84
78#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ 85#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */
79#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ 86#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */
80#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ 87#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */
@@ -83,13 +90,6 @@ typedef struct {
83#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ 90#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */
84#define GLOB_LIMIT 0x2000 /* Limit pattern match output to ARG_MAX */ 91#define GLOB_LIMIT 0x2000 /* Limit pattern match output to ARG_MAX */
85 92
86/* Error values returned by glob(3) */
87#define GLOB_NOSPACE (-1) /* Malloc call failed. */
88#define GLOB_ABORTED (-2) /* Unignored error. */
89#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK not set. */
90#define GLOB_NOSYS (-4) /* Function not supported. */
91#define GLOB_ABEND GLOB_ABORTED
92
93int glob(const char *, int, int (*)(const char *, int), glob_t *); 93int glob(const char *, int, int (*)(const char *, int), glob_t *);
94void globfree(glob_t *); 94void globfree(glob_t *);
95 95
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index 6406af19d..50c6d990b 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -1,4 +1,4 @@
1/* $Id: openbsd-compat.h,v 1.43 2007/06/25 12:15:13 dtucker Exp $ */ 1/* $Id: openbsd-compat.h,v 1.46 2008/06/08 17:32:29 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1999-2003 Damien Miller. All rights reserved. 4 * Copyright (c) 1999-2003 Damien Miller. All rights reserved.
@@ -101,6 +101,11 @@ int daemon(int nochdir, int noclose);
101char *dirname(const char *path); 101char *dirname(const char *path);
102#endif 102#endif
103 103
104#ifndef HAVE_FMT_SCALED
105#define FMT_SCALED_STRSIZE 7
106int fmt_scaled(long long number, char *result);
107#endif
108
104#if defined(BROKEN_INET_NTOA) || !defined(HAVE_INET_NTOA) 109#if defined(BROKEN_INET_NTOA) || !defined(HAVE_INET_NTOA)
105char *inet_ntoa(struct in_addr in); 110char *inet_ntoa(struct in_addr in);
106#endif 111#endif
@@ -139,6 +144,7 @@ int writev(int, struct iovec *, int);
139 144
140/* Home grown routines */ 145/* Home grown routines */
141#include "bsd-misc.h" 146#include "bsd-misc.h"
147#include "bsd-statvfs.h"
142#include "bsd-waitpid.h" 148#include "bsd-waitpid.h"
143#include "bsd-poll.h" 149#include "bsd-poll.h"
144 150
@@ -151,6 +157,14 @@ unsigned int arc4random(void);
151void arc4random_stir(void); 157void arc4random_stir(void);
152#endif /* !HAVE_ARC4RANDOM */ 158#endif /* !HAVE_ARC4RANDOM */
153 159
160#ifndef HAVE_ARC4RANDOM_BUF
161void arc4random_buf(void *, size_t);
162#endif
163
164#ifndef HAVE_ARC4RANDOM_UNIFORM
165u_int32_t arc4random_uniform(u_int32_t);
166#endif
167
154#ifndef HAVE_ASPRINTF 168#ifndef HAVE_ASPRINTF
155int asprintf(char **, const char *, ...); 169int asprintf(char **, const char *, ...);
156#endif 170#endif
diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c
index 45ebd3f66..49238ba80 100644
--- a/openbsd-compat/openssl-compat.c
+++ b/openbsd-compat/openssl-compat.c
@@ -1,4 +1,4 @@
1/* $Id: openssl-compat.c,v 1.4 2006/02/22 11:24:47 dtucker Exp $ */ 1/* $Id: openssl-compat.c,v 1.6 2008/02/28 08:13:52 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> 4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au>
diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h
index f1d2f19fc..6a1bed5b2 100644
--- a/openbsd-compat/openssl-compat.h
+++ b/openbsd-compat/openssl-compat.h
@@ -1,4 +1,4 @@
1/* $Id: openssl-compat.h,v 1.10 2007/06/14 13:47:31 dtucker Exp $ */ 1/* $Id: openssl-compat.h,v 1.12 2008/02/28 08:22:04 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> 4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au>
@@ -19,6 +19,11 @@
19#include "includes.h" 19#include "includes.h"
20#include <openssl/evp.h> 20#include <openssl/evp.h>
21 21
22/* OPENSSL_free() is Free() in versions before OpenSSL 0.9.6 */
23#if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x0090600f)
24# define OPENSSL_free(x) Free(x)
25#endif
26
22#if OPENSSL_VERSION_NUMBER < 0x00906000L 27#if OPENSSL_VERSION_NUMBER < 0x00906000L
23# define SSH_OLD_EVP 28# define SSH_OLD_EVP
24# define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data) 29# define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)
@@ -79,8 +84,8 @@ extern const EVP_CIPHER *evp_acss(void);
79# ifdef SSLeay_add_all_algorithms 84# ifdef SSLeay_add_all_algorithms
80# undef SSLeay_add_all_algorithms 85# undef SSLeay_add_all_algorithms
81# endif 86# endif
82# define SSLeay_add_all_algorithms() ssh_SSLeay_add_all_algorithms() 87# define SSLeay_add_all_algorithms() ssh_SSLeay_add_all_algorithms()
83#endif 88# endif
84 89
85int ssh_EVP_CipherInit(EVP_CIPHER_CTX *, const EVP_CIPHER *, unsigned char *, 90int ssh_EVP_CipherInit(EVP_CIPHER_CTX *, const EVP_CIPHER *, unsigned char *,
86 unsigned char *, int); 91 unsigned char *, int);
diff --git a/openbsd-compat/port-aix.c b/openbsd-compat/port-aix.c
index 94faec670..5b1cb7387 100644
--- a/openbsd-compat/port-aix.c
+++ b/openbsd-compat/port-aix.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * 2 *
3 * Copyright (c) 2001 Gert Doering. All rights reserved. 3 * Copyright (c) 2001 Gert Doering. All rights reserved.
4 * Copyright (c) 2003,2004,2005 Darren Tucker. All rights reserved. 4 * Copyright (c) 2003,2004,2005,2006 Darren Tucker. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
@@ -394,4 +394,47 @@ sshaix_getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
394} 394}
395# endif /* AIX_GETNAMEINFO_HACK */ 395# endif /* AIX_GETNAMEINFO_HACK */
396 396
397# if defined(USE_GETGRSET)
398# include <stdlib.h>
399int
400getgrouplist(const char *user, gid_t pgid, gid_t *groups, int *grpcnt)
401{
402 char *cp, *grplist, *grp;
403 gid_t gid;
404 int ret = 0, ngroups = 0, maxgroups;
405 long l;
406
407 maxgroups = *grpcnt;
408
409 if ((cp = grplist = getgrset(user)) == NULL)
410 return -1;
411
412 /* handle zero-length case */
413 if (maxgroups <= 0) {
414 *grpcnt = 0;
415 return -1;
416 }
417
418 /* copy primary group */
419 groups[ngroups++] = pgid;
420
421 /* copy each entry from getgrset into group list */
422 while ((grp = strsep(&grplist, ",")) != NULL) {
423 l = strtol(grp, NULL, 10);
424 if (ngroups >= maxgroups || l == LONG_MIN || l == LONG_MAX) {
425 ret = -1;
426 goto out;
427 }
428 gid = (gid_t)l;
429 if (gid == pgid)
430 continue; /* we have already added primary gid */
431 groups[ngroups++] = gid;
432 }
433out:
434 free(cp);
435 *grpcnt = ngroups;
436 return ret;
437}
438# endif /* USE_GETGRSET */
439
397#endif /* _AIX */ 440#endif /* _AIX */
diff --git a/openbsd-compat/port-aix.h b/openbsd-compat/port-aix.h
index 5a04bedad..ecb9feae8 100644
--- a/openbsd-compat/port-aix.h
+++ b/openbsd-compat/port-aix.h
@@ -1,9 +1,9 @@
1/* $Id: port-aix.h,v 1.27 2006/09/18 13:54:33 dtucker Exp $ */ 1/* $Id: port-aix.h,v 1.29 2008/03/09 05:36:55 dtucker Exp $ */
2 2
3/* 3/*
4 * 4 *
5 * Copyright (c) 2001 Gert Doering. All rights reserved. 5 * Copyright (c) 2001 Gert Doering. All rights reserved.
6 * Copyright (c) 2004, 2005 Darren Tucker. All rights reserved. 6 * Copyright (c) 2004,2005,2006 Darren Tucker. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
@@ -103,4 +103,14 @@ int sshaix_getnameinfo(const struct sockaddr *, size_t, char *, size_t,
103# define getnameinfo(a,b,c,d,e,f,g) (sshaix_getnameinfo(a,b,c,d,e,f,g)) 103# define getnameinfo(a,b,c,d,e,f,g) (sshaix_getnameinfo(a,b,c,d,e,f,g))
104#endif 104#endif
105 105
106/*
107 * We use getgrset in preference to multiple getgrent calls for efficiency
108 * plus it supports NIS and LDAP groups.
109 */
110#if !defined(HAVE_GETGROUPLIST) && defined(HAVE_GETGRSET)
111# define HAVE_GETGROUPLIST
112# define USE_GETGRSET
113int getgrouplist(const char *, gid_t, gid_t *, int *);
114#endif
115
106#endif /* _AIX */ 116#endif /* _AIX */
diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c
index a9aa773ef..bc4924727 100644
--- a/openbsd-compat/port-linux.c
+++ b/openbsd-compat/port-linux.c
@@ -1,4 +1,4 @@
1/* $Id: port-linux.c,v 1.4 2007/06/27 22:48:03 djm Exp $ */ 1/* $Id: port-linux.c,v 1.5 2008/03/26 20:27:21 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com> 4 * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
@@ -52,7 +52,7 @@
52extern Authctxt *the_authctxt; 52extern Authctxt *the_authctxt;
53 53
54/* Wrapper around is_selinux_enabled() to log its return value once only */ 54/* Wrapper around is_selinux_enabled() to log its return value once only */
55static int 55int
56ssh_selinux_enabled(void) 56ssh_selinux_enabled(void)
57{ 57{
58 static int enabled = -1; 58 static int enabled = -1;
diff --git a/openbsd-compat/port-linux.h b/openbsd-compat/port-linux.h
index cb8a253c4..2a3271a93 100644
--- a/openbsd-compat/port-linux.h
+++ b/openbsd-compat/port-linux.h
@@ -1,4 +1,4 @@
1/* $Id: port-linux.h,v 1.1 2006/04/22 11:26:08 djm Exp $ */ 1/* $Id: port-linux.h,v 1.2 2008/03/26 20:27:21 dtucker Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2006 Damien Miller <djm@openbsd.org> 4 * Copyright (c) 2006 Damien Miller <djm@openbsd.org>
@@ -20,6 +20,7 @@
20#define _PORT_LINUX_H 20#define _PORT_LINUX_H
21 21
22#ifdef WITH_SELINUX 22#ifdef WITH_SELINUX
23int ssh_selinux_enabled(void);
23void ssh_selinux_setup_pty(char *, const char *); 24void ssh_selinux_setup_pty(char *, const char *);
24void ssh_selinux_setup_exec_context(char *); 25void ssh_selinux_setup_exec_context(char *);
25#endif 26#endif
diff --git a/openbsd-compat/port-tun.c b/openbsd-compat/port-tun.c
index 276474db8..ddc92d0f3 100644
--- a/openbsd-compat/port-tun.c
+++ b/openbsd-compat/port-tun.c
@@ -29,6 +29,7 @@
29#include <string.h> 29#include <string.h>
30#include <unistd.h> 30#include <unistd.h>
31 31
32#include "openbsd-compat/sys-queue.h"
32#include "log.h" 33#include "log.h"
33#include "misc.h" 34#include "misc.h"
34#include "buffer.h" 35#include "buffer.h"
diff --git a/openbsd-compat/regress/closefromtest.c b/openbsd-compat/regress/closefromtest.c
index bb129fa16..145b09d7b 100644
--- a/openbsd-compat/regress/closefromtest.c
+++ b/openbsd-compat/regress/closefromtest.c
@@ -57,4 +57,5 @@ main(void)
57 for (i = 0; i < NUM_OPENS; i++) 57 for (i = 0; i < NUM_OPENS; i++)
58 if (close(fds[i]) != -1) 58 if (close(fds[i]) != -1)
59 fail("failed to close from lowest fd"); 59 fail("failed to close from lowest fd");
60 return 0;
60} 61}
diff --git a/openbsd-compat/regress/strtonumtest.c b/openbsd-compat/regress/strtonumtest.c
index cb8585129..50ca5bd22 100644
--- a/openbsd-compat/regress/strtonumtest.c
+++ b/openbsd-compat/regress/strtonumtest.c
@@ -21,6 +21,20 @@
21#include <stdio.h> 21#include <stdio.h>
22#include <stdlib.h> 22#include <stdlib.h>
23 23
24/* LLONG_MAX is known as LONGLONG_MAX on AIX */
25#if defined(LONGLONG_MAX) && !defined(LLONG_MAX)
26# define LLONG_MAX LONGLONG_MAX
27# define LLONG_MIN LONGLONG_MIN
28#endif
29
30/* LLONG_MAX is known as LONG_LONG_MAX on HP-UX */
31#if defined(LONG_LONG_MAX) && !defined(LLONG_MAX)
32# define LLONG_MAX LONG_LONG_MAX
33# define LLONG_MIN LONG_LONG_MIN
34#endif
35
36long long strtonum(const char *, long long, long long, const char **);
37
24int fail; 38int fail;
25 39
26void 40void
diff --git a/openbsd-compat/rresvport.c b/openbsd-compat/rresvport.c
index 5b0275ce0..1cd61e58d 100644
--- a/openbsd-compat/rresvport.c
+++ b/openbsd-compat/rresvport.c
@@ -44,6 +44,7 @@
44#include <errno.h> 44#include <errno.h>
45#include <stdlib.h> 45#include <stdlib.h>
46#include <string.h> 46#include <string.h>
47#include <unistd.h>
47 48
48#if 0 49#if 0
49int 50int
diff --git a/openbsd-compat/setenv.c b/openbsd-compat/setenv.c
index b52a99c2c..e2a8b6dd3 100644
--- a/openbsd-compat/setenv.c
+++ b/openbsd-compat/setenv.c
@@ -47,7 +47,7 @@ extern char **environ;
47 * Explicitly removes '=' in argument name. 47 * Explicitly removes '=' in argument name.
48 */ 48 */
49static char * 49static char *
50__findenv(const char *name, int *offset) 50__findenv(const char *name, size_t *offset)
51{ 51{
52 extern char **environ; 52 extern char **environ;
53 int len, i; 53 int len, i;
@@ -82,7 +82,7 @@ setenv(const char *name, const char *value, int rewrite)
82{ 82{
83 static char **lastenv; /* last value of environ */ 83 static char **lastenv; /* last value of environ */
84 char *C; 84 char *C;
85 int l_value, offset; 85 size_t l_value, offset;
86 86
87 if (*value == '=') /* no `=' in value */ 87 if (*value == '=') /* no `=' in value */
88 ++value; 88 ++value;
@@ -133,7 +133,7 @@ void
133unsetenv(const char *name) 133unsetenv(const char *name)
134{ 134{
135 char **P; 135 char **P;
136 int offset; 136 size_t offset;
137 137
138 while (__findenv(name, &offset)) /* if set multiple times */ 138 while (__findenv(name, &offset)) /* if set multiple times */
139 for (P = &environ[offset];; ++P) 139 for (P = &environ[offset];; ++P)
diff --git a/openbsd-compat/setproctitle.c b/openbsd-compat/setproctitle.c
index b511f6649..2965f689e 100644
--- a/openbsd-compat/setproctitle.c
+++ b/openbsd-compat/setproctitle.c
@@ -43,6 +43,8 @@
43#endif 43#endif
44#include <string.h> 44#include <string.h>
45 45
46#include <vis.h>
47
46#define SPT_NONE 0 /* don't use it at all */ 48#define SPT_NONE 0 /* don't use it at all */
47#define SPT_PSTAT 1 /* use pstat(PSTAT_SETCMD, ...) */ 49#define SPT_PSTAT 1 /* use pstat(PSTAT_SETCMD, ...) */
48#define SPT_REUSEARGV 2 /* cover argv with title information */ 50#define SPT_REUSEARGV 2 /* cover argv with title information */
@@ -121,7 +123,7 @@ setproctitle(const char *fmt, ...)
121{ 123{
122#if SPT_TYPE != SPT_NONE 124#if SPT_TYPE != SPT_NONE
123 va_list ap; 125 va_list ap;
124 char buf[1024]; 126 char buf[1024], ptitle[1024];
125 size_t len; 127 size_t len;
126 extern char *__progname; 128 extern char *__progname;
127#if SPT_TYPE == SPT_PSTAT 129#if SPT_TYPE == SPT_PSTAT
@@ -142,14 +144,16 @@ setproctitle(const char *fmt, ...)
142 vsnprintf(buf + len, sizeof(buf) - len , fmt, ap); 144 vsnprintf(buf + len, sizeof(buf) - len , fmt, ap);
143 } 145 }
144 va_end(ap); 146 va_end(ap);
147 strnvis(ptitle, buf, sizeof(ptitle),
148 VIS_CSTYLE|VIS_NL|VIS_TAB|VIS_OCTAL);
145 149
146#if SPT_TYPE == SPT_PSTAT 150#if SPT_TYPE == SPT_PSTAT
147 pst.pst_command = buf; 151 pst.pst_command = ptitle;
148 pstat(PSTAT_SETCMD, pst, strlen(buf), 0, 0); 152 pstat(PSTAT_SETCMD, pst, strlen(ptitle), 0, 0);
149#elif SPT_TYPE == SPT_REUSEARGV 153#elif SPT_TYPE == SPT_REUSEARGV
150/* debug("setproctitle: copy \"%s\" into len %d", 154/* debug("setproctitle: copy \"%s\" into len %d",
151 buf, argv_env_len); */ 155 buf, argv_env_len); */
152 len = strlcpy(argv_start, buf, argv_env_len); 156 len = strlcpy(argv_start, ptitle, argv_env_len);
153 for(; len < argv_env_len; len++) 157 for(; len < argv_env_len; len++)
154 argv_start[len] = SPT_PADCHAR; 158 argv_start[len] = SPT_PADCHAR;
155#endif 159#endif
diff --git a/openbsd-compat/sigact.c b/openbsd-compat/sigact.c
index 8b8e4dd2c..d67845cf1 100644
--- a/openbsd-compat/sigact.c
+++ b/openbsd-compat/sigact.c
@@ -36,6 +36,7 @@
36/* OPENBSD ORIGINAL: lib/libcurses/base/sigaction.c */ 36/* OPENBSD ORIGINAL: lib/libcurses/base/sigaction.c */
37 37
38#include "includes.h" 38#include "includes.h"
39#include <errno.h>
39#include <signal.h> 40#include <signal.h>
40#include "sigact.h" 41#include "sigact.h"
41 42
@@ -47,28 +48,39 @@
47int 48int
48sigaction(int sig, struct sigaction *sigact, struct sigaction *osigact) 49sigaction(int sig, struct sigaction *sigact, struct sigaction *osigact)
49{ 50{
50 return sigvec(sig, &(sigact->sv), &(osigact->sv)); 51 return sigvec(sig, sigact ? &sigact->sv : NULL,
52 osigact ? &osigact->sv : NULL);
51} 53}
52 54
53int 55int
54sigemptyset (sigset_t * mask) 56sigemptyset (sigset_t *mask)
55{ 57{
58 if (!mask) {
59 errno = EINVAL;
60 return -1;
61 }
56 *mask = 0; 62 *mask = 0;
57 return 0; 63 return 0;
58} 64}
59 65
60int 66int
61sigprocmask (int mode, sigset_t * mask, sigset_t * omask) 67sigprocmask (int mode, sigset_t *mask, sigset_t *omask)
62{ 68{
63 sigset_t current = sigsetmask(0); 69 sigset_t current = sigsetmask(0);
64 70
65 if (omask) *omask = current; 71 if (!mask) {
72 errno = EINVAL;
73 return -1;
74 }
66 75
67 if (mode==SIG_BLOCK) 76 if (omask)
77 *omask = current;
78
79 if (mode == SIG_BLOCK)
68 current |= *mask; 80 current |= *mask;
69 else if (mode==SIG_UNBLOCK) 81 else if (mode == SIG_UNBLOCK)
70 current &= ~*mask; 82 current &= ~*mask;
71 else if (mode==SIG_SETMASK) 83 else if (mode == SIG_SETMASK)
72 current = *mask; 84 current = *mask;
73 85
74 sigsetmask(current); 86 sigsetmask(current);
@@ -76,28 +88,44 @@ sigprocmask (int mode, sigset_t * mask, sigset_t * omask)
76} 88}
77 89
78int 90int
79sigsuspend (sigset_t * mask) 91sigsuspend (sigset_t *mask)
80{ 92{
93 if (!mask) {
94 errno = EINVAL;
95 return -1;
96 }
81 return sigpause(*mask); 97 return sigpause(*mask);
82} 98}
83 99
84int 100int
85sigdelset (sigset_t * mask, int sig) 101sigdelset (sigset_t *mask, int sig)
86{ 102{
103 if (!mask) {
104 errno = EINVAL;
105 return -1;
106 }
87 *mask &= ~sigmask(sig); 107 *mask &= ~sigmask(sig);
88 return 0; 108 return 0;
89} 109}
90 110
91int 111int
92sigaddset (sigset_t * mask, int sig) 112sigaddset (sigset_t *mask, int sig)
93{ 113{
114 if (!mask) {
115 errno = EINVAL;
116 return -1;
117 }
94 *mask |= sigmask(sig); 118 *mask |= sigmask(sig);
95 return 0; 119 return 0;
96} 120}
97 121
98int 122int
99sigismember (sigset_t * mask, int sig) 123sigismember (sigset_t *mask, int sig)
100{ 124{
125 if (!mask) {
126 errno = EINVAL;
127 return -1;
128 }
101 return (*mask & sigmask(sig)) != 0; 129 return (*mask & sigmask(sig)) != 0;
102} 130}
103 131
diff --git a/openbsd-compat/sys-queue.h b/openbsd-compat/sys-queue.h
index 402343324..5cf0587bd 100644
--- a/openbsd-compat/sys-queue.h
+++ b/openbsd-compat/sys-queue.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: queue.h,v 1.25 2004/04/08 16:08:21 henning Exp $ */ 1/* $OpenBSD: queue.h,v 1.32 2007/04/30 18:42:34 pedro Exp $ */
2/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ 2/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */
3 3
4/* 4/*
@@ -167,6 +167,12 @@
167 * For details on the use of these macros, see the queue(3) manual page. 167 * For details on the use of these macros, see the queue(3) manual page.
168 */ 168 */
169 169
170#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC))
171#define _Q_INVALIDATE(a) (a) = ((void *)-1)
172#else
173#define _Q_INVALIDATE(a)
174#endif
175
170/* 176/*
171 * Singly-linked List definitions. 177 * Singly-linked List definitions.
172 */ 178 */
@@ -229,13 +235,14 @@ struct { \
229#define SLIST_REMOVE(head, elm, type, field) do { \ 235#define SLIST_REMOVE(head, elm, type, field) do { \
230 if ((head)->slh_first == (elm)) { \ 236 if ((head)->slh_first == (elm)) { \
231 SLIST_REMOVE_HEAD((head), field); \ 237 SLIST_REMOVE_HEAD((head), field); \
232 } \ 238 } else { \
233 else { \
234 struct type *curelm = (head)->slh_first; \ 239 struct type *curelm = (head)->slh_first; \
235 while( curelm->field.sle_next != (elm) ) \ 240 \
241 while (curelm->field.sle_next != (elm)) \
236 curelm = curelm->field.sle_next; \ 242 curelm = curelm->field.sle_next; \
237 curelm->field.sle_next = \ 243 curelm->field.sle_next = \
238 curelm->field.sle_next->field.sle_next; \ 244 curelm->field.sle_next->field.sle_next; \
245 _Q_INVALIDATE((elm)->field.sle_next); \
239 } \ 246 } \
240} while (0) 247} while (0)
241 248
@@ -303,6 +310,8 @@ struct { \
303 (elm)->field.le_next->field.le_prev = \ 310 (elm)->field.le_next->field.le_prev = \
304 (elm)->field.le_prev; \ 311 (elm)->field.le_prev; \
305 *(elm)->field.le_prev = (elm)->field.le_next; \ 312 *(elm)->field.le_prev = (elm)->field.le_next; \
313 _Q_INVALIDATE((elm)->field.le_prev); \
314 _Q_INVALIDATE((elm)->field.le_next); \
306} while (0) 315} while (0)
307 316
308#define LIST_REPLACE(elm, elm2, field) do { \ 317#define LIST_REPLACE(elm, elm2, field) do { \
@@ -311,6 +320,8 @@ struct { \
311 &(elm2)->field.le_next; \ 320 &(elm2)->field.le_next; \
312 (elm2)->field.le_prev = (elm)->field.le_prev; \ 321 (elm2)->field.le_prev = (elm)->field.le_prev; \
313 *(elm2)->field.le_prev = (elm2); \ 322 *(elm2)->field.le_prev = (elm2); \
323 _Q_INVALIDATE((elm)->field.le_prev); \
324 _Q_INVALIDATE((elm)->field.le_next); \
314} while (0) 325} while (0)
315 326
316/* 327/*
@@ -369,8 +380,8 @@ struct { \
369 (listelm)->field.sqe_next = (elm); \ 380 (listelm)->field.sqe_next = (elm); \
370} while (0) 381} while (0)
371 382
372#define SIMPLEQ_REMOVE_HEAD(head, elm, field) do { \ 383#define SIMPLEQ_REMOVE_HEAD(head, field) do { \
373 if (((head)->sqh_first = (elm)->field.sqe_next) == NULL) \ 384 if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
374 (head)->sqh_last = &(head)->sqh_first; \ 385 (head)->sqh_last = &(head)->sqh_first; \
375} while (0) 386} while (0)
376 387
@@ -465,6 +476,8 @@ struct { \
465 else \ 476 else \
466 (head)->tqh_last = (elm)->field.tqe_prev; \ 477 (head)->tqh_last = (elm)->field.tqe_prev; \
467 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ 478 *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
479 _Q_INVALIDATE((elm)->field.tqe_prev); \
480 _Q_INVALIDATE((elm)->field.tqe_next); \
468} while (0) 481} while (0)
469 482
470#define TAILQ_REPLACE(head, elm, elm2, field) do { \ 483#define TAILQ_REPLACE(head, elm, elm2, field) do { \
@@ -475,6 +488,8 @@ struct { \
475 (head)->tqh_last = &(elm2)->field.tqe_next; \ 488 (head)->tqh_last = &(elm2)->field.tqe_next; \
476 (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ 489 (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \
477 *(elm2)->field.tqe_prev = (elm2); \ 490 *(elm2)->field.tqe_prev = (elm2); \
491 _Q_INVALIDATE((elm)->field.tqe_prev); \
492 _Q_INVALIDATE((elm)->field.tqe_next); \
478} while (0) 493} while (0)
479 494
480/* 495/*
@@ -575,6 +590,8 @@ struct { \
575 else \ 590 else \
576 (elm)->field.cqe_prev->field.cqe_next = \ 591 (elm)->field.cqe_prev->field.cqe_next = \
577 (elm)->field.cqe_next; \ 592 (elm)->field.cqe_next; \
593 _Q_INVALIDATE((elm)->field.cqe_prev); \
594 _Q_INVALIDATE((elm)->field.cqe_next); \
578} while (0) 595} while (0)
579 596
580#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ 597#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \
@@ -588,6 +605,8 @@ struct { \
588 (head).cqh_first = (elm2); \ 605 (head).cqh_first = (elm2); \
589 else \ 606 else \
590 (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ 607 (elm2)->field.cqe_prev->field.cqe_next = (elm2); \
608 _Q_INVALIDATE((elm)->field.cqe_prev); \
609 _Q_INVALIDATE((elm)->field.cqe_next); \
591} while (0) 610} while (0)
592 611
593#endif /* !_FAKE_QUEUE_H_ */ 612#endif /* !_FAKE_QUEUE_H_ */
diff --git a/openbsd-compat/sys-tree.h b/openbsd-compat/sys-tree.h
index c80b90b21..d4949b5e7 100644
--- a/openbsd-compat/sys-tree.h
+++ b/openbsd-compat/sys-tree.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */ 1/* $OpenBSD: tree.h,v 1.10 2007/10/29 23:49:41 djm Exp $ */
2/* 2/*
3 * Copyright 2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2002 Niels Provos <provos@citi.umich.edu>
4 * All rights reserved. 4 * All rights reserved.
@@ -289,7 +289,7 @@ void name##_SPLAY_MINMAX(struct name *head, int __comp) \
289 (x) != NULL; \ 289 (x) != NULL; \
290 (x) = SPLAY_NEXT(name, head, x)) 290 (x) = SPLAY_NEXT(name, head, x))
291 291
292/* Macros that define a red-back tree */ 292/* Macros that define a red-black tree */
293#define RB_HEAD(name, type) \ 293#define RB_HEAD(name, type) \
294struct name { \ 294struct name { \
295 struct type *rbh_root; /* root of the tree */ \ 295 struct type *rbh_root; /* root of the tree */ \
@@ -381,9 +381,9 @@ void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
381struct type *name##_RB_REMOVE(struct name *, struct type *); \ 381struct type *name##_RB_REMOVE(struct name *, struct type *); \
382struct type *name##_RB_INSERT(struct name *, struct type *); \ 382struct type *name##_RB_INSERT(struct name *, struct type *); \
383struct type *name##_RB_FIND(struct name *, struct type *); \ 383struct type *name##_RB_FIND(struct name *, struct type *); \
384struct type *name##_RB_NEXT(struct name *, struct type *); \ 384struct type *name##_RB_NEXT(struct type *); \
385struct type *name##_RB_MINMAX(struct name *, int); \ 385struct type *name##_RB_MINMAX(struct name *, int);
386 \ 386
387 387
388/* Main rb operation. 388/* Main rb operation.
389 * Moves node close to the key of elm to top 389 * Moves node close to the key of elm to top
@@ -626,7 +626,7 @@ name##_RB_FIND(struct name *head, struct type *elm) \
626} \ 626} \
627 \ 627 \
628struct type * \ 628struct type * \
629name##_RB_NEXT(struct name *head, struct type *elm) \ 629name##_RB_NEXT(struct type *elm) \
630{ \ 630{ \
631 if (RB_RIGHT(elm, field)) { \ 631 if (RB_RIGHT(elm, field)) { \
632 elm = RB_RIGHT(elm, field); \ 632 elm = RB_RIGHT(elm, field); \
@@ -667,13 +667,13 @@ name##_RB_MINMAX(struct name *head, int val) \
667#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) 667#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
668#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) 668#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
669#define RB_FIND(name, x, y) name##_RB_FIND(x, y) 669#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
670#define RB_NEXT(name, x, y) name##_RB_NEXT(x, y) 670#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
671#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) 671#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF)
672#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) 672#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF)
673 673
674#define RB_FOREACH(x, name, head) \ 674#define RB_FOREACH(x, name, head) \
675 for ((x) = RB_MIN(name, head); \ 675 for ((x) = RB_MIN(name, head); \
676 (x) != NULL; \ 676 (x) != NULL; \
677 (x) = name##_RB_NEXT(head, x)) 677 (x) = name##_RB_NEXT(x))
678 678
679#endif /* _SYS_TREE_H_ */ 679#endif /* _SYS_TREE_H_ */