1 ## Copyright (C) 1996-2021 The Squid Software Foundation and contributors
3 ## Squid software is distributed under GPLv2+ license and includes
4 ## contributions from numerous individuals and organizations.
5 ## Please see the COPYING and CONTRIBUTORS files for details.
8 dnl check that strnstr() works fine. On Macos X it can cause a buffer overrun
9 dnl sets squid_cv_func_strnstr to "yes" or "no", and defines HAVE_STRNSTR
10 AC_DEFUN([SQUID_CHECK_FUNC_STRNSTR],[
12 # Yay! This one is a MacOSX brokenness. Its not good enough
13 # to know that strnstr() exists, because MacOSX 10.4 have a bad
14 # copy that crashes with a buffer over-run!
15 AH_TEMPLATE(HAVE_STRNSTR,[MacOS brokenness: strnstr() can overrun on that system])
16 AC_CACHE_CHECK([if strnstr is well implemented], squid_cv_func_strnstr,
17 AC_RUN_IFELSE([AC_LANG_SOURCE([[
21 // we expect this to succeed, or crash on over-run.
22 // if it passes otherwise we may need a better check.
23 int main(int argc, char **argv)
26 char *str = malloc(size);
27 memset(str, 'x', size);
28 strnstr(str, "fubar", size);
31 ]])],[squid_cv_func_strnstr="yes"],[squid_cv_func_strnstr="no"],[:])
33 if test "$squid_cv_func_strnstr" = "yes" ; then
34 AC_DEFINE(HAVE_STRNSTR,1)
37 ]) dnl SQUID_CHECK_FUNC_STRNSTR
39 dnl check that epoll actually works
40 dnl sets squid_cv_epoll_works to "yes" or "no"
41 AC_DEFUN([SQUID_CHECK_EPOLL],[
43 AC_CACHE_CHECK(if epoll works, squid_cv_epoll_works,
44 AC_RUN_IFELSE([AC_LANG_SOURCE([[
45 #include <sys/epoll.h>
48 int main(int argc, char **argv)
50 int fd = epoll_create(256);
52 perror("epoll_create:");
57 ]])],[squid_cv_epoll_works=yes],[squid_cv_epoll_works=no],[:]))
59 ]) dnl SQUID_CHECK_EPOLL
61 dnl check that /dev/poll actually works
62 dnl sets squid_cv_devpoll_works to "yes" or "no"
63 AC_DEFUN([SQUID_CHECK_DEVPOLL],[
65 AC_CACHE_CHECK(if /dev/poll works, squid_cv_devpoll_works,
66 AC_RUN_IFELSE([AC_LANG_SOURCE([[
67 #include <sys/devpoll.h>
71 int main(int argc, char **argv)
73 int fd = open("/dev/poll", O_RDWR);
75 perror("devpoll_create:");
80 ]])],[squid_cv_devpoll_works=yes],[squid_cv_devpoll_works=no],[:]))
82 ]) dnl SQUID_CHECK_DEVPOLL
85 dnl check that we have functional libcap2 headers
86 dnl sets squid_cv_sys_capability_works to "yes" or "no"
88 AC_DEFUN([SQUID_CHECK_FUNCTIONAL_LIBCAP2],[
89 AC_CACHE_CHECK([for operational libcap2 headers],
90 squid_cv_sys_capability_works,
91 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
94 #include <sys/capability.h>
99 [squid_cv_sys_capability_works=yes],
100 [squid_cv_sys_capability_works=no])
105 dnl From Samba. Thanks!
106 dnl check that we have Unix sockets. Sets squid_cv_unixsocket to either yes or no depending on the check
108 AC_DEFUN([SQUID_CHECK_UNIX_SOCKET],[
109 AC_CACHE_CHECK([for unix domain sockets],squid_cv_unixsocket, [
110 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
111 #include <sys/types.h>
114 #include <sys/socket.h>
115 #include <sys/un.h>]], [[
116 struct sockaddr_un sunaddr;
117 sunaddr.sun_family = AF_UNIX;
118 ]])],[squid_cv_unixsocket=yes],[squid_cv_unixsocket=no])])
122 dnl check the default FD_SETSIZE size.
123 dnl not cached, people are likely to tune this
124 dnl defines DEFAULT_FD_SETSIZE
126 AC_DEFUN([SQUID_CHECK_DEFAULT_FD_SETSIZE],[
127 AC_MSG_CHECKING(Default FD_SETSIZE value)
128 AC_RUN_IFELSE([AC_LANG_SOURCE([[
139 #include <sys/time.h>
141 #if HAVE_SYS_SELECT_H
142 #include <sys/select.h>
145 #include <sys/types.h>
148 #include <winsock2.h>
152 int main(int argc, char **argv) {
153 FILE *fp = fopen("conftestval", "w");
154 fprintf (fp, "%d\n", FD_SETSIZE);
157 ]])],[DEFAULT_FD_SETSIZE=`cat conftestval`],[DEFAULT_FD_SETSIZE=256],[DEFAULT_FD_SETSIZE=256])
158 AC_MSG_RESULT($DEFAULT_FD_SETSIZE)
159 AC_DEFINE_UNQUOTED(DEFAULT_FD_SETSIZE, $DEFAULT_FD_SETSIZE, [Default FD_SETSIZE value])
163 dnl checks the maximum number of filedescriptor we can open
164 dnl sets shell var squid_filedescriptors_num
166 AC_DEFUN([SQUID_CHECK_MAXFD],[
167 AC_CHECK_FUNCS(getrlimit setrlimit)
168 AC_MSG_CHECKING(Maximum number of filedescriptors we can open)
169 SQUID_STATE_SAVE(maxfd)
170 dnl FreeBSD pthreads break dup2().
171 AS_CASE([$host_os],[freebsd],[ LDFLAGS=`echo $LDFLAGS | sed -e "s/-pthread//"` ])
172 AC_RUN_IFELSE([AC_LANG_SOURCE([[
176 #include <sys/time.h> /* needed on FreeBSD */
177 #include <sys/param.h>
178 #include <sys/resource.h>
179 int main(int argc, char **argv) {
182 #if defined(__CYGWIN32__) || defined (__CYGWIN__)
183 /* getrlimit and sysconf returns bogous values on cygwin32.
184 * Number of fds is virtually unlimited in cygwin (sys/param.h)
185 * __CYGWIN32__ is deprecated.
189 #if HAVE_GETRLIMIT && HAVE_SETRLIMIT
191 #if defined(RLIMIT_NOFILE)
192 if (getrlimit(RLIMIT_NOFILE, &rl) < 0) {
193 perror("getrlimit: RLIMIT_NOFILE");
195 #if defined(__APPLE__)
196 /* asking for more than OPEN_MAX fails on Leopard */
197 rl.rlim_cur = (OPEN_MAX < rl.rlim_max ? OPEN_MAX : rl.rlim_max);
199 rl.rlim_cur = rl.rlim_max; /* set it to the max */
201 if (setrlimit(RLIMIT_NOFILE, &rl) < 0) {
202 perror("setrlimit: RLIMIT_NOFILE");
205 #elif defined(RLIMIT_OFILE)
206 if (getrlimit(RLIMIT_OFILE, &rl) < 0) {
207 perror("getrlimit: RLIMIT_OFILE");
209 rl.rlim_cur = rl.rlim_max; /* set it to the max */
210 if (setrlimit(RLIMIT_OFILE, &rl) < 0) {
211 perror("setrlimit: RLIMIT_OFILE");
214 #endif /* RLIMIT_NOFILE */
215 #endif /* HAVE_SETRLIMIT */
216 /* by starting at 2^14, we will never get higher
217 than 2^15 for squid_filedescriptors_num */
221 if (dup2(0, i) < 0) {
229 #endif /* IF !DEF CYGWIN */
230 fp = fopen("conftestval", "w");
231 fprintf (fp, "%d\n", i & ~0x3F);
234 ]])],[squid_filedescriptors_limit=`cat conftestval`],[],[:])
235 dnl Microsoft MSVCRT.DLL supports 2048 maximum FDs
236 AS_CASE(["$host_os"],[mingw|mingw32],[squid_filedescriptors_limit="2048"])
237 AC_MSG_RESULT($squid_filedescriptors_limit)
238 AS_IF([ test "x$squid_filedescriptors_num" = "x" ],[
239 AS_IF([ test "x$squid_filedescriptors_limit" != "x" ],[
240 squid_filedescriptors_num=$squid_filedescriptors_limit
242 AC_MSG_NOTICE([Unable to detect filedescriptor limits. Assuming 256 is okay.])
243 squid_filedescriptors_num=256
246 SQUID_STATE_ROLLBACK(maxfd)
248 AC_MSG_NOTICE([Default number of filedescriptors: $squid_filedescriptors_num])
250 AS_IF([ test `expr $squid_filedescriptors_num % 64` != 0 ],[
251 AC_MSG_WARN([$squid_filedescriptors_num is not an multiple of 64. This may cause issues on certain platforms.])
254 AS_IF([ test "$squid_filedescriptors_num" -lt 512 ],[
255 AC_MSG_WARN([$squid_filedescriptors_num may not be enough filedescriptors if your])
256 AC_MSG_WARN([cache will be very busy. Please see the FAQ page])
257 AC_MSG_WARN([http://wiki.squid-cache.org/SquidFaq/TroubleShooting])
258 AC_MSG_WARN([on how to increase your filedescriptor limit])
260 AC_DEFINE_UNQUOTED(SQUID_MAXFD,$squid_filedescriptors_num,[Maximum number of open filedescriptors])
264 dnl Check whether this OS defines sin6_len as a member of sockaddr_in6 as a backup to ss_len
265 dnl defines HAVE_SIN6_LEN_IN_SAI
266 dnl TODO: move to AC_CHECK_MEMBER?
268 AC_DEFUN([SQUID_CHECK_SIN6_LEN_IN_SAI],[
269 AC_CACHE_CHECK([for sin6_len field in struct sockaddr_in6],
270 ac_cv_have_sin6_len_in_struct_sai, [
271 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
272 #include <sys/types.h>
273 #include <sys/socket.h>
274 #include <netinet/in.h>
275 ]], [[ struct sockaddr_in6 s; s.sin6_len = 1; ]])],[ ac_cv_have_sin6_len_in_struct_sai="yes" ],[ ac_cv_have_sin6_len_in_struct_sai="no"
278 SQUID_DEFINE_BOOL(HAVE_SIN6_LEN_IN_SAI,$ac_cv_have_sin6_len_in_struct_sai,
279 [Defined if struct sockaddr_in6 has sin6_len])
283 dnl Check whether this OS defines ss_len as a member of sockaddr_storage
284 dnl defines HAVE_SS_LEN_IN_SS
285 dnl TODO: move to AC_CHECK_MEMBER?
287 AC_DEFUN([SQUID_CHECK_SS_LEN_IN_SOCKADDR_STORAGE],[
288 AC_CACHE_CHECK([for ss_len field in struct sockaddr_storage],
289 ac_cv_have_ss_len_in_struct_ss, [
290 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
291 #include <sys/types.h>
292 #include <sys/socket.h>
293 #include <netinet/in.h>
294 ]], [[ struct sockaddr_storage s; s.ss_len = 1; ]])],[ ac_cv_have_ss_len_in_struct_ss="yes" ],[ ac_cv_have_ss_len_in_struct_ss="no"
297 SQUID_DEFINE_BOOL(HAVE_SS_LEN_IN_SS,$ac_cv_have_ss_len_in_struct_ss,
298 [Define if sockaddr_storage has field ss_len])
302 dnl Check whether this OS defines sin_len as a member of sockaddr_in as a backup to ss_len
303 dnl defines HAVE_SIN_LEN_IN_SAI
304 dnl TODO: move to AC_CHECK_MEMBER?
306 AC_DEFUN([SQUID_CHECK_SIN_LEN_IN_SOCKADDR_IN],[
307 AC_CACHE_CHECK([for sin_len field in struct sockaddr_in],
308 ac_cv_have_sin_len_in_struct_sai, [
309 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
310 #include <sys/types.h>
311 #include <sys/socket.h>
312 #include <netinet/in.h>
313 ]], [[ struct sockaddr_in s; s.sin_len = 1; ]])],[ ac_cv_have_sin_len_in_struct_sai="yes" ],[ ac_cv_have_sin_len_in_struct_sai="no"
316 SQUID_DEFINE_BOOL(HAVE_SIN_LEN_IN_SAI,$ac_cv_have_sin_len_in_struct_sai,[Define if sockaddr_in has field sin_len])
320 dnl detects default UDP buffer size
321 dnl not cached since people are likely to tune this
322 dnl defines SQUID_DETECT_UDP_SO_SNDBUF
324 AC_DEFUN([SQUID_DETECT_UDP_SND_BUFSIZE],[
325 AC_MSG_CHECKING(Default UDP send buffer size)
326 AC_RUN_IFELSE([AC_LANG_SOURCE([[
329 #include <sys/types.h>
330 #if HAVE_SYS_SOCKET_H
331 #include <sys/socket.h>
333 #if HAVE_NETINET_IN_H
334 #include <netinet/in.h>
337 #include <winsock2.h>
341 int main(int argc, char **argv)
345 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
348 WSAStartup(2, &wsaData);
350 socklen_t len=sizeof(socklen_t);
352 if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 1;
353 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
354 if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)&val, &len) < 0) return 1;
357 if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) return 1;
359 if (val<=0) return 1;
360 fp = fopen("conftestval", "w");
361 fprintf (fp, "%d\n", val);
364 ]])],[SQUID_DETECT_UDP_SO_SNDBUF=`cat conftestval`],[SQUID_DETECT_UDP_SO_SNDBUF=16384],[SQUID_DETECT_UDP_SO_SNDBUF=16384])
365 AC_MSG_RESULT($SQUID_DETECT_UDP_SO_SNDBUF)
366 AC_DEFINE_UNQUOTED(SQUID_DETECT_UDP_SO_SNDBUF, $SQUID_DETECT_UDP_SO_SNDBUF,[UDP send buffer size])
370 dnl detects default UDP buffer size
371 dnl not cached since people are likely to tune this
372 dnl defines SQUID_DETECT_UDP_SO_RCVBUF
374 AC_DEFUN([SQUID_DETECT_UDP_RECV_BUFSIZE],[
375 AC_MSG_CHECKING(Default UDP receive buffer size)
376 AC_RUN_IFELSE([AC_LANG_SOURCE([[
379 #include <sys/types.h>
380 #if HAVE_SYS_SOCKET_H
381 #include <sys/socket.h>
383 #if HAVE_NETINET_IN_H
384 #include <netinet/in.h>
387 #include <winsock2.h>
391 int main(int argc, char **argv)
395 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
398 WSAStartup(2, &wsaData);
400 socklen_t len=sizeof(socklen_t);
402 if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 1;
403 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
404 if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&val, &len) < 0) return 1;
407 if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &len) < 0) return 1;
409 if (val <= 0) return 1;
410 fp = fopen("conftestval", "w");
411 fprintf (fp, "%d\n", val);
414 ]])],[SQUID_DETECT_UDP_SO_RCVBUF=`cat conftestval`],[SQUID_DETECT_UDP_SO_RCVBUF=16384],[SQUID_DETECT_UDP_SO_RCVBUF=16384])
415 AC_MSG_RESULT($SQUID_DETECT_UDP_SO_RCVBUF)
416 AC_DEFINE_UNQUOTED(SQUID_DETECT_UDP_SO_RCVBUF, $SQUID_DETECT_UDP_SO_RCVBUF,[UDP receive buffer size])
420 dnl detects default TCP buffer size
421 dnl not cached since people are likely to tune this
422 dnl defines SQUID_TCP_SO_SNDBUF
424 AC_DEFUN([SQUID_DETECT_TCP_SND_BUFSIZE],[
425 AC_MSG_CHECKING(Default TCP send buffer size)
426 AC_RUN_IFELSE([AC_LANG_SOURCE([[
429 #include <sys/types.h>
430 #if HAVE_SYS_SOCKET_H
431 #include <sys/socket.h>
433 #if HAVE_NETINET_IN_H
434 #include <netinet/in.h>
437 #include <winsock2.h>
441 int main(int argc, char **argv)
445 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
448 WSAStartup(2, &wsaData);
450 socklen_t len=sizeof(socklen_t);
452 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) return 1;
453 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
454 if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)&val, &len) < 0) return 1;
457 if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) return 1;
459 if (val <= 0) return 1;
460 fp = fopen("conftestval", "w");
461 fprintf (fp, "%d\n", val);
464 ]])],[SQUID_TCP_SO_SNDBUF=`cat conftestval`],[SQUID_TCP_SO_SNDBUF=16384],[SQUID_TCP_SO_SNDBUF=16384])
465 AC_MSG_RESULT($SQUID_TCP_SO_SNDBUF)
466 if test $SQUID_TCP_SO_SNDBUF -gt 32768; then
467 AC_MSG_NOTICE([Limiting send buffer size to 32K])
468 SQUID_TCP_SO_SNDBUF=32768
470 AC_DEFINE_UNQUOTED(SQUID_TCP_SO_SNDBUF, $SQUID_TCP_SO_SNDBUF,[TCP send buffer size])
474 dnl detects default TCP buffer size
475 dnl not cached since people are likely to tune this
476 dnl defines SQUID_TCP_SO_RECVBUF
478 AC_DEFUN([SQUID_DETECT_TCP_RECV_BUFSIZE],[
479 AC_MSG_CHECKING(Default TCP receive buffer size)
480 AC_RUN_IFELSE([AC_LANG_SOURCE([[
483 #include <sys/types.h>
484 #if HAVE_SYS_SOCKET_H
485 #include <sys/socket.h>
487 #if HAVE_NETINET_IN_H
488 #include <netinet/in.h>
491 #include <winsock2.h>
495 int main(int argc, char **argv)
499 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
502 WSAStartup(2, &wsaData);
504 socklen_t len=sizeof(socklen_t);
506 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) return 1;
507 #if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
508 if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&val, &len) < 0) return 1;
511 if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &len) < 0) return 1;
513 if (val <= 0) return 1;
514 fp = fopen("conftestval", "w");
515 fprintf (fp, "%d\n", val);
518 ]])],[SQUID_TCP_SO_RCVBUF=`cat conftestval`],[SQUID_TCP_SO_RCVBUF=16384],[SQUID_TCP_SO_RCVBUF=16384])
519 AC_MSG_RESULT($SQUID_TCP_SO_RCVBUF)
520 if test $SQUID_TCP_SO_RCVBUF -gt 65535; then
521 AC_MSG_NOTICE([Limiting receive buffer size to 64K])
522 SQUID_TCP_SO_RCVBUF=65535
524 AC_DEFINE_UNQUOTED(SQUID_TCP_SO_RCVBUF, $SQUID_TCP_SO_RCVBUF,[TCP receive buffer size])
528 dnl check if we need to define sys_errlist as external
529 dnl defines NEED_SYS_ERRLIST
531 AC_DEFUN([SQUID_CHECK_NEED_SYS_ERRLIST],[
532 AC_CACHE_CHECK(if sys_errlist is already defined, ac_cv_needs_sys_errlist,
533 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]], [[char *s = sys_errlist;]])],[ac_cv_needs_sys_errlist="no"],[ac_cv_needs_sys_errlist="yes"])
535 SQUID_DEFINE_BOOL(NEED_SYS_ERRLIST,$ac_cv_needs_sys_errlist,[If we need to declare sys_errlist as extern])
539 dnl check if MAXPATHLEN is defined in the system headers
540 dnl or define it ourselves
542 AC_DEFUN([SQUID_CHECK_MAXPATHLEN],[
543 AC_MSG_CHECKING(for system-provided MAXPATHLEN)
546 #include <sys/param.h>]], [[
547 int i = MAXPATHLEN;]])], [
548 AC_MSG_RESULT(yes)], [
550 AC_DEFINE(MAXPATHLEN,256,[If MAXPATHLEN has not been defined])])
554 dnl check that we have a working statvfs
555 dnl sets the ac_cv_func_statvfs shell variable and defines HAVE_STATVFS
557 AC_DEFUN([SQUID_CHECK_WORKING_STATVFS],[
558 AC_CACHE_CHECK(for working statvfs() interface,ac_cv_func_statvfs,[
559 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
562 #include <sys/types.h>
563 #include <sys/statvfs.h>
566 sfs.f_blocks = sfs.f_bfree = sfs.f_frsize =
567 sfs.f_files = sfs.f_ffree = 0;
568 statvfs("/tmp", &sfs);
569 ]])],[ac_cv_func_statvfs=yes],[ac_cv_func_statvfs=no])
571 SQUID_DEFINE_BOOL(HAVE_STATVFS,$ac_cv_func_statvfs,[set to 1 if our system has statvfs(), and if it actually works])
575 dnl Check whether this OS defines f_frsize as a member of struct statfs
576 AC_DEFUN([SQUID_CHECK_F_FRSIZE_IN_STATFS],[
577 AC_CACHE_CHECK([for f_frsize field in struct statfs],
578 ac_cv_have_f_frsize_in_struct_statfs, [
579 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
580 #if HAVE_SYS_STATFS_H
581 #include <sts/statfs.h>
583 #if HAVE_SYS_STATVFS_H
584 #include <sts/statvfs.h>
589 ]], [[ struct statfs s; s.f_frsize = 0; ]])],[ ac_cv_have_f_frsize_in_struct_statfs="yes" ],[ ac_cv_have_f_frsize_in_struct_statfs="no"
592 SQUID_DEFINE_BOOL(HAVE_F_FRSIZE_IN_STATFS,$ac_cv_have_f_frsize_in_struct_statfs,[Define if struct statfs has field f_frsize (Linux 2.6 or later)])
596 dnl check that we can use the libresolv _dns_ttl_ hack
597 dnl sets the ac_cv_libresolv_dns_ttl_hack shell variable and defines LIBRESOLV_DNS_TTL_HACK
599 AC_DEFUN([SQUID_CHECK_LIBRESOLV_DNS_TTL_HACK],[
600 AC_CACHE_CHECK(for libresolv _dns_ttl_ hack, ac_cv_libresolv_dns_ttl_hack, [
601 AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern int _dns_ttl_;]], [[return _dns_ttl_;]])],
602 [ac_cv_libresolv_dns_ttl_hack=yes],[ac_cv_libresolv_dns_ttl_hack=no]) ])
603 SQUID_DEFINE_BOOL(LIBRESOLV_DNS_TTL_HACK,$ac_cv_libresolv_dns_ttl_hack,
604 [libresolv.a has been hacked to export _dns_ttl_])
608 dnl checks for availability of some resolver fields
609 dnl sets ac_cv_have_res_ext_nsaddr_list shell variable
610 dnl defines _SQUID_RES_NSADDR6_COUNT _SQUID_RES_NSADDR6_LARRAY
611 dnl defines _SQUID_RES_NSADDR6_LPTR _SQUID_RES_NSADDR6_COUNT
612 dnl defines _SQUID_RES_NSADDR_LIST _SQUID_RES_NSADDR_COUNT
614 AC_DEFUN([SQUID_CHECK_RESOLVER_FIELDS],[
615 AC_CACHE_CHECK(for _res_ext.nsaddr_list, ac_cv_have_res_ext_nsaddr_list,
616 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
618 #include <sys/types.h>
620 #if HAVE_NETINET_IN_H
621 #include <netinet/in.h>
624 #include <arpa/inet.h>
626 #if HAVE_ARPA_NAMESER_H
627 #include <arpa/nameser.h>
633 [[_res_ext.nsaddr_list[[0]].s_addr;]])],[
634 ac_cv_have_res_ext_nsaddr_list="yes" ],[
635 ac_cv_have_res_ext_nsaddr_list="no"]))
636 if test "$ac_cv_have_res_ext_nsaddr_list" = "yes" ; then
637 AC_DEFINE(_SQUID_RES_NSADDR6_LARRAY,_res_ext.nsaddr_list,[If _res_ext structure has nsaddr_list member])
638 AC_DEFINE(_SQUID_RES_NSADDR6_COUNT,ns6count,[Nameserver Counter for IPv6 _res_ext])
641 if test "$_SQUID_RES_NSADDR6_LIST" = ""; then
642 AC_CACHE_CHECK(for _res._u._ext.nsaddrs, ac_cv_have_res_ext_nsaddrs,
643 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
645 #include <sys/types.h>
647 #if HAVE_NETINET_IN_H
648 #include <netinet/in.h>
651 #include <arpa/inet.h>
653 #if HAVE_ARPA_NAMESER_H
654 #include <arpa/nameser.h>
660 [[_res._u._ext.nsaddrs[[0]]->sin6_addr;]])],
661 [ac_cv_have_res_ext_nsaddrs="yes"],[ac_cv_have_res_ext_nsaddrs="no"]))
662 if test "$ac_cv_have_res_ext_nsaddrs" = "yes" ; then
663 AC_DEFINE(_SQUID_RES_NSADDR6_LPTR,_res._u._ext.nsaddrs,[If _res structure has _ext.nsaddrs member])
664 AC_DEFINE(_SQUID_RES_NSADDR6_COUNT,_res._u._ext.nscount6,[Nameserver Counter for IPv6 _res])
668 AC_CACHE_CHECK(for _res.nsaddr_list, ac_cv_have_res_nsaddr_list,
672 #include <sys/types.h>
674 #if HAVE_NETINET_IN_H
675 #include <netinet/in.h>
678 #include <arpa/inet.h>
680 #if HAVE_ARPA_NAMESER_H
681 #include <arpa/nameser.h>
686 ]], [[_res.nsaddr_list[[0]];]])],
687 [ac_cv_have_res_nsaddr_list="yes"],[ac_cv_have_res_nsaddr_list="no"]))
688 if test $ac_cv_have_res_nsaddr_list = "yes" ; then
689 AC_DEFINE(_SQUID_RES_NSADDR_LIST,_res.nsaddr_list,[If _res structure has nsaddr_list member])
690 AC_DEFINE(_SQUID_RES_NSADDR_COUNT,_res.nscount,[Nameserver counter for IPv4 _res])
693 if test "$_SQUID_RES_NSADDR_LIST" = ""; then
694 AC_CACHE_CHECK(for _res.ns_list, ac_cv_have_res_ns_list,
695 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
697 #include <sys/types.h>
699 #if HAVE_NETINET_IN_H
700 #include <netinet/in.h>
703 #include <arpa/inet.h>
705 #if HAVE_ARPA_NAMESER_H
706 #include <arpa/nameser.h>
712 [[_res.ns_list[[0]].addr;]])],
713 [ac_cv_have_res_ns_list="yes"],[ac_cv_have_res_ns_list="no"]))
714 if test $ac_cv_have_res_ns_list = "yes" ; then
715 AC_DEFINE(_SQUID_RES_NSADDR_LIST,_res.ns_list,[If _res structure has ns_list member])
716 AC_DEFINE(_SQUID_RES_NSADDR_COUNT,_res.nscount,[Nameserver counter for IPv4 _res])
722 dnl checks the winsock library to use (ws2_32 or wsock32)
723 dnl may set ac_cv_func_select as a side effect
724 AC_DEFUN([SQUID_CHECK_WINSOCK_LIB],[
725 AC_CHECK_HEADERS(winsock2.h winsock.h)
726 SQUID_STATE_SAVE(winsock)
727 SQUID_SEARCH_LIBS([squid_getprotobynumber],[ws2_32 wsock32],,,,[
729 #include <winsock2.h>
734 void squid_getprotobynumber(void) {
738 AC_MSG_CHECKING([for winsock library])
739 case "$ac_cv_search_squid_getprotobynumber" in
741 AC_MSG_RESULT([winsock library not found])
744 AC_MSG_RESULT([winsock library already in LIBS])
747 AC_MSG_RESULT([winsock2])
748 XTRA_LIBS="-lws2_32 $XTRA_LIBS"
749 ac_cv_func_select='yes'
752 AC_MSG_RESULT([winsock])
753 XTRA_LIBS="-lwsock32 $XTRA_LIBS"
754 ac_cv_func_select='yes'
757 SQUID_STATE_ROLLBACK(winsock)
760 dnl check that setresuid is properly implemented.
761 dnl sets squid_cv_resuid_works to "yes" or "no"
762 AC_DEFUN([SQUID_CHECK_SETRESUID_WORKS],[
763 AC_CACHE_CHECK(if setresuid is actually implemented, squid_cv_resuid_works,
775 int main(int argc, char **argv) {
776 if(setresuid(-1,-1,-1)) {
777 perror("setresuid:");
783 squid_cv_resuid_works="yes" ],[
784 squid_cv_resuid_works="no" ],[:])
788 dnl check that we have functional CPU clock access for the profiler
789 dnl sets squid_cv_profiler_works to "yes" or "no"
791 AC_DEFUN([SQUID_CHECK_FUNCTIONAL_CPU_PROFILER],[
792 AC_CACHE_CHECK([for operational CPU clock access],
793 squid_cv_cpu_profiler_works,
794 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
796 #if defined(__GNUC__) && ( defined(__i386) || defined(__i386__) )
798 #elif defined(__GNUC__) && ( defined(__x86_64) || defined(__x86_64__) )
800 #elif defined(__GNUC__) && defined(__alpha)
802 #elif defined(_M_IX86) && defined(_MSC_VER) /* x86 platform on Microsoft C Compiler ONLY */
804 #elif defined(HAVE_CLOCK_GETTIME_NSEC_NP) && defined(CLOCK_MONOTONIC_RAW)
807 #error This CPU is unsupported. No profiling available here.
810 squid_cv_cpu_profiler_works=yes],[
811 squid_cv_cpu_profiler_works=no])
815 dnl check whether recv takes a char* or void* as a second argument
816 AC_DEFUN([SQUID_CHECK_RECV_ARG_TYPE],[
817 AC_CACHE_CHECK([whether recv takes a pointer to void or char as second argument],
818 squid_cv_recv_second_arg_type, [
819 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
820 #include <sys/types.h>
821 #if HAVE_SYS_SOCKET_H
822 #include <sys/socket.h>
825 #include <winsock2.h>
829 int main (int argc, char ** argv) {
833 ]])],[squid_cv_recv_second_arg_type=void],
834 [squid_cv_recv_second_arg_type=char])
835 AC_MSG_RESULT($squid_cv_recv_second_arg_type*)
837 AC_DEFINE_UNQUOTED(RECV_ARG_TYPE,$squid_cv_recv_second_arg_type,
838 [Base type of the second argument to recv(2)])
842 dnl check whether Solaris has broken IPFilter headers (Solaris 10 at least does)
843 AC_DEFUN([SQUID_CHECK_BROKEN_SOLARIS_IPFILTER],[
844 if test "x$squid_cv_broken_ipfilter_minor_t" = "x"; then
845 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
846 # include <sys/types.h>
847 # include <sys/time.h>
848 # include <sys/ioccom.h>
849 # include <netinet/in.h>
851 # include <netinet/ip_compat.h>
852 # include <netinet/ip_fil.h>
853 # include <netinet/ip_nat.h>
856 squid_cv_broken_ipfilter_minor_t=0
858 ## on fail, test the hack
859 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
860 #define minor_t fubaar
861 # include <sys/types.h>
862 # include <sys/time.h>
863 # include <sys/ioccom.h>
864 # include <netinet/in.h>
866 # include <netinet/ip_compat.h>
867 # include <netinet/ip_fil.h>
868 # include <netinet/ip_nat.h>
871 squid_cv_broken_ipfilter_minor_t=1
873 AC_MSG_ERROR(unable to make IPFilter work with netinet/ headers)
878 AC_DEFINE_UNQUOTED(USE_SOLARIS_IPFILTER_MINOR_T_HACK,$squid_cv_broken_ipfilter_minor_t,
879 [Workaround IPFilter minor_t breakage])
881 ## check for IPFilter headers that require this hack
882 ## (but first netinet/in.h and sys/ioccom.h which they depend on)
890 netinet/ip_compat.h \
891 netinet/ip_fil_compat.h \
895 #if USE_SOLARIS_IPFILTER_MINOR_T_HACK
896 #define minor_t fubar
899 #include <sys/types.h>
902 #include <sys/time.h>
904 #if HAVE_NETINET_IN_H
905 #include <netinet/in.h>
907 #if HAVE_SYS_IOCCOM_H
908 #include <sys/ioccom.h>
910 #if USE_SOLARIS_IPFILTER_MINOR_T_HACK
914 #include <ip_compat.h>
915 #elif HAVE_NETINET_IP_COMPAT_H
916 #include <netinet/ip_compat.h>
920 #elif HAVE_NETINET_IP_FIL_H
921 #include <netinet/ip_fil.h>
923 #if !defined(IPFILTER_VERSION)
924 #define IPFILTER_VERSION 5000004
928 ## Solaris 10+ backported IPv6 NAT to their IPFilter v4.1 instead of using v5
930 struct natlookup.nl_inipaddr.in6,
931 struct natlookup.nl_realipaddr.in6],,,[
932 #if USE_SOLARIS_IPFILTER_MINOR_T_HACK
933 #define minor_t fubar
936 #include <sys/param.h>
939 #include <sys/types.h>
942 #include <sys/time.h>
944 #if HAVE_NETINET_IN_H
945 #include <netinet/in.h>
947 #if HAVE_SYS_IOCCOM_H
948 #include <sys/ioccom.h>
950 #if USE_SOLARIS_IPFILTER_MINOR_T_HACK
954 #include <ip_compat.h>
955 #elif HAVE_NETINET_IP_COMPAT_H
956 #include <netinet/ip_compat.h>
960 #elif HAVE_NETINET_IP_FIL_H
961 #include <netinet/ip_fil.h>
965 #elif HAVE_NETINET_IP_NAT_H
966 #include <netinet/ip_nat.h>