| /* |
| * Copyright (c) 1999-2003 Damien Miller. All rights reserved. |
| * Copyright (c) 2003 Ben Lindstrom. All rights reserved. |
| * Copyright (c) 2002 Tim Rice. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef _OPENBSD_COMPAT_H |
| #define _OPENBSD_COMPAT_H |
| |
| #include "includes.h" |
| |
| #include <sys/types.h> |
| #include <pwd.h> |
| |
| #include <sys/socket.h> |
| |
| #include <stddef.h> /* for wchar_t */ |
| |
| /* OpenBSD function replacements */ |
| #include "base64.h" |
| #include "sigact.h" |
| #include "readpassphrase.h" |
| #include "vis.h" |
| #include "getrrsetbyname.h" |
| #include "sha1.h" |
| #include "sha2.h" |
| #include "rmd160.h" |
| #include "md5.h" |
| #include "blf.h" |
| |
| #ifndef HAVE_BASENAME |
| char *basename(const char *path); |
| #endif |
| |
| #ifndef HAVE_BINDRESVPORT_SA |
| int bindresvport_sa(int sd, struct sockaddr *sa); |
| #endif |
| |
| #ifndef HAVE_CLOSEFROM |
| void closefrom(int); |
| #endif |
| |
| #ifndef HAVE_GETPAGESIZE |
| int getpagesize(void); |
| #endif |
| |
| #ifndef HAVE_GETCWD |
| char *getcwd(char *pt, size_t size); |
| #endif |
| |
| #ifndef HAVE_REALLOCARRAY |
| void *reallocarray(void *, size_t, size_t); |
| #endif |
| |
| #ifndef HAVE_RECALLOCARRAY |
| void *recallocarray(void *, size_t, size_t, size_t); |
| #endif |
| |
| #if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH) |
| /* |
| * glibc's FORTIFY_SOURCE can redefine this and prevent us picking up the |
| * compat version. |
| */ |
| # ifdef BROKEN_REALPATH |
| # define realpath(x, y) _ssh_compat_realpath(x, y) |
| # endif |
| |
| char *realpath(const char *path, char *resolved); |
| #endif |
| |
| #ifndef HAVE_RRESVPORT_AF |
| int rresvport_af(int *alport, sa_family_t af); |
| #endif |
| |
| #ifndef HAVE_STRLCPY |
| size_t strlcpy(char *dst, const char *src, size_t siz); |
| #endif |
| |
| #ifndef HAVE_STRLCAT |
| size_t strlcat(char *dst, const char *src, size_t siz); |
| #endif |
| |
| #ifndef HAVE_STRCASESTR |
| char *strcasestr(const char *, const char *); |
| #endif |
| |
| #ifndef HAVE_SETENV |
| int setenv(register const char *name, register const char *value, int rewrite); |
| #endif |
| |
| #ifndef HAVE_STRMODE |
| void strmode(int mode, char *p); |
| #endif |
| |
| #ifndef HAVE_STRPTIME |
| #include <time.h> |
| char *strptime(const char *buf, const char *fmt, struct tm *tm); |
| #endif |
| |
| #if !defined(HAVE_MKDTEMP) || defined(HAVE_STRICT_MKSTEMP) |
| int mkstemps(char *path, int slen); |
| int mkstemp(char *path); |
| char *mkdtemp(char *path); |
| #endif |
| |
| #ifndef HAVE_DAEMON |
| int daemon(int nochdir, int noclose); |
| #endif |
| |
| #ifndef HAVE_DIRNAME |
| char *dirname(const char *path); |
| #endif |
| |
| #ifndef HAVE_FMT_SCALED |
| #define FMT_SCALED_STRSIZE 7 |
| int fmt_scaled(long long number, char *result); |
| #endif |
| |
| #ifndef HAVE_SCAN_SCALED |
| int scan_scaled(char *, long long *); |
| #endif |
| |
| #if defined(BROKEN_INET_NTOA) || !defined(HAVE_INET_NTOA) |
| char *inet_ntoa(struct in_addr in); |
| #endif |
| |
| #ifndef HAVE_INET_NTOP |
| const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); |
| #endif |
| |
| #ifndef HAVE_INET_ATON |
| int inet_aton(const char *cp, struct in_addr *addr); |
| #endif |
| |
| #ifndef HAVE_STRSEP |
| char *strsep(char **stringp, const char *delim); |
| #endif |
| |
| #ifndef HAVE_SETPROCTITLE |
| void setproctitle(const char *fmt, ...); |
| void compat_init_setproctitle(int argc, char *argv[]); |
| #endif |
| |
| #ifndef HAVE_GETGROUPLIST |
| int getgrouplist(const char *, gid_t, gid_t *, int *); |
| #endif |
| |
| #if !defined(HAVE_GETOPT) || !defined(HAVE_GETOPT_OPTRESET) |
| int BSDgetopt(int argc, char * const *argv, const char *opts); |
| #include "openbsd-compat/getopt.h" |
| #endif |
| |
| #if defined(HAVE_DECL_WRITEV) && HAVE_DECL_WRITEV == 0 |
| # include <sys/types.h> |
| # include <sys/uio.h> |
| int writev(int, struct iovec *, int); |
| #endif |
| |
| /* Home grown routines */ |
| #include "bsd-misc.h" |
| #include "bsd-setres_id.h" |
| #include "bsd-statvfs.h" |
| #include "bsd-waitpid.h" |
| #include "bsd-poll.h" |
| |
| #ifndef HAVE_GETPEEREID |
| int getpeereid(int , uid_t *, gid_t *); |
| #endif |
| |
| #ifdef HAVE_ARC4RANDOM |
| # ifndef HAVE_ARC4RANDOM_STIR |
| # define arc4random_stir() |
| # endif |
| #else |
| unsigned int arc4random(void); |
| void arc4random_stir(void); |
| #endif /* !HAVE_ARC4RANDOM */ |
| |
| #ifndef HAVE_ARC4RANDOM_BUF |
| void arc4random_buf(void *, size_t); |
| #endif |
| |
| #ifndef HAVE_ARC4RANDOM_UNIFORM |
| u_int32_t arc4random_uniform(u_int32_t); |
| #endif |
| |
| #ifndef HAVE_ASPRINTF |
| int asprintf(char **, const char *, ...); |
| #endif |
| |
| #ifndef HAVE_OPENPTY |
| # include <sys/ioctl.h> /* for struct winsize */ |
| int openpty(int *, int *, char *, struct termios *, struct winsize *); |
| #endif /* HAVE_OPENPTY */ |
| |
| #ifndef HAVE_SNPRINTF |
| int snprintf(char *, size_t, SNPRINTF_CONST char *, ...); |
| #endif |
| |
| #ifndef HAVE_STRTOLL |
| long long strtoll(const char *, char **, int); |
| #endif |
| |
| #ifndef HAVE_STRTOUL |
| unsigned long strtoul(const char *, char **, int); |
| #endif |
| |
| #ifndef HAVE_STRTOULL |
| unsigned long long strtoull(const char *, char **, int); |
| #endif |
| |
| #ifndef HAVE_STRTONUM |
| long long strtonum(const char *, long long, long long, const char **); |
| #endif |
| |
| /* multibyte character support */ |
| #ifndef HAVE_MBLEN |
| # define mblen(x, y) (1) |
| #endif |
| |
| #ifndef HAVE_WCWIDTH |
| # define wcwidth(x) (((x) >= 0x20 && (x) <= 0x7e) ? 1 : -1) |
| /* force our no-op nl_langinfo and mbtowc */ |
| # undef HAVE_NL_LANGINFO |
| # undef HAVE_MBTOWC |
| # undef HAVE_LANGINFO_H |
| #endif |
| |
| #ifndef HAVE_NL_LANGINFO |
| # define nl_langinfo(x) "" |
| #endif |
| |
| #ifndef HAVE_MBTOWC |
| int mbtowc(wchar_t *, const char*, size_t); |
| #endif |
| |
| #if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF) |
| # include <stdarg.h> |
| #endif |
| |
| /* |
| * Some platforms unconditionally undefine va_copy() so we define VA_COPY() |
| * instead. This is known to be the case on at least some configurations of |
| * AIX with the xlc compiler. |
| */ |
| #ifndef VA_COPY |
| # ifdef HAVE_VA_COPY |
| # define VA_COPY(dest, src) va_copy(dest, src) |
| # else |
| # ifdef HAVE___VA_COPY |
| # define VA_COPY(dest, src) __va_copy(dest, src) |
| # else |
| # define VA_COPY(dest, src) (dest) = (src) |
| # endif |
| # endif |
| #endif |
| |
| #ifndef HAVE_VASPRINTF |
| int vasprintf(char **, const char *, va_list); |
| #endif |
| |
| #ifndef HAVE_VSNPRINTF |
| int vsnprintf(char *, size_t, const char *, va_list); |
| #endif |
| |
| #ifndef HAVE_USER_FROM_UID |
| char *user_from_uid(uid_t, int); |
| #endif |
| |
| #ifndef HAVE_GROUP_FROM_GID |
| char *group_from_gid(gid_t, int); |
| #endif |
| |
| #ifndef HAVE_TIMINGSAFE_BCMP |
| int timingsafe_bcmp(const void *, const void *, size_t); |
| #endif |
| |
| #ifndef HAVE_BCRYPT_PBKDF |
| int bcrypt_pbkdf(const char *, size_t, const u_int8_t *, size_t, |
| u_int8_t *, size_t, unsigned int); |
| #endif |
| |
| #ifndef HAVE_EXPLICIT_BZERO |
| void explicit_bzero(void *p, size_t n); |
| #endif |
| |
| char *xcrypt(const char *password, const char *salt); |
| char *shadow_pw(struct passwd *pw); |
| |
| /* rfc2553 socket API replacements */ |
| #include "fake-rfc2553.h" |
| |
| /* Routines for a single OS platform */ |
| #include "bsd-cray.h" |
| #include "bsd-cygwin_util.h" |
| |
| #include "port-aix.h" |
| #include "port-irix.h" |
| #include "port-linux.h" |
| #include "port-solaris.h" |
| #include "port-tun.h" |
| #include "port-uw.h" |
| |
| /* _FORTIFY_SOURCE breaks FD_ISSET(n)/FD_SET(n) for n > FD_SETSIZE. Avoid. */ |
| #if defined(HAVE_FEATURES_H) && defined(_FORTIFY_SOURCE) |
| # include <features.h> |
| # if defined(__GNU_LIBRARY__) && defined(__GLIBC_PREREQ) |
| # if __GLIBC_PREREQ(2, 15) && (_FORTIFY_SOURCE > 0) |
| # include <sys/socket.h> /* Ensure include guard is defined */ |
| # undef FD_SET |
| # undef FD_ISSET |
| # define FD_SET(n, set) kludge_FD_SET(n, set) |
| # define FD_ISSET(n, set) kludge_FD_ISSET(n, set) |
| void kludge_FD_SET(int, fd_set *); |
| int kludge_FD_ISSET(int, fd_set *); |
| # endif /* __GLIBC_PREREQ(2, 15) && (_FORTIFY_SOURCE > 0) */ |
| # endif /* __GNU_LIBRARY__ && __GLIBC_PREREQ */ |
| #endif /* HAVE_FEATURES_H && _FORTIFY_SOURCE */ |
| |
| #endif /* _OPENBSD_COMPAT_H */ |