1## Copyright (C) 1996-2021 The Squid Software Foundation and contributors
2##
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.
6##
7
8dnl check that strnstr() works fine. On Macos X it can cause a buffer overrun
9dnl sets squid_cv_func_strnstr to "yes" or "no", and defines HAVE_STRNSTR
10AC_DEFUN([SQUID_CHECK_FUNC_STRNSTR],[
11
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!
15AH_TEMPLATE(HAVE_STRNSTR,[MacOS brokenness: strnstr() can overrun on that system])
16AC_CACHE_CHECK([if strnstr is well implemented], squid_cv_func_strnstr,
17  AC_RUN_IFELSE([AC_LANG_SOURCE([[
18#include <stdlib.h>
19#include <stdio.h>
20#include <string.h>
21    // we expect this to succeed, or crash on over-run.
22    // if it passes otherwise we may need a better check.
23int main(int argc, char **argv)
24{
25    int size = 20;
26    char *str = malloc(size);
27    memset(str, 'x', size);
28    strnstr(str, "fubar", size);
29    return 0;
30}
31  ]])],[squid_cv_func_strnstr="yes"],[squid_cv_func_strnstr="no"],[:])
32)
33if test "$squid_cv_func_strnstr" = "yes" ; then
34  AC_DEFINE(HAVE_STRNSTR,1)
35fi
36
37]) dnl SQUID_CHECK_FUNC_STRNSTR
38
39dnl check that epoll actually works
40dnl sets squid_cv_epoll_works to "yes" or "no"
41AC_DEFUN([SQUID_CHECK_EPOLL],[
42
43    AC_CACHE_CHECK(if epoll works, squid_cv_epoll_works,
44      AC_RUN_IFELSE([AC_LANG_SOURCE([[
45#include <sys/epoll.h>
46#include <stdlib.h>
47#include <stdio.h>
48int main(int argc, char **argv)
49{
50    int fd = epoll_create(256);
51    if (fd < 0) {
52	perror("epoll_create:");
53	return 1;
54    }
55    return 0;
56}
57      ]])],[squid_cv_epoll_works=yes],[squid_cv_epoll_works=no],[:]))
58
59]) dnl SQUID_CHECK_EPOLL
60
61dnl check that /dev/poll actually works
62dnl sets squid_cv_devpoll_works to "yes" or "no"
63AC_DEFUN([SQUID_CHECK_DEVPOLL],[
64
65    AC_CACHE_CHECK(if /dev/poll works, squid_cv_devpoll_works,
66      AC_RUN_IFELSE([AC_LANG_SOURCE([[
67#include <sys/devpoll.h>
68#include <fcntl.h>
69#include <stdlib.h>
70#include <stdio.h>
71int main(int argc, char **argv)
72{
73    int fd = open("/dev/poll", O_RDWR);
74    if (fd < 0) {
75       perror("devpoll_create:");
76       return 1;
77    }
78    return 0;
79}
80      ]])],[squid_cv_devpoll_works=yes],[squid_cv_devpoll_works=no],[:]))
81
82]) dnl SQUID_CHECK_DEVPOLL
83
84
85dnl check that we have functional libcap2 headers
86dnl sets squid_cv_sys_capability_works to "yes" or "no"
87
88AC_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([[
92#include <stdlib.h>
93#include <stddef.h>
94#include <sys/capability.h>
95]], [[
96    capget(NULL, NULL);
97    capset(NULL, NULL);
98]])],
99   [squid_cv_sys_capability_works=yes],
100   [squid_cv_sys_capability_works=no])
101  )
102])
103
104
105dnl From Samba. Thanks!
106dnl check that we have Unix sockets. Sets squid_cv_unixsocket to either yes or no depending on the check
107
108AC_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>
112#include <stdlib.h>
113#include <stddef.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])])
119])
120
121
122dnl check the default FD_SETSIZE size.
123dnl not cached, people are likely to tune this
124dnl defines DEFAULT_FD_SETSIZE
125
126AC_DEFUN([SQUID_CHECK_DEFAULT_FD_SETSIZE],[
127AC_MSG_CHECKING(Default FD_SETSIZE value)
128AC_RUN_IFELSE([AC_LANG_SOURCE([[
129#if HAVE_STDIO_H
130#include <stdio.h>
131#endif
132#if HAVE_UNISTD_H
133#include <unistd.h>
134#endif
135#if HAVE_STDLIB_H
136#include <stdlib.h>
137#endif
138#if HAVE_SYS_TIME_H
139#include <sys/time.h>
140#endif
141#if HAVE_SYS_SELECT_H
142#include <sys/select.h>
143#endif
144#if HAVE_SYS_TYPES_H
145#include <sys/types.h>
146#endif
147#if HAVE_WINSOCK2_H
148#include <winsock2.h>
149#elif HAVE_WINSOCK_H
150#include <winsock.h>
151#endif
152int main(int argc, char **argv) {
153	FILE *fp = fopen("conftestval", "w");
154	fprintf (fp, "%d\n", FD_SETSIZE);
155	return 0;
156}
157]])],[DEFAULT_FD_SETSIZE=`cat conftestval`],[DEFAULT_FD_SETSIZE=256],[DEFAULT_FD_SETSIZE=256])
158AC_MSG_RESULT($DEFAULT_FD_SETSIZE)
159AC_DEFINE_UNQUOTED(DEFAULT_FD_SETSIZE, $DEFAULT_FD_SETSIZE, [Default FD_SETSIZE value])
160])
161
162
163dnl checks the maximum number of filedescriptor we can open
164dnl sets shell var squid_filedescriptors_num
165
166AC_DEFUN([SQUID_CHECK_MAXFD],[
167AC_CHECK_FUNCS(getrlimit setrlimit)
168AC_MSG_CHECKING(Maximum number of filedescriptors we can open)
169SQUID_STATE_SAVE(maxfd)
170dnl FreeBSD pthreads break dup2().
171  AS_CASE([$host_os],[freebsd],[ LDFLAGS=`echo $LDFLAGS | sed -e "s/-pthread//"` ])
172  AC_RUN_IFELSE([AC_LANG_SOURCE([[
173#include <stdio.h>
174#include <unistd.h>
175#include <stdlib.h>
176#include <sys/time.h>	/* needed on FreeBSD */
177#include <sys/param.h>
178#include <sys/resource.h>
179int main(int argc, char **argv) {
180	FILE *fp;
181	int i,j;
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.
186     */
187    i = NOFILE;
188#else
189#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
190    struct rlimit rl;
191#if defined(RLIMIT_NOFILE)
192    if (getrlimit(RLIMIT_NOFILE, &rl) < 0) {
193        perror("getrlimit: RLIMIT_NOFILE");
194    } else {
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);
198#else
199        rl.rlim_cur = rl.rlim_max;      /* set it to the max */
200#endif
201        if (setrlimit(RLIMIT_NOFILE, &rl) < 0) {
202            perror("setrlimit: RLIMIT_NOFILE");
203        }
204    }
205#elif defined(RLIMIT_OFILE)
206    if (getrlimit(RLIMIT_OFILE, &rl) < 0) {
207        perror("getrlimit: RLIMIT_OFILE");
208    } else {
209        rl.rlim_cur = rl.rlim_max;      /* set it to the max */
210        if (setrlimit(RLIMIT_OFILE, &rl) < 0) {
211            perror("setrlimit: RLIMIT_OFILE");
212        }
213    }
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 */
218        i = j = 1<<14;
219        while (j) {
220                j >>= 1;
221                if (dup2(0, i) < 0) {
222                        i -= j;
223                } else {
224                        close(i);
225                        i += j;
226                }
227        }
228        i++;
229#endif /* IF !DEF CYGWIN */
230	fp = fopen("conftestval", "w");
231	fprintf (fp, "%d\n", i & ~0x3F);
232	return 0;
233}
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
241    ],[
242      AC_MSG_NOTICE([Unable to detect filedescriptor limits. Assuming 256 is okay.])
243      squid_filedescriptors_num=256
244    ])
245  ])
246SQUID_STATE_ROLLBACK(maxfd)
247
248AC_MSG_NOTICE([Default number of filedescriptors: $squid_filedescriptors_num])
249
250AS_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.])
252])
253
254AS_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])
259])
260AC_DEFINE_UNQUOTED(SQUID_MAXFD,$squid_filedescriptors_num,[Maximum number of open filedescriptors])
261])
262
263
264dnl Check whether this OS defines sin6_len as a member of sockaddr_in6 as a backup to ss_len
265dnl defines HAVE_SIN6_LEN_IN_SAI
266dnl TODO: move to AC_CHECK_MEMBER?
267
268AC_DEFUN([SQUID_CHECK_SIN6_LEN_IN_SAI],[
269AC_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"
276      ])
277])
278SQUID_DEFINE_BOOL(HAVE_SIN6_LEN_IN_SAI,$ac_cv_have_sin6_len_in_struct_sai,
279      [Defined if struct sockaddr_in6 has sin6_len])
280])
281
282
283dnl Check whether this OS defines ss_len as a member of sockaddr_storage
284dnl defines HAVE_SS_LEN_IN_SS
285dnl TODO: move to AC_CHECK_MEMBER?
286
287AC_DEFUN([SQUID_CHECK_SS_LEN_IN_SOCKADDR_STORAGE],[
288AC_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"
295	])
296])
297SQUID_DEFINE_BOOL(HAVE_SS_LEN_IN_SS,$ac_cv_have_ss_len_in_struct_ss,
298   [Define if sockaddr_storage has field ss_len])
299])
300
301
302dnl Check whether this OS defines sin_len as a member of sockaddr_in as a backup to ss_len
303dnl defines HAVE_SIN_LEN_IN_SAI
304dnl TODO: move to AC_CHECK_MEMBER?
305
306AC_DEFUN([SQUID_CHECK_SIN_LEN_IN_SOCKADDR_IN],[
307AC_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"
314        ])
315])
316SQUID_DEFINE_BOOL(HAVE_SIN_LEN_IN_SAI,$ac_cv_have_sin_len_in_struct_sai,[Define if sockaddr_in has field sin_len])
317])
318
319
320dnl detects default UDP buffer size
321dnl not cached since people are likely to tune this
322dnl defines SQUID_DETECT_UDP_SO_SNDBUF
323
324AC_DEFUN([SQUID_DETECT_UDP_SND_BUFSIZE],[
325AC_MSG_CHECKING(Default UDP send buffer size)
326AC_RUN_IFELSE([AC_LANG_SOURCE([[
327#include <stdlib.h>
328#include <stdio.h>
329#include <sys/types.h>
330#if HAVE_SYS_SOCKET_H
331#include <sys/socket.h>
332#endif
333#if HAVE_NETINET_IN_H
334#include <netinet/in.h>
335#endif
336#if HAVE_WINSOCK2_H
337#include <winsock2.h>
338#elif HAVE_WINSOCK_H
339#include <winsock.h>
340#endif
341int main(int argc, char **argv)
342{
343	FILE *fp;
344        int fd,val=0;
345#if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
346        int len=sizeof(int);
347	WSADATA wsaData;
348	WSAStartup(2, &wsaData);
349#else
350        socklen_t len=sizeof(socklen_t);
351#endif
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;
355	WSACleanup();
356#else
357        if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) return 1;
358#endif
359	if (val<=0) return 1;
360        fp = fopen("conftestval", "w");
361        fprintf (fp, "%d\n", val);
362	return 0;
363}
364]])],[SQUID_DETECT_UDP_SO_SNDBUF=`cat conftestval`],[SQUID_DETECT_UDP_SO_SNDBUF=16384],[SQUID_DETECT_UDP_SO_SNDBUF=16384])
365AC_MSG_RESULT($SQUID_DETECT_UDP_SO_SNDBUF)
366AC_DEFINE_UNQUOTED(SQUID_DETECT_UDP_SO_SNDBUF, $SQUID_DETECT_UDP_SO_SNDBUF,[UDP send buffer size])
367])
368
369
370dnl detects default UDP buffer size
371dnl not cached since people are likely to tune this
372dnl defines SQUID_DETECT_UDP_SO_RCVBUF
373
374AC_DEFUN([SQUID_DETECT_UDP_RECV_BUFSIZE],[
375AC_MSG_CHECKING(Default UDP receive buffer size)
376AC_RUN_IFELSE([AC_LANG_SOURCE([[
377#include <stdlib.h>
378#include <stdio.h>
379#include <sys/types.h>
380#if HAVE_SYS_SOCKET_H
381#include <sys/socket.h>
382#endif
383#if HAVE_NETINET_IN_H
384#include <netinet/in.h>
385#endif
386#if HAVE_WINSOCK2_H
387#include <winsock2.h>
388#elif HAVE_WINSOCK_H
389#include <winsock.h>
390#endif
391int main(int argc, char **argv)
392{
393	FILE *fp;
394        int fd,val=0;
395#if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
396        int len=sizeof(int);
397	WSADATA wsaData;
398	WSAStartup(2, &wsaData);
399#else
400        socklen_t len=sizeof(socklen_t);
401#endif
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;
405	WSACleanup();
406#else
407        if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &len) < 0) return 1;
408#endif
409	if (val <= 0) return 1;
410	fp = fopen("conftestval", "w");
411	fprintf (fp, "%d\n", val);
412	return 0;
413}
414]])],[SQUID_DETECT_UDP_SO_RCVBUF=`cat conftestval`],[SQUID_DETECT_UDP_SO_RCVBUF=16384],[SQUID_DETECT_UDP_SO_RCVBUF=16384])
415AC_MSG_RESULT($SQUID_DETECT_UDP_SO_RCVBUF)
416AC_DEFINE_UNQUOTED(SQUID_DETECT_UDP_SO_RCVBUF, $SQUID_DETECT_UDP_SO_RCVBUF,[UDP receive buffer size])
417])
418
419
420dnl detects default TCP buffer size
421dnl not cached since people are likely to tune this
422dnl defines SQUID_TCP_SO_SNDBUF
423
424AC_DEFUN([SQUID_DETECT_TCP_SND_BUFSIZE],[
425AC_MSG_CHECKING(Default TCP send buffer size)
426AC_RUN_IFELSE([AC_LANG_SOURCE([[
427#include <stdlib.h>
428#include <stdio.h>
429#include <sys/types.h>
430#if HAVE_SYS_SOCKET_H
431#include <sys/socket.h>
432#endif
433#if HAVE_NETINET_IN_H
434#include <netinet/in.h>
435#endif
436#if HAVE_WINSOCK2_H
437#include <winsock2.h>
438#elif HAVE_WINSOCK_H
439#include <winsock.h>
440#endif
441int main(int argc, char **argv)
442{
443	FILE *fp;
444        int fd,val=0;
445#if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
446        int len=sizeof(int);
447	WSADATA wsaData;
448	WSAStartup(2, &wsaData);
449#else
450        socklen_t len=sizeof(socklen_t);
451#endif
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;
455	WSACleanup();
456#else
457        if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) return 1;
458#endif
459	if (val <= 0) return 1;
460	fp = fopen("conftestval", "w");
461	fprintf (fp, "%d\n", val);
462	return 0;
463}
464]])],[SQUID_TCP_SO_SNDBUF=`cat conftestval`],[SQUID_TCP_SO_SNDBUF=16384],[SQUID_TCP_SO_SNDBUF=16384])
465AC_MSG_RESULT($SQUID_TCP_SO_SNDBUF)
466if test $SQUID_TCP_SO_SNDBUF -gt 32768; then
467    AC_MSG_NOTICE([Limiting send buffer size to 32K])
468    SQUID_TCP_SO_SNDBUF=32768
469fi
470AC_DEFINE_UNQUOTED(SQUID_TCP_SO_SNDBUF, $SQUID_TCP_SO_SNDBUF,[TCP send buffer size])
471])
472
473
474dnl detects default TCP buffer size
475dnl not cached since people are likely to tune this
476dnl defines SQUID_TCP_SO_RECVBUF
477
478AC_DEFUN([SQUID_DETECT_TCP_RECV_BUFSIZE],[
479AC_MSG_CHECKING(Default TCP receive buffer size)
480AC_RUN_IFELSE([AC_LANG_SOURCE([[
481#include <stdlib.h>
482#include <stdio.h>
483#include <sys/types.h>
484#if HAVE_SYS_SOCKET_H
485#include <sys/socket.h>
486#endif
487#if HAVE_NETINET_IN_H
488#include <netinet/in.h>
489#endif
490#if HAVE_WINSOCK2_H
491#include <winsock2.h>
492#elif HAVE_WINSOCK_H
493#include <winsock.h>
494#endif
495int main(int argc, char **argv)
496{
497	FILE *fp;
498        int fd,val=0;
499#if (defined(WIN32) || defined(__WIN32__) || defined(__WIN32)) && !(defined(__CYGWIN32__) || defined(__CYGWIN__))
500        int len=sizeof(int);
501	WSADATA wsaData;
502	WSAStartup(2, &wsaData);
503#else
504        socklen_t len=sizeof(socklen_t);
505#endif
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;
509	WSACleanup();
510#else
511        if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &len) < 0) return 1;
512#endif
513	if (val <= 0) return 1;
514	fp = fopen("conftestval", "w");
515	fprintf (fp, "%d\n", val);
516	return 0;
517}
518]])],[SQUID_TCP_SO_RCVBUF=`cat conftestval`],[SQUID_TCP_SO_RCVBUF=16384],[SQUID_TCP_SO_RCVBUF=16384])
519AC_MSG_RESULT($SQUID_TCP_SO_RCVBUF)
520if test $SQUID_TCP_SO_RCVBUF -gt 65535; then
521    AC_MSG_NOTICE([Limiting receive buffer size to 64K])
522    SQUID_TCP_SO_RCVBUF=65535
523fi
524AC_DEFINE_UNQUOTED(SQUID_TCP_SO_RCVBUF, $SQUID_TCP_SO_RCVBUF,[TCP receive buffer size])
525])
526
527
528dnl check if we need to define sys_errlist as external
529dnl defines NEED_SYS_ERRLIST
530
531AC_DEFUN([SQUID_CHECK_NEED_SYS_ERRLIST],[
532AC_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"])
534)
535SQUID_DEFINE_BOOL(NEED_SYS_ERRLIST,$ac_cv_needs_sys_errlist,[If we need to declare sys_errlist as extern])
536])
537
538
539dnl check if MAXPATHLEN is defined in the system headers
540dnl or define it ourselves
541
542AC_DEFUN([SQUID_CHECK_MAXPATHLEN],[
543AC_MSG_CHECKING(for system-provided MAXPATHLEN)
544AC_LINK_IFELSE([
545  AC_LANG_PROGRAM([[
546#include <sys/param.h>]], [[
547int i = MAXPATHLEN;]])], [
548  AC_MSG_RESULT(yes)], [
549  AC_MSG_RESULT(no)
550  AC_DEFINE(MAXPATHLEN,256,[If MAXPATHLEN has not been defined])])
551])
552
553
554dnl check that we have a working statvfs
555dnl sets the ac_cv_func_statvfs shell variable and defines HAVE_STATVFS
556
557AC_DEFUN([SQUID_CHECK_WORKING_STATVFS],[
558AC_CACHE_CHECK(for working statvfs() interface,ac_cv_func_statvfs,[
559  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
560#include <stdlib.h>
561#include <stdio.h>
562#include <sys/types.h>
563#include <sys/statvfs.h>
564]], [[
565struct statvfs sfs;
566sfs.f_blocks = sfs.f_bfree = sfs.f_frsize =
567sfs.f_files = sfs.f_ffree = 0;
568statvfs("/tmp", &sfs);
569]])],[ac_cv_func_statvfs=yes],[ac_cv_func_statvfs=no])
570])
571SQUID_DEFINE_BOOL(HAVE_STATVFS,$ac_cv_func_statvfs,[set to 1 if our system has statvfs(), and if it actually works])
572])
573
574
575dnl Check whether this OS defines f_frsize as a member of struct statfs
576AC_DEFUN([SQUID_CHECK_F_FRSIZE_IN_STATFS],[
577AC_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>
582#endif
583#if HAVE_SYS_STATVFS_H
584#include <sts/statvfs.h>
585#endif
586#if HAVE_SYS_VFS_H
587#include <sts/vfs.h>
588#endif
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"
590        ])
591])
592SQUID_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)])
593])
594
595
596dnl check that we can use the libresolv _dns_ttl_ hack
597dnl sets the ac_cv_libresolv_dns_ttl_hack shell variable and defines LIBRESOLV_DNS_TTL_HACK
598
599AC_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_])
605])
606
607
608dnl checks for availability of some resolver fields
609dnl sets ac_cv_have_res_ext_nsaddr_list shell variable
610dnl defines _SQUID_RES_NSADDR6_COUNT _SQUID_RES_NSADDR6_LARRAY
611dnl defines _SQUID_RES_NSADDR6_LPTR _SQUID_RES_NSADDR6_COUNT
612dnl defines _SQUID_RES_NSADDR_LIST _SQUID_RES_NSADDR_COUNT
613
614AC_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([[
617#if HAVE_SYS_TYPES_H
618#include <sys/types.h>
619#endif
620#if HAVE_NETINET_IN_H
621#include <netinet/in.h>
622#endif
623#if HAVE_ARPA_INET_H
624#include <arpa/inet.h>
625#endif
626#if HAVE_ARPA_NAMESER_H
627#include <arpa/nameser.h>
628#endif
629#if HAVE_RESOLV_H
630#include <resolv.h>
631#endif
632    ]],
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])
639  fi
640
641if 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([[
644#if HAVE_SYS_TYPES_H
645#include <sys/types.h>
646#endif
647#if HAVE_NETINET_IN_H
648#include <netinet/in.h>
649#endif
650#if HAVE_ARPA_INET_H
651#include <arpa/inet.h>
652#endif
653#if HAVE_ARPA_NAMESER_H
654#include <arpa/nameser.h>
655#endif
656#if HAVE_RESOLV_H
657#include <resolv.h>
658#endif
659    ]], i
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])
665  fi
666fi
667
668AC_CACHE_CHECK(for _res.nsaddr_list, ac_cv_have_res_nsaddr_list,
669  AC_COMPILE_IFELSE([
670    AC_LANG_PROGRAM([[
671#if HAVE_SYS_TYPES_H
672#include <sys/types.h>
673#endif
674#if HAVE_NETINET_IN_H
675#include <netinet/in.h>
676#endif
677#if HAVE_ARPA_INET_H
678#include <arpa/inet.h>
679#endif
680#if HAVE_ARPA_NAMESER_H
681#include <arpa/nameser.h>
682#endif
683#if HAVE_RESOLV_H
684#include <resolv.h>
685#endif
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])
691  fi
692
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([[
696#if HAVE_SYS_TYPES_H
697#include <sys/types.h>
698#endif
699#if HAVE_NETINET_IN_H
700#include <netinet/in.h>
701#endif
702#if HAVE_ARPA_INET_H
703#include <arpa/inet.h>
704#endif
705#if HAVE_ARPA_NAMESER_H
706#include <arpa/nameser.h>
707#endif
708#if HAVE_RESOLV_H
709#include <resolv.h>
710#endif
711  ]],
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])
717  fi
718fi
719])
720
721
722dnl checks the winsock library to use (ws2_32 or wsock32)
723dnl may set ac_cv_func_select as a side effect
724AC_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],,,,[
728#if HAVE_WINSOCK2_H
729#include <winsock2.h>
730#elif HAVE_WINSOCK_H
731#include <winsock.h>
732#endif
733/* ugly hack. */
734void squid_getprotobynumber(void) {
735    getprotobynumber(1);
736}
737  ])
738  AC_MSG_CHECKING([for winsock library])
739  case "$ac_cv_search_squid_getprotobynumber" in
740    "no")
741      AC_MSG_RESULT([winsock library not found])
742      ;;
743    "none required")
744      AC_MSG_RESULT([winsock library already in LIBS])
745      ;;
746    "-lws2_32")
747      AC_MSG_RESULT([winsock2])
748      XTRA_LIBS="-lws2_32 $XTRA_LIBS"
749      ac_cv_func_select='yes'
750      ;;
751    "-lwsock32")
752      AC_MSG_RESULT([winsock])
753      XTRA_LIBS="-lwsock32 $XTRA_LIBS"
754      ac_cv_func_select='yes'
755      ;;
756  esac
757  SQUID_STATE_ROLLBACK(winsock)
758])
759
760dnl check that setresuid is properly implemented.
761dnl sets squid_cv_resuid_works to "yes" or "no"
762AC_DEFUN([SQUID_CHECK_SETRESUID_WORKS],[
763  AC_CACHE_CHECK(if setresuid is actually implemented, squid_cv_resuid_works,
764    AC_RUN_IFELSE([
765      AC_LANG_SOURCE([[
766#if HAVE_STDLIB_H
767#include <stdlib.h>
768#endif
769#if HAVE_STDIO_H
770#include <stdio.h>
771#endif
772#if HAVE_UNISTD_H
773#include <unistd.h>
774#endif
775  int main(int argc, char **argv) {
776    if(setresuid(-1,-1,-1)) {
777      perror("setresuid:");
778      return 1;
779    }
780    return 0;
781  }
782  ]])],[
783    squid_cv_resuid_works="yes" ],[
784    squid_cv_resuid_works="no" ],[:])
785  )
786])
787
788dnl check that we have functional CPU clock access for the profiler
789dnl sets squid_cv_profiler_works to "yes" or "no"
790
791AC_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([[
795#include <ctime>
796#if defined(__GNUC__) && ( defined(__i386) || defined(__i386__) )
797// okay
798#elif defined(__GNUC__) && ( defined(__x86_64) || defined(__x86_64__) )
799// okay
800#elif defined(__GNUC__) && defined(__alpha)
801// okay
802#elif defined(_M_IX86) && defined(_MSC_VER) /* x86 platform on Microsoft C Compiler ONLY */
803// okay
804#elif defined(HAVE_CLOCK_GETTIME_NSEC_NP) && defined(CLOCK_MONOTONIC_RAW)
805// okay
806#else
807#error This CPU is unsupported. No profiling available here.
808#endif
809  ]])],[
810  squid_cv_cpu_profiler_works=yes],[
811  squid_cv_cpu_profiler_works=no])
812  )
813])
814
815dnl check whether recv takes a char* or void* as a second argument
816AC_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>
823#endif
824#if HAVE_WINSOCK2_H
825#include <winsock2.h>
826#elif HAVE_WINSOCK_H
827#include <winsock.h>
828#endif
829int main (int argc, char ** argv) {
830       void *buf;
831  recv(0,buf,0,0);
832}
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*)
836  ])
837  AC_DEFINE_UNQUOTED(RECV_ARG_TYPE,$squid_cv_recv_second_arg_type,
838    [Base type of the second argument to recv(2)])
839])
840
841
842dnl check whether Solaris has broken IPFilter headers (Solaris 10 at least does)
843AC_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>
850
851#     include <netinet/ip_compat.h>
852#     include <netinet/ip_fil.h>
853#     include <netinet/ip_nat.h>
854    ]])],[
855      AC_MSG_RESULT(no)
856      squid_cv_broken_ipfilter_minor_t=0
857    ],[
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>
865#undef minor_t
866#       include <netinet/ip_compat.h>
867#       include <netinet/ip_fil.h>
868#       include <netinet/ip_nat.h>
869      ]])],[
870        AC_MSG_RESULT(yes)
871        squid_cv_broken_ipfilter_minor_t=1
872      ],[
873        AC_MSG_ERROR(unable to make IPFilter work with netinet/ headers)
874      ])
875    ])
876  fi
877
878  AC_DEFINE_UNQUOTED(USE_SOLARIS_IPFILTER_MINOR_T_HACK,$squid_cv_broken_ipfilter_minor_t,
879    [Workaround IPFilter minor_t breakage])
880
881## check for IPFilter headers that require this hack
882## (but first netinet/in.h and sys/ioccom.h which they depend on)
883  AC_CHECK_HEADERS( \
884	netinet/in.h \
885	sys/ioccom.h \
886	ip_compat.h \
887	ip_fil_compat.h \
888	ip_fil.h \
889	ip_nat.h \
890	netinet/ip_compat.h \
891	netinet/ip_fil_compat.h \
892	netinet/ip_fil.h \
893	netinet/ip_nat.h \
894  ,,,[
895#if USE_SOLARIS_IPFILTER_MINOR_T_HACK
896#define minor_t fubar
897#endif
898#if HAVE_SYS_TYPES_H
899#include <sys/types.h>
900#endif
901#if HAVE_SYS_TIME_H
902#include <sys/time.h>
903#endif
904#if HAVE_NETINET_IN_H
905#include <netinet/in.h>
906#endif
907#if HAVE_SYS_IOCCOM_H
908#include <sys/ioccom.h>
909#endif
910#if USE_SOLARIS_IPFILTER_MINOR_T_HACK
911#undef minor_t
912#endif
913#if HAVE_IP_COMPAT_H
914#include <ip_compat.h>
915#elif HAVE_NETINET_IP_COMPAT_H
916#include <netinet/ip_compat.h>
917#endif
918#if HAVE_IP_FIL_H
919#include <ip_fil.h>
920#elif HAVE_NETINET_IP_FIL_H
921#include <netinet/ip_fil.h>
922#endif
923#if !defined(IPFILTER_VERSION)
924#define IPFILTER_VERSION        5000004
925#endif
926  ])
927
928## Solaris 10+ backported IPv6 NAT to their IPFilter v4.1 instead of using v5
929  AC_CHECK_MEMBERS([
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
934#endif
935#if HAVE_SYS_PARAM_H
936#include <sys/param.h>
937#endif
938#if HAVE_SYS_TYPES_H
939#include <sys/types.h>
940#endif
941#if HAVE_SYS_TIME_H
942#include <sys/time.h>
943#endif
944#if HAVE_NETINET_IN_H
945#include <netinet/in.h>
946#endif
947#if HAVE_SYS_IOCCOM_H
948#include <sys/ioccom.h>
949#endif
950#if USE_SOLARIS_IPFILTER_MINOR_T_HACK
951#undef minor_t
952#endif
953#if HAVE_IP_COMPAT_H
954#include <ip_compat.h>
955#elif HAVE_NETINET_IP_COMPAT_H
956#include <netinet/ip_compat.h>
957#endif
958#if HAVE_IP_FIL_H
959#include <ip_fil.h>
960#elif HAVE_NETINET_IP_FIL_H
961#include <netinet/ip_fil.h>
962#endif
963#if HAVE_IP_NAT_H
964#include <ip_nat.h>
965#elif HAVE_NETINET_IP_NAT_H
966#include <netinet/ip_nat.h>
967#endif
968  ])
969
970])
971