Browse code

work around non reentrant lresolv

git-svn: trunk@4087

aCaB authored on 2008/08/06 09:27:36
Showing 24 changed files
... ...
@@ -1,3 +1,7 @@
1
+Wed Aug  6 02:11:12 CEST 2008 (acab)
2
+------------------------------------
3
+  * build system, clamav-milter: work around for non MT lresolv (bb#1125)
4
+
1 5
 Tue Aug  5 13:14:31 CEST 2008 (acab)
2 6
 ------------------------------------
3 7
   * clamav-milter: properly wrap dns stuff (again) - bb#1125
... ...
@@ -72,7 +72,8 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
72 72
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
73 73
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
74 74
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
75
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
75
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
76
+	$(top_srcdir)/configure.in
76 77
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
77 78
 	$(ACLOCAL_M4)
78 79
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
... ...
@@ -7791,3 +7791,4 @@ m4_include([m4/acinclude.m4])
7791 7791
 m4_include([m4/fdpassing.m4])
7792 7792
 m4_include([m4/lib-link.m4])
7793 7793
 m4_include([m4/lib-prefix.m4])
7794
+m4_include([m4/resolv.m4])
... ...
@@ -177,6 +177,9 @@
177 177
 /* Define to 1 if you have the <limits.h> header file. */
178 178
 #undef HAVE_LIMITS_H
179 179
 
180
+/* Define to 1 if -lresolv provides thread safe API's like res_nquery */
181
+#undef HAVE_LRESOLV_R
182
+
180 183
 /* Define to 1 if you have the <malloc.h> header file. */
181 184
 #undef HAVE_MALLOC_H
182 185
 
... ...
@@ -58,7 +58,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in INSTALL
58 58
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
59 59
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
60 60
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
61
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
61
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
62
+	$(top_srcdir)/configure.in
62 63
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
63 64
 	$(ACLOCAL_M4)
64 65
 mkinstalldirs = $(install_sh) -d
... ...
@@ -590,11 +590,12 @@ static	table_t	*resolve(const char *host, table_t *t);
590 590
 static	int	spf(struct privdata *privdata, table_t *prevhosts);
591 591
 static	void	spf_ip(char *ip, int zero, void *v);
592 592
 
593
+pthread_mutex_t	res_pool_mutex = PTHREAD_MUTEX_INITIALIZER;
594
+
595
+#ifdef HAVE_LRESOLV_R
593 596
 res_state res_pool;
594 597
 uint8_t *res_pool_state;
595 598
 pthread_cond_t res_pool_cond = PTHREAD_COND_INITIALIZER;
596
-pthread_mutex_t	res_pool_mutex = PTHREAD_MUTEX_INITIALIZER;
597
-
598 599
 
599 600
 int safe_res_query(const char *d, int c, int t, u_char *a, int l) {
600 601
 	int i = -1, ret;
... ...
@@ -620,7 +621,20 @@ int safe_res_query(const char *d, int c, int t, u_char *a, int l) {
620 620
 	pthread_cond_signal(&res_pool_cond);
621 621
 	pthread_mutex_unlock(&res_pool_mutex);
622 622
 	return ret;
623
-} 
623
+}
624
+
625
+#else /* !HAVE_LRESOLV_R - non thread safe resolver (old bsd's) */
626
+
627
+int safe_res_query(const char *d, int c, int t, u_char *a, int l) {
628
+	int ret;
629
+	pthread_mutex_lock(&res_pool_mutex);
630
+	ret = res_query(d, c, t, a, l);
631
+	pthread_mutex_unlock(&res_pool_mutex);
632
+	return ret;
633
+}
634
+
635
+#endif /* HAVE_LRESOLV_R */
636
+
624 637
 #endif /* HAVE_RESOLV_H */
625 638
 
626 639
 static void
... ...
@@ -1393,7 +1407,7 @@ main(int argc, char **argv)
1393 1393
 	if((max_children == 0) && ((cpt = cfgopt(copt, "MaxThreads")) != NULL))
1394 1394
 		max_children = cfgopt(copt, "MaxThreads")->numarg;
1395 1395
 
1396
-#ifdef HAVE_RESOLV_H
1396
+#ifdef HAVE_LRESOLV_R
1397 1397
 	/* allocate a pool of resolvers */
1398 1398
 	if(!(res_pool=cli_calloc(max_children+1, sizeof(*res_pool))))
1399 1399
 		return EX_OSERR;
... ...
@@ -57,7 +57,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
57 57
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
58 58
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
59 59
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
60
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
60
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
61
+	$(top_srcdir)/configure.in
61 62
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
62 63
 	$(ACLOCAL_M4)
63 64
 mkinstalldirs = $(install_sh) -d
... ...
@@ -57,7 +57,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
57 57
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
58 58
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
59 59
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
60
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
60
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
61
+	$(top_srcdir)/configure.in
61 62
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
62 63
 	$(ACLOCAL_M4)
63 64
 mkinstalldirs = $(install_sh) -d
... ...
@@ -57,7 +57,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
57 57
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
58 58
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
59 59
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
60
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
60
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
61
+	$(top_srcdir)/configure.in
61 62
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
62 63
 	$(ACLOCAL_M4)
63 64
 mkinstalldirs = $(install_sh) -d
... ...
@@ -58,7 +58,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
58 58
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
59 59
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
60 60
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
61
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
61
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
62
+	$(top_srcdir)/configure.in
62 63
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
63 64
 	$(ACLOCAL_M4)
64 65
 mkinstalldirs = $(install_sh) -d
... ...
@@ -15350,6 +15350,8 @@ _ACEOF
15350 15350
     fi
15351 15351
 fi
15352 15352
 
15353
+
15354
+
15353 15355
 # Check whether --enable-dns was given.
15354 15356
 if test "${enable_dns+set}" = set; then
15355 15357
   enableval=$enable_dns; want_dns=$enableval
... ...
@@ -15359,43 +15361,33 @@ else
15359 15359
 fi
15360 15360
 
15361 15361
 if test $want_dns = yes; then
15362
-    { echo "$as_me:$LINENO: checking for __dn_expand in -lresolv" >&5
15363
-echo $ECHO_N "checking for __dn_expand in -lresolv... $ECHO_C" >&6; }
15364
-if test "${ac_cv_lib_resolv___dn_expand+set}" = set; then
15362
+    { echo "$as_me:$LINENO: checking for resolv.h" >&5
15363
+echo $ECHO_N "checking for resolv.h... $ECHO_C" >&6; }
15364
+if test "${ac_cv_header_resolv_h+set}" = set; then
15365 15365
   echo $ECHO_N "(cached) $ECHO_C" >&6
15366 15366
 else
15367
-  ac_check_lib_save_LIBS=$LIBS
15368
-LIBS="-lresolv  $LIBS"
15369
-cat >conftest.$ac_ext <<_ACEOF
15367
+  cat >conftest.$ac_ext <<_ACEOF
15370 15368
 /* confdefs.h.  */
15371 15369
 _ACEOF
15372 15370
 cat confdefs.h >>conftest.$ac_ext
15373 15371
 cat >>conftest.$ac_ext <<_ACEOF
15374 15372
 /* end confdefs.h.  */
15375 15373
 
15376
-/* Override any GCC internal prototype to avoid an error.
15377
-   Use char because int might match the return type of a GCC
15378
-   builtin and then its argument prototype would still apply.  */
15379
-#ifdef __cplusplus
15380
-extern "C"
15381
-#endif
15382
-char __dn_expand ();
15383
-int
15384
-main ()
15385
-{
15386
-return __dn_expand ();
15387
-  ;
15388
-  return 0;
15389
-}
15374
+#include <sys/types.h>
15375
+#include <netinet/in.h>
15376
+#include <arpa/nameser.h>
15377
+
15378
+
15379
+#include <resolv.h>
15390 15380
 _ACEOF
15391
-rm -f conftest.$ac_objext conftest$ac_exeext
15392
-if { (ac_try="$ac_link"
15381
+rm -f conftest.$ac_objext
15382
+if { (ac_try="$ac_compile"
15393 15383
 case "(($ac_try" in
15394 15384
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
15395 15385
   *) ac_try_echo=$ac_try;;
15396 15386
 esac
15397 15387
 eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
15398
-  (eval "$ac_link") 2>conftest.er1
15388
+  (eval "$ac_compile") 2>conftest.er1
15399 15389
   ac_status=$?
15400 15390
   grep -v '^ *+' conftest.er1 >conftest.err
15401 15391
   rm -f conftest.er1
... ...
@@ -15404,55 +15396,38 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
15404 15404
   (exit $ac_status); } && {
15405 15405
 	 test -z "$ac_c_werror_flag" ||
15406 15406
 	 test ! -s conftest.err
15407
-       } && test -s conftest$ac_exeext &&
15408
-       $as_test_x conftest$ac_exeext; then
15409
-  ac_cv_lib_resolv___dn_expand=yes
15407
+       } && test -s conftest.$ac_objext; then
15408
+  ac_cv_header_resolv_h=yes
15410 15409
 else
15411 15410
   echo "$as_me: failed program was:" >&5
15412 15411
 sed 's/^/| /' conftest.$ac_ext >&5
15413 15412
 
15414
-	ac_cv_lib_resolv___dn_expand=no
15413
+	ac_cv_header_resolv_h=no
15415 15414
 fi
15416 15415
 
15417
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
15418
-      conftest$ac_exeext conftest.$ac_ext
15419
-LIBS=$ac_check_lib_save_LIBS
15420
-fi
15421
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_resolv___dn_expand" >&5
15422
-echo "${ECHO_T}$ac_cv_lib_resolv___dn_expand" >&6; }
15423
-if test $ac_cv_lib_resolv___dn_expand = yes; then
15424
-  resolv_lib="-lresolv"
15416
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
15425 15417
 fi
15418
+{ echo "$as_me:$LINENO: result: $ac_cv_header_resolv_h" >&5
15419
+echo "${ECHO_T}$ac_cv_header_resolv_h" >&6; }
15420
+if test $ac_cv_header_resolv_h = yes; then
15426 15421
 
15427
-    if test -z "$resolv_lib"; then
15428
-	{ echo "$as_me:$LINENO: checking for dn_expand in -lresolv" >&5
15422
+	    bklibs=$LIBS;
15423
+	    LIBS=-lresolv;
15424
+	    { echo "$as_me:$LINENO: checking for dn_expand in -lresolv" >&5
15429 15425
 echo $ECHO_N "checking for dn_expand in -lresolv... $ECHO_C" >&6; }
15430
-if test "${ac_cv_lib_resolv_dn_expand+set}" = set; then
15426
+if test "${ac_cv_have_lresolv+set}" = set; then
15431 15427
   echo $ECHO_N "(cached) $ECHO_C" >&6
15432 15428
 else
15433
-  ac_check_lib_save_LIBS=$LIBS
15434
-LIBS="-lresolv  $LIBS"
15435
-cat >conftest.$ac_ext <<_ACEOF
15436
-/* confdefs.h.  */
15437
-_ACEOF
15438
-cat confdefs.h >>conftest.$ac_ext
15439
-cat >>conftest.$ac_ext <<_ACEOF
15440
-/* end confdefs.h.  */
15441 15429
 
15442
-/* Override any GCC internal prototype to avoid an error.
15443
-   Use char because int might match the return type of a GCC
15444
-   builtin and then its argument prototype would still apply.  */
15445
-#ifdef __cplusplus
15446
-extern "C"
15447
-#endif
15448
-char dn_expand ();
15449
-int
15450
-main ()
15451
-{
15452
-return dn_expand ();
15453
-  ;
15454
-  return 0;
15455
-}
15430
+	        ac_cv_have_lresolv=no;
15431
+		cat >conftest.$ac_ext <<_ACEOF
15432
+
15433
+#include <sys/types.h>
15434
+#include <netinet/in.h>
15435
+#include <arpa/nameser.h>
15436
+#include <resolv.h>
15437
+int main() { return (int)dn_expand; }
15438
+
15456 15439
 _ACEOF
15457 15440
 rm -f conftest.$ac_objext conftest$ac_exeext
15458 15441
 if { (ac_try="$ac_link"
... ...
@@ -15472,52 +15447,61 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
15472 15472
 	 test ! -s conftest.err
15473 15473
        } && test -s conftest$ac_exeext &&
15474 15474
        $as_test_x conftest$ac_exeext; then
15475
-  ac_cv_lib_resolv_dn_expand=yes
15475
+
15476
+		    ac_cv_have_lresolv=yes;
15477
+
15476 15478
 else
15477 15479
   echo "$as_me: failed program was:" >&5
15478 15480
 sed 's/^/| /' conftest.$ac_ext >&5
15479 15481
 
15480
-	ac_cv_lib_resolv_dn_expand=no
15482
+
15481 15483
 fi
15482 15484
 
15483 15485
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
15484 15486
       conftest$ac_exeext conftest.$ac_ext
15485
-LIBS=$ac_check_lib_save_LIBS
15487
+
15486 15488
 fi
15487
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_dn_expand" >&5
15488
-echo "${ECHO_T}$ac_cv_lib_resolv_dn_expand" >&6; }
15489
-if test $ac_cv_lib_resolv_dn_expand = yes; then
15490
-  resolv_lib="-lresolv"
15489
+{ echo "$as_me:$LINENO: result: $ac_cv_have_lresolv" >&5
15490
+echo "${ECHO_T}$ac_cv_have_lresolv" >&6; }
15491
+	    LIBS=$bklibs;
15492
+
15491 15493
 fi
15492 15494
 
15493
-    fi
15494
-    { echo "$as_me:$LINENO: checking for resolv.h" >&5
15495
-echo $ECHO_N "checking for resolv.h... $ECHO_C" >&6; }
15496
-if test "${ac_cv_header_resolv_h+set}" = set; then
15495
+
15496
+    if test "x$ac_cv_have_lresolv" = "xyes"; then
15497
+    	FRESHCLAM_LIBS="$FRESHCLAM_LIBS -lresolv";
15498
+	CLAMAV_MILTER_LIBS="$CLAMAV_MILTER_LIBS -lresolv";
15499
+	bklibs=$LIBS;
15500
+	LIBS=-lresolv;
15501
+
15502
+cat >>confdefs.h <<\_ACEOF
15503
+#define HAVE_RESOLV_H 1
15504
+_ACEOF
15505
+
15506
+	{ echo "$as_me:$LINENO: checking for res_nquery in -lresolv" >&5
15507
+echo $ECHO_N "checking for res_nquery in -lresolv... $ECHO_C" >&6; }
15508
+if test "${ac_cv_have_lresolv_r+set}" = set; then
15497 15509
   echo $ECHO_N "(cached) $ECHO_C" >&6
15498 15510
 else
15499
-  cat >conftest.$ac_ext <<_ACEOF
15500
-/* confdefs.h.  */
15501
-_ACEOF
15502
-cat confdefs.h >>conftest.$ac_ext
15503
-cat >>conftest.$ac_ext <<_ACEOF
15504
-/* end confdefs.h.  */
15511
+
15512
+	    ac_cv_have_lresolv_r=no;
15513
+	    cat >conftest.$ac_ext <<_ACEOF
15505 15514
 
15506 15515
 #include <sys/types.h>
15507 15516
 #include <netinet/in.h>
15508 15517
 #include <arpa/nameser.h>
15509
-
15510
-
15511 15518
 #include <resolv.h>
15519
+int main() { return (int)res_nquery; }
15520
+
15512 15521
 _ACEOF
15513
-rm -f conftest.$ac_objext
15514
-if { (ac_try="$ac_compile"
15522
+rm -f conftest.$ac_objext conftest$ac_exeext
15523
+if { (ac_try="$ac_link"
15515 15524
 case "(($ac_try" in
15516 15525
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
15517 15526
   *) ac_try_echo=$ac_try;;
15518 15527
 esac
15519 15528
 eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
15520
-  (eval "$ac_compile") 2>conftest.er1
15529
+  (eval "$ac_link") 2>conftest.er1
15521 15530
   ac_status=$?
15522 15531
   grep -v '^ *+' conftest.er1 >conftest.err
15523 15532
   rm -f conftest.er1
... ...
@@ -15526,32 +15510,39 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
15526 15526
   (exit $ac_status); } && {
15527 15527
 	 test -z "$ac_c_werror_flag" ||
15528 15528
 	 test ! -s conftest.err
15529
-       } && test -s conftest.$ac_objext; then
15530
-  ac_cv_header_resolv_h=yes
15529
+       } && test -s conftest$ac_exeext &&
15530
+       $as_test_x conftest$ac_exeext; then
15531
+
15532
+	        ac_cv_have_lresolv_r=yes;
15533
+
15531 15534
 else
15532 15535
   echo "$as_me: failed program was:" >&5
15533 15536
 sed 's/^/| /' conftest.$ac_ext >&5
15534 15537
 
15535
-	ac_cv_header_resolv_h=no
15538
+
15536 15539
 fi
15537 15540
 
15538
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
15541
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
15542
+      conftest$ac_exeext conftest.$ac_ext,
15543
+
15539 15544
 fi
15540
-{ echo "$as_me:$LINENO: result: $ac_cv_header_resolv_h" >&5
15541
-echo "${ECHO_T}$ac_cv_header_resolv_h" >&6; }
15542
-if test $ac_cv_header_resolv_h = yes; then
15543
-  FRESHCLAM_LIBS="$FRESHCLAM_LIBS $resolv_lib"; CLAMAV_MILTER_LIBS="$CLAMAV_MILTER_LIBS $resolv_lib";
15545
+{ echo "$as_me:$LINENO: result: $ac_cv_have_lresolv_r" >&5
15546
+echo "${ECHO_T}$ac_cv_have_lresolv_r" >&6; }
15547
+	LIBS=$bklibs;
15548
+	if test "x$ac_cv_have_lresolv_r" = "xyes"; then
15549
+
15544 15550
 cat >>confdefs.h <<\_ACEOF
15545
-#define HAVE_RESOLV_H 1
15551
+#define HAVE_LRESOLV_R 1
15546 15552
 _ACEOF
15547 15553
 
15548
-else
15549
-  { echo "$as_me:$LINENO: WARNING: ****** DNS support disabled" >&5
15554
+	fi
15555
+    else
15556
+	{ echo "$as_me:$LINENO: WARNING: ****** DNS support disabled" >&5
15550 15557
 echo "$as_me: WARNING: ****** DNS support disabled" >&2;}
15558
+    fi
15551 15559
 fi
15552 15560
 
15553 15561
 
15554
-fi
15555 15562
 
15556 15563
 # Check whether --enable-clamuko was given.
15557 15564
 if test "${enable_clamuko+set}" = set; then
... ...
@@ -15803,6 +15794,10 @@ cat >>confdefs.h <<_ACEOF
15803 15803
 _ACEOF
15804 15804
 
15805 15805
   fi
15806
+  if test "x$ac_cv_have_lresolv_r" != "xyes"; then
15807
+    { echo "$as_me:$LINENO: WARNING: ****** Your libresolv is not thread safe, SPF queries in clamav-milter will block" >&5
15808
+echo "$as_me: WARNING: ****** Your libresolv is not thread safe, SPF queries in clamav-milter will block" >&2;}
15809
+  fi
15806 15810
 fi
15807 15811
 
15808 15812
 # Check whether --enable-dsig was given.
... ...
@@ -520,21 +520,7 @@ then
520 520
     fi
521 521
 fi
522 522
 
523
-AC_ARG_ENABLE([dns],
524
-    AC_HELP_STRING([--disable-dns], [disable support for database verification through DNS]),
525
-    [want_dns=$enableval], [want_dns=yes]
526
-)
527
-if test $want_dns = yes; then
528
-    AC_CHECK_LIB([resolv], [__dn_expand], [resolv_lib="-lresolv"],)
529
-    if test -z "$resolv_lib"; then
530
-	AC_CHECK_LIB([resolv], [dn_expand], [resolv_lib="-lresolv"],)
531
-    fi
532
-    AC_CHECK_HEADER([resolv.h],[FRESHCLAM_LIBS="$FRESHCLAM_LIBS $resolv_lib"; CLAMAV_MILTER_LIBS="$CLAMAV_MILTER_LIBS $resolv_lib"; AC_DEFINE([HAVE_RESOLV_H],1,[have resolv.h])], AC_MSG_WARN([****** DNS support disabled]), [
533
-#include <sys/types.h>
534
-#include <netinet/in.h>
535
-#include <arpa/nameser.h>
536
-])
537
-fi
523
+AC_C_DNS
538 524
 
539 525
 AC_ARG_ENABLE([clamuko],
540 526
 [  --disable-clamuko	  disable clamuko support (Linux, DragonFly and FreeBSD only)],
... ...
@@ -593,6 +579,9 @@ if test "$have_milter" = "yes"; then
593 593
     AC_DEFINE_UNQUOTED([SENDMAIL_VERSION_B], $sendmailver_b, [minor version of Sendmail])
594 594
     AC_DEFINE_UNQUOTED([SENDMAIL_VERSION_C], $sendmailver_c, [subversion of Sendmail])
595 595
   fi
596
+  if test "x$ac_cv_have_lresolv_r" != "xyes"; then
597
+    AC_MSG_WARN([****** Your libresolv is not thread safe, SPF queries in clamav-milter will block])
598
+  fi
596 599
 fi
597 600
 
598 601
 AC_ARG_ENABLE([dsig],
... ...
@@ -56,7 +56,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
56 56
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
57 57
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
58 58
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
59
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
59
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
60
+	$(top_srcdir)/configure.in
60 61
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 62
 	$(ACLOCAL_M4)
62 63
 mkinstalldirs = $(install_sh) -d
... ...
@@ -55,7 +55,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
55 55
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
56 56
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
57 57
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
58
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
58
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
59
+	$(top_srcdir)/configure.in
59 60
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
60 61
 	$(ACLOCAL_M4)
61 62
 mkinstalldirs = $(install_sh) -d
... ...
@@ -55,7 +55,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
55 55
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
56 56
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
57 57
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
58
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
58
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
59
+	$(top_srcdir)/configure.in
59 60
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
60 61
 	$(ACLOCAL_M4)
61 62
 mkinstalldirs = $(install_sh) -d
... ...
@@ -58,7 +58,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
58 58
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
59 59
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
60 60
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
61
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
61
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
62
+	$(top_srcdir)/configure.in
62 63
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
63 64
 	$(ACLOCAL_M4)
64 65
 mkinstalldirs = $(install_sh) -d
... ...
@@ -59,7 +59,8 @@ DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
59 59
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
60 60
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
61 61
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
62
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
62
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
63
+	$(top_srcdir)/configure.in
63 64
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
64 65
 	$(ACLOCAL_M4)
65 66
 mkinstalldirs = $(install_sh) -d
... ...
@@ -57,7 +57,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
57 57
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
58 58
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
59 59
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
60
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
60
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
61
+	$(top_srcdir)/configure.in
61 62
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
62 63
 	$(ACLOCAL_M4)
63 64
 mkinstalldirs = $(install_sh) -d
... ...
@@ -43,7 +43,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
43 43
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
44 44
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
45 45
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
46
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
46
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
47
+	$(top_srcdir)/configure.in
47 48
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
48 49
 	$(ACLOCAL_M4)
49 50
 mkinstalldirs = $(install_sh) -d
... ...
@@ -43,7 +43,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
43 43
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
44 44
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
45 45
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
46
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
46
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
47
+	$(top_srcdir)/configure.in
47 48
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
48 49
 	$(ACLOCAL_M4)
49 50
 mkinstalldirs = $(install_sh) -d
50 51
new file mode 100644
... ...
@@ -0,0 +1,70 @@
0
+dnl AC_C_DNS
1
+dnl Checks resolv.h presence and usability
2
+dnl Checks for specific lresolv exports
3
+dnl Checks for lresolve reentrance
4
+dnl
5
+dnl Note using AC_LINK_IFELSE instead of AC_CHECK_LIB
6
+dnl as symbols are often redefined in resolv.h
7
+
8
+AC_DEFUN([AC_C_DNS], [
9
+
10
+AC_ARG_ENABLE([dns],
11
+    AC_HELP_STRING([--disable-dns], [disable support for database verification through DNS]),
12
+    [want_dns=$enableval], [want_dns=yes]
13
+)
14
+if test $want_dns = yes; then
15
+    AC_CHECK_HEADER([resolv.h],
16
+	[
17
+	    bklibs=$LIBS;
18
+	    LIBS=-lresolv;
19
+	    AC_CACHE_CHECK([for dn_expand in -lresolv], [ac_cv_have_lresolv], [
20
+	        ac_cv_have_lresolv=no;
21
+		AC_LINK_IFELSE([
22
+#include <sys/types.h>
23
+#include <netinet/in.h>
24
+#include <arpa/nameser.h>
25
+#include <resolv.h>
26
+int main() { return (int)dn_expand; }
27
+    	     	],
28
+		[
29
+		    ac_cv_have_lresolv=yes;
30
+		])
31
+	    ])
32
+	    LIBS=$bklibs;
33
+	],
34
+	[],
35
+	[
36
+#include <sys/types.h>
37
+#include <netinet/in.h>
38
+#include <arpa/nameser.h>
39
+    ])
40
+    if test "x$ac_cv_have_lresolv" = "xyes"; then
41
+    	FRESHCLAM_LIBS="$FRESHCLAM_LIBS -lresolv";
42
+	CLAMAV_MILTER_LIBS="$CLAMAV_MILTER_LIBS -lresolv";
43
+	bklibs=$LIBS;
44
+	LIBS=-lresolv;
45
+	AC_DEFINE([HAVE_RESOLV_H],1,[have resolv.h])
46
+	AC_CACHE_CHECK([for res_nquery in -lresolv], [ac_cv_have_lresolv_r], [
47
+	    ac_cv_have_lresolv_r=no;
48
+	    AC_LINK_IFELSE([
49
+#include <sys/types.h>
50
+#include <netinet/in.h>
51
+#include <arpa/nameser.h>
52
+#include <resolv.h>
53
+int main() { return (int)res_nquery; }
54
+    	    ],
55
+	    [
56
+	        ac_cv_have_lresolv_r=yes;
57
+	    ]),
58
+	])
59
+	LIBS=$bklibs;
60
+	if test "x$ac_cv_have_lresolv_r" = "xyes"; then
61
+	    AC_DEFINE([HAVE_LRESOLV_R],1,[Define to 1 if -lresolv provides thread safe API's like res_nquery])
62
+	fi
63
+    else
64
+	AC_MSG_WARN([****** DNS support disabled])
65
+    fi
66
+fi
67
+
68
+])
69
+
... ...
@@ -57,7 +57,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
57 57
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
58 58
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
59 59
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
60
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
60
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
61
+	$(top_srcdir)/configure.in
61 62
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
62 63
 	$(ACLOCAL_M4)
63 64
 mkinstalldirs = $(install_sh) -d
... ...
@@ -37,7 +37,8 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
37 37
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
38 38
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
39 39
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
40
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
40
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
41
+	$(top_srcdir)/configure.in
41 42
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
42 43
 	$(ACLOCAL_M4)
43 44
 mkinstalldirs = $(install_sh) -d
... ...
@@ -43,7 +43,8 @@ DIST_COMMON = $(am__dist_bin_SCRIPTS_DIST) $(srcdir)/Makefile.am \
43 43
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
44 44
 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \
45 45
 	$(top_srcdir)/m4/fdpassing.m4 $(top_srcdir)/m4/lib-link.m4 \
46
-	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/configure.in
46
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/resolv.m4 \
47
+	$(top_srcdir)/configure.in
47 48
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
48 49
 	$(ACLOCAL_M4)
49 50
 mkinstalldirs = $(install_sh) -d