1 /* 2 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 14 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef COMPAT_H 18 #define COMPAT_H 19 20 #include <sys/types.h> 21 #include <sys/ioctl.h> 22 #include <sys/uio.h> 23 24 #include <fnmatch.h> 25 #include <limits.h> 26 #include <stdio.h> 27 #include <termios.h> 28 #include <wchar.h> 29 30 #ifndef __GNUC__ 31 #define __attribute__(a) 32 #endif 33 34 #ifndef __unused 35 #define __unused __attribute__ ((__unused__)) 36 #endif 37 #ifndef __dead 38 #define __dead __attribute__ ((__noreturn__)) 39 #endif 40 #ifndef __packed 41 #define __packed __attribute__ ((__packed__)) 42 #endif 43 44 #ifndef ECHOPRT 45 #define ECHOPRT 0 46 #endif 47 48 #ifndef ACCESSPERMS 49 #define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) 50 #endif 51 52 #if !defined(FIONREAD) && defined(__sun) 53 #include <sys/filio.h> 54 #endif 55 56 #ifdef HAVE_ERR_H 57 #include <err.h> 58 #else 59 void err(int, const char *, ...); 60 void errx(int, const char *, ...); 61 void warn(const char *, ...); 62 void warnx(const char *, ...); 63 #endif 64 65 #ifdef HAVE_PATHS_H 66 #include <paths.h> 67 #endif 68 69 #ifndef _PATH_BSHELL 70 #define _PATH_BSHELL "/bin/sh" 71 #endif 72 73 #ifndef _PATH_TMP 74 #define _PATH_TMP "/tmp/" 75 #endif 76 77 #ifndef _PATH_DEVNULL 78 #define _PATH_DEVNULL "/dev/null" 79 #endif 80 81 #ifndef _PATH_TTY 82 #define _PATH_TTY "/dev/tty" 83 #endif 84 85 #ifndef _PATH_DEV 86 #define _PATH_DEV "/dev/" 87 #endif 88 89 #ifndef _PATH_DEFPATH 90 #define _PATH_DEFPATH "/usr/bin:/bin" 91 #endif 92 93 #ifndef __OpenBSD__ 94 #define pledge(s, p) (0) 95 #endif 96 97 #ifdef HAVE_STDINT_H 98 #include <stdint.h> 99 #else 100 #include <inttypes.h> 101 #endif 102 103 #ifdef HAVE_QUEUE_H 104 #include <sys/queue.h> 105 #else 106 #include "compat/queue.h" 107 #endif 108 109 #ifdef HAVE_TREE_H 110 #include <sys/tree.h> 111 #else 112 #include "compat/tree.h" 113 #endif 114 115 #ifdef HAVE_BITSTRING_H 116 #include <bitstring.h> 117 #else 118 #include "compat/bitstring.h" 119 #endif 120 121 #ifdef HAVE_LIBUTIL_H 122 #include <libutil.h> 123 #endif 124 125 #ifdef HAVE_PTY_H 126 #include <pty.h> 127 #endif 128 129 #ifdef HAVE_UTIL_H 130 #include <util.h> 131 #endif 132 133 #ifdef HAVE_VIS 134 #include <vis.h> 135 #else 136 #include "compat/vis.h" 137 #endif 138 139 #ifdef HAVE_IMSG 140 #include <imsg.h> 141 #else 142 #include "compat/imsg.h" 143 #endif 144 145 #ifdef BROKEN_CMSG_FIRSTHDR 146 #undef CMSG_FIRSTHDR 147 #define CMSG_FIRSTHDR(mhdr) \ 148 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ 149 (struct cmsghdr *)(mhdr)->msg_control : \ 150 (struct cmsghdr *)NULL) 151 #endif 152 153 #ifndef CMSG_ALIGN 154 #ifdef _CMSG_DATA_ALIGN 155 #define CMSG_ALIGN _CMSG_DATA_ALIGN 156 #else 157 #define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1)) 158 #endif 159 #endif 160 161 #ifndef CMSG_SPACE 162 #define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) 163 #endif 164 165 #ifndef CMSG_LEN 166 #define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) 167 #endif 168 169 #ifndef O_DIRECTORY 170 #define O_DIRECTORY 0 171 #endif 172 173 #ifndef FNM_CASEFOLD 174 #ifdef FNM_IGNORECASE 175 #define FNM_CASEFOLD FNM_IGNORECASE 176 #else 177 #define FNM_CASEFOLD 0 178 #endif 179 #endif 180 181 #ifndef INFTIM 182 #define INFTIM -1 183 #endif 184 185 #ifndef WAIT_ANY 186 #define WAIT_ANY -1 187 #endif 188 189 #ifndef SUN_LEN 190 #define SUN_LEN(sun) (sizeof (sun)->sun_path) 191 #endif 192 193 #ifndef timercmp 194 #define timercmp(tvp, uvp, cmp) \ 195 (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 196 ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 197 ((tvp)->tv_sec cmp (uvp)->tv_sec)) 198 #endif 199 200 #ifndef timeradd 201 #define timeradd(tvp, uvp, vvp) \ 202 do { \ 203 (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 204 (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 205 if ((vvp)->tv_usec >= 1000000) { \ 206 (vvp)->tv_sec++; \ 207 (vvp)->tv_usec -= 1000000; \ 208 } \ 209 } while (0) 210 #endif 211 212 #ifndef timersub 213 #define timersub(tvp, uvp, vvp) \ 214 do { \ 215 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 216 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 217 if ((vvp)->tv_usec < 0) { \ 218 (vvp)->tv_sec--; \ 219 (vvp)->tv_usec += 1000000; \ 220 } \ 221 } while (0) 222 #endif 223 224 #ifndef TTY_NAME_MAX 225 #define TTY_NAME_MAX 32 226 #endif 227 228 #ifndef HOST_NAME_MAX 229 #define HOST_NAME_MAX 255 230 #endif 231 232 #ifndef HAVE_FLOCK 233 #define LOCK_SH 0 234 #define LOCK_EX 0 235 #define LOCK_NB 0 236 #define flock(fd, op) (0) 237 #endif 238 239 #ifndef HAVE_EXPLICIT_BZERO 240 /* explicit_bzero.c */ 241 void explicit_bzero(void *, size_t); 242 #endif 243 244 #ifndef HAVE_GETDTABLECOUNT 245 /* getdtablecount.c */ 246 int getdtablecount(void); 247 #endif 248 249 #ifndef HAVE_CLOSEFROM 250 /* closefrom.c */ 251 void closefrom(int); 252 #endif 253 254 #ifndef HAVE_STRCASESTR 255 /* strcasestr.c */ 256 char *strcasestr(const char *, const char *); 257 #endif 258 259 #ifndef HAVE_STRSEP 260 /* strsep.c */ 261 char *strsep(char **, const char *); 262 #endif 263 264 #ifndef HAVE_STRTONUM 265 /* strtonum.c */ 266 long long strtonum(const char *, long long, long long, const char **); 267 #endif 268 269 #ifndef HAVE_STRLCPY 270 /* strlcpy.c */ 271 size_t strlcpy(char *, const char *, size_t); 272 #endif 273 274 #ifndef HAVE_STRLCAT 275 /* strlcat.c */ 276 size_t strlcat(char *, const char *, size_t); 277 #endif 278 279 #ifndef HAVE_STRNLEN 280 /* strnlen.c */ 281 size_t strnlen(const char *, size_t); 282 #endif 283 284 #ifndef HAVE_STRNDUP 285 /* strndup.c */ 286 char *strndup(const char *, size_t); 287 #endif 288 289 #ifndef HAVE_MEMMEM 290 /* memmem.c */ 291 void *memmem(const void *, size_t, const void *, size_t); 292 #endif 293 294 #ifndef HAVE_DAEMON 295 /* daemon.c */ 296 int daemon(int, int); 297 #endif 298 299 #ifndef HAVE_GETPROGNAME 300 /* getprogname.c */ 301 const char *getprogname(void); 302 #endif 303 304 #ifndef HAVE_SETPROCTITLE 305 /* setproctitle.c */ 306 void setproctitle(const char *, ...); 307 #endif 308 309 #ifndef HAVE_B64_NTOP 310 /* base64.c */ 311 #undef b64_ntop 312 #undef b64_pton 313 int b64_ntop(const char *, size_t, char *, size_t); 314 int b64_pton(const char *, u_char *, size_t); 315 #endif 316 317 #ifndef HAVE_FDFORKPTY 318 /* fdforkpty.c */ 319 int getptmfd(void); 320 pid_t fdforkpty(int, int *, char *, struct termios *, 321 struct winsize *); 322 #endif 323 324 #ifndef HAVE_FORKPTY 325 /* forkpty.c */ 326 pid_t forkpty(int *, char *, struct termios *, struct winsize *); 327 #endif 328 329 #ifndef HAVE_ASPRINTF 330 /* asprintf.c */ 331 int asprintf(char **, const char *, ...); 332 int vasprintf(char **, const char *, va_list); 333 #endif 334 335 #ifndef HAVE_FGETLN 336 /* fgetln.c */ 337 char *fgetln(FILE *, size_t *); 338 #endif 339 340 #ifndef HAVE_SETENV 341 /* setenv.c */ 342 int setenv(const char *, const char *, int); 343 int unsetenv(const char *); 344 #endif 345 346 #ifndef HAVE_CFMAKERAW 347 /* cfmakeraw.c */ 348 void cfmakeraw(struct termios *); 349 #endif 350 351 #ifndef HAVE_FREEZERO 352 /* freezero.c */ 353 void freezero(void *, size_t); 354 #endif 355 356 #ifndef HAVE_REALLOCARRAY 357 /* reallocarray.c */ 358 void *reallocarray(void *, size_t, size_t); 359 #endif 360 361 #ifndef HAVE_RECALLOCARRAY 362 /* recallocarray.c */ 363 void *recallocarray(void *, size_t, size_t, size_t); 364 #endif 365 366 #ifdef HAVE_UTF8PROC 367 /* utf8proc.c */ 368 int utf8proc_wcwidth(wchar_t); 369 int utf8proc_mbtowc(wchar_t *, const char *, size_t); 370 int utf8proc_wctomb(char *, wchar_t); 371 #endif 372 373 /* getopt.c */ 374 #ifndef HAVE_BSD_GETOPT 375 extern int BSDopterr; 376 extern int BSDoptind; 377 extern int BSDoptopt; 378 extern int BSDoptreset; 379 extern char *BSDoptarg; 380 int BSDgetopt(int, char *const *, const char *); 381 #define getopt(ac, av, o) BSDgetopt(ac, av, o) 382 #define opterr BSDopterr 383 #define optind BSDoptind 384 #define optopt BSDoptopt 385 #define optreset BSDoptreset 386 #define optarg BSDoptarg 387 #endif 388 389 #endif /* COMPAT_H */ 390