1*3da8d17dSfengbojiang(姜凤波) 2*3da8d17dSfengbojiang(姜凤波)# Copyright (C) Igor Sysoev 3*3da8d17dSfengbojiang(姜凤波)# Copyright (C) Nginx, Inc. 4*3da8d17dSfengbojiang(姜凤波) 5*3da8d17dSfengbojiang(姜凤波) 6*3da8d17dSfengbojiang(姜凤波)have=NGX_LINUX . auto/have_headers 7*3da8d17dSfengbojiang(姜凤波) 8*3da8d17dSfengbojiang(姜凤波)CORE_INCS="$UNIX_INCS" 9*3da8d17dSfengbojiang(姜凤波)CORE_DEPS="$UNIX_DEPS $LINUX_DEPS" 10*3da8d17dSfengbojiang(姜凤波)CORE_SRCS="$UNIX_SRCS $LINUX_SRCS" 11*3da8d17dSfengbojiang(姜凤波) 12*3da8d17dSfengbojiang(姜凤波)ngx_spacer=' 13*3da8d17dSfengbojiang(姜凤波)' 14*3da8d17dSfengbojiang(姜凤波) 15*3da8d17dSfengbojiang(姜凤波)cc_aux_flags="$CC_AUX_FLAGS" 16*3da8d17dSfengbojiang(姜凤波)CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" 17*3da8d17dSfengbojiang(姜凤波) 18*3da8d17dSfengbojiang(姜凤波) 19*3da8d17dSfengbojiang(姜凤波)# Linux kernel version 20*3da8d17dSfengbojiang(姜凤波) 21*3da8d17dSfengbojiang(姜凤波)version=$((`uname -r \ 22*3da8d17dSfengbojiang(姜凤波) | sed -n -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/ \ 23*3da8d17dSfengbojiang(姜凤波) \1*256*256+\2*256+\3/p' \ 24*3da8d17dSfengbojiang(姜凤波) -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1*256*256+\2*256/p'`)) 25*3da8d17dSfengbojiang(姜凤波) 26*3da8d17dSfengbojiang(姜凤波)version=${version:-0} 27*3da8d17dSfengbojiang(姜凤波) 28*3da8d17dSfengbojiang(姜凤波) 29*3da8d17dSfengbojiang(姜凤波)# posix_fadvise64() had been implemented in 2.5.60 30*3da8d17dSfengbojiang(姜凤波) 31*3da8d17dSfengbojiang(姜凤波)if [ $version -lt 132412 ]; then 32*3da8d17dSfengbojiang(姜凤波) have=NGX_HAVE_POSIX_FADVISE . auto/nohave 33*3da8d17dSfengbojiang(姜凤波)fi 34*3da8d17dSfengbojiang(姜凤波) 35*3da8d17dSfengbojiang(姜凤波)# epoll, EPOLLET version 36*3da8d17dSfengbojiang(姜凤波) 37*3da8d17dSfengbojiang(姜凤波)ngx_feature="epoll" 38*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_EPOLL" 39*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=yes 40*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/epoll.h>" 41*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 42*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 43*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="int efd = 0; 44*3da8d17dSfengbojiang(姜凤波) struct epoll_event ee; 45*3da8d17dSfengbojiang(姜凤波) ee.events = EPOLLIN|EPOLLOUT|EPOLLET; 46*3da8d17dSfengbojiang(姜凤波) ee.data.ptr = NULL; 47*3da8d17dSfengbojiang(姜凤波) (void) ee; 48*3da8d17dSfengbojiang(姜凤波) efd = epoll_create(100); 49*3da8d17dSfengbojiang(姜凤波) if (efd == -1) return 1;" 50*3da8d17dSfengbojiang(姜凤波). auto/feature 51*3da8d17dSfengbojiang(姜凤波) 52*3da8d17dSfengbojiang(姜凤波)if [ $ngx_found = yes ]; then 53*3da8d17dSfengbojiang(姜凤波) have=NGX_HAVE_CLEAR_EVENT . auto/have 54*3da8d17dSfengbojiang(姜凤波) CORE_SRCS="$CORE_SRCS $EPOLL_SRCS" 55*3da8d17dSfengbojiang(姜凤波) EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE" 56*3da8d17dSfengbojiang(姜凤波) EVENT_FOUND=YES 57*3da8d17dSfengbojiang(姜凤波) 58*3da8d17dSfengbojiang(姜凤波) 59*3da8d17dSfengbojiang(姜凤波) # EPOLLRDHUP appeared in Linux 2.6.17, glibc 2.8 60*3da8d17dSfengbojiang(姜凤波) 61*3da8d17dSfengbojiang(姜凤波) ngx_feature="EPOLLRDHUP" 62*3da8d17dSfengbojiang(姜凤波) ngx_feature_name="NGX_HAVE_EPOLLRDHUP" 63*3da8d17dSfengbojiang(姜凤波) ngx_feature_run=no 64*3da8d17dSfengbojiang(姜凤波) ngx_feature_incs="#include <sys/epoll.h>" 65*3da8d17dSfengbojiang(姜凤波) ngx_feature_path= 66*3da8d17dSfengbojiang(姜凤波) ngx_feature_libs= 67*3da8d17dSfengbojiang(姜凤波) ngx_feature_test="int efd = 0, fd = 0; 68*3da8d17dSfengbojiang(姜凤波) struct epoll_event ee; 69*3da8d17dSfengbojiang(姜凤波) ee.events = EPOLLIN|EPOLLRDHUP|EPOLLET; 70*3da8d17dSfengbojiang(姜凤波) ee.data.ptr = NULL; 71*3da8d17dSfengbojiang(姜凤波) epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" 72*3da8d17dSfengbojiang(姜凤波) . auto/feature 73*3da8d17dSfengbojiang(姜凤波) 74*3da8d17dSfengbojiang(姜凤波) 75*3da8d17dSfengbojiang(姜凤波) # EPOLLEXCLUSIVE appeared in Linux 4.5, glibc 2.24 76*3da8d17dSfengbojiang(姜凤波) 77*3da8d17dSfengbojiang(姜凤波) ngx_feature="EPOLLEXCLUSIVE" 78*3da8d17dSfengbojiang(姜凤波) ngx_feature_name="NGX_HAVE_EPOLLEXCLUSIVE" 79*3da8d17dSfengbojiang(姜凤波) ngx_feature_run=no 80*3da8d17dSfengbojiang(姜凤波) ngx_feature_incs="#include <sys/epoll.h>" 81*3da8d17dSfengbojiang(姜凤波) ngx_feature_path= 82*3da8d17dSfengbojiang(姜凤波) ngx_feature_libs= 83*3da8d17dSfengbojiang(姜凤波) ngx_feature_test="int efd = 0, fd = 0; 84*3da8d17dSfengbojiang(姜凤波) struct epoll_event ee; 85*3da8d17dSfengbojiang(姜凤波) ee.events = EPOLLIN|EPOLLEXCLUSIVE; 86*3da8d17dSfengbojiang(姜凤波) ee.data.ptr = NULL; 87*3da8d17dSfengbojiang(姜凤波) epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" 88*3da8d17dSfengbojiang(姜凤波)# . auto/feature 89*3da8d17dSfengbojiang(姜凤波)fi 90*3da8d17dSfengbojiang(姜凤波) 91*3da8d17dSfengbojiang(姜凤波) 92*3da8d17dSfengbojiang(姜凤波)# O_PATH and AT_EMPTY_PATH were introduced in 2.6.39, glibc 2.14 93*3da8d17dSfengbojiang(姜凤波) 94*3da8d17dSfengbojiang(姜凤波)ngx_feature="O_PATH" 95*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_O_PATH" 96*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=no 97*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/types.h> 98*3da8d17dSfengbojiang(姜凤波) #include <sys/stat.h> 99*3da8d17dSfengbojiang(姜凤波) #include <fcntl.h>" 100*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 101*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 102*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="int fd; struct stat sb; 103*3da8d17dSfengbojiang(姜凤波) fd = openat(AT_FDCWD, \".\", O_PATH|O_DIRECTORY|O_NOFOLLOW); 104*3da8d17dSfengbojiang(姜凤波) if (fstatat(fd, \"\", &sb, AT_EMPTY_PATH) != 0) return 1" 105*3da8d17dSfengbojiang(姜凤波). auto/feature 106*3da8d17dSfengbojiang(姜凤波) 107*3da8d17dSfengbojiang(姜凤波) 108*3da8d17dSfengbojiang(姜凤波)# sendfile() 109*3da8d17dSfengbojiang(姜凤波) 110*3da8d17dSfengbojiang(姜凤波)CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE" 111*3da8d17dSfengbojiang(姜凤波)ngx_feature="sendfile()" 112*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_SENDFILE" 113*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=yes 114*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/sendfile.h> 115*3da8d17dSfengbojiang(姜凤波) #include <errno.h>" 116*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 117*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 118*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="int s = 0, fd = 1; 119*3da8d17dSfengbojiang(姜凤波) ssize_t n; off_t off = 0; 120*3da8d17dSfengbojiang(姜凤波) n = sendfile(s, fd, &off, 1); 121*3da8d17dSfengbojiang(姜凤波) if (n == -1 && errno == ENOSYS) return 1" 122*3da8d17dSfengbojiang(姜凤波). auto/feature 123*3da8d17dSfengbojiang(姜凤波) 124*3da8d17dSfengbojiang(姜凤波)if [ $ngx_found = yes ]; then 125*3da8d17dSfengbojiang(姜凤波) CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS" 126*3da8d17dSfengbojiang(姜凤波)fi 127*3da8d17dSfengbojiang(姜凤波) 128*3da8d17dSfengbojiang(姜凤波) 129*3da8d17dSfengbojiang(姜凤波)# sendfile64() 130*3da8d17dSfengbojiang(姜凤波) 131*3da8d17dSfengbojiang(姜凤波)CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" 132*3da8d17dSfengbojiang(姜凤波)ngx_feature="sendfile64()" 133*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_SENDFILE64" 134*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=yes 135*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/sendfile.h> 136*3da8d17dSfengbojiang(姜凤波) #include <errno.h>" 137*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 138*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 139*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="int s = 0, fd = 1; 140*3da8d17dSfengbojiang(姜凤波) ssize_t n; off_t off = 0; 141*3da8d17dSfengbojiang(姜凤波) n = sendfile(s, fd, &off, 1); 142*3da8d17dSfengbojiang(姜凤波) if (n == -1 && errno == ENOSYS) return 1" 143*3da8d17dSfengbojiang(姜凤波). auto/feature 144*3da8d17dSfengbojiang(姜凤波) 145*3da8d17dSfengbojiang(姜凤波) 146*3da8d17dSfengbojiang(姜凤波)ngx_include="sys/prctl.h"; . auto/include 147*3da8d17dSfengbojiang(姜凤波) 148*3da8d17dSfengbojiang(姜凤波)# prctl(PR_SET_DUMPABLE) 149*3da8d17dSfengbojiang(姜凤波) 150*3da8d17dSfengbojiang(姜凤波)ngx_feature="prctl(PR_SET_DUMPABLE)" 151*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE" 152*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=yes 153*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/prctl.h>" 154*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 155*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 156*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) return 1" 157*3da8d17dSfengbojiang(姜凤波). auto/feature 158*3da8d17dSfengbojiang(姜凤波) 159*3da8d17dSfengbojiang(姜凤波) 160*3da8d17dSfengbojiang(姜凤波)# prctl(PR_SET_KEEPCAPS) 161*3da8d17dSfengbojiang(姜凤波) 162*3da8d17dSfengbojiang(姜凤波)ngx_feature="prctl(PR_SET_KEEPCAPS)" 163*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_PR_SET_KEEPCAPS" 164*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=yes 165*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <sys/prctl.h>" 166*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 167*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 168*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) return 1" 169*3da8d17dSfengbojiang(姜凤波). auto/feature 170*3da8d17dSfengbojiang(姜凤波) 171*3da8d17dSfengbojiang(姜凤波) 172*3da8d17dSfengbojiang(姜凤波)# capabilities 173*3da8d17dSfengbojiang(姜凤波) 174*3da8d17dSfengbojiang(姜凤波)ngx_feature="capabilities" 175*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_CAPABILITIES" 176*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=no 177*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <linux/capability.h> 178*3da8d17dSfengbojiang(姜凤波) #include <sys/syscall.h>" 179*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 180*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs= 181*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="struct __user_cap_data_struct data; 182*3da8d17dSfengbojiang(姜凤波) struct __user_cap_header_struct header; 183*3da8d17dSfengbojiang(姜凤波) 184*3da8d17dSfengbojiang(姜凤波) header.version = _LINUX_CAPABILITY_VERSION_1; 185*3da8d17dSfengbojiang(姜凤波) data.effective = CAP_TO_MASK(CAP_NET_RAW); 186*3da8d17dSfengbojiang(姜凤波) data.permitted = 0; 187*3da8d17dSfengbojiang(姜凤波) 188*3da8d17dSfengbojiang(姜凤波) (void) header; 189*3da8d17dSfengbojiang(姜凤波) (void) data; 190*3da8d17dSfengbojiang(姜凤波) (void) SYS_capset" 191*3da8d17dSfengbojiang(姜凤波). auto/feature 192*3da8d17dSfengbojiang(姜凤波) 193*3da8d17dSfengbojiang(姜凤波) 194*3da8d17dSfengbojiang(姜凤波)# crypt_r() 195*3da8d17dSfengbojiang(姜凤波) 196*3da8d17dSfengbojiang(姜凤波)ngx_feature="crypt_r()" 197*3da8d17dSfengbojiang(姜凤波)ngx_feature_name="NGX_HAVE_GNU_CRYPT_R" 198*3da8d17dSfengbojiang(姜凤波)ngx_feature_run=no 199*3da8d17dSfengbojiang(姜凤波)ngx_feature_incs="#include <crypt.h>" 200*3da8d17dSfengbojiang(姜凤波)ngx_feature_path= 201*3da8d17dSfengbojiang(姜凤波)ngx_feature_libs=-lcrypt 202*3da8d17dSfengbojiang(姜凤波)ngx_feature_test="struct crypt_data cd; 203*3da8d17dSfengbojiang(姜凤波) crypt_r(\"key\", \"salt\", &cd);" 204*3da8d17dSfengbojiang(姜凤波). auto/feature 205*3da8d17dSfengbojiang(姜凤波) 206*3da8d17dSfengbojiang(姜凤波) 207*3da8d17dSfengbojiang(姜凤波)ngx_include="sys/vfs.h"; . auto/include 208*3da8d17dSfengbojiang(姜凤波) 209*3da8d17dSfengbojiang(姜凤波) 210*3da8d17dSfengbojiang(姜凤波)CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" 211