1case $host in
2    *-*-darwin*)
3	AC_DEFINE(HAVE_DARWIN, 1, [enable darwin/osx workarounds])
4	;;
5
6    *-*-openbsd*)
7	AC_DEFINE(HAVE_OPENBSD_BUGS, 1, [bug workaround])
8	;;
9
10    *-*-solaris*)
11	AC_DEFINE(HAVE_SENDMSG_DEADLOCK, 1, [bug workaround])
12	AC_DEFINE(HAVE_SOLARIS_BUGS, 1, [bug workaround])
13	AC_DEFINE(SPT_TYPE, SPT_REUSEARGV, [setproctitle replacement type])
14	;;
15
16    *-*-linux-*)
17	AC_DEFINE(HAVE_LINUX_BUGS, 1, [bug workaround])
18	AC_DEFINE(SPT_TYPE, SPT_REUSEARGV, [setproctitle replacement type])
19	;;
20
21    *-*-aix*)
22	AC_DEFINE(HAVE_SYSTEM_XMSG_MAGIC, 1, [platform workaround])
23	;;
24esac
25
26dnl Checking variable sizes
27AC_CHECK_SIZEOF(char)
28AC_CHECK_SIZEOF(short)
29AC_CHECK_SIZEOF(int)
30AC_CHECK_SIZEOF(long)
31
32dnl Checks for header files.
33AC_HEADER_SYS_WAIT
34AC_CHECK_HEADERS(fcntl.h limits.h malloc.h paths.h strings.h syslog.h)
35AC_CHECK_HEADERS(unistd.h crypt.h stddef.h sys/file.h sys/ioctl.h sys/time.h)
36AC_CHECK_HEADERS(shadow.h ifaddrs.h sys/sem.h netinet/in.h rpc/rpc.h)
37AC_CHECK_HEADERS(sys/ipc.h arpa/nameser.h net/if_dl.h execinfo.h sys/pstat.h)
38AC_CHECK_HEADERS(sys/shm.h valgrind/valgrind.h netinet/tcp_fsm.h)
39
40#some header dependencies for netinet/ip.h, use compilation test
41AC_MSG_CHECKING([for netinet/ip.h])
42AC_TRY_COMPILE([
43#include <sys/types.h>
44#include <sys/socket.h>
45
46#include <netinet/in.h>
47#include <netinet/in_systm.h>
48#include <netinet/ip.h>
49], [], [AC_MSG_RESULT(yes)
50    AC_DEFINE(HAVE_NETINET_IP_H, 1, [netinet/ip.h header found])],
51   [AC_MSG_RESULT(no)])
52
53case $host in
54    #XXX only check for priv.h support on Solaris for now
55    *-*-solaris*)
56	AC_CHECK_HEADERS(priv.h,
57	    [AC_DEFINE(HAVE_PRIVILEGES, 1, [Some privilege type supported])
58	     AC_DEFINE(HAVE_SOLARIS_PRIVS, 1, [Solaris priv.h support])])
59	;;
60esac
61
62AC_CHECK_HEADERS([netinet/ip_var.h], [], [], [
63#if HAVE_SYS_TYPES_H
64#include <sys/types.h>
65#endif
66#if HAVE_NETINET_IN_H
67#include <netinet/in.h>
68#endif
69])
70
71AC_CHECK_HEADERS([resolv.h], [], [], [
72#if HAVE_SYS_TYPES_H
73#include <sys/types.h>
74#endif
75#if HAVE_NETINET_IN_H
76#include <netinet/in.h>
77#endif
78#if HAVE_ARPA_NAMESER_H
79#include <arpa/nameser.h>
80#endif
81])
82
83AC_CHECK_HEADER(sys/sockio.h,
84[AC_DEFINE(HAVE_SYS_SOCKIO_H, 1, [sys/sockio.h exists])
85 have_sys_sockio_h=t])
86
87dnl Checks for typedefs, structures, and compiler characteristics.
88AC_MSG_CHECKING([whether <sys/types.h> defines const])
89AC_EGREP_CPP(yes, [
90#include <sys/types.h>
91#ifdef const
92yes
93#endif
94], [AC_MSG_RESULT(yes)],
95   [AC_MSG_RESULT(no)
96    check_const="yes"])
97if test x$check_const = xyes; then
98    AC_C_CONST
99fi
100
101#looks for Linux + systems with RTAX_GATEWAY defined in net/route.h
102AC_MSG_CHECKING([for supported routing socket communication])
103AH_TEMPLATE([HAVE_ROUTE_SOURCE], [routing socket communication supported])
104unset no_routeinfo
105AC_EGREP_CPP(yes, [
106#include <net/route.h>
107#ifdef linux
108yes
109#endif /* linux */
110], [AC_DEFINE(HAVE_ROUTE_SOURCE, 1)
111    AC_DEFINE(HAVE_ROUTEINFO_LINUX, 1, [Linux type routing socket])
112    AC_MSG_RESULT(yes)],
113   [AC_EGREP_CPP(yes, [
114#include <net/route.h>
115#ifdef RTA_GATEWAY
116yes
117#endif /* RTA_GATEWAY */
118],  [AC_DEFINE(HAVE_ROUTE_SOURCE, 1)
119     AC_DEFINE(HAVE_ROUTEINFO_BSD, 1, [BSD type routing socket])
120     AC_MSG_RESULT(yes)],
121     [AC_MSG_RESULT([no, might result in reduced functionality])
122      no_routeinfo=t])])
123
124#XXXsys/socket.h?
125AC_MSG_CHECKING([for struct ip_opts in <netinet/in.h>])
126AC_EGREP_CPP([struct.*ipoption], [
127#include <netinet/ip_var.h>
128], [AC_DEFINE(HAVE_STRUCT_IPOPTS, 1, [ip_opts defined in netinet/in.h])
129    AC_MSG_RESULT(yes)],
130   AC_MSG_RESULT(no))
131
132AC_MSG_CHECKING([for struct tcp_info in <netinet/tcp.h>])
133AC_EGREP_CPP([struct.*tcp_info], [
134#include <netinet/tcp.h>
135], [AC_DEFINE(HAVE_TCP_INFO, 1, [tcp_info struct found in netinet/tcp.h])
136    AC_MSG_RESULT(yes)
137
138    # check which values are found in the tcp_info struct
139    # (limitations in autoconf makes it necessary to list each name explicitly
140    #  and not use a list stored in a variable)
141
142    #values not present on some older linux versions
143    L_TCPINFOCHECK(tcpi_rcv_rtt)
144    L_TCPINFOCHECK(tcpi_rcv_space)
145    L_TCPINFOCHECK(tcpi_total_retrans)
146
147    #values not present on freebsd
148    L_TCPINFOCHECK(tcpi_advmss)
149    L_TCPINFOCHECK(tcpi_ato)
150    L_TCPINFOCHECK(tcpi_backoff)
151    L_TCPINFOCHECK(tcpi_ca_state)
152    L_TCPINFOCHECK(tcpi_fackets)
153    L_TCPINFOCHECK(tcpi_last_ack_recv)
154    L_TCPINFOCHECK(tcpi_last_ack_sent)
155    L_TCPINFOCHECK(tcpi_last_data_recv)
156    L_TCPINFOCHECK(tcpi_last_data_sent)
157    L_TCPINFOCHECK(tcpi_lost)
158    L_TCPINFOCHECK(tcpi_pmtu)
159    L_TCPINFOCHECK(tcpi_probes)
160    L_TCPINFOCHECK(tcpi_rcv_rtt)
161    L_TCPINFOCHECK(tcpi_rcv_ssthresh)
162    L_TCPINFOCHECK(tcpi_reordering)
163    L_TCPINFOCHECK(tcpi_retrans)
164    L_TCPINFOCHECK(tcpi_retransmits)
165    L_TCPINFOCHECK(tcpi_sacked)
166    L_TCPINFOCHECK(tcpi_unacked)],
167   [AC_MSG_RESULT(no)])
168
169AC_MSG_CHECKING([whether <sys/types.h> defines inline])
170AC_EGREP_CPP(yes, [
171#include <sys/types.h>
172#ifdef inline
173yes
174#endif
175], [AC_MSG_RESULT(yes)],
176   [AC_MSG_RESULT(no)
177    check_inline="yes"])
178if test x"${check_inline}" = xyes; then
179    AC_C_INLINE
180fi
181
182AC_TYPE_UID_T
183AC_TYPE_OFF_T
184AC_TYPE_PID_T
185AC_TYPE_SIZE_T
186AC_HEADER_TIME
187
188AC_SYS_LARGEFILE
189
190AC_MSG_CHECKING([for in6_addr])
191AC_TRY_COMPILE([
192#include <sys/types.h>
193#include <sys/socket.h>
194#include <netinet/in.h>
195], [
196struct in6_addr sin6;
197], [AC_MSG_RESULT(yes)
198    AC_DEFINE(HAVE_IN6_ADDR, 1, [in6_addr defined])],
199   [AC_MSG_RESULT(no)])
200
201AC_MSG_CHECKING([to see if openlog accepts LOG_PERROR])
202AC_EGREP_CPP(yes, [
203#include <syslog.h>
204#ifdef LOG_PERROR
205yes
206#endif
207], [AC_DEFINE(HAVE_OPENLOG_LOG_PERROR, 1, [openlog supports LOG_PERROR])
208    AC_MSG_RESULT(yes)],
209    AC_MSG_RESULT(no))
210
211AC_MSG_CHECKING([to see if stdlib.h defines EXIT_FAILURE])
212AC_EGREP_CPP(yes, [
213#include <stdlib.h>
214#ifdef EXIT_FAILURE
215yes
216#endif
217], [AC_MSG_RESULT(yes)],
218   [AC_DEFINE(NEED_EXIT_FAILURE, 1, [EXIT_FAILURE not defined in stdlib.h])
219    AC_MSG_RESULT(no)])
220
221#XXX actually checks if AF_UNIX should be used instead of AF_LOCAL
222AC_MSG_CHECKING([whether <sys/socket.h> uses AF_UNIX])
223AC_EGREP_CPP(yes, [
224#include <sys/types.h>
225#include <sys/socket.h>
226#ifdef AF_LOCAL
227#else
228#ifdef AF_UNIX
229yes
230#endif
231#endif
232], [AC_DEFINE(NEED_AF_LOCAL, 1, [need AF_LOCAL definition])
233    AC_MSG_RESULT(yes)],
234    AC_MSG_RESULT(no))
235
236AC_MSG_CHECKING([for SIGINFO])
237AC_EGREP_CPP(yes, [
238#include <signal.h>
239#ifdef SIGINFO
240yes
241#endif
242], [AC_DEFINE(HAVE_SIGNAL_SIGINFO, 1, [signal.h defined SIGINFO])
243    AC_MSG_RESULT(yes)],
244    AC_MSG_RESULT(no))
245
246AC_MSG_CHECKING([to see if MSG_WAITALL exists])
247AC_EGREP_CPP(yes, [
248#include <sys/socket.h>
249#ifdef MSG_WAITALL
250yes
251#endif
252], [AC_DEFINE(HAVE_MSG_WAITALL, 1, [sys/socket.h defines MSG_WAITALL])
253    AC_MSG_RESULT(yes)],
254    AC_MSG_RESULT(no))
255
256AC_MSG_CHECKING([whether realloc with a NULL pointer calls malloc])
257AC_TRY_RUN([
258#include <stdlib.h>
259#ifndef NULL
260#define NULL (char *)0
261#endif
262
263int main()
264{
265	/* will assume this test doesn\'t fail because of lack of memory */
266	if (realloc(NULL, 1) == NULL)
267		return 1;
268	else
269		return 0;
270}], [AC_MSG_RESULT(yes)],
271    [AC_DEFINE(HAVE_NOMALLOC_REALLOC, 1, [realloc never calls malloc])
272     AC_MSG_RESULT(no)],
273    [dnl assume malloc is not called when cross-compiling
274     AC_DEFINE(HAVE_NOMALLOC_REALLOC, 1, [realloc never calls malloc])
275     AC_MSG_RESULT(no)])
276
277# AC_MSG_CHECKING([whether free can be called with NULL])
278# AC_TRY_RUN([
279# #include <stdlib.h>
280# #ifndef NULL
281# #define NULL (char *)0
282# #endif
283
284# int main()
285# {
286#	/* will assume core dump/seg fault if it doesn\'t work */
287#	free(NULL);
288#	return 0;
289# }], [AC_MSG_RESULT(yes)],
290#     [AC_DEFINE(HAVE_NONULL_FREE, 1, [free does not accept NULL parameter])
291#      AC_MSG_RESULT(no)],
292#     [dnl assume NULL is not accepted when cross-compiling
293#      AC_DEFINE(HAVE_NONULL_FREE, 1, [free does not accept NULL parameter])
294#      AC_MSG_RESULT(no)])
295#XXX always set for now
296AC_DEFINE(HAVE_NONULL_FREE, 1, [free does not accept NULL parameter])
297
298AC_MSG_CHECKING([if getsockopt needs cast])
299AC_TRY_COMPILE([
300#include <sys/types.h>
301#include <sys/socket.h>
302int getsockopt(int, int, int, char *, int *);
303], [ 1 ],
304 [AC_DEFINE(NEED_GETSOCKOPT_CAST, 1, [getsockopt needs cast])
305  AC_MSG_RESULT(yes)],
306  AC_MSG_RESULT(no))
307
308#include both <sys/ioctl.h> and <sys/sockio.h>?
309if test x$have_sys_sockio_h = xt; then
310	AC_MSG_CHECKING([to see if <sys/sockio.h> should be included])
311	AC_EGREP_CPP(yes, [
312#include <sys/ioctl.h>
313#ifdef SIOCATMARK
314#else
315#include <sys/sockio.h>
316#ifdef SIOCATMARK
317yes
318#endif
319#endif
320], [AC_DEFINE(NEED_SYS_SOCKIO_H, 1, [sys/sockio.h must be included])
321    AC_MSG_RESULT(yes)],
322    AC_MSG_RESULT(no))
323fi
324
325#XXX should be more generic, check if nonexistent
326#SV_INTERRUPT, but not SA_RESTART defined?
327AC_MSG_CHECKING([to see if SV_INTERRUPT should be used])
328AC_EGREP_CPP(yes, [
329#include <signal.h>
330#ifdef SA_RESTART
331#else
332# ifdef SV_INTERRUPT
333yes
334# endif
335#endif
336], [AC_DEFINE(NEED_SA_RESTART, 1, [use SA_RESTART, not SV_INTERRUPT])
337    AC_MSG_RESULT(yes)],
338    AC_MSG_RESULT(no))
339
340#XXX seems to be supported on Solaris2.6, but there might be some
341#defines that need to be set (should _XOPEN_SOURCE be defined on all
342#platforms?)
343AC_MSG_CHECKING([if cmsghdr exists in <sys/socket.h>])
344case $host in
345    *)
346	AC_TRY_COMPILE([
347#include <sys/types.h>
348#include <sys/socket.h>
349], [struct cmsghdr foo = {1,1,1};
350 struct msghdr bar;
351 foo.cmsg_len = 0;
352 foo.cmsg_type = SCM_RIGHTS;
353 foo.cmsg_level = SOL_SOCKET;
354 bar.msg_controllen = 1;
355], [AC_DEFINE(HAVE_CMSGHDR, 1, [struct cmsghdr exists])
356    AC_MSG_RESULT(yes)],
357    AC_MSG_RESULT(no))
358	;;
359esac
360
361AC_MSG_CHECKING([for CMSG_SPACE in sys/socket.h])
362AC_TRY_LINK([
363#include <sys/types.h>
364#include <sys/socket.h>
365], [int d = CMSG_SPACE(4);
366   return 0;
367], [AC_MSG_RESULT(yes)
368    AC_DEFINE(HAVE_CMSG_SPACE, 1, CMSG_SPACE exists)],
369   [AC_MSG_RESULT(no)])
370
371AC_MSG_CHECKING([for CMSG_LEN in sys/socket.h])
372AC_TRY_LINK([
373#include <sys/types.h>
374#include <sys/socket.h>
375], [int d = CMSG_LEN(4);
376    return 0;
377], [AC_MSG_RESULT(yes)
378    AC_DEFINE(HAVE_CMSG_LEN, 1, [CMSG_LEN exists])],
379   [AC_MSG_RESULT(no)])
380
381unset have_sa_len
382AC_MSG_CHECKING([for sa_len in sockaddr])
383AC_TRY_COMPILE([
384#include <sys/types.h>
385#include <sys/socket.h>
386], [struct sockaddr sa;
387sa.sa_len = 0;
388], [AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1, [sa_len exists in sockaddr])
389    have_sa_len=t
390    AC_MSG_RESULT(yes)],
391   [AC_MSG_RESULT(no)])
392
393if test x"${have_sa_len}" != x; then
394   AC_MSG_CHECKING([for sa_len type])
395   oCFLAGS="$CFLAGS"
396   CFLAGS="$CFLAGS${CFLAGS:+ }$FAILWARN"
397   unset sa_len_type_found
398   for type in uint8_t "unsigned char"; do
399       AC_TRY_COMPILE([
400#include <sys/types.h>
401#include <sys/socket.h>], [
402struct sockaddr sa;
403$type *sa_len_ptr;
404sa_len_ptr = &sa.sa_len;
405sa_len_ptr++; /* use to avoid warning/error */],
406       [AC_DEFINE_UNQUOTED(sa_len_type, [$type], [sa_len type])
407        sa_len_type_found=t
408        break])
409   done
410   CFLAGS="$oCFLAGS"
411
412   if test x"${sa_len_type_found}" != x; then
413       AC_MSG_RESULT([yes])
414   else
415       AC_MSG_RESULT([no])
416       AC_MSG_WARN([unable to obtain sa_len type, exiting])
417       exit 1
418   fi
419else
420   AC_DEFINE(sa_len_type, [socklen_t], [sa_len type])
421fi
422
423unset have_ss_len
424AC_MSG_CHECKING([for sockaddr_storage ss_len in sockaddr])
425AC_TRY_COMPILE([
426#include <sys/types.h>
427#include <sys/socket.h>
428], [struct sockaddr_storage ss;
429ss.ss_len = 0;
430], [AC_DEFINE(HAVE_SOCKADDR_STORAGE_SS_LEN, 1, [ss_len exists in sockaddr_storage])
431    have_ss_len=t
432    AC_MSG_RESULT(yes)],
433   [AC_MSG_RESULT(no)])
434
435AC_MSG_CHECKING([for __res_state options type])
436oCFLAGS="$CFLAGS"
437CFLAGS="$CFLAGS${CFLAGS:+ }$FAILWARN"
438unset res_options_type_found
439for type in "unsigned int" u_long; do
440    AC_TRY_COMPILE([
441#include <sys/types.h>
442#include <netinet/in.h>
443#include <arpa/nameser.h>
444#include <resolv.h>], [
445struct __res_state res;
446$type *res_options_ptr;
447res_options_ptr = &res.options;
448res_options_ptr++;],
449    [AC_DEFINE_UNQUOTED(res_options_type_t, [$type], [resolver options type])
450     res_options_type_found=t
451     break])
452done
453CFLAGS="$oCFLAGS"
454if test x"${res_options_type_found}" != x; then
455    AC_MSG_RESULT([yes])
456else
457    AC_MSG_RESULT([no])
458    AC_MSG_WARN([unable to obtain __res_state options type, setting to unsigned long])
459    AC_DEFINE_UNQUOTED(res_options_type_t, [unsigned long], [resolver options type])
460fi
461
462#AIX 6.1 needs sys/select.h, but can be problematic on other platforms
463AC_MSG_CHECKING([if sys/select.h is needed])
464AC_TRY_COMPILE([
465#include <sys/types.h>
466#include <sys/time.h>
467#include <string.h>
468#include <unistd.h>
469], [fd_set *fdp;
470    size_t p;
471    fdp = NULL;
472    p = NFDBITS * sizeof(fd_mask);
473], [AC_MSG_RESULT(no)],
474   [dnl compilation failure, try with sys/select.h (ignore if this fails)
475    AC_TRY_COMPILE([
476#include <sys/types.h>
477#include <sys/time.h>
478#include <sys/select.h>
479#include <string.h>
480#include <unistd.h>
481], [fd_set *fdp;
482    size_t p;
483    fdp = NULL;
484    p = NFDBITS * sizeof(fd_mask);],
485    [AC_DEFINE(HAVE_SYS_SELECT_H, 1, [sys/select.h needed])
486     AC_MSG_RESULT(yes)],
487    [AC_MSG_RESULT(no)])])
488
489AC_MSG_CHECKING([to see if malloc_options exists])
490AC_TRY_LINK([extern char *malloc_options;],
491[ malloc_options = 0; ],
492[AC_DEFINE(HAVE_MALLOC_OPTIONS, 1, [support for malloc debugging])
493 AC_MSG_RESULT(yes)],
494[AC_MSG_RESULT(no)])
495
496AC_MSG_CHECKING([to see if __progname exists])
497AC_TRY_LINK([extern char *__progname;],
498[ __progname = 0; ],
499[AC_DEFINE(HAVE_PROGNAME, 1, [programe name symbol exists])
500 AC_MSG_RESULT(yes)],
501[AC_MSG_RESULT(no)])
502
503dnl Checks for libraries.
504AC_SEARCH_LIBS(crypt, crypt)
505
506#HP-UX 11.00
507AC_SEARCH_LIBS(getspnam, sec)
508
509#FreeBSD has setproctitle in -lutil
510AC_SEARCH_LIBS(setproctitle, util)
511
512#expected select behavior?
513unset nb_select_err
514L_UNCON_SELECT([],
515 [nb_select_err=t])
516
517if test x"${nb_select_err}" = xt; then
518   AC_MSG_WARN([socksify operations on nonblocking sockets might fail on this platform])
519fi
520
521#Linux (RedHat 5.2) defines socklen_t in <socketbits.h>, which is
522#included by <sys/socket.h>.  check for this first.
523AC_MSG_CHECKING([for socklen_t])
524AC_TRY_COMPILE([
525#include <sys/types.h>
526#include <sys/socket.h>
527], [socklen_t foo = 1;],
528   [AC_MSG_RESULT(yes)
529    socklen_found=t],
530   [AC_MSG_RESULT(no)
531    socklen_found=""])
532
533AH_TEMPLATE([socklen_t], [platform workaround])
534if test x"$socklen_found" = x; then
535    case $host in
536	alpha*-dec-osf* | *-*-aix*)
537	    AC_DEFINE(socklen_t, size_t)
538	    ;;
539
540	*)
541	    AC_DEFINE(socklen_t, int)
542	    ;;
543    esac
544fi
545
546#sig_atomic_t
547AC_MSG_CHECKING([for sig_atomic_t in <signal.h>])
548AC_EGREP_CPP(sig_atomic_t, [
549#include <signal.h>
550], [AC_DEFINE(HAVE_SIG_ATOMIC_T, 1, [sig_atomic_t defined in signal.h])
551    case $host in
552	*-*-aix*)
553	    AC_DEFINE(HAVE_VOLATILE_SIG_ATOMIC_T, 1, [platform workaround])
554	;;
555    esac
556    AC_MSG_RESULT(yes)],
557   [AC_MSG_RESULT(no)])
558
559#try to identify number of valid signal values
560SIGDEFAULT=128
561unset sigmax
562AC_MSG_CHECKING([for number of valid signal values])
563AC_TRY_RUN([
564#include <signal.h>
565#include <stdio.h>
566#include <stdlib.h>
567
568int main(int argc, char *argv[])
569{
570   FILE *fp;
571   int minval = 0;
572   int i;
573
574   for (i = 1; i < 1000; i++) {
575      if (i == SIGKILL || i == SIGSTOP)
576         continue;
577      if (signal(i, SIG_DFL) == SIG_ERR) {
578         perror("signal");
579         break;
580      }
581   }
582   minval = i;
583   fprintf(stderr, "notice: signal() based value: %d\n", minval);
584
585#ifdef NSIG
586   if (NSIG > minval) {
587      minval = NSIG;
588      fprintf(stderr, "notice: NSIG based value: %d\n", minval);
589   }
590#endif /* NSIG */
591
592#ifdef SIGRTMAX
593   /* note: this value might be changed at runtime (e.g., Linux) */
594   if (SIGRTMAX > minval) {
595      minval = SIGRTMAX;
596      fprintf(stderr, "notice: SIGRTMAX based value: %d\n", minval);
597   }
598#endif /* SIGRTMAX */
599
600   /* get base 2 value */
601   for (i = 0; i < 10; i++) {
602      int n = 1 << i;
603      if (n > minval) {
604         minval = n;
605         fprintf(stderr, "notice: base 2 based increase: %d\n", minval);
606	 break;
607      }
608   }
609
610   fprintf(stderr, "notice: setting signal max value to %d\n", minval);
611   if ((fp = fopen("conftest.out", "w")) == NULL) {
612      perror("fopen");
613      exit(1);
614   }
615   /* write zero for no special handling needed */
616   fprintf(fp, "%ld\n", minval);
617   fclose(fp);
618   exit(0);
619
620   return 0;
621}], [sigmax=`test -s conftest.out && cat conftest.out`],
622[],
623[dnl set a large value when cross-compiling
624 sigmax=128
625 AC_MSG_RESULT([cross-compiling, setting to $sigmax])
626])
627if test x"$sigmax" = x; then
628   sigmax=$SIGDEFAULT
629   AC_MSG_RESULT([got no value, setting to $sigmax])
630else
631   AC_MSG_RESULT(setting to $sigmax)
632fi
633AC_DEFINE_UNQUOTED(SOCKS_NSIG, $sigmax, [Guess at max number of valid signals])
634
635AC_CHECK_TYPES([int8_t, int16_t, int32_t, uint8_t, uint16_t, uint32_t,
636		in_port_t, in_addr_t],
637		, ,
638[
639#include <sys/types.h>
640#include <netinet/in.h>
641])
642AC_CHECK_TYPE(ssize_t, int)
643
644dnl Checks for library functions.
645AC_FUNC_MEMCMP
646AC_FUNC_SETVBUF_REVERSED
647AC_TYPE_SIGNAL
648AC_FUNC_STRFTIME
649AC_FUNC_UTIME_NULL
650AC_FUNC_VPRINTF
651
652#doesn't work if test links with -lsocket (Solaris)
653AC_SEARCH_LIBS(inet_addr, nsl)
654
655#NOTE: also test for -lsocket in preload.m4. not really needed there
656#      as check is also done here (for checks such as L_PIPETYPE() that
657#      might need to link with -lsocket, but also having test there makes
658#      code in that file easier to read.
659AC_SEARCH_LIBS(getsockopt, socket)
660
661AC_CHECK_FUNCS(getprpwnam getspnam getpwnam_shadow bindresvport)
662AC_CHECK_FUNCS(getpass)
663
664AC_MSG_CHECKING([for system V getpwnam])
665unset getpwnam_alt
666if test x"${ac_cv_func_getprpwnam}" = xyes; then
667    getpwnam_alt=t
668fi
669
670if test x"${ac_cv_func_getspnam}" = xyes; then
671    getpwnam_alt=t
672fi
673
674#XXX
675if test x"${getpwnam_alt}" = x; then
676    AC_DEFINE(HAVE_WORKING_GETPWNAM, 1, [system V getpwnam])
677    AC_MSG_RESULT(no)
678else
679    AC_MSG_RESULT(yes)
680fi
681
682#try to determine pipe buffer type
683L_PIPETYPE()
684
685#obtain highest valid select() timeout seconds value
686L_SELECT_MAXTIMEOUT
687
688#generate list of errno values
689ERRNOSRC="include/errorsymbols_gen.h"
690cp /dev/null $ERRNOSRC
691ERRVALFILE="errorvals.txt" #for counting unique (numeric) values
692cp /dev/null $ERRVALFILE
693unset ERRNOVALS
694L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, E2BIG)
695L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EACCES)
696L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EADDRINUSE)
697L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EADDRNOTAVAIL)
698L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EADV)
699L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EAFNOSUPPORT)
700L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EAGAIN)
701L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EALREADY)
702L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EAUTH)
703L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADARCH)
704L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADE)
705L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADEXEC)
706L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADF)
707L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADFD)
708L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADMACHO)
709L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADMSG)
710L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADR)
711L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADRPC)
712L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADRQC)
713L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBADSLT)
714L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBFONT)
715L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EBUSY)
716L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECANCELED)
717L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECAPMODE)
718L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECHILD)
719L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECHRNG)
720L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECOMM)
721L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECONNABORTED)
722L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECONNREFUSED)
723L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECONNRESET)
724L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDEADLK)
725L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDEADLOCK)
726L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDESTADDRREQ)
727L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDEVERR)
728L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDIRIOCTL)
729L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDOM)
730L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDOOFUS)
731L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDQUOT)
732L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EEXIST)
733L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EFAULT)
734L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EFBIG)
735L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EFTYPE)
736L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EHOSTDOWN)
737L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EHOSTUNREACH)
738L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EIDRM)
739L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EILSEQ)
740L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EINPROGRESS)
741L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EINTR)
742L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EINVAL)
743L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EIO)
744L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EIPSEC)
745L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EISCONN)
746L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EISDIR)
747L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EJUSTRETURN)
748L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EL2HLT)
749L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EL2NSYNC)
750L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EL3HLT)
751L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EL3RST)
752L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELAST)
753L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELIBACC)
754L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELIBBAD)
755L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELIBEXEC)
756L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELIBMAX)
757L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELIBSCN)
758L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELNRNG)
759L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELOCKUNMAPPED)
760L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ELOOP)
761L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMEDIUMTYPE)
762L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMFILE)
763L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMLINK)
764L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMSGSIZE)
765L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMULTIHOP)
766L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENAMETOOLONG)
767L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENEEDAUTH)
768L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENETDOWN)
769L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENETRESET)
770L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENETUNREACH)
771L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENFILE)
772L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOANO)
773L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOATTR)
774L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOBUFS)
775L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOCSI)
776L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENODATA)
777L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENODEV)
778L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOENT)
779L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOEXEC)
780L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOIOCTL)
781L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOLCK)
782L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOLINK)
783L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOMEDIUM)
784L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOMEM)
785L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOMSG)
786L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENONET)
787L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOPKG)
788L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOPOLICY)
789L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOPROTOOPT)
790L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOSPC)
791L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOSR)
792L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOSTR)
793L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOSYS)
794L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTACTIVE)
795L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTBLK)
796L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTCAPABLE)
797L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTCONN)
798L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTDIR)
799L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTEMPTY)
800L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTRECOVERABLE)
801L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTSOCK)
802L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTSUP)
803L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTTY)
804L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTUNIQ)
805L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENXIO)
806L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EOPNOTSUPP)
807L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EOVERFLOW)
808L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EOWNERDEAD)
809L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPERM)
810L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPFNOSUPPORT)
811L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPIPE)
812L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROCLIM)
813L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROCUNAVAIL)
814L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROGMISMATCH)
815L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROGUNAVAIL)
816L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROTO)
817L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROTONOSUPPORT)
818L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPROTOTYPE)
819L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EPWROFF)
820L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ERANGE)
821L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EREMCHG)
822L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EREMOTE)
823L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ERESTART)
824L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EROFS)
825L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ERPCMISMATCH)
826L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESHLIBVERS)
827L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESHUTDOWN)
828L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESOCKTNOSUPPORT)
829L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESPIPE)
830L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESRCH)
831L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESRMNT)
832L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESTALE)
833L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESTRPIPE)
834L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ETIME)
835L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ETIMEDOUT)
836L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ETOOMANYREFS)
837L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ETXTBSY)
838L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EUNATCH)
839L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EUSERS)
840L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EWOULDBLOCK)
841L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EXDEV)
842L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EXFULL)
843L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECLONEME)
844L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ECORRUPT)
845L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDESTADDREQ)
846L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EDIST)
847L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EFORMAT)
848L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EMEDIA)
849L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOCONNECT)
850L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTEMPTY)
851L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTREADY)
852L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ENOTRUST)
853L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESAD)
854L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESOFT)
855L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, ESYSERROR)
856L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EWOULDBLOCK)
857L_CHECKERRNO(ERRNOVALS, $ERRVALFILE, EWRPROTECT)
858
859if test x"$ERRNOVALS" = x; then
860    AC_MSG_FAILURE([error: no errno symbols found])
861fi
862ERRNOCNT=`echo $ERRNOVALS | wc -w | awk '{ print $1 }'`
863
864AC_MSG_CHECKING([errno symbols])
865unset UNIQUEVALS UNIQUESYMBOLS
866if test -s $ERRVALFILE; then
867    UNIQUEVALS=`sort $ERRVALFILE | uniq | wc -l | awk '{ print $1 }'`
868    UNIQUESYMBOLS=`cat $ERRVALFILE | wc -l | awk '{ print $1 }'`
869    if test $ERRNOCNT -ne $UNIQUESYMBOLS; then
870	AC_MSG_FAILURE([internal error: errno symbol count mismatch])
871    fi
872    AC_DEFINE_UNQUOTED(UNIQUE_ERRNO_VALUES, $UNIQUEVALS,
873	[Number of unique errno numbers])
874    AC_MSG_RESULT([unique symbols: $UNIQUESYMBOLS, unique values: $UNIQUEVALS])
875else
876    AC_MSG_FAILURE([error: unable to determine errno symbol values])
877fi
878
879changequote(<<, >>)dnl
880echo "/* NOTICE: $ERRNOSRC: Generated from by configure */" >>$ERRNOSRC
881echo "" >>$ERRNOSRC
882echo "static const errorsymboltable_t errnosymbolv[] = {" >>$ERRNOSRC
883changequote([, ])dnl
884
885#generic list
886for errno in $ERRNOVALS; do
887    echo "   { \"$errno\",	$errno	}," >>$ERRNOSRC
888done
889
890#keyword alias list
891maxaliaslen=0 #highest number of values for an alias
892
893#errno values that can match 'no-route' keyword (if found on platform)
894ERRNO_NOROUTE="ENETUNREACH EHOSTUNREACH ENETDOWN ETIMEDOUT"
895keyword="no-route"
896keycnt=0
897for keyval in ${ERRNO_NOROUTE}; do
898    for errno in $ERRNOVALS; do
899	if test x"$keyval" = x"$errno"; then
900	    echo "   { \"$keyword\",	$errno	}," >>$ERRNOSRC
901	    keycnt=`expr $keycnt + 1`
902	fi
903    done
904done
905
906#any-error; alias for all values
907keyword="system-any"
908keycnt=0
909for errno in $ERRNOVALS; do
910    echo "   { \"$keyword\",	$errno	}," >>$ERRNOSRC
911    keycnt=`expr $keycnt + 1`
912done
913
914if test $keycnt -gt $maxaliaslen; then
915    maxaliaslen=$keycnt
916fi
917
918echo "};" >>$ERRNOSRC
919
920AC_DEFINE_UNQUOTED(MAX_ERRNO_VALUES_FOR_SYMBOL, $maxaliaslen,
921    [Max number of errno values matching any alias keyword])
922
923
924#generate list of getaddrinfo errors
925cp /dev/null $ERRVALFILE
926unset GAIERRVALS
927L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_ADDRFAMILY)
928L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_AGAIN)
929L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_BADFLAGS)
930L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_BADHINTS)
931L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_FAIL)
932L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_FAMILY)
933L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_MEMORY)
934L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_NODATA)
935L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_NONAME)
936L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_OVERFLOW)
937L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_PROTOCOL)
938L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_SERVICE)
939L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_SOCKTYPE)
940L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_SYSTEM)
941
942L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_ALLDONE)
943L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_CANCELED)
944L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_IDN_ENCODE)
945L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_INPROGRESS)
946L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_INTR)
947L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_NOTCANCELED)
948L_CHECKGAIERROR(GAIERRVALS, $ERRVALFILE, EAI_BADEXTFLAGS)
949
950if test x"$GAIERRVALS" = x; then
951    AC_MSG_FAILURE([error: no getaddrinfo() error symbols found])
952fi
953ERRNOCNT=`echo $GAIERRVALS | wc -w | awk '{ print $1 }'`
954
955AC_MSG_CHECKING([getaddrinfo() error symbols])
956unset UNIQUEVALS UNIQUESYMBOLS
957if test -s $ERRVALFILE; then
958    UNIQUEVALS=`sort $ERRVALFILE | uniq | wc -l | awk '{ print $1 }'`
959    if test $UNIQUEVALS -le 1; then
960        AC_MSG_FAILURE([error: getaddrinfo() error value count too low])
961    fi
962    UNIQUESYMBOLS=`cat $ERRVALFILE | wc -l | awk '{ print $1 }'`
963    if test $UNIQUESYMBOLS -le 1; then
964        AC_MSG_FAILURE([error: getaddrinfo() error symbol count too low])
965    fi
966
967    if test $ERRNOCNT -ne $UNIQUESYMBOLS; then
968	AC_MSG_FAILURE([internal error: errno symbol count mismatch])
969    fi
970    AC_DEFINE_UNQUOTED(UNIQUE_GAIERR_VALUES, $UNIQUEVALS,
971	[Number of unique getaddrinfo() error numbers])
972    AC_MSG_RESULT([unique symbols: $UNIQUESYMBOLS, unique values: $UNIQUEVALS])
973else
974    AC_MSG_FAILURE([error: unable to determine getaddrinfo() error symbol values])
975fi
976
977changequote(<<, >>)dnl
978echo "" >>$ERRNOSRC
979echo "static const errorsymboltable_t gaierrsymbolv[] = {" >>$ERRNOSRC
980changequote([, ])dnl
981
982#generic list
983for errno in $GAIERRVALS; do
984    echo "   { \"$errno\",	$errno	}," >>$ERRNOSRC
985done
986
987#keyword alias list
988maxaliaslen=0 #highest number of values for an alias
989
990#error values that can match 'foo' keyword (if found on platform)
991ERRNO_foo="..."
992keyword="foo"
993keycnt=0
994for keyval in ${ERRNO_foo}; do
995    for errno in $GAIERRVALS; do
996	if test x"$keyval" = x"$errno"; then
997	    echo "   { \"$keyword\",	$errno	}," >>$ERRNOSRC
998	    keycnt=`expr $keycnt + 1`
999	fi
1000    done
1001done
1002
1003#any-error; alias for all values
1004keyword="dns-any"
1005keycnt=0
1006for errno in $GAIERRVALS; do
1007    echo "   { \"$keyword\",	$errno	}," >>$ERRNOSRC
1008    keycnt=`expr $keycnt + 1`
1009done
1010
1011if test $keycnt -gt $maxaliaslen; then
1012    maxaliaslen=$keycnt
1013fi
1014
1015echo "};" >>$ERRNOSRC
1016
1017AC_DEFINE_UNQUOTED(MAX_GAIERR_VALUES_FOR_SYMBOL, $maxaliaslen,
1018    [Max number of gataddrinfo() error values matching any alias keyword])
1019rm -f $ERRVALFILE
1020