xref: /f-stack/app/nginx-1.16.1/auto/unix (revision 3da8d17d)
1
2# Copyright (C) Igor Sysoev
3# Copyright (C) Nginx, Inc.
4
5
6NGX_USER=${NGX_USER:-nobody}
7
8if [ -z "$NGX_GROUP" ]; then
9    if [ $NGX_USER = nobody ]; then
10        if grep nobody /etc/group 2>&1 >/dev/null; then
11            echo "checking for nobody group ... found"
12            NGX_GROUP=nobody
13        else
14            echo "checking for nobody group ... not found"
15
16            if grep nogroup /etc/group 2>&1 >/dev/null; then
17                echo "checking for nogroup group ... found"
18                NGX_GROUP=nogroup
19            else
20                echo "checking for nogroup group ... not found"
21                NGX_GROUP=nobody
22            fi
23        fi
24    else
25        NGX_GROUP=$NGX_USER
26    fi
27fi
28
29
30ngx_feature="poll()"
31ngx_feature_name=
32ngx_feature_run=no
33ngx_feature_incs="#include <poll.h>"
34ngx_feature_path=
35ngx_feature_libs=
36ngx_feature_test="int  n; struct pollfd  pl;
37                  pl.fd = 0;
38                  pl.events = 0;
39                  pl.revents = 0;
40                  n = poll(&pl, 1, 0);
41                  if (n == -1) return 1"
42. auto/feature
43
44if [ $ngx_found = no ]; then
45    EVENT_POLL=NONE
46fi
47
48
49ngx_feature="/dev/poll"
50ngx_feature_name="NGX_HAVE_DEVPOLL"
51ngx_feature_run=no
52ngx_feature_incs="#include <sys/devpoll.h>"
53ngx_feature_path=
54ngx_feature_libs=
55ngx_feature_test="int  n, dp; struct dvpoll  dvp;
56                  dp = 0;
57                  dvp.dp_fds = NULL;
58                  dvp.dp_nfds = 0;
59                  dvp.dp_timeout = 0;
60                  n = ioctl(dp, DP_POLL, &dvp);
61                  if (n == -1) return 1"
62. auto/feature
63
64if [ $ngx_found = yes ]; then
65    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"
66    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"
67    EVENT_FOUND=YES
68fi
69
70
71if test -z "$NGX_KQUEUE_CHECKED"; then
72    ngx_feature="kqueue"
73    ngx_feature_name="NGX_HAVE_KQUEUE"
74    ngx_feature_run=no
75    ngx_feature_incs="#include <sys/event.h>"
76    ngx_feature_path=
77    ngx_feature_libs=
78    ngx_feature_test="(void) kqueue()"
79    . auto/feature
80
81    if [ $ngx_found = yes ]; then
82
83        have=NGX_HAVE_CLEAR_EVENT . auto/have
84        EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"
85        CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"
86        EVENT_FOUND=YES
87
88        ngx_feature="kqueue's NOTE_LOWAT"
89        ngx_feature_name="NGX_HAVE_LOWAT_EVENT"
90        ngx_feature_run=no
91        ngx_feature_incs="#include <sys/event.h>"
92        ngx_feature_path=
93        ngx_feature_libs=
94        ngx_feature_test="struct kevent  kev;
95                          kev.fflags = NOTE_LOWAT;
96                          (void) kev"
97        . auto/feature
98
99
100        ngx_feature="kqueue's EVFILT_TIMER"
101        ngx_feature_name="NGX_HAVE_TIMER_EVENT"
102        ngx_feature_run=yes
103        ngx_feature_incs="#include <sys/event.h>
104                          #include <sys/time.h>"
105        ngx_feature_path=
106        ngx_feature_libs=
107        ngx_feature_test="int      kq;
108                  struct kevent    kev;
109                  struct timespec  ts;
110
111                  if ((kq = kqueue()) == -1) return 1;
112
113                  kev.ident = 0;
114                  kev.filter = EVFILT_TIMER;
115                  kev.flags = EV_ADD|EV_ENABLE;
116                  kev.fflags = 0;
117                  kev.data = 1000;
118                  kev.udata = 0;
119
120                  ts.tv_sec = 0;
121                  ts.tv_nsec = 0;
122
123                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;
124
125                  if (kev.flags & EV_ERROR) return 1;"
126
127        . auto/feature
128    fi
129fi
130
131
132if [ "$NGX_SYSTEM" = "NetBSD" ]; then
133
134    # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t"
135
136    cat << END >> $NGX_AUTO_CONFIG_H
137
138#define NGX_KQUEUE_UDATA_T
139
140END
141
142else
143    cat << END >> $NGX_AUTO_CONFIG_H
144
145#define NGX_KQUEUE_UDATA_T  (void *)
146
147END
148
149fi
150
151
152ngx_feature="crypt()"
153ngx_feature_name=
154ngx_feature_run=no
155ngx_feature_incs=
156ngx_feature_path=
157ngx_feature_libs=
158ngx_feature_test="crypt(\"test\", \"salt\");"
159. auto/feature
160
161
162if [ $ngx_found = no ]; then
163
164    ngx_feature="crypt() in libcrypt"
165    ngx_feature_name=
166    ngx_feature_run=no
167    ngx_feature_incs=
168    ngx_feature_path=
169    ngx_feature_libs=-lcrypt
170    . auto/feature
171
172    if [ $ngx_found = yes ]; then
173        CRYPT_LIB="-lcrypt"
174    fi
175fi
176
177
178ngx_feature="F_READAHEAD"
179ngx_feature_name="NGX_HAVE_F_READAHEAD"
180ngx_feature_run=no
181ngx_feature_incs="#include <fcntl.h>"
182ngx_feature_path=
183ngx_feature_libs=
184ngx_feature_test="fcntl(0, F_READAHEAD, 1);"
185. auto/feature
186
187
188ngx_feature="posix_fadvise()"
189ngx_feature_name="NGX_HAVE_POSIX_FADVISE"
190ngx_feature_run=no
191ngx_feature_incs="#include <fcntl.h>"
192ngx_feature_path=
193ngx_feature_libs=
194ngx_feature_test="posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL);"
195. auto/feature
196
197
198ngx_feature="O_DIRECT"
199ngx_feature_name="NGX_HAVE_O_DIRECT"
200ngx_feature_run=no
201ngx_feature_incs="#include <fcntl.h>"
202ngx_feature_path=
203ngx_feature_libs=
204ngx_feature_test="fcntl(0, F_SETFL, O_DIRECT);"
205. auto/feature
206
207
208if [ $ngx_found = yes -a "$NGX_SYSTEM" = "Linux" ]; then
209    have=NGX_HAVE_ALIGNED_DIRECTIO . auto/have
210fi
211
212ngx_feature="F_NOCACHE"
213ngx_feature_name="NGX_HAVE_F_NOCACHE"
214ngx_feature_run=no
215ngx_feature_incs="#include <fcntl.h>"
216ngx_feature_path=
217ngx_feature_libs=
218ngx_feature_test="fcntl(0, F_NOCACHE, 1);"
219. auto/feature
220
221
222ngx_feature="directio()"
223ngx_feature_name="NGX_HAVE_DIRECTIO"
224ngx_feature_run=no
225ngx_feature_incs="#include <sys/types.h>
226                  #include <sys/fcntl.h>"
227ngx_feature_path=
228ngx_feature_libs=
229ngx_feature_test="directio(0, DIRECTIO_ON);"
230. auto/feature
231
232
233ngx_feature="statfs()"
234ngx_feature_name="NGX_HAVE_STATFS"
235ngx_feature_run=no
236ngx_feature_incs="$NGX_INCLUDE_SYS_PARAM_H
237                  $NGX_INCLUDE_SYS_MOUNT_H
238                  $NGX_INCLUDE_SYS_VFS_H"
239ngx_feature_path=
240ngx_feature_libs=
241ngx_feature_test="struct statfs  fs;
242                  statfs(\".\", &fs);"
243. auto/feature
244
245
246ngx_feature="statvfs()"
247ngx_feature_name="NGX_HAVE_STATVFS"
248ngx_feature_run=no
249ngx_feature_incs="#include <sys/types.h>
250                  #include <sys/statvfs.h>"
251ngx_feature_path=
252ngx_feature_libs=
253ngx_feature_test="struct statvfs  fs;
254                  statvfs(\".\", &fs);"
255. auto/feature
256
257
258ngx_feature="dlopen()"
259ngx_feature_name="NGX_HAVE_DLOPEN"
260ngx_feature_run=no
261ngx_feature_incs="#include <dlfcn.h>"
262ngx_feature_path=
263ngx_feature_libs=
264ngx_feature_test="dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, \"\")"
265. auto/feature
266
267
268if [ $ngx_found = no ]; then
269
270    ngx_feature="dlopen() in libdl"
271    ngx_feature_libs="-ldl"
272    . auto/feature
273
274    if [ $ngx_found = yes ]; then
275        CORE_LIBS="$CORE_LIBS -ldl"
276        NGX_LIBDL="-ldl"
277    fi
278fi
279
280
281ngx_feature="sched_yield()"
282ngx_feature_name="NGX_HAVE_SCHED_YIELD"
283ngx_feature_run=no
284ngx_feature_incs="#include <sched.h>"
285ngx_feature_path=
286ngx_feature_libs=
287ngx_feature_test="sched_yield()"
288. auto/feature
289
290
291if [ $ngx_found = no ]; then
292
293    ngx_feature="sched_yield() in librt"
294    ngx_feature_libs="-lrt"
295    . auto/feature
296
297    if [ $ngx_found = yes ]; then
298        CORE_LIBS="$CORE_LIBS -lrt"
299    fi
300fi
301
302
303ngx_feature="sched_setaffinity()"
304ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY"
305ngx_feature_run=no
306ngx_feature_incs="#include <sched.h>"
307ngx_feature_path=
308ngx_feature_libs=
309ngx_feature_test="cpu_set_t mask;
310                  CPU_ZERO(&mask);
311                  sched_setaffinity(0, sizeof(cpu_set_t), &mask)"
312. auto/feature
313
314
315ngx_feature="SO_SETFIB"
316ngx_feature_name="NGX_HAVE_SETFIB"
317ngx_feature_run=no
318ngx_feature_incs="#include <sys/socket.h>"
319ngx_feature_path=
320ngx_feature_libs=
321ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)"
322. auto/feature
323
324
325ngx_feature="SO_REUSEPORT"
326ngx_feature_name="NGX_HAVE_REUSEPORT"
327ngx_feature_run=no
328ngx_feature_incs="#include <sys/socket.h>"
329ngx_feature_path=
330ngx_feature_libs=
331ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)"
332. auto/feature
333
334
335ngx_feature="SO_ACCEPTFILTER"
336ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"
337ngx_feature_run=no
338ngx_feature_incs="#include <sys/socket.h>"
339ngx_feature_path=
340ngx_feature_libs=
341ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)"
342. auto/feature
343
344
345# OpenBSD bind to any address for transparent proxying
346
347ngx_feature="SO_BINDANY"
348ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY"
349ngx_feature_run=no
350ngx_feature_incs="#include <sys/socket.h>"
351ngx_feature_path=
352ngx_feature_libs=
353ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_BINDANY, NULL, 0)"
354. auto/feature
355
356
357# Linux transparent proxying
358
359ngx_feature="IP_TRANSPARENT"
360ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY"
361ngx_feature_run=no
362ngx_feature_incs="#include <sys/socket.h>
363                  #include <netinet/in.h>"
364ngx_feature_path=
365ngx_feature_libs=
366ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_TRANSPARENT, NULL, 0)"
367. auto/feature
368
369
370# FreeBSD bind to any address for transparent proxying
371
372ngx_feature="IP_BINDANY"
373ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY"
374ngx_feature_run=no
375ngx_feature_incs="#include <sys/socket.h>
376                  #include <netinet/in.h>"
377ngx_feature_path=
378ngx_feature_libs=
379ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BINDANY, NULL, 0)"
380. auto/feature
381
382
383# Linux IP_BIND_ADDRESS_NO_PORT
384
385ngx_feature="IP_BIND_ADDRESS_NO_PORT"
386ngx_feature_name="NGX_HAVE_IP_BIND_ADDRESS_NO_PORT"
387ngx_feature_run=no
388ngx_feature_incs="#include <sys/socket.h>
389                  #include <netinet/in.h>"
390ngx_feature_path=
391ngx_feature_libs=
392ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BIND_ADDRESS_NO_PORT, NULL, 0)"
393. auto/feature
394
395
396# BSD way to get IPv4 datagram destination address
397
398ngx_feature="IP_RECVDSTADDR"
399ngx_feature_name="NGX_HAVE_IP_RECVDSTADDR"
400ngx_feature_run=no
401ngx_feature_incs="#include <sys/socket.h>
402                  #include <netinet/in.h>"
403ngx_feature_path=
404ngx_feature_libs=
405ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0)"
406. auto/feature
407
408
409# BSD way to set IPv4 datagram source address
410
411ngx_feature="IP_SENDSRCADDR"
412ngx_feature_name="NGX_HAVE_IP_SENDSRCADDR"
413ngx_feature_run=no
414ngx_feature_incs="#include <sys/socket.h>
415                  #include <netinet/in.h>"
416ngx_feature_path=
417ngx_feature_libs=
418ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_SENDSRCADDR, NULL, 0)"
419. auto/feature
420
421
422# Linux way to get IPv4 datagram destination address
423
424ngx_feature="IP_PKTINFO"
425ngx_feature_name="NGX_HAVE_IP_PKTINFO"
426ngx_feature_run=no
427ngx_feature_incs="#include <sys/socket.h>
428                  #include <netinet/in.h>"
429ngx_feature_path=
430ngx_feature_libs=
431ngx_feature_test="struct in_pktinfo  pkt;
432                  pkt.ipi_spec_dst.s_addr = INADDR_ANY;
433                  (void) pkt;
434                  setsockopt(0, IPPROTO_IP, IP_PKTINFO, NULL, 0)"
435. auto/feature
436
437
438# RFC 3542 way to get IPv6 datagram destination address
439
440ngx_feature="IPV6_RECVPKTINFO"
441ngx_feature_name="NGX_HAVE_IPV6_RECVPKTINFO"
442ngx_feature_run=no
443ngx_feature_incs="#include <sys/socket.h>
444                  #include <netinet/in.h>"
445ngx_feature_path=
446ngx_feature_libs=
447ngx_feature_test="setsockopt(0, IPPROTO_IPV6, IPV6_RECVPKTINFO, NULL, 0)"
448. auto/feature
449
450
451ngx_feature="TCP_DEFER_ACCEPT"
452ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT"
453ngx_feature_run=no
454ngx_feature_incs="#include <sys/socket.h>
455                  #include <netinet/in.h>
456                  #include <netinet/tcp.h>"
457ngx_feature_path=
458ngx_feature_libs=
459ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)"
460. auto/feature
461
462
463ngx_feature="TCP_KEEPIDLE"
464ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"
465ngx_feature_run=no
466ngx_feature_incs="#include <sys/socket.h>
467                  #include <netinet/in.h>
468                  #include <netinet/tcp.h>"
469ngx_feature_path=
470ngx_feature_libs=
471ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);
472                  setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);
473                  setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"
474. auto/feature
475
476
477ngx_feature="TCP_FASTOPEN"
478ngx_feature_name="NGX_HAVE_TCP_FASTOPEN"
479ngx_feature_run=no
480ngx_feature_incs="#include <sys/socket.h>
481                  #include <netinet/in.h>
482                  #include <netinet/tcp.h>"
483ngx_feature_path=
484ngx_feature_libs=
485ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0)"
486. auto/feature
487
488
489ngx_feature="TCP_INFO"
490ngx_feature_name="NGX_HAVE_TCP_INFO"
491ngx_feature_run=no
492ngx_feature_incs="#include <sys/socket.h>
493                  #include <netinet/in.h>
494                  #include <netinet/tcp.h>"
495ngx_feature_path=
496ngx_feature_libs=
497ngx_feature_test="socklen_t optlen = sizeof(struct tcp_info);
498                  struct tcp_info ti;
499                  ti.tcpi_rtt = 0;
500                  ti.tcpi_rttvar = 0;
501                  ti.tcpi_snd_cwnd = 0;
502                  ti.tcpi_rcv_space = 0;
503                  getsockopt(0, IPPROTO_TCP, TCP_INFO, &ti, &optlen)"
504. auto/feature
505
506
507#ngx_feature="accept4()"
508#ngx_feature_name="NGX_HAVE_ACCEPT4"
509#ngx_feature_run=no
510#ngx_feature_incs="#include <sys/socket.h>"
511#ngx_feature_path=
512#ngx_feature_libs=
513#ngx_feature_test="accept4(0, NULL, NULL, SOCK_NONBLOCK)"
514#. auto/feature
515
516if [ $NGX_FILE_AIO = YES ]; then
517
518    ngx_feature="kqueue AIO support"
519    ngx_feature_name="NGX_HAVE_FILE_AIO"
520    ngx_feature_run=no
521    ngx_feature_incs="#include <aio.h>"
522    ngx_feature_path=
523    ngx_feature_libs=
524    ngx_feature_test="struct aiocb  iocb;
525                      iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
526                      (void) aio_read(&iocb)"
527    . auto/feature
528
529    if [ $ngx_found = yes ]; then
530        CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS"
531    fi
532
533    if [ $ngx_found = no ]; then
534
535        ngx_feature="Linux AIO support"
536        ngx_feature_name="NGX_HAVE_FILE_AIO"
537        ngx_feature_run=no
538        ngx_feature_incs="#include <linux/aio_abi.h>
539                          #include <sys/eventfd.h>"
540        ngx_feature_path=
541        ngx_feature_libs=
542        ngx_feature_test="struct iocb  iocb;
543                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;
544                          iocb.aio_flags = IOCB_FLAG_RESFD;
545                          iocb.aio_resfd = -1;
546                          (void) iocb;
547                          (void) eventfd(0, 0)"
548        . auto/feature
549
550        if [ $ngx_found = yes ]; then
551            have=NGX_HAVE_EVENTFD . auto/have
552            have=NGX_HAVE_SYS_EVENTFD_H . auto/have
553            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"
554        fi
555    fi
556
557    if [ $ngx_found = no ]; then
558
559        ngx_feature="Linux AIO support (SYS_eventfd)"
560        ngx_feature_incs="#include <linux/aio_abi.h>
561                          #include <sys/syscall.h>"
562        ngx_feature_test="struct iocb  iocb;
563                          iocb.aio_lio_opcode = IOCB_CMD_PREAD;
564                          iocb.aio_flags = IOCB_FLAG_RESFD;
565                          iocb.aio_resfd = -1;
566                          (void) iocb;
567                          (void) SYS_eventfd"
568        . auto/feature
569
570        if [ $ngx_found = yes ]; then
571            have=NGX_HAVE_EVENTFD . auto/have
572            CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS"
573        fi
574    fi
575
576    if [ $ngx_found = no ]; then
577        cat << END
578
579$0: no supported file AIO was found
580Currently file AIO is supported on FreeBSD 4.3+ and Linux 2.6.22+ only
581
582END
583        exit 1
584    fi
585
586else
587
588    ngx_feature="eventfd()"
589    ngx_feature_name="NGX_HAVE_EVENTFD"
590    ngx_feature_run=no
591    ngx_feature_incs="#include <sys/eventfd.h>"
592    ngx_feature_path=
593    ngx_feature_libs=
594    ngx_feature_test="(void) eventfd(0, 0)"
595    . auto/feature
596
597    if [ $ngx_found = yes ]; then
598        have=NGX_HAVE_SYS_EVENTFD_H . auto/have
599    fi
600
601    if [ $ngx_found = no ]; then
602
603        ngx_feature="eventfd() (SYS_eventfd)"
604        ngx_feature_incs="#include <sys/syscall.h>"
605        ngx_feature_test="(void) SYS_eventfd"
606        . auto/feature
607    fi
608fi
609
610
611have=NGX_HAVE_UNIX_DOMAIN . auto/have
612
613ngx_feature_libs=
614
615
616# C types
617
618ngx_type="int"; . auto/types/sizeof
619
620ngx_type="long"; . auto/types/sizeof
621
622ngx_type="long long"; . auto/types/sizeof
623
624ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size
625ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value
626
627
628# POSIX types
629
630NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\""
631
632ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef
633ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef
634
635ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef
636. auto/types/sizeof
637ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value
638
639ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef
640
641ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef
642
643ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef
644
645ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef
646
647. auto/types/uintptr_t
648
649. auto/endianness
650
651ngx_type="size_t"; . auto/types/sizeof
652ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
653ngx_param=NGX_SIZE_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
654
655ngx_type="off_t"; . auto/types/sizeof
656ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
657ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
658
659ngx_type="time_t"; . auto/types/sizeof
660ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value
661ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
662ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
663
664
665# syscalls, libc calls and some features
666
667
668ngx_feature="AF_INET6"
669ngx_feature_name="NGX_HAVE_INET6"
670ngx_feature_run=no
671ngx_feature_incs="#include <sys/socket.h>
672                  #include <netinet/in.h>
673                  #include <arpa/inet.h>"
674ngx_feature_path=
675ngx_feature_libs=
676ngx_feature_test="struct sockaddr_in6  sin6;
677                  sin6.sin6_family = AF_INET6;
678                  (void) sin6"
679. auto/feature
680
681
682ngx_feature="setproctitle()"
683ngx_feature_name="NGX_HAVE_SETPROCTITLE"
684ngx_feature_run=no
685ngx_feature_incs="#include <stdlib.h>"
686ngx_feature_path=
687ngx_feature_libs=$NGX_SETPROCTITLE_LIB
688ngx_feature_test="setproctitle(\"test\");"
689. auto/feature
690
691
692ngx_feature="pread()"
693ngx_feature_name="NGX_HAVE_PREAD"
694ngx_feature_run=no
695ngx_feature_incs=
696ngx_feature_path=
697ngx_feature_libs=
698ngx_feature_test="char buf[1]; ssize_t n; n = pread(0, buf, 1, 0);
699                  if (n == -1) return 1"
700. auto/feature
701
702
703ngx_feature="pwrite()"
704ngx_feature_name="NGX_HAVE_PWRITE"
705ngx_feature_run=no
706ngx_feature_incs=
707ngx_feature_path=
708ngx_feature_libs=
709ngx_feature_test="char buf[1]; ssize_t n; n = pwrite(1, buf, 1, 0);
710                  if (n == -1) return 1"
711. auto/feature
712
713
714# pwritev() was introduced in FreeBSD 6 and Linux 2.6.30, glibc 2.10
715
716ngx_feature="pwritev()"
717ngx_feature_name="NGX_HAVE_PWRITEV"
718ngx_feature_run=no
719ngx_feature_incs='#include <sys/uio.h>'
720ngx_feature_path=
721ngx_feature_libs=
722ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n;
723                  vec[0].iov_base = buf;
724                  vec[0].iov_len = 1;
725                  n = pwritev(1, vec, 1, 0);
726                  if (n == -1) return 1"
727. auto/feature
728
729
730ngx_feature="sys_nerr"
731ngx_feature_name="NGX_SYS_NERR"
732ngx_feature_run=value
733ngx_feature_incs='#include <errno.h>
734                  #include <stdio.h>'
735ngx_feature_path=
736ngx_feature_libs=
737ngx_feature_test='printf("%d", sys_nerr);'
738. auto/feature
739
740
741if [ $ngx_found = no ]; then
742
743    # Cygiwn defines _sys_nerr
744    ngx_feature="_sys_nerr"
745    ngx_feature_name="NGX_SYS_NERR"
746    ngx_feature_run=value
747    ngx_feature_incs='#include <errno.h>
748                      #include <stdio.h>'
749    ngx_feature_path=
750    ngx_feature_libs=
751    ngx_feature_test='printf("%d", _sys_nerr);'
752    . auto/feature
753fi
754
755
756if [ $ngx_found = no ]; then
757
758    # Solaris has no sys_nerr
759    ngx_feature='maximum errno'
760    ngx_feature_name=NGX_SYS_NERR
761    ngx_feature_run=value
762    ngx_feature_incs='#include <errno.h>
763                      #include <string.h>
764                      #include <stdio.h>'
765    ngx_feature_path=
766    ngx_feature_libs=
767    ngx_feature_test='int  n;
768                      char *p;
769                      for (n = 1; n < 1000; n++) {
770                          errno = 0;
771                          p = strerror(n);
772                          if (errno == EINVAL
773                              || p == NULL
774                              || strncmp(p, "Unknown error", 13) == 0)
775                          {
776                              break;
777                          }
778                      }
779                      printf("%d", n);'
780    . auto/feature
781fi
782
783
784ngx_feature="localtime_r()"
785ngx_feature_name="NGX_HAVE_LOCALTIME_R"
786ngx_feature_run=no
787ngx_feature_incs="#include <time.h>"
788ngx_feature_path=
789ngx_feature_libs=
790ngx_feature_test="struct tm t; time_t c=0; localtime_r(&c, &t)"
791. auto/feature
792
793
794ngx_feature="clock_gettime(CLOCK_MONOTONIC)"
795ngx_feature_name="NGX_HAVE_CLOCK_MONOTONIC"
796ngx_feature_run=no
797ngx_feature_incs="#include <time.h>"
798ngx_feature_path=
799ngx_feature_libs=
800ngx_feature_test="struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts)"
801. auto/feature
802
803
804if [ $ngx_found = no ]; then
805
806    # Linux before glibc 2.17, notably CentOS 6
807
808    ngx_feature="clock_gettime(CLOCK_MONOTONIC) in librt"
809    ngx_feature_libs="-lrt"
810    . auto/feature
811
812    if [ $ngx_found = yes ]; then
813        CORE_LIBS="$CORE_LIBS -lrt"
814    fi
815fi
816
817
818ngx_feature="posix_memalign()"
819ngx_feature_name="NGX_HAVE_POSIX_MEMALIGN"
820ngx_feature_run=no
821ngx_feature_incs="#include <stdlib.h>"
822ngx_feature_path=
823ngx_feature_libs=
824ngx_feature_test="void *p; int n; n = posix_memalign(&p, 4096, 4096);
825                  if (n != 0) return 1"
826. auto/feature
827
828
829ngx_feature="memalign()"
830ngx_feature_name="NGX_HAVE_MEMALIGN"
831ngx_feature_run=no
832ngx_feature_incs="#include <stdlib.h>
833                  #include <malloc.h>"
834ngx_feature_path=
835ngx_feature_libs=
836ngx_feature_test="void *p; p = memalign(4096, 4096);
837                  if (p == NULL) return 1"
838. auto/feature
839
840
841ngx_feature="mmap(MAP_ANON|MAP_SHARED)"
842ngx_feature_name="NGX_HAVE_MAP_ANON"
843ngx_feature_run=yes
844ngx_feature_incs="#include <sys/mman.h>"
845ngx_feature_path=
846ngx_feature_libs=
847ngx_feature_test="void *p;
848                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
849                           MAP_ANON|MAP_SHARED, -1, 0);
850                  if (p == MAP_FAILED) return 1;"
851. auto/feature
852
853
854ngx_feature='mmap("/dev/zero", MAP_SHARED)'
855ngx_feature_name="NGX_HAVE_MAP_DEVZERO"
856ngx_feature_run=yes
857ngx_feature_incs="#include <sys/mman.h>
858                  #include <sys/stat.h>
859                  #include <fcntl.h>"
860ngx_feature_path=
861ngx_feature_libs=
862ngx_feature_test='void *p; int  fd;
863                  fd = open("/dev/zero", O_RDWR);
864                  p = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
865                  if (p == MAP_FAILED) return 1;'
866. auto/feature
867
868
869ngx_feature="System V shared memory"
870ngx_feature_name="NGX_HAVE_SYSVSHM"
871ngx_feature_run=yes
872ngx_feature_incs="#include <sys/ipc.h>
873                  #include <sys/shm.h>"
874ngx_feature_path=
875ngx_feature_libs=
876ngx_feature_test="int  id;
877                  id = shmget(IPC_PRIVATE, 4096, (SHM_R|SHM_W|IPC_CREAT));
878                  if (id == -1) return 1;
879                  shmctl(id, IPC_RMID, NULL);"
880. auto/feature
881
882
883ngx_feature="POSIX semaphores"
884ngx_feature_name="NGX_HAVE_POSIX_SEM"
885ngx_feature_run=yes
886ngx_feature_incs="#include <semaphore.h>"
887ngx_feature_path=
888ngx_feature_libs=
889ngx_feature_test="sem_t  sem;
890                  if (sem_init(&sem, 1, 0) == -1) return 1;
891                  sem_destroy(&sem);"
892. auto/feature
893
894
895if [ $ngx_found = no ]; then
896
897    # Linux has POSIX semaphores in libpthread
898    ngx_feature="POSIX semaphores in libpthread"
899    ngx_feature_libs=-lpthread
900    . auto/feature
901
902    if [ $ngx_found = yes ]; then
903        CORE_LIBS="$CORE_LIBS -lpthread"
904        NGX_LIBPTHREAD="-lpthread"
905    fi
906fi
907
908
909if [ $ngx_found = no ]; then
910
911    # Solaris has POSIX semaphores in librt
912    ngx_feature="POSIX semaphores in librt"
913    ngx_feature_libs=-lrt
914    . auto/feature
915
916    if [ $ngx_found = yes ]; then
917        CORE_LIBS="$CORE_LIBS -lrt"
918    fi
919fi
920
921
922ngx_feature="struct msghdr.msg_control"
923ngx_feature_name="NGX_HAVE_MSGHDR_MSG_CONTROL"
924ngx_feature_run=no
925ngx_feature_incs="#include <sys/socket.h>
926                  #include <stdio.h>"
927ngx_feature_path=
928ngx_feature_libs=
929ngx_feature_test="struct msghdr  msg;
930                  printf(\"%d\", (int) sizeof(msg.msg_control))"
931. auto/feature
932
933
934ngx_feature="ioctl(FIONBIO)"
935ngx_feature_name="NGX_HAVE_FIONBIO"
936ngx_feature_run=no
937ngx_feature_incs="#include <sys/ioctl.h>
938                  #include <stdio.h>
939                  $NGX_INCLUDE_SYS_FILIO_H"
940ngx_feature_path=
941ngx_feature_libs=
942ngx_feature_test="int i = FIONBIO; printf(\"%d\", i)"
943. auto/feature
944
945
946ngx_feature="struct tm.tm_gmtoff"
947ngx_feature_name="NGX_HAVE_GMTOFF"
948ngx_feature_run=no
949ngx_feature_incs="#include <time.h>
950                  #include <stdio.h>"
951ngx_feature_path=
952ngx_feature_libs=
953ngx_feature_test="struct tm  tm; tm.tm_gmtoff = 0;
954                  printf(\"%d\", (int) tm.tm_gmtoff)"
955. auto/feature
956
957
958ngx_feature="struct dirent.d_namlen"
959ngx_feature_name="NGX_HAVE_D_NAMLEN"
960ngx_feature_run=no
961ngx_feature_incs="#include <dirent.h>
962                  #include <stdio.h>"
963ngx_feature_path=
964ngx_feature_libs=
965ngx_feature_test="struct dirent  dir; dir.d_namlen = 0;
966                  printf(\"%d\", (int) dir.d_namlen)"
967. auto/feature
968
969
970ngx_feature="struct dirent.d_type"
971ngx_feature_name="NGX_HAVE_D_TYPE"
972ngx_feature_run=no
973ngx_feature_incs="#include <dirent.h>
974                  #include <stdio.h>"
975ngx_feature_path=
976ngx_feature_libs=
977ngx_feature_test="struct dirent  dir; dir.d_type = DT_REG;
978                  printf(\"%d\", (int) dir.d_type)"
979. auto/feature
980
981
982ngx_feature="sysconf(_SC_NPROCESSORS_ONLN)"
983ngx_feature_name="NGX_HAVE_SC_NPROCESSORS_ONLN"
984ngx_feature_run=no
985ngx_feature_incs=
986ngx_feature_path=
987ngx_feature_libs=
988ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)"
989. auto/feature
990
991
992ngx_feature="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)"
993ngx_feature_name="NGX_HAVE_LEVEL1_DCACHE_LINESIZE"
994ngx_feature_run=no
995ngx_feature_incs=
996ngx_feature_path=
997ngx_feature_libs=
998ngx_feature_test="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)"
999. auto/feature
1000
1001
1002ngx_feature="openat(), fstatat()"
1003ngx_feature_name="NGX_HAVE_OPENAT"
1004ngx_feature_run=no
1005ngx_feature_incs="#include <sys/types.h>
1006                  #include <sys/stat.h>
1007                  #include <fcntl.h>"
1008ngx_feature_path=
1009ngx_feature_libs=
1010ngx_feature_test="struct stat sb;
1011                  openat(AT_FDCWD, \".\", O_RDONLY|O_NOFOLLOW);
1012                  fstatat(AT_FDCWD, \".\", &sb, AT_SYMLINK_NOFOLLOW);"
1013. auto/feature
1014
1015
1016ngx_feature="getaddrinfo()"
1017ngx_feature_name="NGX_HAVE_GETADDRINFO"
1018ngx_feature_run=no
1019ngx_feature_incs="#include <sys/types.h>
1020                  #include <sys/socket.h>
1021                  #include <netdb.h>"
1022ngx_feature_path=
1023ngx_feature_libs=
1024ngx_feature_test='struct addrinfo *res;
1025                  if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1;
1026                  freeaddrinfo(res)'
1027. auto/feature
1028