xref: /freebsd/crypto/openssh/openbsd-compat/openbsd-compat.h (revision a91a246563dffa876a52f53a98de4af9fa364c52)
1d95e11bfSDag-Erling Smørgrav /*
2d95e11bfSDag-Erling Smørgrav  * Copyright (c) 1999-2003 Damien Miller.  All rights reserved.
3d95e11bfSDag-Erling Smørgrav  * Copyright (c) 2003 Ben Lindstrom. All rights reserved.
4d95e11bfSDag-Erling Smørgrav  * Copyright (c) 2002 Tim Rice.  All rights reserved.
5d95e11bfSDag-Erling Smørgrav  *
6d95e11bfSDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
7d95e11bfSDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
8d95e11bfSDag-Erling Smørgrav  * are met:
9d95e11bfSDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
10d95e11bfSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer.
11d95e11bfSDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
12d95e11bfSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
13d95e11bfSDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
14d95e11bfSDag-Erling Smørgrav  *
15d95e11bfSDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16d95e11bfSDag-Erling Smørgrav  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17d95e11bfSDag-Erling Smørgrav  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18d95e11bfSDag-Erling Smørgrav  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19d95e11bfSDag-Erling Smørgrav  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20d95e11bfSDag-Erling Smørgrav  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21d95e11bfSDag-Erling Smørgrav  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22d95e11bfSDag-Erling Smørgrav  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23d95e11bfSDag-Erling Smørgrav  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24d95e11bfSDag-Erling Smørgrav  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25d95e11bfSDag-Erling Smørgrav  */
2683d2307dSDag-Erling Smørgrav 
27d95e11bfSDag-Erling Smørgrav #ifndef _OPENBSD_COMPAT_H
28d95e11bfSDag-Erling Smørgrav #define _OPENBSD_COMPAT_H
29d95e11bfSDag-Erling Smørgrav 
30d95e11bfSDag-Erling Smørgrav #include "includes.h"
3183d2307dSDag-Erling Smørgrav 
32761efaa7SDag-Erling Smørgrav #include <sys/types.h>
33761efaa7SDag-Erling Smørgrav #include <pwd.h>
34761efaa7SDag-Erling Smørgrav 
35761efaa7SDag-Erling Smørgrav #include <sys/socket.h>
36761efaa7SDag-Erling Smørgrav 
37076ad2f8SDag-Erling Smørgrav #include <stddef.h>  /* for wchar_t */
38076ad2f8SDag-Erling Smørgrav 
3983d2307dSDag-Erling Smørgrav /* OpenBSD function replacements */
4083d2307dSDag-Erling Smørgrav #include "base64.h"
4183d2307dSDag-Erling Smørgrav #include "sigact.h"
4283d2307dSDag-Erling Smørgrav #include "readpassphrase.h"
43d0c8c0bcSDag-Erling Smørgrav #include "vis.h"
44d95e11bfSDag-Erling Smørgrav #include "getrrsetbyname.h"
45bc5531deSDag-Erling Smørgrav #include "sha1.h"
46761efaa7SDag-Erling Smørgrav #include "sha2.h"
47bc5531deSDag-Erling Smørgrav #include "md5.h"
48f7167e0eSDag-Erling Smørgrav #include "blf.h"
4919261079SEd Maste #include "fnmatch.h"
5019261079SEd Maste 
51*a91a2465SEd Maste #ifndef __THROW
52*a91a2465SEd Maste # if defined __cplusplus
53*a91a2465SEd Maste #  define __THROW throw()
54*a91a2465SEd Maste # else
55*a91a2465SEd Maste #  define __THROW
56*a91a2465SEd Maste # endif
57*a91a2465SEd Maste #endif
58*a91a2465SEd Maste 
5919261079SEd Maste #if defined(HAVE_LOGIN_CAP) && !defined(HAVE_LOGIN_GETPWCLASS)
6019261079SEd Maste # include <login_cap.h>
6119261079SEd Maste # define login_getpwclass(pw) login_getclass(pw->pw_class)
6219261079SEd Maste #endif
63d95e11bfSDag-Erling Smørgrav 
64d95e11bfSDag-Erling Smørgrav #ifndef HAVE_BASENAME
65d95e11bfSDag-Erling Smørgrav char *basename(const char *path);
66d95e11bfSDag-Erling Smørgrav #endif
67d95e11bfSDag-Erling Smørgrav 
68d95e11bfSDag-Erling Smørgrav #ifndef HAVE_BINDRESVPORT_SA
69d95e11bfSDag-Erling Smørgrav int bindresvport_sa(int sd, struct sockaddr *sa);
70d95e11bfSDag-Erling Smørgrav #endif
71d95e11bfSDag-Erling Smørgrav 
72d74d50a8SDag-Erling Smørgrav #ifndef HAVE_CLOSEFROM
73d74d50a8SDag-Erling Smørgrav void closefrom(int);
74d74d50a8SDag-Erling Smørgrav #endif
75d74d50a8SDag-Erling Smørgrav 
7687c1498dSEd Maste #if defined(HAVE_DECL_FTRUNCATE) && HAVE_DECL_FTRUNCATE == 0
7787c1498dSEd Maste int ftruncate(int filedes, off_t length);
7887c1498dSEd Maste #endif
7987c1498dSEd Maste 
80190cef3dSDag-Erling Smørgrav #ifndef HAVE_GETLINE
8119261079SEd Maste #include <stdio.h>
82190cef3dSDag-Erling Smørgrav ssize_t getline(char **, size_t *, FILE *);
83190cef3dSDag-Erling Smørgrav #endif
84190cef3dSDag-Erling Smørgrav 
854f52dfbbSDag-Erling Smørgrav #ifndef HAVE_GETPAGESIZE
864f52dfbbSDag-Erling Smørgrav int getpagesize(void);
874f52dfbbSDag-Erling Smørgrav #endif
884f52dfbbSDag-Erling Smørgrav 
89d95e11bfSDag-Erling Smørgrav #ifndef HAVE_GETCWD
90d95e11bfSDag-Erling Smørgrav char *getcwd(char *pt, size_t size);
91d95e11bfSDag-Erling Smørgrav #endif
92d95e11bfSDag-Erling Smørgrav 
9387c1498dSEd Maste #ifndef HAVE_KILLPG
9487c1498dSEd Maste int killpg(pid_t, int);
9587c1498dSEd Maste #endif
9687c1498dSEd Maste 
9719261079SEd Maste #if defined(HAVE_DECL_MEMMEM) && HAVE_DECL_MEMMEM == 0
9819261079SEd Maste void *memmem(const void *, size_t, const void *, size_t);
9919261079SEd Maste #endif
10019261079SEd Maste 
101bc5531deSDag-Erling Smørgrav #ifndef HAVE_REALLOCARRAY
102bc5531deSDag-Erling Smørgrav void *reallocarray(void *, size_t, size_t);
103bc5531deSDag-Erling Smørgrav #endif
104bc5531deSDag-Erling Smørgrav 
1054f52dfbbSDag-Erling Smørgrav #ifndef HAVE_RECALLOCARRAY
1064f52dfbbSDag-Erling Smørgrav void *recallocarray(void *, size_t, size_t, size_t);
1074f52dfbbSDag-Erling Smørgrav #endif
1084f52dfbbSDag-Erling Smørgrav 
109d95e11bfSDag-Erling Smørgrav #ifndef HAVE_RRESVPORT_AF
110d95e11bfSDag-Erling Smørgrav int rresvport_af(int *alport, sa_family_t af);
111d95e11bfSDag-Erling Smørgrav #endif
112d95e11bfSDag-Erling Smørgrav 
113d95e11bfSDag-Erling Smørgrav #ifndef HAVE_STRLCPY
114d95e11bfSDag-Erling Smørgrav size_t strlcpy(char *dst, const char *src, size_t siz);
115d95e11bfSDag-Erling Smørgrav #endif
116d95e11bfSDag-Erling Smørgrav 
117d95e11bfSDag-Erling Smørgrav #ifndef HAVE_STRLCAT
118d95e11bfSDag-Erling Smørgrav size_t strlcat(char *dst, const char *src, size_t siz);
119d95e11bfSDag-Erling Smørgrav #endif
120d95e11bfSDag-Erling Smørgrav 
121ca86bcf2SDag-Erling Smørgrav #ifndef HAVE_STRCASESTR
122ca86bcf2SDag-Erling Smørgrav char *strcasestr(const char *, const char *);
123ca86bcf2SDag-Erling Smørgrav #endif
124ca86bcf2SDag-Erling Smørgrav 
12519261079SEd Maste #ifndef HAVE_STRNLEN
12619261079SEd Maste size_t strnlen(const char *, size_t);
12719261079SEd Maste #endif
12819261079SEd Maste 
12919261079SEd Maste #ifndef HAVE_STRNDUP
13019261079SEd Maste char *strndup(const char *s, size_t n);
13119261079SEd Maste #endif
13219261079SEd Maste 
133d95e11bfSDag-Erling Smørgrav #ifndef HAVE_SETENV
134d95e11bfSDag-Erling Smørgrav int setenv(register const char *name, register const char *value, int rewrite);
135d95e11bfSDag-Erling Smørgrav #endif
136d95e11bfSDag-Erling Smørgrav 
137d95e11bfSDag-Erling Smørgrav #ifndef HAVE_STRMODE
138d95e11bfSDag-Erling Smørgrav void strmode(int mode, char *p);
139d95e11bfSDag-Erling Smørgrav #endif
140d95e11bfSDag-Erling Smørgrav 
141e2f6069cSDag-Erling Smørgrav #ifndef HAVE_STRPTIME
142e2f6069cSDag-Erling Smørgrav #include  <time.h>
143e2f6069cSDag-Erling Smørgrav char *strptime(const char *buf, const char *fmt, struct tm *tm);
144e2f6069cSDag-Erling Smørgrav #endif
145e2f6069cSDag-Erling Smørgrav 
14619261079SEd Maste #if !defined(HAVE_MKDTEMP)
147d95e11bfSDag-Erling Smørgrav int mkstemps(char *path, int slen);
148d95e11bfSDag-Erling Smørgrav int mkstemp(char *path);
149d95e11bfSDag-Erling Smørgrav char *mkdtemp(char *path);
150d95e11bfSDag-Erling Smørgrav #endif
151d95e11bfSDag-Erling Smørgrav 
1524d3fc8b0SEd Maste #define mkstemp(x) _ssh_mkstemp(x)
1534d3fc8b0SEd Maste int _ssh_mkstemp(char *);
1544d3fc8b0SEd Maste 
155d95e11bfSDag-Erling Smørgrav #ifndef HAVE_DAEMON
156d95e11bfSDag-Erling Smørgrav int daemon(int nochdir, int noclose);
157d95e11bfSDag-Erling Smørgrav #endif
158d95e11bfSDag-Erling Smørgrav 
159d95e11bfSDag-Erling Smørgrav #ifndef HAVE_DIRNAME
160d95e11bfSDag-Erling Smørgrav char *dirname(const char *path);
161d95e11bfSDag-Erling Smørgrav #endif
162d95e11bfSDag-Erling Smørgrav 
163d4af9e69SDag-Erling Smørgrav #ifndef HAVE_FMT_SCALED
164d4af9e69SDag-Erling Smørgrav #define	FMT_SCALED_STRSIZE	7
165d4af9e69SDag-Erling Smørgrav int	fmt_scaled(long long number, char *result);
166d4af9e69SDag-Erling Smørgrav #endif
167d4af9e69SDag-Erling Smørgrav 
168e4a9863fSDag-Erling Smørgrav #ifndef HAVE_SCAN_SCALED
169e4a9863fSDag-Erling Smørgrav int	scan_scaled(char *, long long *);
170e4a9863fSDag-Erling Smørgrav #endif
171e4a9863fSDag-Erling Smørgrav 
172d95e11bfSDag-Erling Smørgrav #if defined(BROKEN_INET_NTOA) || !defined(HAVE_INET_NTOA)
173d95e11bfSDag-Erling Smørgrav char *inet_ntoa(struct in_addr in);
174d95e11bfSDag-Erling Smørgrav #endif
175d95e11bfSDag-Erling Smørgrav 
176d95e11bfSDag-Erling Smørgrav #ifndef HAVE_INET_NTOP
177462c32cbSDag-Erling Smørgrav const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
178d95e11bfSDag-Erling Smørgrav #endif
179d95e11bfSDag-Erling Smørgrav 
180d95e11bfSDag-Erling Smørgrav #ifndef HAVE_INET_ATON
181d95e11bfSDag-Erling Smørgrav int inet_aton(const char *cp, struct in_addr *addr);
182d95e11bfSDag-Erling Smørgrav #endif
183d95e11bfSDag-Erling Smørgrav 
184d95e11bfSDag-Erling Smørgrav #ifndef HAVE_STRSEP
185d95e11bfSDag-Erling Smørgrav char *strsep(char **stringp, const char *delim);
186d95e11bfSDag-Erling Smørgrav #endif
187d95e11bfSDag-Erling Smørgrav 
188d95e11bfSDag-Erling Smørgrav #ifndef HAVE_SETPROCTITLE
189d95e11bfSDag-Erling Smørgrav void setproctitle(const char *fmt, ...);
190d95e11bfSDag-Erling Smørgrav void compat_init_setproctitle(int argc, char *argv[]);
191d95e11bfSDag-Erling Smørgrav #endif
192d95e11bfSDag-Erling Smørgrav 
193d95e11bfSDag-Erling Smørgrav #ifndef HAVE_GETGROUPLIST
194d95e11bfSDag-Erling Smørgrav int getgrouplist(const char *, gid_t, gid_t *, int *);
195d95e11bfSDag-Erling Smørgrav #endif
196d95e11bfSDag-Erling Smørgrav 
197d95e11bfSDag-Erling Smørgrav #if !defined(HAVE_GETOPT) || !defined(HAVE_GETOPT_OPTRESET)
198*a91a2465SEd Maste int BSDgetopt(int argc, char * const *argv, const char *opts) __THROW;
199e4a9863fSDag-Erling Smørgrav #include "openbsd-compat/getopt.h"
200d95e11bfSDag-Erling Smørgrav #endif
201d95e11bfSDag-Erling Smørgrav 
20247dd1d1bSDag-Erling Smørgrav #if ((defined(HAVE_DECL_READV) && HAVE_DECL_READV == 0) || \
20347dd1d1bSDag-Erling Smørgrav     (defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0))
204761efaa7SDag-Erling Smørgrav # include <sys/types.h>
205761efaa7SDag-Erling Smørgrav # include <sys/uio.h>
20647dd1d1bSDag-Erling Smørgrav 
20747dd1d1bSDag-Erling Smørgrav # if defined(HAVE_DECL_READV) && HAVE_DECL_READV == 0
20847dd1d1bSDag-Erling Smørgrav int readv(int, struct iovec *, int);
20947dd1d1bSDag-Erling Smørgrav # endif
21047dd1d1bSDag-Erling Smørgrav 
21147dd1d1bSDag-Erling Smørgrav # if defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0
212761efaa7SDag-Erling Smørgrav int writev(int, struct iovec *, int);
213761efaa7SDag-Erling Smørgrav # endif
21447dd1d1bSDag-Erling Smørgrav #endif
21583d2307dSDag-Erling Smørgrav 
21683d2307dSDag-Erling Smørgrav /* Home grown routines */
21719261079SEd Maste #include "bsd-signal.h"
21883d2307dSDag-Erling Smørgrav #include "bsd-misc.h"
2196888a9beSDag-Erling Smørgrav #include "bsd-setres_id.h"
220d4af9e69SDag-Erling Smørgrav #include "bsd-statvfs.h"
22183d2307dSDag-Erling Smørgrav #include "bsd-waitpid.h"
222d4af9e69SDag-Erling Smørgrav #include "bsd-poll.h"
22383d2307dSDag-Erling Smørgrav 
22419261079SEd Maste #if defined(HAVE_DECL_GETPEEREID) && HAVE_DECL_GETPEEREID == 0
225d95e11bfSDag-Erling Smørgrav int getpeereid(int , uid_t *, gid_t *);
226d95e11bfSDag-Erling Smørgrav #endif
227d95e11bfSDag-Erling Smørgrav 
22838a52bd3SEd Maste #ifndef HAVE_ARC4RANDOM
22938a52bd3SEd Maste uint32_t arc4random(void);
230d95e11bfSDag-Erling Smørgrav #endif /* !HAVE_ARC4RANDOM */
231d95e11bfSDag-Erling Smørgrav 
232d4af9e69SDag-Erling Smørgrav #ifndef HAVE_ARC4RANDOM_BUF
233d4af9e69SDag-Erling Smørgrav void arc4random_buf(void *, size_t);
234d4af9e69SDag-Erling Smørgrav #endif
235d4af9e69SDag-Erling Smørgrav 
23638a52bd3SEd Maste #ifndef HAVE_ARC4RANDOM_STIR
23738a52bd3SEd Maste # define arc4random_stir()
23838a52bd3SEd Maste #endif
23938a52bd3SEd Maste 
240d4af9e69SDag-Erling Smørgrav #ifndef HAVE_ARC4RANDOM_UNIFORM
24138a52bd3SEd Maste uint32_t arc4random_uniform(uint32_t);
242d4af9e69SDag-Erling Smørgrav #endif
243d4af9e69SDag-Erling Smørgrav 
244021d409fSDag-Erling Smørgrav #ifndef HAVE_ASPRINTF
245021d409fSDag-Erling Smørgrav int asprintf(char **, const char *, ...);
246021d409fSDag-Erling Smørgrav #endif
247021d409fSDag-Erling Smørgrav 
248efcad6b7SDag-Erling Smørgrav #ifndef HAVE_OPENPTY
249761efaa7SDag-Erling Smørgrav # include <sys/ioctl.h>	/* for struct winsize */
250efcad6b7SDag-Erling Smørgrav int openpty(int *, int *, char *, struct termios *, struct winsize *);
251efcad6b7SDag-Erling Smørgrav #endif /* HAVE_OPENPTY */
252d95e11bfSDag-Erling Smørgrav 
253d95e11bfSDag-Erling Smørgrav #ifndef HAVE_SNPRINTF
254761efaa7SDag-Erling Smørgrav int snprintf(char *, size_t, SNPRINTF_CONST char *, ...);
255d95e11bfSDag-Erling Smørgrav #endif
256d95e11bfSDag-Erling Smørgrav 
257021d409fSDag-Erling Smørgrav #ifndef HAVE_STRTOLL
258021d409fSDag-Erling Smørgrav long long strtoll(const char *, char **, int);
259021d409fSDag-Erling Smørgrav #endif
260021d409fSDag-Erling Smørgrav 
2616888a9beSDag-Erling Smørgrav #ifndef HAVE_STRTOUL
2626888a9beSDag-Erling Smørgrav unsigned long strtoul(const char *, char **, int);
2636888a9beSDag-Erling Smørgrav #endif
2646888a9beSDag-Erling Smørgrav 
2656888a9beSDag-Erling Smørgrav #ifndef HAVE_STRTOULL
2666888a9beSDag-Erling Smørgrav unsigned long long strtoull(const char *, char **, int);
2676888a9beSDag-Erling Smørgrav #endif
2686888a9beSDag-Erling Smørgrav 
269043840dfSDag-Erling Smørgrav #ifndef HAVE_STRTONUM
270043840dfSDag-Erling Smørgrav long long strtonum(const char *, long long, long long, const char **);
271043840dfSDag-Erling Smørgrav #endif
272043840dfSDag-Erling Smørgrav 
273e4a9863fSDag-Erling Smørgrav /* multibyte character support */
274e4a9863fSDag-Erling Smørgrav #ifndef HAVE_MBLEN
275557f75e5SDag-Erling Smørgrav # define mblen(x, y)	(1)
276e4a9863fSDag-Erling Smørgrav #endif
277e4a9863fSDag-Erling Smørgrav 
278076ad2f8SDag-Erling Smørgrav #ifndef HAVE_WCWIDTH
279076ad2f8SDag-Erling Smørgrav # define wcwidth(x)	(((x) >= 0x20 && (x) <= 0x7e) ? 1 : -1)
280076ad2f8SDag-Erling Smørgrav /* force our no-op nl_langinfo and mbtowc */
281076ad2f8SDag-Erling Smørgrav # undef HAVE_NL_LANGINFO
282076ad2f8SDag-Erling Smørgrav # undef HAVE_MBTOWC
283076ad2f8SDag-Erling Smørgrav # undef HAVE_LANGINFO_H
284076ad2f8SDag-Erling Smørgrav #endif
285076ad2f8SDag-Erling Smørgrav 
286076ad2f8SDag-Erling Smørgrav #ifndef HAVE_NL_LANGINFO
287076ad2f8SDag-Erling Smørgrav # define nl_langinfo(x)	""
288076ad2f8SDag-Erling Smørgrav #endif
289076ad2f8SDag-Erling Smørgrav 
290076ad2f8SDag-Erling Smørgrav #ifndef HAVE_MBTOWC
291076ad2f8SDag-Erling Smørgrav int mbtowc(wchar_t *, const char*, size_t);
292076ad2f8SDag-Erling Smørgrav #endif
293076ad2f8SDag-Erling Smørgrav 
294761efaa7SDag-Erling Smørgrav #if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF)
295761efaa7SDag-Erling Smørgrav # include <stdarg.h>
296761efaa7SDag-Erling Smørgrav #endif
297761efaa7SDag-Erling Smørgrav 
298076ad2f8SDag-Erling Smørgrav /*
299076ad2f8SDag-Erling Smørgrav  * Some platforms unconditionally undefine va_copy() so we define VA_COPY()
300076ad2f8SDag-Erling Smørgrav  * instead.  This is known to be the case on at least some configurations of
301076ad2f8SDag-Erling Smørgrav  * AIX with the xlc compiler.
302076ad2f8SDag-Erling Smørgrav  */
303076ad2f8SDag-Erling Smørgrav #ifndef VA_COPY
304076ad2f8SDag-Erling Smørgrav # ifdef HAVE_VA_COPY
305076ad2f8SDag-Erling Smørgrav #  define VA_COPY(dest, src) va_copy(dest, src)
306076ad2f8SDag-Erling Smørgrav # else
307076ad2f8SDag-Erling Smørgrav #  ifdef HAVE___VA_COPY
308076ad2f8SDag-Erling Smørgrav #   define VA_COPY(dest, src) __va_copy(dest, src)
309076ad2f8SDag-Erling Smørgrav #  else
310076ad2f8SDag-Erling Smørgrav #   define VA_COPY(dest, src) (dest) = (src)
311076ad2f8SDag-Erling Smørgrav #  endif
312076ad2f8SDag-Erling Smørgrav # endif
313076ad2f8SDag-Erling Smørgrav #endif
314076ad2f8SDag-Erling Smørgrav 
315021d409fSDag-Erling Smørgrav #ifndef HAVE_VASPRINTF
316021d409fSDag-Erling Smørgrav int vasprintf(char **, const char *, va_list);
317021d409fSDag-Erling Smørgrav #endif
318021d409fSDag-Erling Smørgrav 
319d95e11bfSDag-Erling Smørgrav #ifndef HAVE_VSNPRINTF
320d95e11bfSDag-Erling Smørgrav int vsnprintf(char *, size_t, const char *, va_list);
321d95e11bfSDag-Erling Smørgrav #endif
322d95e11bfSDag-Erling Smørgrav 
323b15c8340SDag-Erling Smørgrav #ifndef HAVE_USER_FROM_UID
324b15c8340SDag-Erling Smørgrav char *user_from_uid(uid_t, int);
325b15c8340SDag-Erling Smørgrav #endif
326b15c8340SDag-Erling Smørgrav 
327b15c8340SDag-Erling Smørgrav #ifndef HAVE_GROUP_FROM_GID
328b15c8340SDag-Erling Smørgrav char *group_from_gid(gid_t, int);
329b15c8340SDag-Erling Smørgrav #endif
330b15c8340SDag-Erling Smørgrav 
3314a421b63SDag-Erling Smørgrav #ifndef HAVE_TIMINGSAFE_BCMP
3324a421b63SDag-Erling Smørgrav int timingsafe_bcmp(const void *, const void *, size_t);
3334a421b63SDag-Erling Smørgrav #endif
3344a421b63SDag-Erling Smørgrav 
335f7167e0eSDag-Erling Smørgrav #ifndef HAVE_BCRYPT_PBKDF
3361323ec57SEd Maste int	bcrypt_pbkdf(const char *, size_t, const uint8_t *, size_t,
3371323ec57SEd Maste     uint8_t *, size_t, unsigned int);
338f7167e0eSDag-Erling Smørgrav #endif
339f7167e0eSDag-Erling Smørgrav 
340b83788ffSDag-Erling Smørgrav #ifndef HAVE_EXPLICIT_BZERO
341b83788ffSDag-Erling Smørgrav void explicit_bzero(void *p, size_t n);
342b83788ffSDag-Erling Smørgrav #endif
343b83788ffSDag-Erling Smørgrav 
3444f52dfbbSDag-Erling Smørgrav #ifndef HAVE_FREEZERO
3454f52dfbbSDag-Erling Smørgrav void freezero(void *, size_t);
3464f52dfbbSDag-Erling Smørgrav #endif
3474f52dfbbSDag-Erling Smørgrav 
34819261079SEd Maste #ifndef HAVE_LOCALTIME_R
34919261079SEd Maste struct tm *localtime_r(const time_t *, struct tm *);
35019261079SEd Maste #endif
35119261079SEd Maste 
35238a52bd3SEd Maste #ifndef HAVE_TIMEGM
353f374ba41SEd Maste #include <time.h>
35438a52bd3SEd Maste time_t timegm(struct tm *);
35538a52bd3SEd Maste #endif
35638a52bd3SEd Maste 
357d95e11bfSDag-Erling Smørgrav char *xcrypt(const char *password, const char *salt);
358d95e11bfSDag-Erling Smørgrav char *shadow_pw(struct passwd *pw);
359d95e11bfSDag-Erling Smørgrav 
36083d2307dSDag-Erling Smørgrav /* rfc2553 socket API replacements */
361d95e11bfSDag-Erling Smørgrav #include "fake-rfc2553.h"
36283d2307dSDag-Erling Smørgrav 
36383d2307dSDag-Erling Smørgrav /* Routines for a single OS platform */
364d95e11bfSDag-Erling Smørgrav #include "bsd-cygwin_util.h"
365761efaa7SDag-Erling Smørgrav 
36683d2307dSDag-Erling Smørgrav #include "port-aix.h"
367761efaa7SDag-Erling Smørgrav #include "port-irix.h"
368761efaa7SDag-Erling Smørgrav #include "port-linux.h"
369761efaa7SDag-Erling Smørgrav #include "port-solaris.h"
37047dd1d1bSDag-Erling Smørgrav #include "port-net.h"
371761efaa7SDag-Erling Smørgrav #include "port-uw.h"
37283d2307dSDag-Erling Smørgrav 
373a0ee8cc6SDag-Erling Smørgrav /* _FORTIFY_SOURCE breaks FD_ISSET(n)/FD_SET(n) for n > FD_SETSIZE. Avoid. */
374a0ee8cc6SDag-Erling Smørgrav #if defined(HAVE_FEATURES_H) && defined(_FORTIFY_SOURCE)
375a0ee8cc6SDag-Erling Smørgrav # include <features.h>
376a0ee8cc6SDag-Erling Smørgrav # if defined(__GNU_LIBRARY__) && defined(__GLIBC_PREREQ)
377a0ee8cc6SDag-Erling Smørgrav #  if __GLIBC_PREREQ(2, 15) && (_FORTIFY_SOURCE > 0)
378a0ee8cc6SDag-Erling Smørgrav #   include <sys/socket.h>  /* Ensure include guard is defined */
379a0ee8cc6SDag-Erling Smørgrav #   undef FD_SET
380a0ee8cc6SDag-Erling Smørgrav #   undef FD_ISSET
381a0ee8cc6SDag-Erling Smørgrav #   define FD_SET(n, set)	kludge_FD_SET(n, set)
382a0ee8cc6SDag-Erling Smørgrav #   define FD_ISSET(n, set)	kludge_FD_ISSET(n, set)
383a0ee8cc6SDag-Erling Smørgrav void kludge_FD_SET(int, fd_set *);
384a0ee8cc6SDag-Erling Smørgrav int kludge_FD_ISSET(int, fd_set *);
385a0ee8cc6SDag-Erling Smørgrav #  endif /* __GLIBC_PREREQ(2, 15) && (_FORTIFY_SOURCE > 0) */
386a0ee8cc6SDag-Erling Smørgrav # endif /* __GNU_LIBRARY__ && __GLIBC_PREREQ */
387a0ee8cc6SDag-Erling Smørgrav #endif /* HAVE_FEATURES_H && _FORTIFY_SOURCE */
388a0ee8cc6SDag-Erling Smørgrav 
389d95e11bfSDag-Erling Smørgrav #endif /* _OPENBSD_COMPAT_H */
390