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 660Sigor@sysoev.ru #define _FILE_OFFSET_BITS 64 /* Must be before <sys/types.h>. */ 670Sigor@sysoev.ru 680Sigor@sysoev.ru #ifndef _REENTRANT /* May be set by "-mt" options. */ 690Sigor@sysoev.ru #define _REENTRANT /* Thread safe errno. */ 700Sigor@sysoev.ru #endif 710Sigor@sysoev.ru 72*26Sigor@sysoev.ru #ifndef _POSIX_PTHREAD_SEMANTICS 730Sigor@sysoev.ru #define _POSIX_PTHREAD_SEMANTICS /* 2 arguments in sigwait(). */ 74*26Sigor@sysoev.ru #endif 750Sigor@sysoev.ru 760Sigor@sysoev.ru /* 770Sigor@sysoev.ru * Solaris provides two sockets API: 780Sigor@sysoev.ru * 790Sigor@sysoev.ru * 1) 4.3BSD sockets (int instead of socklen_t in accept(), etc.; 800Sigor@sysoev.ru * struct msghdr.msg_accrights) in libsocket; 810Sigor@sysoev.ru * 2) X/Open sockets (socklen_t, struct msghdr.msg_control) with __xnet_ 820Sigor@sysoev.ru * function name prefix in libxnet and libsocket. 830Sigor@sysoev.ru */ 840Sigor@sysoev.ru 850Sigor@sysoev.ru /* Enable X/Open sockets API. */ 860Sigor@sysoev.ru #define _XOPEN_SOURCE 870Sigor@sysoev.ru #define _XOPEN_SOURCE_EXTENDED 1 880Sigor@sysoev.ru /* Enable Solaris extensions disabled by _XOPEN_SOURCE. */ 89*26Sigor@sysoev.ru #ifndef __EXTENSIONS__ 900Sigor@sysoev.ru #define __EXTENSIONS__ 91*26Sigor@sysoev.ru #endif 920Sigor@sysoev.ru 930Sigor@sysoev.ru #endif /* NXT_SOLARIS */ 940Sigor@sysoev.ru 950Sigor@sysoev.ru 960Sigor@sysoev.ru #if (NXT_MACOSX) 970Sigor@sysoev.ru 980Sigor@sysoev.ru #define _XOPEN_SOURCE /* ucontext(3). */ 99*26Sigor@sysoev.ru #ifndef _DARWIN_C_SOURCE 1000Sigor@sysoev.ru #define _DARWIN_C_SOURCE /* pthread_threadid_np(), mach_port_t. */ 101*26Sigor@sysoev.ru #endif 1020Sigor@sysoev.ru 1030Sigor@sysoev.ru #include <mach/mach_time.h> /* mach_absolute_time(). */ 1040Sigor@sysoev.ru #include <malloc/malloc.h> /* malloc_size(). */ 1050Sigor@sysoev.ru 1060Sigor@sysoev.ru #endif /* NXT_MACOSX */ 1070Sigor@sysoev.ru 1080Sigor@sysoev.ru 1090Sigor@sysoev.ru #if (NXT_AIX) 1100Sigor@sysoev.ru 1110Sigor@sysoev.ru #define _THREAD_SAFE /* Must before any include. */ 1120Sigor@sysoev.ru 1130Sigor@sysoev.ru #endif /* NXT_AIX */ 1140Sigor@sysoev.ru 1150Sigor@sysoev.ru 1160Sigor@sysoev.ru #if (NXT_HPUX) 1170Sigor@sysoev.ru 1180Sigor@sysoev.ru #define _FILE_OFFSET_BITS 64 1190Sigor@sysoev.ru 1200Sigor@sysoev.ru /* 1210Sigor@sysoev.ru * HP-UX provides three sockets API: 1220Sigor@sysoev.ru * 1230Sigor@sysoev.ru * 1) 4.3BSD sockets (int instead of socklen_t in accept(), etc.; 1240Sigor@sysoev.ru * struct msghdr.msg_accrights) in libc; 1250Sigor@sysoev.ru * 2) X/Open sockets (socklen_t, struct msghdr.msg_control) with _xpg_ 1260Sigor@sysoev.ru * function name prefix in libc; 1270Sigor@sysoev.ru * 3) and X/Open sockets (socklen_t, struct msghdr.msg_control) in libxnet. 1280Sigor@sysoev.ru */ 1290Sigor@sysoev.ru 1300Sigor@sysoev.ru /* Enable X/Open sockets API. */ 1310Sigor@sysoev.ru #define _XOPEN_SOURCE 1320Sigor@sysoev.ru #define _XOPEN_SOURCE_EXTENDED 1330Sigor@sysoev.ru /* Enable static function wrappers for _xpg_ X/Open sockets API in libc. */ 1340Sigor@sysoev.ru #define _HPUX_ALT_XOPEN_SOCKET_API 1350Sigor@sysoev.ru 1360Sigor@sysoev.ru #include <sys/mpctl.h> 1370Sigor@sysoev.ru 1380Sigor@sysoev.ru #if (NXT_HAVE_HG_GETHRTIME) 1390Sigor@sysoev.ru #include <sys/mercury.h> 1400Sigor@sysoev.ru #endif 1410Sigor@sysoev.ru 1420Sigor@sysoev.ru #endif /* NXT_HPUX */ 1430Sigor@sysoev.ru 1440Sigor@sysoev.ru 1450Sigor@sysoev.ru #if (NXT_HAVE_ALLOCA_H) 1460Sigor@sysoev.ru #include <alloca.h> 1470Sigor@sysoev.ru #endif 1480Sigor@sysoev.ru #include <dlfcn.h> 1490Sigor@sysoev.ru #include <errno.h> 1500Sigor@sysoev.ru #include <fcntl.h> 1510Sigor@sysoev.ru #include <grp.h> 1520Sigor@sysoev.ru #include <limits.h> 1530Sigor@sysoev.ru #include <netdb.h> 1540Sigor@sysoev.ru #include <netinet/in.h> 1550Sigor@sysoev.ru #include <netinet/tcp.h> 1560Sigor@sysoev.ru #include <poll.h> 1570Sigor@sysoev.ru #include <pwd.h> 1580Sigor@sysoev.ru #include <semaphore.h> 1590Sigor@sysoev.ru #include <setjmp.h> 1600Sigor@sysoev.ru #include <sched.h> 1610Sigor@sysoev.ru #include <signal.h> 1620Sigor@sysoev.ru #if (NXT_HAVE_POSIX_SPAWN) 1630Sigor@sysoev.ru #include <spawn.h> 1640Sigor@sysoev.ru #endif 1650Sigor@sysoev.ru #include <stdarg.h> 1660Sigor@sysoev.ru #include <stddef.h> /* offsetof() */ 1670Sigor@sysoev.ru #include <stdio.h> 1680Sigor@sysoev.ru #include <stdint.h> 1690Sigor@sysoev.ru #include <stdlib.h> 1700Sigor@sysoev.ru #include <string.h> 1710Sigor@sysoev.ru #include <syslog.h> 1720Sigor@sysoev.ru #if (NXT_HAVE_SYS_FILIO_H) 1730Sigor@sysoev.ru #include <sys/filio.h> /* FIONBIO */ 1740Sigor@sysoev.ru #endif 1750Sigor@sysoev.ru #include <sys/ioctl.h> 1760Sigor@sysoev.ru #include <sys/mman.h> 1770Sigor@sysoev.ru #include <sys/param.h> /* MAXPATHLEN */ 1780Sigor@sysoev.ru #include <sys/resource.h> 1790Sigor@sysoev.ru #include <sys/socket.h> 1800Sigor@sysoev.ru #include <sys/stat.h> 1810Sigor@sysoev.ru #include <sys/time.h> 1820Sigor@sysoev.ru #include <sys/types.h> 1830Sigor@sysoev.ru #include <sys/uio.h> 1840Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN) 1850Sigor@sysoev.ru #include <sys/un.h> 1860Sigor@sysoev.ru #endif 1870Sigor@sysoev.ru #include <sys/wait.h> 1880Sigor@sysoev.ru #include <time.h> 1890Sigor@sysoev.ru #include <ucontext.h> 1900Sigor@sysoev.ru #include <unistd.h> 1910Sigor@sysoev.ru 1920Sigor@sysoev.ru 1930Sigor@sysoev.ru #if (NXT_THREADS) 1940Sigor@sysoev.ru #include <pthread.h> 1950Sigor@sysoev.ru #endif 1960Sigor@sysoev.ru 1970Sigor@sysoev.ru #if (NXT_HAVE_EPOLL) 1980Sigor@sysoev.ru #include <sys/epoll.h> 1990Sigor@sysoev.ru 2000Sigor@sysoev.ru #ifdef EPOLLRDHUP 2010Sigor@sysoev.ru /* 2020Sigor@sysoev.ru * Epoll edge-tiggered mode is pretty much useless without EPOLLRDHUP support. 2030Sigor@sysoev.ru */ 2040Sigor@sysoev.ru #define NXT_HAVE_EPOLL_EDGE 1 2050Sigor@sysoev.ru #endif 2060Sigor@sysoev.ru 2070Sigor@sysoev.ru #endif 2080Sigor@sysoev.ru 2090Sigor@sysoev.ru #if (NXT_HAVE_SIGNALFD) 2100Sigor@sysoev.ru #include <sys/signalfd.h> 2110Sigor@sysoev.ru #endif 2120Sigor@sysoev.ru 2130Sigor@sysoev.ru #if (NXT_HAVE_EVENTFD) 2140Sigor@sysoev.ru #include <sys/eventfd.h> 2150Sigor@sysoev.ru #endif 2160Sigor@sysoev.ru 2170Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 2180Sigor@sysoev.ru #include <sys/event.h> 2190Sigor@sysoev.ru #endif 2200Sigor@sysoev.ru 2210Sigor@sysoev.ru #if (NXT_HAVE_EVENTPORT) 2220Sigor@sysoev.ru #include <port.h> 2230Sigor@sysoev.ru #endif 2240Sigor@sysoev.ru 2250Sigor@sysoev.ru #if (NXT_HAVE_DEVPOLL) 2260Sigor@sysoev.ru #include <sys/devpoll.h> 2270Sigor@sysoev.ru #endif 2280Sigor@sysoev.ru 2290Sigor@sysoev.ru #if (NXT_HAVE_POLLSET) 2300Sigor@sysoev.ru #include <sys/pollset.h> 2310Sigor@sysoev.ru #endif 2320Sigor@sysoev.ru 2330Sigor@sysoev.ru #if (NXT_HAVE_LINUX_SENDFILE) 2340Sigor@sysoev.ru #include <sys/sendfile.h> 2350Sigor@sysoev.ru #endif 2360Sigor@sysoev.ru 2370Sigor@sysoev.ru #if (NXT_HAVE_SOLARIS_SENDFILEV) 2380Sigor@sysoev.ru #include <sys/sendfile.h> 2390Sigor@sysoev.ru #endif 2400Sigor@sysoev.ru 2410Sigor@sysoev.ru 2420Sigor@sysoev.ru #if (NXT_TEST_BUILD) 2431Sigor@sysoev.ru #include <nxt_test_build.h> 2440Sigor@sysoev.ru #endif 2450Sigor@sysoev.ru 2460Sigor@sysoev.ru 2470Sigor@sysoev.ru /* 2480Sigor@sysoev.ru * On Linux IOV_MAX is 1024. Linux uses kernel stack for 8 iovec's 2490Sigor@sysoev.ru * to avoid kernel allocation/deallocation. 2500Sigor@sysoev.ru * 2510Sigor@sysoev.ru * On FreeBSD IOV_MAX is 1024. FreeBSD used kernel stack for 8 iovec's 2520Sigor@sysoev.ru * to avoid kernel allocation/deallocation until FreeBSD 5.2. 2530Sigor@sysoev.ru * FreeBSD 5.2 and later do not use stack at all. 2540Sigor@sysoev.ru * 2550Sigor@sysoev.ru * On Solaris IOV_MAX is 16 and Solaris uses only kernel stack. 2560Sigor@sysoev.ru * 2570Sigor@sysoev.ru * On MacOSX IOV_MAX is 1024. MacOSX used kernel stack for 8 iovec's 2580Sigor@sysoev.ru * to avoid kernel allocation/deallocation until MacOSX 10.4 (Tiger). 2590Sigor@sysoev.ru * MacOSX 10.4 and later do not use stack at all. 2600Sigor@sysoev.ru * 2610Sigor@sysoev.ru * On NetBSD, OpenBSD, and DragonFlyBSD IOV_MAX is 1024. All these OSes 2620Sigor@sysoev.ru * uses kernel stack for 8 iovec's to avoid kernel allocation/deallocation. 2630Sigor@sysoev.ru * 2640Sigor@sysoev.ru * On AIX and HP-UX IOV_MAX is 16. 2650Sigor@sysoev.ru */ 2660Sigor@sysoev.ru #define NXT_IOBUF_MAX 8 2670Sigor@sysoev.ru 2680Sigor@sysoev.ru 2690Sigor@sysoev.ru typedef struct iovec nxt_iobuf_t; 2700Sigor@sysoev.ru 2710Sigor@sysoev.ru #define \ 2720Sigor@sysoev.ru nxt_iobuf_data(iob) \ 2730Sigor@sysoev.ru (iob)->iov_base 2740Sigor@sysoev.ru 2750Sigor@sysoev.ru #define \ 2760Sigor@sysoev.ru nxt_iobuf_size(iob) \ 2770Sigor@sysoev.ru (iob)->iov_len 2780Sigor@sysoev.ru 2790Sigor@sysoev.ru #define \ 2800Sigor@sysoev.ru nxt_iobuf_set(iob, p, size) \ 2810Sigor@sysoev.ru do { \ 2820Sigor@sysoev.ru (iob)->iov_base = (void *) p; \ 2830Sigor@sysoev.ru (iob)->iov_len = size; \ 2840Sigor@sysoev.ru } while (0) 2850Sigor@sysoev.ru 2860Sigor@sysoev.ru #define \ 2870Sigor@sysoev.ru nxt_iobuf_add(iob, size) \ 2880Sigor@sysoev.ru (iob)->iov_len += size 2890Sigor@sysoev.ru 2900Sigor@sysoev.ru 2910Sigor@sysoev.ru #endif /* _NXT_UNIX_H_INCLUDED_ */ 292