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