14Srgrimes/* 2509Srgrimes * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> 315543Sphk * 44Srgrimes * Permission to use, copy, modify, and distribute this software for any 5509Srgrimes * purpose with or without fee is hereby granted, provided that the above 6509Srgrimes * copyright notice and this permission notice appear in all copies. 74Srgrimes * 84Srgrimes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 94Srgrimes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 104Srgrimes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 114Srgrimes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 124Srgrimes * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 134Srgrimes * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 144Srgrimes * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 154Srgrimes */ 164Srgrimes 178876Srgrimes#ifndef COMPAT_H 183698Swollman#define COMPAT_H 195908Sbde 204Srgrimes#include <sys/types.h> 212056Swollman#include <sys/ioctl.h> 222056Swollman#include <sys/uio.h> 232056Swollman 244Srgrimes#include <fnmatch.h> 252056Swollman#include <limits.h> 262056Swollman#include <stdio.h> 274Srgrimes#include <termios.h> 2810079Sbde#include <wchar.h> 2912880Sbde 3012880Sbde#ifdef HAVE_EVENT2_EVENT_H 31798Swollman#include <event2/event.h> 323863Sbde#include <event2/event_compat.h> 3312880Sbde#include <event2/event_struct.h> 34798Swollman#include <event2/buffer.h> 35798Swollman#include <event2/buffer_compat.h> 36798Swollman#include <event2/bufferevent.h> 37798Swollman#include <event2/bufferevent_struct.h> 384836Sdg#include <event2/bufferevent_compat.h> 396733Sbde#else 407627Snate#include <event.h> 417627Snate#endif 427627Snate 437627Snate#ifdef HAVE_MALLOC_TRIM 447627Snate#include <malloc.h> 457627Snate#endif 467627Snate 4712400Sdg#ifdef HAVE_UTF8PROC 484Srgrimes#include <utf8proc.h> 49712Swollman#endif 50974Sdg 514Srgrimes#ifndef __GNUC__ 524Srgrimes#define __attribute__(a) 534Srgrimes#endif 542408Sbde 552408Sbde#ifdef BROKEN___DEAD 563863Sbde#undef __dead 574Srgrimes#endif 584Srgrimes 5911999Speter#ifndef __unused 603863Sbde#define __unused __attribute__ ((__unused__)) 612408Sbde#endif 622408Sbde#ifndef __dead 632408Sbde#define __dead __attribute__ ((__noreturn__)) 648876Srgrimes#endif 6513031Sbde#ifndef __packed 665908Sbde#define __packed __attribute__ ((__packed__)) 6713031Sbde#endif 685908Sbde#ifndef __weak 695908Sbde#define __weak __attribute__ ((__weak__)) 705908Sbde#endif 715908Sbde 726018Sphk#ifndef ECHOPRT 735908Sbde#define ECHOPRT 0 744Srgrimes#endif 755327Sgibbs 765327Sgibbs#ifndef ACCESSPERMS 774Srgrimes#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) 784Srgrimes#endif 794Srgrimes 804Srgrimes#if !defined(FIONREAD) && defined(__sun) 8111918Sdg#include <sys/filio.h> 8211918Sdg#endif 834Srgrimes 844Srgrimes#ifdef HAVE_ERR_H 856802Sgibbs#include <err.h> 866802Sgibbs#else 874Srgrimesvoid err(int, const char *, ...); 8813031Sbdevoid errx(int, const char *, ...); 899647Sbdevoid warn(const char *, ...); 909647Sbdevoid warnx(const char *, ...); 914Srgrimes#endif 92715Swollman 933863Sbde#ifdef HAVE_PATHS_H 94715Swollman#include <paths.h> 95715Swollman#endif 96715Swollman 974Srgrimes#ifndef _PATH_BSHELL 985908Sbde#define _PATH_BSHELL "/bin/sh" 995908Sbde#endif 1005908Sbde 1015908Sbde#ifndef _PATH_TMP 1024Srgrimes#define _PATH_TMP "/tmp/" 1034Srgrimes#endif 1044Srgrimes 1054Srgrimes#ifndef _PATH_DEVNULL 1062464Sbde#define _PATH_DEVNULL "/dev/null" 1072408Sbde#endif 1084Srgrimes 1092408Sbde#ifndef _PATH_TTY 1102408Sbde#define _PATH_TTY "/dev/tty" 1112408Sbde#endif 1122408Sbde 113757Sdg#ifndef _PATH_DEV 1144Srgrimes#define _PATH_DEV "/dev/" 1154Srgrimes#endif 1164Srgrimes 11713259Swollman#ifndef _PATH_DEFPATH 11813259Swollman#define _PATH_DEFPATH "/usr/bin:/bin" 1194Srgrimes#endif 1204Srgrimes 1214Srgrimes#ifndef _PATH_VI 1224Srgrimes#define _PATH_VI "/usr/bin/vi" 1232408Sbde#endif 1242408Sbde 1252408Sbde#ifndef __OpenBSD__ 126649Snate#define pledge(s, p) (0) 1273863Sbde#endif 1284Srgrimes 1298876Srgrimes#ifndef IMAXBEL 130715Swollman#define IMAXBEL 0 1313863Sbde#endif 1324508Sbde 1334Srgrimes#ifdef HAVE_STDINT_H 1343863Sbde#include <stdint.h> 1353863Sbde#else 1363863Sbde#include <inttypes.h> 1372408Sbde#endif 1385327Sgibbs 13914924Speter#ifdef HAVE_QUEUE_H 14014924Speter#include <sys/queue.h> 14114924Speter#else 14214924Speter#include "compat/queue.h" 14314924Speter#endif 14414331Speter 14514924Speter#ifdef HAVE_TREE_H 1464Srgrimes#include <sys/tree.h> 1474Srgrimes#else 1488457Swollman#include "compat/tree.h" 1494Srgrimes#endif 1508457Swollman 1514Srgrimes#ifdef HAVE_BITSTRING_H 1524Srgrimes#include <bitstring.h> 1534Srgrimes#else 1544Srgrimes#include "compat/bitstring.h" 1554Srgrimes#endif 1564Srgrimes 1574Srgrimes#ifdef HAVE_LIBUTIL_H 15815412Sjoerg#include <libutil.h> 1592823Sjkh#endif 1602627Swollman 16114915Sbde#ifdef HAVE_PTY_H 16213321Sphk#include <pty.h> 16313330Speter#endif 16413321Sphk 1652627Swollman#ifdef HAVE_UTIL_H 1662627Swollman#include <util.h> 16715543Sphk#endif 1684Srgrimes 1694Srgrimes#ifdef HAVE_VIS 1704Srgrimes#include <vis.h> 171509Srgrimes#else 1724Srgrimes#include "compat/vis.h" 1734Srgrimes#endif 1744Srgrimes 1754Srgrimes#ifdef HAVE_IMSG 1764Srgrimes#include <imsg.h> 1774Srgrimes#else 178509Srgrimes#include "compat/imsg.h" 1794Srgrimes#endif 1804Srgrimes 1814Srgrimes#ifdef BROKEN_CMSG_FIRSTHDR 1821549Srgrimes#undef CMSG_FIRSTHDR 1831549Srgrimes#define CMSG_FIRSTHDR(mhdr) \ 1841549Srgrimes ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ 1851549Srgrimes (struct cmsghdr *)(mhdr)->msg_control : \ 1861549Srgrimes (struct cmsghdr *)NULL) 1874Srgrimes#endif 1884Srgrimes 1894Srgrimes#ifndef CMSG_ALIGN 190#ifdef _CMSG_DATA_ALIGN 191#define CMSG_ALIGN _CMSG_DATA_ALIGN 192#else 193#define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1)) 194#endif 195#endif 196 197#ifndef CMSG_SPACE 198#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) 199#endif 200 201#ifndef CMSG_LEN 202#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) 203#endif 204 205#ifndef O_DIRECTORY 206#define O_DIRECTORY 0 207#endif 208 209#ifndef FNM_CASEFOLD 210#ifdef FNM_IGNORECASE 211#define FNM_CASEFOLD FNM_IGNORECASE 212#else 213#define FNM_CASEFOLD 0 214#endif 215#endif 216 217#ifndef INFTIM 218#define INFTIM -1 219#endif 220 221#ifndef WAIT_ANY 222#define WAIT_ANY -1 223#endif 224 225#ifndef SUN_LEN 226#define SUN_LEN(sun) (sizeof (sun)->sun_path) 227#endif 228 229#ifndef timercmp 230#define timercmp(tvp, uvp, cmp) \ 231 (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 232 ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 233 ((tvp)->tv_sec cmp (uvp)->tv_sec)) 234#endif 235 236#ifndef timeradd 237#define timeradd(tvp, uvp, vvp) \ 238 do { \ 239 (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 240 (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 241 if ((vvp)->tv_usec >= 1000000) { \ 242 (vvp)->tv_sec++; \ 243 (vvp)->tv_usec -= 1000000; \ 244 } \ 245 } while (0) 246#endif 247 248#ifndef timersub 249#define timersub(tvp, uvp, vvp) \ 250 do { \ 251 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 252 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 253 if ((vvp)->tv_usec < 0) { \ 254 (vvp)->tv_sec--; \ 255 (vvp)->tv_usec += 1000000; \ 256 } \ 257 } while (0) 258#endif 259 260#ifndef TTY_NAME_MAX 261#define TTY_NAME_MAX 32 262#endif 263 264#ifndef HOST_NAME_MAX 265#define HOST_NAME_MAX 255 266#endif 267 268#ifndef CLOCK_REALTIME 269#define CLOCK_REALTIME 0 270#endif 271#ifndef CLOCK_MONOTONIC 272#define CLOCK_MONOTONIC CLOCK_REALTIME 273#endif 274 275#ifndef HAVE_FLOCK 276#define LOCK_SH 0 277#define LOCK_EX 0 278#define LOCK_NB 0 279#define flock(fd, op) (0) 280#endif 281 282#ifndef HAVE_EXPLICIT_BZERO 283/* explicit_bzero.c */ 284void explicit_bzero(void *, size_t); 285#endif 286 287#ifndef HAVE_GETDTABLECOUNT 288/* getdtablecount.c */ 289int getdtablecount(void); 290#endif 291 292#ifndef HAVE_CLOSEFROM 293/* closefrom.c */ 294void closefrom(int); 295#endif 296 297#ifndef HAVE_STRCASESTR 298/* strcasestr.c */ 299char *strcasestr(const char *, const char *); 300#endif 301 302#ifndef HAVE_STRSEP 303/* strsep.c */ 304char *strsep(char **, const char *); 305#endif 306 307#ifndef HAVE_STRTONUM 308/* strtonum.c */ 309long long strtonum(const char *, long long, long long, const char **); 310#endif 311 312#ifndef HAVE_STRLCPY 313/* strlcpy.c */ 314size_t strlcpy(char *, const char *, size_t); 315#endif 316 317#ifndef HAVE_STRLCAT 318/* strlcat.c */ 319size_t strlcat(char *, const char *, size_t); 320#endif 321 322#ifndef HAVE_STRNLEN 323/* strnlen.c */ 324size_t strnlen(const char *, size_t); 325#endif 326 327#ifndef HAVE_STRNDUP 328/* strndup.c */ 329char *strndup(const char *, size_t); 330#endif 331 332#ifndef HAVE_MEMMEM 333/* memmem.c */ 334void *memmem(const void *, size_t, const void *, size_t); 335#endif 336 337#ifndef HAVE_GETPEEREID 338/* getpeereid.c */ 339int getpeereid(int, uid_t *, gid_t *); 340#endif 341 342#ifndef HAVE_DAEMON 343/* daemon.c */ 344int daemon(int, int); 345#endif 346 347#ifndef HAVE_GETPROGNAME 348/* getprogname.c */ 349const char *getprogname(void); 350#endif 351 352#ifndef HAVE_SETPROCTITLE 353/* setproctitle.c */ 354void setproctitle(const char *, ...); 355#endif 356 357#ifndef HAVE_CLOCK_GETTIME 358/* clock_gettime.c */ 359int clock_gettime(int, struct timespec *); 360#endif 361 362#ifndef HAVE_B64_NTOP 363/* base64.c */ 364#undef b64_ntop 365#undef b64_pton 366int b64_ntop(const char *, size_t, char *, size_t); 367int b64_pton(const char *, u_char *, size_t); 368#endif 369 370#ifndef HAVE_FDFORKPTY 371/* fdforkpty.c */ 372int getptmfd(void); 373pid_t fdforkpty(int, int *, char *, struct termios *, 374 struct winsize *); 375#endif 376 377#ifndef HAVE_FORKPTY 378/* forkpty.c */ 379pid_t forkpty(int *, char *, struct termios *, struct winsize *); 380#endif 381 382#ifndef HAVE_ASPRINTF 383/* asprintf.c */ 384int asprintf(char **, const char *, ...); 385int vasprintf(char **, const char *, va_list); 386#endif 387 388#ifndef HAVE_FGETLN 389/* fgetln.c */ 390char *fgetln(FILE *, size_t *); 391#endif 392 393#ifndef HAVE_GETLINE 394/* getline.c */ 395ssize_t getline(char **, size_t *, FILE *); 396#endif 397 398#ifndef HAVE_SETENV 399/* setenv.c */ 400int setenv(const char *, const char *, int); 401int unsetenv(const char *); 402#endif 403 404#ifndef HAVE_CFMAKERAW 405/* cfmakeraw.c */ 406void cfmakeraw(struct termios *); 407#endif 408 409#ifndef HAVE_FREEZERO 410/* freezero.c */ 411void freezero(void *, size_t); 412#endif 413 414#ifndef HAVE_REALLOCARRAY 415/* reallocarray.c */ 416void *reallocarray(void *, size_t, size_t); 417#endif 418 419#ifndef HAVE_RECALLOCARRAY 420/* recallocarray.c */ 421void *recallocarray(void *, size_t, size_t, size_t); 422#endif 423 424#ifdef HAVE_SYSTEMD 425/* systemd.c */ 426int systemd_create_socket(int, char **); 427#endif 428 429#ifdef HAVE_UTF8PROC 430/* utf8proc.c */ 431int utf8proc_wcwidth(wchar_t); 432int utf8proc_mbtowc(wchar_t *, const char *, size_t); 433int utf8proc_wctomb(char *, wchar_t); 434#endif 435 436#ifdef NEED_FUZZING 437/* tmux.c */ 438#define main __weak main 439#endif 440 441/* getopt.c */ 442#ifndef HAVE_BSD_GETOPT 443extern int BSDopterr; 444extern int BSDoptind; 445extern int BSDoptopt; 446extern int BSDoptreset; 447extern char *BSDoptarg; 448int BSDgetopt(int, char *const *, const char *); 449#define getopt(ac, av, o) BSDgetopt(ac, av, o) 450#define opterr BSDopterr 451#define optind BSDoptind 452#define optopt BSDoptopt 453#define optreset BSDoptreset 454#define optarg BSDoptarg 455#endif 456 457#endif /* COMPAT_H */ 458