10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru 80Sigor@sysoev.ru #ifndef _NXT_UNIX_H_INCLUDED_ 90Sigor@sysoev.ru #define _NXT_UNIX_H_INCLUDED_ 100Sigor@sysoev.ru 110Sigor@sysoev.ru 120Sigor@sysoev.ru #if (NXT_LINUX) 130Sigor@sysoev.ru 140Sigor@sysoev.ru #ifdef _FORTIFY_SOURCE 150Sigor@sysoev.ru /* 160Sigor@sysoev.ru * _FORTIFY_SOURCE 170Sigor@sysoev.ru * may call sigaltstack() while _longjmp() checking; 180Sigor@sysoev.ru * may cause _longjmp() to fail with message: 190Sigor@sysoev.ru * "longjmp() causes uninitialized stack frame"; 200Sigor@sysoev.ru * does not allow to use "(void) write()"; 210Sigor@sysoev.ru * does surplus checks. 220Sigor@sysoev.ru */ 230Sigor@sysoev.ru #undef _FORTIFY_SOURCE 240Sigor@sysoev.ru #endif 250Sigor@sysoev.ru 260Sigor@sysoev.ru #ifndef _GNU_SOURCE 270Sigor@sysoev.ru #define _GNU_SOURCE /* pread(), pwrite(), gethostname(). */ 280Sigor@sysoev.ru #endif 290Sigor@sysoev.ru 300Sigor@sysoev.ru #define _FILE_OFFSET_BITS 64 310Sigor@sysoev.ru 320Sigor@sysoev.ru #include <malloc.h> /* malloc_usable_size(). */ 330Sigor@sysoev.ru #include <sys/syscall.h> /* syscall(SYS_gettid). */ 340Sigor@sysoev.ru 350Sigor@sysoev.ru #if (NXT_GETRANDOM) 360Sigor@sysoev.ru #include <linux/random.h> /* getrandom(). */ 370Sigor@sysoev.ru #endif 380Sigor@sysoev.ru 390Sigor@sysoev.ru #if (__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 4) 400Sigor@sysoev.ru /* 410Sigor@sysoev.ru * POSIX semaphores using NPTL atomic/futex operations 420Sigor@sysoev.ru * were introduced during glibc 2.3 development time. 430Sigor@sysoev.ru */ 440Sigor@sysoev.ru #define NXT_HAVE_SEM_TRYWAIT_FAST 1 450Sigor@sysoev.ru #endif 460Sigor@sysoev.ru 470Sigor@sysoev.ru #endif /* NXT_LINUX */ 480Sigor@sysoev.ru 490Sigor@sysoev.ru 500Sigor@sysoev.ru #if (NXT_FREEBSD) 510Sigor@sysoev.ru 520Sigor@sysoev.ru #if (NXT_HAVE_MALLOC_USABLE_SIZE) 530Sigor@sysoev.ru #include <malloc_np.h> /* malloc_usable_size(). */ 540Sigor@sysoev.ru #endif 550Sigor@sysoev.ru 560Sigor@sysoev.ru #if (__FreeBSD_version >= 900007) 570Sigor@sysoev.ru /* POSIX semaphores using atomic/umtx. */ 580Sigor@sysoev.ru #define NXT_HAVE_SEM_TRYWAIT_FAST 1 590Sigor@sysoev.ru #endif 600Sigor@sysoev.ru 610Sigor@sysoev.ru #endif /* NXT_FREEBSD */ 620Sigor@sysoev.ru 630Sigor@sysoev.ru 640Sigor@sysoev.ru #if (NXT_SOLARIS) 650Sigor@sysoev.ru 66*93Smax.romanov@nginx.com #ifndef _FILE_OFFSET_BITS 670Sigor@sysoev.ru #define _FILE_OFFSET_BITS 64 /* Must be before <sys/types.h>. */ 68*93Smax.romanov@nginx.com #endif 690Sigor@sysoev.ru 700Sigor@sysoev.ru #ifndef _REENTRANT /* May be set by "-mt" options. */ 710Sigor@sysoev.ru #define _REENTRANT /* Thread safe errno. */ 720Sigor@sysoev.ru #endif 730Sigor@sysoev.ru 7426Sigor@sysoev.ru #ifndef _POSIX_PTHREAD_SEMANTICS 750Sigor@sysoev.ru #define _POSIX_PTHREAD_SEMANTICS /* 2 arguments in sigwait(). */ 7626Sigor@sysoev.ru #endif 770Sigor@sysoev.ru 780Sigor@sysoev.ru /* 790Sigor@sysoev.ru * Solaris provides two sockets API: 800Sigor@sysoev.ru * 810Sigor@sysoev.ru * 1) 4.3BSD sockets (int instead of socklen_t in accept(), etc.; 820Sigor@sysoev.ru * struct msghdr.msg_accrights) in libsocket; 830Sigor@sysoev.ru * 2) X/Open sockets (socklen_t, struct msghdr.msg_control) with __xnet_ 840Sigor@sysoev.ru * function name prefix in libxnet and libsocket. 850Sigor@sysoev.ru */ 860Sigor@sysoev.ru 870Sigor@sysoev.ru /* Enable X/Open sockets API. */ 880Sigor@sysoev.ru #define _XOPEN_SOURCE 890Sigor@sysoev.ru #define _XOPEN_SOURCE_EXTENDED 1 900Sigor@sysoev.ru /* Enable Solaris extensions disabled by _XOPEN_SOURCE. */ 9126Sigor@sysoev.ru #ifndef __EXTENSIONS__ 920Sigor@sysoev.ru #define __EXTENSIONS__ 9326Sigor@sysoev.ru #endif 940Sigor@sysoev.ru 950Sigor@sysoev.ru #endif /* NXT_SOLARIS */ 960Sigor@sysoev.ru 970Sigor@sysoev.ru 980Sigor@sysoev.ru #if (NXT_MACOSX) 990Sigor@sysoev.ru 1000Sigor@sysoev.ru #define _XOPEN_SOURCE /* ucontext(3). */ 10126Sigor@sysoev.ru #ifndef _DARWIN_C_SOURCE 1020Sigor@sysoev.ru #define _DARWIN_C_SOURCE /* pthread_threadid_np(), mach_port_t. */ 10326Sigor@sysoev.ru #endif 1040Sigor@sysoev.ru 1050Sigor@sysoev.ru #include <mach/mach_time.h> /* mach_absolute_time(). */ 1060Sigor@sysoev.ru #include <malloc/malloc.h> /* malloc_size(). */ 1070Sigor@sysoev.ru 1080Sigor@sysoev.ru #endif /* NXT_MACOSX */ 1090Sigor@sysoev.ru 1100Sigor@sysoev.ru 1110Sigor@sysoev.ru #if (NXT_AIX) 1120Sigor@sysoev.ru 1130Sigor@sysoev.ru #define _THREAD_SAFE /* Must before any include. */ 1140Sigor@sysoev.ru 1150Sigor@sysoev.ru #endif /* NXT_AIX */ 1160Sigor@sysoev.ru 1170Sigor@sysoev.ru 1180Sigor@sysoev.ru #if (NXT_HPUX) 1190Sigor@sysoev.ru 1200Sigor@sysoev.ru #define _FILE_OFFSET_BITS 64 1210Sigor@sysoev.ru 1220Sigor@sysoev.ru /* 1230Sigor@sysoev.ru * HP-UX provides three sockets API: 1240Sigor@sysoev.ru * 1250Sigor@sysoev.ru * 1) 4.3BSD sockets (int instead of socklen_t in accept(), etc.; 1260Sigor@sysoev.ru * struct msghdr.msg_accrights) in libc; 1270Sigor@sysoev.ru * 2) X/Open sockets (socklen_t, struct msghdr.msg_control) with _xpg_ 1280Sigor@sysoev.ru * function name prefix in libc; 1290Sigor@sysoev.ru * 3) and X/Open sockets (socklen_t, struct msghdr.msg_control) in libxnet. 1300Sigor@sysoev.ru */ 1310Sigor@sysoev.ru 1320Sigor@sysoev.ru /* Enable X/Open sockets API. */ 1330Sigor@sysoev.ru #define _XOPEN_SOURCE 1340Sigor@sysoev.ru #define _XOPEN_SOURCE_EXTENDED 1350Sigor@sysoev.ru /* Enable static function wrappers for _xpg_ X/Open sockets API in libc. */ 1360Sigor@sysoev.ru #define _HPUX_ALT_XOPEN_SOCKET_API 1370Sigor@sysoev.ru 1380Sigor@sysoev.ru #include <sys/mpctl.h> 1390Sigor@sysoev.ru 1400Sigor@sysoev.ru #if (NXT_HAVE_HG_GETHRTIME) 1410Sigor@sysoev.ru #include <sys/mercury.h> 1420Sigor@sysoev.ru #endif 1430Sigor@sysoev.ru 1440Sigor@sysoev.ru #endif /* NXT_HPUX */ 1450Sigor@sysoev.ru 1460Sigor@sysoev.ru 1470Sigor@sysoev.ru #if (NXT_HAVE_ALLOCA_H) 1480Sigor@sysoev.ru #include <alloca.h> 1490Sigor@sysoev.ru #endif 1500Sigor@sysoev.ru #include <dlfcn.h> 1510Sigor@sysoev.ru #include <errno.h> 1520Sigor@sysoev.ru #include <fcntl.h> 1530Sigor@sysoev.ru #include <grp.h> 1540Sigor@sysoev.ru #include <limits.h> 1550Sigor@sysoev.ru #include <netdb.h> 1560Sigor@sysoev.ru #include <netinet/in.h> 1570Sigor@sysoev.ru #include <netinet/tcp.h> 1580Sigor@sysoev.ru #include <poll.h> 1590Sigor@sysoev.ru #include <pwd.h> 1600Sigor@sysoev.ru #include <semaphore.h> 1610Sigor@sysoev.ru #include <setjmp.h> 1620Sigor@sysoev.ru #include <sched.h> 1630Sigor@sysoev.ru #include <signal.h> 1640Sigor@sysoev.ru #if (NXT_HAVE_POSIX_SPAWN) 1650Sigor@sysoev.ru #include <spawn.h> 1660Sigor@sysoev.ru #endif 1670Sigor@sysoev.ru #include <stdarg.h> 1680Sigor@sysoev.ru #include <stddef.h> /* offsetof() */ 1690Sigor@sysoev.ru #include <stdio.h> 1700Sigor@sysoev.ru #include <stdint.h> 1710Sigor@sysoev.ru #include <stdlib.h> 1720Sigor@sysoev.ru #include <string.h> 1730Sigor@sysoev.ru #include <syslog.h> 1740Sigor@sysoev.ru #if (NXT_HAVE_SYS_FILIO_H) 1750Sigor@sysoev.ru #include <sys/filio.h> /* FIONBIO */ 1760Sigor@sysoev.ru #endif 1770Sigor@sysoev.ru #include <sys/ioctl.h> 1780Sigor@sysoev.ru #include <sys/mman.h> 1790Sigor@sysoev.ru #include <sys/param.h> /* MAXPATHLEN */ 1800Sigor@sysoev.ru #include <sys/resource.h> 1810Sigor@sysoev.ru #include <sys/socket.h> 1820Sigor@sysoev.ru #include <sys/stat.h> 1830Sigor@sysoev.ru #include <sys/time.h> 1840Sigor@sysoev.ru #include <sys/types.h> 1850Sigor@sysoev.ru #include <sys/uio.h> 1860Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN) 1870Sigor@sysoev.ru #include <sys/un.h> 1880Sigor@sysoev.ru #endif 1890Sigor@sysoev.ru #include <sys/wait.h> 1900Sigor@sysoev.ru #include <time.h> 1910Sigor@sysoev.ru #include <ucontext.h> 1920Sigor@sysoev.ru #include <unistd.h> 1930Sigor@sysoev.ru 1940Sigor@sysoev.ru 1950Sigor@sysoev.ru #if (NXT_THREADS) 1960Sigor@sysoev.ru #include <pthread.h> 1970Sigor@sysoev.ru #endif 1980Sigor@sysoev.ru 1990Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 2000Sigor@sysoev.ru #include <sys/epoll.h> 2010Sigor@sysoev.ru 2020Sigor@sysoev.ru #ifdef EPOLLRDHUP 2030Sigor@sysoev.ru /* 2040Sigor@sysoev.ru * Epoll edge-tiggered mode is pretty much useless without EPOLLRDHUP support. 2050Sigor@sysoev.ru */ 2060Sigor@sysoev.ru #define NXT_HAVE_EPOLL_EDGE 1 2070Sigor@sysoev.ru #endif 2080Sigor@sysoev.ru 2090Sigor@sysoev.ru #endif 2100Sigor@sysoev.ru 2110Sigor@sysoev.ru #if (NXT_HAVE_SIGNALFD) 2120Sigor@sysoev.ru #include <sys/signalfd.h> 2130Sigor@sysoev.ru #endif 2140Sigor@sysoev.ru 2150Sigor@sysoev.ru #if (NXT_HAVE_EVENTFD) 2160Sigor@sysoev.ru #include <sys/eventfd.h> 2170Sigor@sysoev.ru #endif 2180Sigor@sysoev.ru 2190Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 2200Sigor@sysoev.ru #include <sys/event.h> 2210Sigor@sysoev.ru #endif 2220Sigor@sysoev.ru 2230Sigor@sysoev.ru #if (NXT_HAVE_EVENTPORT) 2240Sigor@sysoev.ru #include <port.h> 2250Sigor@sysoev.ru #endif 2260Sigor@sysoev.ru 2270Sigor@sysoev.ru #if (NXT_HAVE_DEVPOLL) 2280Sigor@sysoev.ru #include <sys/devpoll.h> 2290Sigor@sysoev.ru #endif 2300Sigor@sysoev.ru 2310Sigor@sysoev.ru #if (NXT_HAVE_POLLSET) 2320Sigor@sysoev.ru #include <sys/pollset.h> 2330Sigor@sysoev.ru #endif 2340Sigor@sysoev.ru 2350Sigor@sysoev.ru #if (NXT_HAVE_LINUX_SENDFILE) 2360Sigor@sysoev.ru #include <sys/sendfile.h> 2370Sigor@sysoev.ru #endif 2380Sigor@sysoev.ru 2390Sigor@sysoev.ru #if (NXT_HAVE_SOLARIS_SENDFILEV) 2400Sigor@sysoev.ru #include <sys/sendfile.h> 2410Sigor@sysoev.ru #endif 2420Sigor@sysoev.ru 2430Sigor@sysoev.ru 2440Sigor@sysoev.ru #if (NXT_TEST_BUILD) 2451Sigor@sysoev.ru #include <nxt_test_build.h> 2460Sigor@sysoev.ru #endif 2470Sigor@sysoev.ru 2480Sigor@sysoev.ru 2490Sigor@sysoev.ru /* 2500Sigor@sysoev.ru * On Linux IOV_MAX is 1024. Linux uses kernel stack for 8 iovec's 2510Sigor@sysoev.ru * to avoid kernel allocation/deallocation. 2520Sigor@sysoev.ru * 2530Sigor@sysoev.ru * On FreeBSD IOV_MAX is 1024. FreeBSD used kernel stack for 8 iovec's 2540Sigor@sysoev.ru * to avoid kernel allocation/deallocation until FreeBSD 5.2. 2550Sigor@sysoev.ru * FreeBSD 5.2 and later do not use stack at all. 2560Sigor@sysoev.ru * 2570Sigor@sysoev.ru * On Solaris IOV_MAX is 16 and Solaris uses only kernel stack. 2580Sigor@sysoev.ru * 2590Sigor@sysoev.ru * On MacOSX IOV_MAX is 1024. MacOSX used kernel stack for 8 iovec's 2600Sigor@sysoev.ru * to avoid kernel allocation/deallocation until MacOSX 10.4 (Tiger). 2610Sigor@sysoev.ru * MacOSX 10.4 and later do not use stack at all. 2620Sigor@sysoev.ru * 2630Sigor@sysoev.ru * On NetBSD, OpenBSD, and DragonFlyBSD IOV_MAX is 1024. All these OSes 2640Sigor@sysoev.ru * uses kernel stack for 8 iovec's to avoid kernel allocation/deallocation. 2650Sigor@sysoev.ru * 2660Sigor@sysoev.ru * On AIX and HP-UX IOV_MAX is 16. 2670Sigor@sysoev.ru */ 2680Sigor@sysoev.ru #define NXT_IOBUF_MAX 8 2690Sigor@sysoev.ru 2700Sigor@sysoev.ru 2710Sigor@sysoev.ru typedef struct iovec nxt_iobuf_t; 2720Sigor@sysoev.ru 2730Sigor@sysoev.ru #define \ 2740Sigor@sysoev.ru nxt_iobuf_data(iob) \ 2750Sigor@sysoev.ru (iob)->iov_base 2760Sigor@sysoev.ru 2770Sigor@sysoev.ru #define \ 2780Sigor@sysoev.ru nxt_iobuf_size(iob) \ 2790Sigor@sysoev.ru (iob)->iov_len 2800Sigor@sysoev.ru 2810Sigor@sysoev.ru #define \ 2820Sigor@sysoev.ru nxt_iobuf_set(iob, p, size) \ 2830Sigor@sysoev.ru do { \ 2840Sigor@sysoev.ru (iob)->iov_base = (void *) p; \ 2850Sigor@sysoev.ru (iob)->iov_len = size; \ 2860Sigor@sysoev.ru } while (0) 2870Sigor@sysoev.ru 2880Sigor@sysoev.ru #define \ 2890Sigor@sysoev.ru nxt_iobuf_add(iob, size) \ 2900Sigor@sysoev.ru (iob)->iov_len += size 2910Sigor@sysoev.ru 2920Sigor@sysoev.ru 2930Sigor@sysoev.ru #endif /* _NXT_UNIX_H_INCLUDED_ */ 294