From 54b33493441870a09efe4e28dad9ae30f327afac Mon Sep 17 00:00:00 2001 From: Nathan Freitas Date: Wed, 29 Jun 2016 09:54:03 -0400 Subject: [PATCH] remove redundant code from old ant build format (not in gradle modules) --- assets/bridges.txt | 22 - jni/Android.mk | 145 - jni/Application.mk | 4 - jni/libancillary/API | 139 - jni/libancillary/COPYING | 21 - jni/libancillary/Makefile | 73 - jni/libancillary/ancillary.h | 131 - jni/libancillary/fd_recv.c | 98 - jni/libancillary/fd_send.c | 92 - jni/libancillary/test.c | 112 - jni/pdnsd/AUTHORS | 58 - jni/pdnsd/COPYING | 674 - jni/pdnsd/COPYING.BSD | 26 - jni/pdnsd/ChangeLog | 3304 ----- jni/pdnsd/ChangeLog.old | 161 - jni/pdnsd/INSTALL | 190 - jni/pdnsd/Makefile.am | 40 - jni/pdnsd/Makefile.in | 734 - jni/pdnsd/NEWS | 324 - jni/pdnsd/PKGBUILD.in | 24 - jni/pdnsd/README | 22 - jni/pdnsd/README.par | 216 - jni/pdnsd/README.par.old | 249 - jni/pdnsd/THANKS | 66 - jni/pdnsd/TODO | 20 - jni/pdnsd/acconfig.h | 191 - jni/pdnsd/aclocal.m4 | 1021 -- jni/pdnsd/compile | 142 - jni/pdnsd/config.h | 437 - jni/pdnsd/config.h.in | 430 - jni/pdnsd/configure | 11389 ---------------- jni/pdnsd/configure.in | 548 - jni/pdnsd/contrib/Makefile.am | 2 - jni/pdnsd/contrib/Makefile.in | 323 - jni/pdnsd/contrib/README | 30 - jni/pdnsd/contrib/change_pdnsd_server_ip.pl | 124 - jni/pdnsd/contrib/dhcp2pdnsd | 45 - jni/pdnsd/contrib/pdnsd_dhcp.pl | 246 - jni/pdnsd/depcomp | 530 - jni/pdnsd/doc/Makefile.am | 28 - jni/pdnsd/doc/Makefile.in | 483 - jni/pdnsd/doc/doc_makefile | 38 - jni/pdnsd/doc/html/dl.html | 96 - jni/pdnsd/doc/html/dl.html.in | 96 - jni/pdnsd/doc/html/doc.html | 2630 ---- jni/pdnsd/doc/html/doc_makefile | 23 - jni/pdnsd/doc/html/faq.html | 412 - jni/pdnsd/doc/html/htmlsubst.pl | 36 - jni/pdnsd/doc/html/index.html | 686 - jni/pdnsd/doc/html2confman.pl | 161 - jni/pdnsd/doc/pdnsd-ctl.8 | 198 - jni/pdnsd/doc/pdnsd.8.in | 326 - jni/pdnsd/doc/pdnsd.conf.5.in | 1328 -- jni/pdnsd/doc/pdnsd.conf.in | 143 - jni/pdnsd/doc/txt/doc_makefile | 21 - jni/pdnsd/doc/txt/faq.txt | 227 - jni/pdnsd/doc/txt/intro.txt | 305 - jni/pdnsd/doc/txt/manual.txt | 2017 --- jni/pdnsd/file-list.base.in | 5 - jni/pdnsd/install-sh | 323 - jni/pdnsd/missing | 360 - jni/pdnsd/pdnsd.spec.in | 244 - jni/pdnsd/src/Makefile.am | 24 - jni/pdnsd/src/Makefile.in | 921 -- jni/pdnsd/src/cache.c | 2731 ---- jni/pdnsd/src/cache.h | 306 - jni/pdnsd/src/conf-keywords.h | 238 - jni/pdnsd/src/conf-parser.c | 2118 --- jni/pdnsd/src/conf-parser.h | 29 - jni/pdnsd/src/conff.c | 544 - jni/pdnsd/src/conff.h | 190 - jni/pdnsd/src/consts.c | 133 - jni/pdnsd/src/consts.h | 69 - jni/pdnsd/src/debug.c | 64 - jni/pdnsd/src/debug.h | 52 - jni/pdnsd/src/dns.c | 617 - jni/pdnsd/src/dns.h | 309 - jni/pdnsd/src/dns_answer.c | 2170 --- jni/pdnsd/src/dns_answer.h | 40 - jni/pdnsd/src/dns_query.c | 3798 ------ jni/pdnsd/src/dns_query.h | 51 - jni/pdnsd/src/error.c | 142 - jni/pdnsd/src/error.h | 115 - jni/pdnsd/src/freebsd_netinet_ip_icmp.h | 187 - jni/pdnsd/src/hash.c | 322 - jni/pdnsd/src/hash.h | 83 - jni/pdnsd/src/helpers.c | 795 -- jni/pdnsd/src/helpers.h | 319 - jni/pdnsd/src/icmp.c | 544 - jni/pdnsd/src/icmp.h | 43 - jni/pdnsd/src/ipvers.h | 297 - jni/pdnsd/src/list.c | 171 - jni/pdnsd/src/list.h | 170 - jni/pdnsd/src/main.c | 710 - jni/pdnsd/src/make_rr_types_h.pl | 309 - jni/pdnsd/src/netdev.c | 363 - jni/pdnsd/src/netdev.h | 32 - jni/pdnsd/src/pdnsd-ctl/Makefile.am | 18 - jni/pdnsd/src/pdnsd-ctl/Makefile.in | 470 - jni/pdnsd/src/pdnsd-ctl/pdnsd-ctl.c | 799 -- jni/pdnsd/src/pdnsd_assert.h | 51 - jni/pdnsd/src/rc/ArchLinux/Makefile.am | 7 - jni/pdnsd/src/rc/ArchLinux/Makefile.in | 332 - jni/pdnsd/src/rc/ArchLinux/pdnsd.in | 45 - jni/pdnsd/src/rc/Debian/Makefile.am | 8 - jni/pdnsd/src/rc/Debian/Makefile.in | 334 - jni/pdnsd/src/rc/Debian/pdnsd.in | 52 - jni/pdnsd/src/rc/Makefile.am | 5 - jni/pdnsd/src/rc/Makefile.in | 526 - jni/pdnsd/src/rc/README | 104 - jni/pdnsd/src/rc/RedHat/Makefile.am | 12 - jni/pdnsd/src/rc/RedHat/Makefile.in | 337 - jni/pdnsd/src/rc/RedHat/pdnsd.in | 88 - jni/pdnsd/src/rc/Slackware/Makefile.am | 3 - jni/pdnsd/src/rc/Slackware/Makefile.in | 330 - jni/pdnsd/src/rc/Slackware/rc.pdnsd.in | 74 - jni/pdnsd/src/rc/SuSE/Makefile.am | 22 - jni/pdnsd/src/rc/SuSE/Makefile.in | 345 - jni/pdnsd/src/rc/SuSE/pdnsd.in | 68 - jni/pdnsd/src/rr_types.c | 172 - jni/pdnsd/src/rr_types.h | 536 - jni/pdnsd/src/rr_types.in | 99 - jni/pdnsd/src/servers.c | 856 -- jni/pdnsd/src/servers.h | 68 - jni/pdnsd/src/sort_namevalues.pl | 25 - jni/pdnsd/src/status.c | 824 -- jni/pdnsd/src/status.h | 59 - jni/pdnsd/src/test/Makefile.am | 35 - jni/pdnsd/src/test/Makefile.in | 464 - jni/pdnsd/src/test/if_up.c | 36 - jni/pdnsd/src/test/is_local_addr.c | 57 - jni/pdnsd/src/test/random.c | 33 - jni/pdnsd/src/test/tping.c | 59 - jni/pdnsd/src/thread.c | 85 - jni/pdnsd/src/thread.h | 143 - jni/pdnsd/version | 1 - libs/android-support-v4.jar | Bin 1364299 -> 0 bytes res/drawable-hdpi-v11/ic_stat_notifyerr.png | Bin 480 -> 0 bytes res/drawable-hdpi-v11/ic_stat_tor.png | Bin 802 -> 0 bytes res/drawable-hdpi-v11/ic_stat_tor_off.png | Bin 744 -> 0 bytes res/drawable-hdpi-v11/ic_stat_tor_xfer.png | Bin 967 -> 0 bytes res/drawable-hdpi-v11/inverse.png | Bin 1027 -> 0 bytes res/drawable-hdpi-v9/ic_stat_notifyerr.png | Bin 616 -> 0 bytes res/drawable-hdpi-v9/ic_stat_tor.png | Bin 713 -> 0 bytes res/drawable-hdpi-v9/inverse.png | Bin 1027 -> 0 bytes res/drawable-hdpi/ic_action_settings.png | Bin 553 -> 0 bytes res/drawable-hdpi/ic_launcher.png | Bin 4194 -> 0 bytes res/drawable-hdpi/ic_stat_notifyerr.png | Bin 1312 -> 0 bytes res/drawable-hdpi/ic_stat_tor.png | Bin 852 -> 0 bytes res/drawable-hdpi/ic_stat_tor_xfer.png | Bin 990 -> 0 bytes res/drawable-hdpi/inverse.png | Bin 1027 -> 0 bytes res/drawable-ldpi-v11/ic_stat_notifyerr.png | Bin 294 -> 0 bytes res/drawable-ldpi-v11/ic_stat_tor.png | Bin 390 -> 0 bytes res/drawable-ldpi-v11/inverse.png | Bin 1027 -> 0 bytes res/drawable-ldpi-v9/ic_stat_notifyerr.png | Bin 342 -> 0 bytes res/drawable-ldpi-v9/ic_stat_tor.png | Bin 358 -> 0 bytes res/drawable-ldpi-v9/inverse.png | Bin 1027 -> 0 bytes res/drawable-ldpi/ic_action_settings.png | Bin 319 -> 0 bytes res/drawable-ldpi/ic_launcher.png | Bin 2852 -> 0 bytes res/drawable-ldpi/ic_stat_notifyerr.png | Bin 647 -> 0 bytes res/drawable-ldpi/ic_stat_tor.png | Bin 606 -> 0 bytes res/drawable-ldpi/inverse.png | Bin 1027 -> 0 bytes res/drawable-mdpi-v11/ic_stat_notifyerr.png | Bin 357 -> 0 bytes res/drawable-mdpi-v11/ic_stat_tor.png | Bin 517 -> 0 bytes res/drawable-mdpi-v11/ic_stat_tor_xfer.png | Bin 607 -> 0 bytes res/drawable-mdpi-v11/inverse.png | Bin 1027 -> 0 bytes res/drawable-mdpi-v9/ic_stat_notifyerr.png | Bin 458 -> 0 bytes res/drawable-mdpi-v9/ic_stat_tor.png | Bin 475 -> 0 bytes res/drawable-mdpi-v9/inverse.png | Bin 1027 -> 0 bytes res/drawable-mdpi/ic_action_settings.png | Bin 364 -> 0 bytes res/drawable-mdpi/ic_launcher.png | Bin 2677 -> 0 bytes res/drawable-mdpi/ic_stat_notifyerr.png | Bin 883 -> 0 bytes res/drawable-mdpi/ic_stat_tor.png | Bin 535 -> 0 bytes res/drawable-mdpi/ic_stat_tor_xfer.png | Bin 600 -> 0 bytes res/drawable-mdpi/inverse.png | Bin 1027 -> 0 bytes res/drawable-xhdpi-v11/ic_stat_notifyerr.png | Bin 618 -> 0 bytes res/drawable-xhdpi-v11/ic_stat_tor.png | Bin 1165 -> 0 bytes res/drawable-xhdpi-v11/ic_stat_tor_xfer.png | Bin 1337 -> 0 bytes res/drawable-xhdpi-v11/inverse.png | Bin 1027 -> 0 bytes res/drawable-xhdpi-v9/ic_stat_notifyerr.png | Bin 747 -> 0 bytes res/drawable-xhdpi-v9/ic_stat_tor.png | Bin 970 -> 0 bytes res/drawable-xhdpi-v9/inverse.png | Bin 1027 -> 0 bytes res/drawable-xhdpi/ic_action_settings.png | Bin 716 -> 0 bytes res/drawable-xhdpi/ic_launcher.png | Bin 5964 -> 0 bytes res/drawable-xhdpi/ic_stat_notifyerr.png | Bin 1796 -> 0 bytes res/drawable-xhdpi/ic_stat_tor.png | Bin 1161 -> 0 bytes res/drawable-xhdpi/ic_stat_tor_xfer.png | Bin 1378 -> 0 bytes res/drawable-xhdpi/inverse.png | Bin 1027 -> 0 bytes res/drawable-xxhdpi-v11/ic_stat_tor.png | Bin 1903 -> 0 bytes res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png | Bin 2019 -> 0 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 9556 -> 0 bytes res/drawable-xxhdpi/ic_stat_tor.png | Bin 1872 -> 0 bytes res/drawable-xxhdpi/ic_stat_tor_xfer.png | Bin 2216 -> 0 bytes res/drawable-xxhdpi/inverse.png | Bin 1027 -> 0 bytes res/drawable-xxxhdpi-v11/ic_stat_tor.png | Bin 2661 -> 0 bytes res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png | Bin 3156 -> 0 bytes res/drawable-xxxhdpi/ic_launcher.png | Bin 13297 -> 0 bytes res/drawable-xxxhdpi/ic_stat_tor.png | Bin 2631 -> 0 bytes res/drawable-xxxhdpi/ic_stat_tor_xfer.png | Bin 2859 -> 0 bytes res/drawable-xxxhdpi/inverse.png | Bin 1027 -> 0 bytes res/drawable/button.xml | 37 - res/drawable/button_off.xml | 37 - res/drawable/button_on.xml | 35 - res/drawable/classyfabric.png | Bin 8856 -> 0 bytes res/drawable/error.png | Bin 2922 -> 0 bytes res/drawable/ic_chatsecure.png | Bin 4013 -> 0 bytes res/drawable/ic_duckduckgo.png | Bin 5042 -> 0 bytes res/drawable/ic_launcher.png | Bin 6055 -> 0 bytes res/drawable/ic_menu_about.png | Bin 1771 -> 0 bytes res/drawable/ic_menu_exit.png | Bin 2693 -> 0 bytes res/drawable/ic_menu_goto.png | Bin 1636 -> 0 bytes res/drawable/ic_play.png | Bin 3560 -> 0 bytes res/drawable/ic_stat_tor_off.png | Bin 744 -> 0 bytes res/drawable/ic_stat_tor_xfer.png | Bin 600 -> 0 bytes res/drawable/ic_twitter.png | Bin 2797 -> 0 bytes res/drawable/icon_martus.png | Bin 6763 -> 0 bytes res/drawable/icon_orfox.png | Bin 7617 -> 0 bytes res/drawable/icon_story_maker.png | Bin 4290 -> 0 bytes res/drawable/inverse.png | Bin 1027 -> 0 bytes res/drawable/n8fr8.jpg | Bin 18062 -> 0 bytes res/drawable/oldtoroff.png | Bin 63700 -> 0 bytes res/drawable/oldtoron.png | Bin 121036 -> 0 bytes res/drawable/oldtorstarting.png | Bin 111753 -> 0 bytes res/drawable/onion32.png | Bin 1599 -> 0 bytes res/drawable/tilebg.xml | 4 - res/drawable/toggle.xml | 8 - res/drawable/tor.png | Bin 4766 -> 0 bytes res/drawable/tor25.png | Bin 2227 -> 0 bytes res/drawable/toroff.png | Bin 39556 -> 0 bytes res/drawable/toron.png | Bin 47022 -> 0 bytes res/drawable/torstarting.png | Bin 41700 -> 0 bytes .../layout_notification_expanded.xml | 123 - res/layout/layout_about.xml | 120 - res/layout/layout_apps.xml | 74 - res/layout/layout_apps_item.xml | 17 - res/layout/layout_diag.xml | 14 - res/layout/layout_help.xml | 20 - res/layout/layout_log.xml | 52 - res/layout/layout_main.xml | 244 - res/layout/layout_notification_expanded.xml | 122 - res/layout/layout_promo_apps.xml | 115 - res/layout/layout_settings.xml | 29 - res/layout/layout_vpn_setup.xml | 34 - ...notification_template_part_chronometer.xml | 25 - .../notification_template_part_time.xml | 25 - res/layout/scrollingtext_buttons_view.xml | 34 - res/menu/orbot_main.xml | 70 - res/menu/share_menu.xml | 7 - res/raw/geoip.mp3 | Bin 609031 -> 0 bytes res/raw/geoip6.mp3 | 1663 --- res/raw/pluto.properties | 3 - res/raw/torpolipo.conf | 23 - res/raw/torrc | 8 - res/values-ach/strings.xml | 12 - res/values-ar/strings.xml | 262 - res/values-az/strings.xml | 297 - res/values-bg/strings.xml | 293 - res/values-bn-rBD/strings.xml | 40 - res/values-bn-rIN/strings.xml | 12 - res/values-bn/strings.xml | 12 - res/values-brx/strings.xml | 12 - res/values-bs/strings.xml | 18 - res/values-ca/strings.xml | 226 - res/values-cs-rCZ/strings.xml | 223 - res/values-cs/strings.xml | 74 - res/values-cy/strings.xml | 81 - res/values-da/strings.xml | 203 - res/values-de-rAT/strings.xml | 12 - res/values-de/strings.xml | 293 - res/values-el/strings.xml | 208 - res/values-en-rGB/strings.xml | 13 - res/values-eo/strings.xml | 146 - res/values-es-rAR/strings.xml | 69 - res/values-es/strings.xml | 294 - res/values-et/strings.xml | 210 - res/values-eu/strings.xml | 218 - res/values-fa/strings.xml | 292 - res/values-fi/strings.xml | 278 - res/values-fr-rFR/strings.xml | 293 - res/values-fr/strings.xml | 54 - res/values-gl/strings.xml | 209 - res/values-gu-rIN/strings.xml | 14 - res/values-gu/strings.xml | 17 - res/values-he | 1 - res/values-hi/strings.xml | 26 - res/values-hr-rHR/strings.xml | 30 - res/values-hr/strings.xml | 293 - res/values-hu/strings.xml | 293 - res/values-hy-rAM/strings.xml | 12 - res/values-ia/strings.xml | 30 - res/values-id | 1 - res/values-in-rID/strings.xml | 284 - res/values-in/strings.xml | 48 - res/values-is/strings.xml | 278 - res/values-it/strings.xml | 293 - res/values-iw/strings.xml | 233 - res/values-ja/strings.xml | 293 - res/values-kn-rIN/strings.xml | 12 - res/values-kn/strings.xml | 12 - res/values-ko/strings.xml | 214 - res/values-ky/strings.xml | 21 - res/values-lt-rLT/strings.xml | 12 - res/values-lt/strings.xml | 28 - res/values-lv/strings.xml | 278 - res/values-mk/strings.xml | 278 - res/values-ml/strings.xml | 12 - res/values-mn/strings.xml | 12 - res/values-mr-rIN/strings.xml | 12 - res/values-ms-rMY/strings.xml | 196 - res/values-ms/strings.xml | 200 - res/values-my/strings.xml | 30 - res/values-nb/strings.xml | 258 - res/values-nl/strings.xml | 292 - res/values-pa/strings.xml | 19 - res/values-pl/strings.xml | 293 - res/values-ps/strings.xml | 12 - res/values-pt-rBR/strings.xml | 285 - res/values-pt-rPT/strings.xml | 14 - res/values-pt/strings.xml | 181 - res/values-ro-rRO/strings.xml | 30 - res/values-ro/strings.xml | 231 - res/values-rs-rAR/strings.xml | 58 - res/values-ru/strings.xml | 293 - res/values-si-rLK/strings.xml | 190 - res/values-sk-rSK/strings.xml | 15 - res/values-sk/strings.xml | 45 - res/values-sl/strings.xml | 79 - res/values-sn/strings.xml | 22 - res/values-sq/strings.xml | 30 - res/values-sr/strings.xml | 200 - res/values-sv/strings.xml | 293 - res/values-ta/strings.xml | 68 - res/values-th/strings.xml | 169 - res/values-tl/strings.xml | 249 - res/values-tr/strings.xml | 282 - res/values-uk/strings.xml | 278 - res/values-ur/strings.xml | 18 - res/values-uz/strings.xml | 47 - res/values-vi/strings.xml | 293 - res/values-zh-rCN/strings.xml | 298 - res/values-zh-rTW/strings.xml | 116 - res/values/arrays.xml | 16 - res/values/colors.xml | 8 - res/values/dimens.xml | 361 - res/values/pdnsd.xml | 33 - res/values/strings.xml | 339 - res/values/styles.xml | 5 - res/values/theme.xml | 8 - res/xml/preferences.xml | 269 - .../integration/android/IntentIntegrator.java | 506 - .../integration/android/IntentResult.java | 95 - src/info/guardianproject/util/Languages.java | 233 - src/net | 1 - src/org/torproject/android/OrbotApp.java | 78 - .../torproject/android/OrbotConstants.java | 37 - .../torproject/android/OrbotMainActivity.java | 1442 -- src/org/torproject/android/Prefs.java | 134 - .../android/service/DummyActivity.java | 15 - .../android/service/HiddenServiceManager.java | 25 - .../android/service/OnBootReceiver.java | 46 - .../android/service/StartTorReceiver.java | 36 - .../android/service/TorResourceInstaller.java | 372 - .../android/service/TorService.java | 2276 --- .../android/service/TorServiceConstants.java | 163 - .../android/service/TorServiceUtils.java | 188 - .../android/service/TorTransProxy.java | 763 -- .../android/service/TorrcConfig.java | 33 - src/org/torproject/android/service/Utils.java | 100 - .../android/settings/AppManager.java | 389 - .../android/settings/SettingsPreferences.java | 183 - .../android/settings/TorifiedApp.java | 139 - .../android/ui/BridgeSetupActivity.java | 5 - .../android/ui/ImageProgressView.java | 78 - .../android/ui/OrbotDiagnosticsActivity.java | 333 - .../android/ui/PromoAppsActivity.java | 215 - .../android/ui/Rotate3dAnimation.java | 76 - .../android/ui/VPNSetupActivity.java | 5 - .../android/vpn/OrbotVpnManager.java | 455 - src/org/torproject/android/vpn/Tun2Socks.java | 126 - .../android/vpn/VPNEnableActivity.java | 164 - 380 files changed, 84345 deletions(-) delete mode 100644 assets/bridges.txt delete mode 100644 jni/Android.mk delete mode 100644 jni/Application.mk delete mode 100644 jni/libancillary/API delete mode 100644 jni/libancillary/COPYING delete mode 100644 jni/libancillary/Makefile delete mode 100644 jni/libancillary/ancillary.h delete mode 100644 jni/libancillary/fd_recv.c delete mode 100644 jni/libancillary/fd_send.c delete mode 100644 jni/libancillary/test.c delete mode 100644 jni/pdnsd/AUTHORS delete mode 100644 jni/pdnsd/COPYING delete mode 100644 jni/pdnsd/COPYING.BSD delete mode 100644 jni/pdnsd/ChangeLog delete mode 100644 jni/pdnsd/ChangeLog.old delete mode 100644 jni/pdnsd/INSTALL delete mode 100644 jni/pdnsd/Makefile.am delete mode 100644 jni/pdnsd/Makefile.in delete mode 100644 jni/pdnsd/NEWS delete mode 100644 jni/pdnsd/PKGBUILD.in delete mode 100644 jni/pdnsd/README delete mode 100644 jni/pdnsd/README.par delete mode 100644 jni/pdnsd/README.par.old delete mode 100644 jni/pdnsd/THANKS delete mode 100644 jni/pdnsd/TODO delete mode 100644 jni/pdnsd/acconfig.h delete mode 100644 jni/pdnsd/aclocal.m4 delete mode 100644 jni/pdnsd/compile delete mode 100644 jni/pdnsd/config.h delete mode 100644 jni/pdnsd/config.h.in delete mode 100644 jni/pdnsd/configure delete mode 100644 jni/pdnsd/configure.in delete mode 100644 jni/pdnsd/contrib/Makefile.am delete mode 100644 jni/pdnsd/contrib/Makefile.in delete mode 100644 jni/pdnsd/contrib/README delete mode 100644 jni/pdnsd/contrib/change_pdnsd_server_ip.pl delete mode 100644 jni/pdnsd/contrib/dhcp2pdnsd delete mode 100644 jni/pdnsd/contrib/pdnsd_dhcp.pl delete mode 100644 jni/pdnsd/depcomp delete mode 100644 jni/pdnsd/doc/Makefile.am delete mode 100644 jni/pdnsd/doc/Makefile.in delete mode 100644 jni/pdnsd/doc/doc_makefile delete mode 100644 jni/pdnsd/doc/html/dl.html delete mode 100644 jni/pdnsd/doc/html/dl.html.in delete mode 100644 jni/pdnsd/doc/html/doc.html delete mode 100644 jni/pdnsd/doc/html/doc_makefile delete mode 100644 jni/pdnsd/doc/html/faq.html delete mode 100644 jni/pdnsd/doc/html/htmlsubst.pl delete mode 100644 jni/pdnsd/doc/html/index.html delete mode 100644 jni/pdnsd/doc/html2confman.pl delete mode 100644 jni/pdnsd/doc/pdnsd-ctl.8 delete mode 100644 jni/pdnsd/doc/pdnsd.8.in delete mode 100644 jni/pdnsd/doc/pdnsd.conf.5.in delete mode 100644 jni/pdnsd/doc/pdnsd.conf.in delete mode 100644 jni/pdnsd/doc/txt/doc_makefile delete mode 100644 jni/pdnsd/doc/txt/faq.txt delete mode 100644 jni/pdnsd/doc/txt/intro.txt delete mode 100644 jni/pdnsd/doc/txt/manual.txt delete mode 100644 jni/pdnsd/file-list.base.in delete mode 100644 jni/pdnsd/install-sh delete mode 100644 jni/pdnsd/missing delete mode 100644 jni/pdnsd/pdnsd.spec.in delete mode 100644 jni/pdnsd/src/Makefile.am delete mode 100644 jni/pdnsd/src/Makefile.in delete mode 100644 jni/pdnsd/src/cache.c delete mode 100644 jni/pdnsd/src/cache.h delete mode 100644 jni/pdnsd/src/conf-keywords.h delete mode 100644 jni/pdnsd/src/conf-parser.c delete mode 100644 jni/pdnsd/src/conf-parser.h delete mode 100644 jni/pdnsd/src/conff.c delete mode 100644 jni/pdnsd/src/conff.h delete mode 100644 jni/pdnsd/src/consts.c delete mode 100644 jni/pdnsd/src/consts.h delete mode 100644 jni/pdnsd/src/debug.c delete mode 100644 jni/pdnsd/src/debug.h delete mode 100644 jni/pdnsd/src/dns.c delete mode 100644 jni/pdnsd/src/dns.h delete mode 100644 jni/pdnsd/src/dns_answer.c delete mode 100644 jni/pdnsd/src/dns_answer.h delete mode 100644 jni/pdnsd/src/dns_query.c delete mode 100644 jni/pdnsd/src/dns_query.h delete mode 100644 jni/pdnsd/src/error.c delete mode 100644 jni/pdnsd/src/error.h delete mode 100644 jni/pdnsd/src/freebsd_netinet_ip_icmp.h delete mode 100644 jni/pdnsd/src/hash.c delete mode 100644 jni/pdnsd/src/hash.h delete mode 100644 jni/pdnsd/src/helpers.c delete mode 100644 jni/pdnsd/src/helpers.h delete mode 100644 jni/pdnsd/src/icmp.c delete mode 100644 jni/pdnsd/src/icmp.h delete mode 100644 jni/pdnsd/src/ipvers.h delete mode 100644 jni/pdnsd/src/list.c delete mode 100644 jni/pdnsd/src/list.h delete mode 100644 jni/pdnsd/src/main.c delete mode 100644 jni/pdnsd/src/make_rr_types_h.pl delete mode 100644 jni/pdnsd/src/netdev.c delete mode 100644 jni/pdnsd/src/netdev.h delete mode 100644 jni/pdnsd/src/pdnsd-ctl/Makefile.am delete mode 100644 jni/pdnsd/src/pdnsd-ctl/Makefile.in delete mode 100644 jni/pdnsd/src/pdnsd-ctl/pdnsd-ctl.c delete mode 100644 jni/pdnsd/src/pdnsd_assert.h delete mode 100644 jni/pdnsd/src/rc/ArchLinux/Makefile.am delete mode 100644 jni/pdnsd/src/rc/ArchLinux/Makefile.in delete mode 100644 jni/pdnsd/src/rc/ArchLinux/pdnsd.in delete mode 100644 jni/pdnsd/src/rc/Debian/Makefile.am delete mode 100644 jni/pdnsd/src/rc/Debian/Makefile.in delete mode 100644 jni/pdnsd/src/rc/Debian/pdnsd.in delete mode 100644 jni/pdnsd/src/rc/Makefile.am delete mode 100644 jni/pdnsd/src/rc/Makefile.in delete mode 100644 jni/pdnsd/src/rc/README delete mode 100644 jni/pdnsd/src/rc/RedHat/Makefile.am delete mode 100644 jni/pdnsd/src/rc/RedHat/Makefile.in delete mode 100644 jni/pdnsd/src/rc/RedHat/pdnsd.in delete mode 100644 jni/pdnsd/src/rc/Slackware/Makefile.am delete mode 100644 jni/pdnsd/src/rc/Slackware/Makefile.in delete mode 100644 jni/pdnsd/src/rc/Slackware/rc.pdnsd.in delete mode 100644 jni/pdnsd/src/rc/SuSE/Makefile.am delete mode 100644 jni/pdnsd/src/rc/SuSE/Makefile.in delete mode 100644 jni/pdnsd/src/rc/SuSE/pdnsd.in delete mode 100644 jni/pdnsd/src/rr_types.c delete mode 100644 jni/pdnsd/src/rr_types.h delete mode 100644 jni/pdnsd/src/rr_types.in delete mode 100644 jni/pdnsd/src/servers.c delete mode 100644 jni/pdnsd/src/servers.h delete mode 100644 jni/pdnsd/src/sort_namevalues.pl delete mode 100644 jni/pdnsd/src/status.c delete mode 100644 jni/pdnsd/src/status.h delete mode 100644 jni/pdnsd/src/test/Makefile.am delete mode 100644 jni/pdnsd/src/test/Makefile.in delete mode 100644 jni/pdnsd/src/test/if_up.c delete mode 100644 jni/pdnsd/src/test/is_local_addr.c delete mode 100644 jni/pdnsd/src/test/random.c delete mode 100644 jni/pdnsd/src/test/tping.c delete mode 100644 jni/pdnsd/src/thread.c delete mode 100644 jni/pdnsd/src/thread.h delete mode 100644 jni/pdnsd/version delete mode 100644 libs/android-support-v4.jar delete mode 100644 res/drawable-hdpi-v11/ic_stat_notifyerr.png delete mode 100644 res/drawable-hdpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-hdpi-v11/ic_stat_tor_off.png delete mode 100644 res/drawable-hdpi-v11/ic_stat_tor_xfer.png delete mode 100644 res/drawable-hdpi-v11/inverse.png delete mode 100644 res/drawable-hdpi-v9/ic_stat_notifyerr.png delete mode 100644 res/drawable-hdpi-v9/ic_stat_tor.png delete mode 100644 res/drawable-hdpi-v9/inverse.png delete mode 100644 res/drawable-hdpi/ic_action_settings.png delete mode 100644 res/drawable-hdpi/ic_launcher.png delete mode 100644 res/drawable-hdpi/ic_stat_notifyerr.png delete mode 100644 res/drawable-hdpi/ic_stat_tor.png delete mode 100644 res/drawable-hdpi/ic_stat_tor_xfer.png delete mode 100644 res/drawable-hdpi/inverse.png delete mode 100644 res/drawable-ldpi-v11/ic_stat_notifyerr.png delete mode 100644 res/drawable-ldpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-ldpi-v11/inverse.png delete mode 100644 res/drawable-ldpi-v9/ic_stat_notifyerr.png delete mode 100644 res/drawable-ldpi-v9/ic_stat_tor.png delete mode 100644 res/drawable-ldpi-v9/inverse.png delete mode 100644 res/drawable-ldpi/ic_action_settings.png delete mode 100644 res/drawable-ldpi/ic_launcher.png delete mode 100644 res/drawable-ldpi/ic_stat_notifyerr.png delete mode 100644 res/drawable-ldpi/ic_stat_tor.png delete mode 100644 res/drawable-ldpi/inverse.png delete mode 100644 res/drawable-mdpi-v11/ic_stat_notifyerr.png delete mode 100644 res/drawable-mdpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-mdpi-v11/ic_stat_tor_xfer.png delete mode 100644 res/drawable-mdpi-v11/inverse.png delete mode 100644 res/drawable-mdpi-v9/ic_stat_notifyerr.png delete mode 100644 res/drawable-mdpi-v9/ic_stat_tor.png delete mode 100644 res/drawable-mdpi-v9/inverse.png delete mode 100644 res/drawable-mdpi/ic_action_settings.png delete mode 100644 res/drawable-mdpi/ic_launcher.png delete mode 100644 res/drawable-mdpi/ic_stat_notifyerr.png delete mode 100644 res/drawable-mdpi/ic_stat_tor.png delete mode 100644 res/drawable-mdpi/ic_stat_tor_xfer.png delete mode 100644 res/drawable-mdpi/inverse.png delete mode 100644 res/drawable-xhdpi-v11/ic_stat_notifyerr.png delete mode 100644 res/drawable-xhdpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-xhdpi-v11/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xhdpi-v11/inverse.png delete mode 100644 res/drawable-xhdpi-v9/ic_stat_notifyerr.png delete mode 100644 res/drawable-xhdpi-v9/ic_stat_tor.png delete mode 100644 res/drawable-xhdpi-v9/inverse.png delete mode 100644 res/drawable-xhdpi/ic_action_settings.png delete mode 100644 res/drawable-xhdpi/ic_launcher.png delete mode 100644 res/drawable-xhdpi/ic_stat_notifyerr.png delete mode 100644 res/drawable-xhdpi/ic_stat_tor.png delete mode 100644 res/drawable-xhdpi/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xhdpi/inverse.png delete mode 100644 res/drawable-xxhdpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xxhdpi/ic_launcher.png delete mode 100644 res/drawable-xxhdpi/ic_stat_tor.png delete mode 100644 res/drawable-xxhdpi/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xxhdpi/inverse.png delete mode 100644 res/drawable-xxxhdpi-v11/ic_stat_tor.png delete mode 100644 res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xxxhdpi/ic_launcher.png delete mode 100644 res/drawable-xxxhdpi/ic_stat_tor.png delete mode 100644 res/drawable-xxxhdpi/ic_stat_tor_xfer.png delete mode 100644 res/drawable-xxxhdpi/inverse.png delete mode 100644 res/drawable/button.xml delete mode 100644 res/drawable/button_off.xml delete mode 100644 res/drawable/button_on.xml delete mode 100644 res/drawable/classyfabric.png delete mode 100644 res/drawable/error.png delete mode 100644 res/drawable/ic_chatsecure.png delete mode 100644 res/drawable/ic_duckduckgo.png delete mode 100644 res/drawable/ic_launcher.png delete mode 100644 res/drawable/ic_menu_about.png delete mode 100644 res/drawable/ic_menu_exit.png delete mode 100644 res/drawable/ic_menu_goto.png delete mode 100644 res/drawable/ic_play.png delete mode 100644 res/drawable/ic_stat_tor_off.png delete mode 100644 res/drawable/ic_stat_tor_xfer.png delete mode 100644 res/drawable/ic_twitter.png delete mode 100644 res/drawable/icon_martus.png delete mode 100644 res/drawable/icon_orfox.png delete mode 100644 res/drawable/icon_story_maker.png delete mode 100644 res/drawable/inverse.png delete mode 100644 res/drawable/n8fr8.jpg delete mode 100644 res/drawable/oldtoroff.png delete mode 100644 res/drawable/oldtoron.png delete mode 100644 res/drawable/oldtorstarting.png delete mode 100644 res/drawable/onion32.png delete mode 100644 res/drawable/tilebg.xml delete mode 100644 res/drawable/toggle.xml delete mode 100644 res/drawable/tor.png delete mode 100644 res/drawable/tor25.png delete mode 100644 res/drawable/toroff.png delete mode 100644 res/drawable/toron.png delete mode 100644 res/drawable/torstarting.png delete mode 100644 res/layout-v21/layout_notification_expanded.xml delete mode 100644 res/layout/layout_about.xml delete mode 100644 res/layout/layout_apps.xml delete mode 100644 res/layout/layout_apps_item.xml delete mode 100644 res/layout/layout_diag.xml delete mode 100644 res/layout/layout_help.xml delete mode 100644 res/layout/layout_log.xml delete mode 100644 res/layout/layout_main.xml delete mode 100644 res/layout/layout_notification_expanded.xml delete mode 100644 res/layout/layout_promo_apps.xml delete mode 100644 res/layout/layout_settings.xml delete mode 100644 res/layout/layout_vpn_setup.xml delete mode 100644 res/layout/notification_template_part_chronometer.xml delete mode 100644 res/layout/notification_template_part_time.xml delete mode 100644 res/layout/scrollingtext_buttons_view.xml delete mode 100644 res/menu/orbot_main.xml delete mode 100644 res/menu/share_menu.xml delete mode 100644 res/raw/geoip.mp3 delete mode 100644 res/raw/geoip6.mp3 delete mode 100644 res/raw/pluto.properties delete mode 100644 res/raw/torpolipo.conf delete mode 100644 res/raw/torrc delete mode 100644 res/values-ach/strings.xml delete mode 100644 res/values-ar/strings.xml delete mode 100644 res/values-az/strings.xml delete mode 100644 res/values-bg/strings.xml delete mode 100644 res/values-bn-rBD/strings.xml delete mode 100644 res/values-bn-rIN/strings.xml delete mode 100644 res/values-bn/strings.xml delete mode 100644 res/values-brx/strings.xml delete mode 100644 res/values-bs/strings.xml delete mode 100644 res/values-ca/strings.xml delete mode 100644 res/values-cs-rCZ/strings.xml delete mode 100644 res/values-cs/strings.xml delete mode 100644 res/values-cy/strings.xml delete mode 100644 res/values-da/strings.xml delete mode 100644 res/values-de-rAT/strings.xml delete mode 100644 res/values-de/strings.xml delete mode 100644 res/values-el/strings.xml delete mode 100644 res/values-en-rGB/strings.xml delete mode 100644 res/values-eo/strings.xml delete mode 100644 res/values-es-rAR/strings.xml delete mode 100644 res/values-es/strings.xml delete mode 100644 res/values-et/strings.xml delete mode 100644 res/values-eu/strings.xml delete mode 100644 res/values-fa/strings.xml delete mode 100644 res/values-fi/strings.xml delete mode 100644 res/values-fr-rFR/strings.xml delete mode 100644 res/values-fr/strings.xml delete mode 100644 res/values-gl/strings.xml delete mode 100644 res/values-gu-rIN/strings.xml delete mode 100644 res/values-gu/strings.xml delete mode 120000 res/values-he delete mode 100644 res/values-hi/strings.xml delete mode 100644 res/values-hr-rHR/strings.xml delete mode 100644 res/values-hr/strings.xml delete mode 100644 res/values-hu/strings.xml delete mode 100644 res/values-hy-rAM/strings.xml delete mode 100644 res/values-ia/strings.xml delete mode 120000 res/values-id delete mode 100644 res/values-in-rID/strings.xml delete mode 100644 res/values-in/strings.xml delete mode 100644 res/values-is/strings.xml delete mode 100644 res/values-it/strings.xml delete mode 100644 res/values-iw/strings.xml delete mode 100644 res/values-ja/strings.xml delete mode 100644 res/values-kn-rIN/strings.xml delete mode 100644 res/values-kn/strings.xml delete mode 100644 res/values-ko/strings.xml delete mode 100644 res/values-ky/strings.xml delete mode 100644 res/values-lt-rLT/strings.xml delete mode 100644 res/values-lt/strings.xml delete mode 100644 res/values-lv/strings.xml delete mode 100644 res/values-mk/strings.xml delete mode 100644 res/values-ml/strings.xml delete mode 100644 res/values-mn/strings.xml delete mode 100644 res/values-mr-rIN/strings.xml delete mode 100644 res/values-ms-rMY/strings.xml delete mode 100644 res/values-ms/strings.xml delete mode 100644 res/values-my/strings.xml delete mode 100644 res/values-nb/strings.xml delete mode 100644 res/values-nl/strings.xml delete mode 100644 res/values-pa/strings.xml delete mode 100644 res/values-pl/strings.xml delete mode 100644 res/values-ps/strings.xml delete mode 100644 res/values-pt-rBR/strings.xml delete mode 100644 res/values-pt-rPT/strings.xml delete mode 100644 res/values-pt/strings.xml delete mode 100644 res/values-ro-rRO/strings.xml delete mode 100644 res/values-ro/strings.xml delete mode 100644 res/values-rs-rAR/strings.xml delete mode 100644 res/values-ru/strings.xml delete mode 100644 res/values-si-rLK/strings.xml delete mode 100644 res/values-sk-rSK/strings.xml delete mode 100644 res/values-sk/strings.xml delete mode 100644 res/values-sl/strings.xml delete mode 100644 res/values-sn/strings.xml delete mode 100644 res/values-sq/strings.xml delete mode 100644 res/values-sr/strings.xml delete mode 100644 res/values-sv/strings.xml delete mode 100644 res/values-ta/strings.xml delete mode 100644 res/values-th/strings.xml delete mode 100644 res/values-tl/strings.xml delete mode 100644 res/values-tr/strings.xml delete mode 100644 res/values-uk/strings.xml delete mode 100644 res/values-ur/strings.xml delete mode 100644 res/values-uz/strings.xml delete mode 100644 res/values-vi/strings.xml delete mode 100644 res/values-zh-rCN/strings.xml delete mode 100644 res/values-zh-rTW/strings.xml delete mode 100644 res/values/arrays.xml delete mode 100644 res/values/colors.xml delete mode 100644 res/values/dimens.xml delete mode 100644 res/values/pdnsd.xml delete mode 100644 res/values/strings.xml delete mode 100644 res/values/styles.xml delete mode 100644 res/values/theme.xml delete mode 100644 res/xml/preferences.xml delete mode 100644 src/com/google/zxing/integration/android/IntentIntegrator.java delete mode 100644 src/com/google/zxing/integration/android/IntentResult.java delete mode 100644 src/info/guardianproject/util/Languages.java delete mode 120000 src/net delete mode 100644 src/org/torproject/android/OrbotApp.java delete mode 100644 src/org/torproject/android/OrbotConstants.java delete mode 100644 src/org/torproject/android/OrbotMainActivity.java delete mode 100644 src/org/torproject/android/Prefs.java delete mode 100644 src/org/torproject/android/service/DummyActivity.java delete mode 100644 src/org/torproject/android/service/HiddenServiceManager.java delete mode 100644 src/org/torproject/android/service/OnBootReceiver.java delete mode 100644 src/org/torproject/android/service/StartTorReceiver.java delete mode 100644 src/org/torproject/android/service/TorResourceInstaller.java delete mode 100644 src/org/torproject/android/service/TorService.java delete mode 100644 src/org/torproject/android/service/TorServiceConstants.java delete mode 100644 src/org/torproject/android/service/TorServiceUtils.java delete mode 100644 src/org/torproject/android/service/TorTransProxy.java delete mode 100644 src/org/torproject/android/service/TorrcConfig.java delete mode 100644 src/org/torproject/android/service/Utils.java delete mode 100644 src/org/torproject/android/settings/AppManager.java delete mode 100644 src/org/torproject/android/settings/SettingsPreferences.java delete mode 100644 src/org/torproject/android/settings/TorifiedApp.java delete mode 100644 src/org/torproject/android/ui/BridgeSetupActivity.java delete mode 100644 src/org/torproject/android/ui/ImageProgressView.java delete mode 100644 src/org/torproject/android/ui/OrbotDiagnosticsActivity.java delete mode 100644 src/org/torproject/android/ui/PromoAppsActivity.java delete mode 100644 src/org/torproject/android/ui/Rotate3dAnimation.java delete mode 100644 src/org/torproject/android/ui/VPNSetupActivity.java delete mode 100644 src/org/torproject/android/vpn/OrbotVpnManager.java delete mode 100644 src/org/torproject/android/vpn/Tun2Socks.java delete mode 100644 src/org/torproject/android/vpn/VPNEnableActivity.java diff --git a/assets/bridges.txt b/assets/bridges.txt deleted file mode 100644 index 679f8116..00000000 --- a/assets/bridges.txt +++ /dev/null @@ -1,22 +0,0 @@ -obfs3 83.212.101.3:80 A09D536DD1752D542E1FBB3C9CE4449D51298239 -obfs3 169.229.59.74:31493 AF9F66B7B04F8FF6F32D455F05135250A16543C9 -obfs3 169.229.59.75:46328 AF9F66B7B04F8FF6F32D455F05135250A16543C9 -obfs3 109.105.109.163:38980 1E05F577A0EC0213F971D81BF4D86A9E4E8229ED -obfs3 109.105.109.163:47779 4C331FA9B3D1D6D8FB0D8FBBF0C259C360D97E6A -scramblesuit 83.212.101.3:443 A09D536DD1752D542E1FBB3C9CE4449D51298239 password=XTCXLG2JAMJKZW2POLBAOWOQETQSMASH -obfs4 198.245.60.50:443 752CF7825B3B9EA6A98C83AC41F7099D67007EA5 cert=xpmQtKUqQ/6v5X7ijgYE/f03+l2/EuQ1dexjyUhh16wQlu/cpXUGalmhDIlhuiQPNEKmKw iat-mode=0 -obfs4 109.105.109.165:10527 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=0 -obfs4 83.212.101.3:41213 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0 -obfs4 104.131.108.182:56880 EF577C30B9F788B0E1801CF7E433B3B77792B77A cert=0SFhfDQrKjUJP8Qq6wrwSICEPf3Vl/nJRsYxWbg3QRoSqhl2EB78MPS2lQxbXY4EW1wwXA iat-mode=0 -obfs4 109.105.109.147:13764 BBB28DF0F201E706BE564EFE690FE9577DD8386D cert=KfMQN/tNMFdda61hMgpiMI7pbwU1T+wxjTulYnfw+4sgvG0zSH7N7fwT10BI8MUdAD7iJA iat-mode=0 -obfs4 154.35.22.10:41835 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0 -obfs4 154.35.22.11:49868 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0 -obfs4 154.35.22.12:80 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0 -obfs4 154.35.22.13:443 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0 -obfs4 154.35.22.10:1984 8FB9F4319E89E5C6223052AA525A192AFBC85D55 cert=GGGS1TX4R81m3r0HBl79wKy1OtPPNR2CZUIrHjkRg65Vc2VR8fOyo64f9kmT1UAFG7j0HQ iat-mode=0 -obfs4 154.35.22.11:1984 A832D176ECD5C7C6B58825AE22FC4C90FA249637 cert=YPbQqXPiqTUBfjGFLpm9JYEFTBvnzEJDKJxXG5Sxzrr/v2qrhGU4Jls9lHjLAhqpXaEfZw iat-mode=0 -obfs4 154.35.22.12:1984 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0 -obfs4 154.35.22.13:1984 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0 -meek 0.0.2.0:1 46D4A71197B8FA515A826C6B017C522FE264655B url=https://meek-reflect.appspot.com/ front=www.google.com -meek 0.0.2.0:2 B9E7141C594AF25699E0079C1F0146F409495296 url=https://d2zfqthxsdq309.cloudfront.net/ front=a0.awsstatic.com -meek 0.0.2.0:3 A2C13B7DFCAB1CBF3A884B6EB99A98067AB6EF44 url=https://az786092.vo.msecnd.net/ front=ajax.aspnetcdn.com diff --git a/jni/Android.mk b/jni/Android.mk deleted file mode 100644 index f4af1d97..00000000 --- a/jni/Android.mk +++ /dev/null @@ -1,145 +0,0 @@ -# Copyright (C) 2009 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# -LOCAL_PATH := $(call my-dir) -ROOT_PATH := $(LOCAL_PATH) -EXTERN_PATH := $(LOCAL_PATH)/../external - -######################################################## -## pdnsd library -######################################################## - -include $(CLEAR_VARS) - -PDNSD_SOURCES := $(wildcard $(LOCAL_PATH)/pdnsd/src/*.c) - -LOCAL_MODULE := pdnsd -LOCAL_SRC_FILES := $(PDNSD_SOURCES:$(LOCAL_PATH)/%=%) -LOCAL_CFLAGS := -Wall -O2 -I$(LOCAL_PATH)/pdnsd -DHAVE_STPCPY - -include $(BUILD_EXECUTABLE) - -######################################################## -## libancillary -######################################################## - -include $(CLEAR_VARS) - -ANCILLARY_SOURCE := fd_recv.c fd_send.c - -LOCAL_MODULE := libancillary -LOCAL_CFLAGS := -O2 -I$(LOCAL_PATH)/libancillary - -LOCAL_SRC_FILES := $(addprefix libancillary/, $(ANCILLARY_SOURCE)) - -include $(BUILD_STATIC_LIBRARY) - - -######################################################## -## tun2socks -######################################################## - -include $(CLEAR_VARS) - -LOCAL_CFLAGS := -std=gnu99 -LOCAL_CFLAGS += -DBADVPN_THREADWORK_USE_PTHREAD -DBADVPN_LINUX -DBADVPN_BREACTOR_BADVPN -D_GNU_SOURCE -LOCAL_CFLAGS += -DBADVPN_USE_SELFPIPE -DBADVPN_USE_EPOLL -LOCAL_CFLAGS += -DBADVPN_LITTLE_ENDIAN -DBADVPN_THREAD_SAFE -LOCAL_CFLAGS += -DNDEBUG -DANDROID -LOCAL_CFLAGS += -DTUN2SOCKS_JNI -LOCAL_CFLAGS += -DPSIPHON - -LOCAL_STATIC_LIBRARIES := libancillary - -LOCAL_C_INCLUDES:= \ - $(LOCAL_PATH)/libancillary \ - $(EXTERN_PATH)/badvpn/ \ - $(EXTERN_PATH)/badvpn/lwip/src/include/ipv4 \ - $(EXTERN_PATH)/badvpn/lwip/src/include/ipv6 \ - $(EXTERN_PATH)/badvpn/lwip/src/include \ - $(EXTERN_PATH)/badvpn/lwip/custom \ - -TUN2SOCKS_SOURCES := \ - base/BLog_syslog.c \ - system/BReactor_badvpn.c \ - system/BSignal.c \ - system/BConnection_unix.c \ - system/BTime.c \ - system/BUnixSignal.c \ - system/BNetwork.c \ - flow/StreamRecvInterface.c \ - flow/PacketRecvInterface.c \ - flow/PacketPassInterface.c \ - flow/StreamPassInterface.c \ - flow/SinglePacketBuffer.c \ - flow/BufferWriter.c \ - flow/PacketBuffer.c \ - flow/PacketStreamSender.c \ - flow/PacketPassConnector.c \ - flow/PacketProtoFlow.c \ - flow/PacketPassFairQueue.c \ - flow/PacketProtoEncoder.c \ - flow/PacketProtoDecoder.c \ - socksclient/BSocksClient.c \ - tuntap/BTap.c \ - lwip/src/core/timers.c \ - lwip/src/core/udp.c \ - lwip/src/core/memp.c \ - lwip/src/core/init.c \ - lwip/src/core/pbuf.c \ - lwip/src/core/tcp.c \ - lwip/src/core/tcp_out.c \ - lwip/src/core/netif.c \ - lwip/src/core/def.c \ - lwip/src/core/mem.c \ - lwip/src/core/tcp_in.c \ - lwip/src/core/stats.c \ - lwip/src/core/inet_chksum.c \ - lwip/src/core/ipv4/icmp.c \ - lwip/src/core/ipv4/igmp.c \ - lwip/src/core/ipv4/ip4_addr.c \ - lwip/src/core/ipv4/ip_frag.c \ - lwip/src/core/ipv4/ip4.c \ - lwip/src/core/ipv4/autoip.c \ - lwip/src/core/ipv6/ethip6.c \ - lwip/src/core/ipv6/inet6.c \ - lwip/src/core/ipv6/ip6_addr.c \ - lwip/src/core/ipv6/mld6.c \ - lwip/src/core/ipv6/dhcp6.c \ - lwip/src/core/ipv6/icmp6.c \ - lwip/src/core/ipv6/ip6.c \ - lwip/src/core/ipv6/ip6_frag.c \ - lwip/src/core/ipv6/nd6.c \ - lwip/custom/sys.c \ - tun2socks/tun2socks.c \ - base/DebugObject.c \ - base/BLog.c \ - base/BPending.c \ - system/BDatagram_unix.c \ - flowextra/PacketPassInactivityMonitor.c \ - tun2socks/SocksUdpGwClient.c \ - udpgw_client/UdpGwClient.c - -LOCAL_MODULE := tun2socks - -LOCAL_LDLIBS := -ldl -llog - -LOCAL_SRC_FILES := $(addprefix ../external/badvpn/, $(TUN2SOCKS_SOURCES)) - -##include $(BUILD_EXECUTABLE) -include $(BUILD_SHARED_LIBRARY) - -# Import cpufeatures -$(call import-module,android/cpufeatures) diff --git a/jni/Application.mk b/jni/Application.mk deleted file mode 100644 index 554a462d..00000000 --- a/jni/Application.mk +++ /dev/null @@ -1,4 +0,0 @@ -APP_ABI := armeabi x86 -APP_PLATFORM := android-16 -APP_STL := stlport_static -NDK_TOOLCHAIN_VERSION := 4.8 diff --git a/jni/libancillary/API b/jni/libancillary/API deleted file mode 100644 index b558995a..00000000 --- a/jni/libancillary/API +++ /dev/null @@ -1,139 +0,0 @@ - This library provide an easy interface to the black magic that can be done - on Unix domain sockets, like passing file descriptors from one process to - another. - - Programs that uses this library should include the ancillary.h header file. - Nothing else is required. - - All functions of this library require the following header: - - #include - - At this time, the only ancillary data defined by the Single Unix - Specification (v3) is file descriptors. - -Passing file descriptors - - int ancil_send_fd(socket, file_descriptor) - int socket: the Unix socket - int file_descriptor: the file descriptor - Return value: 0 for success, -1 for failure. - - Sends one file descriptor on a socket. - In case of failure, errno is set; the possible values are the ones of the - sendmsg(2) system call. - - - int ancil_recv_fd(socket, file_descriptor) - int socket: the Unix socket - int *file_descriptor: pointer to the returned file descriptor - Return value: 0 for success, -1 for failure - - Receives one file descriptor from a socket. - In case of success, the file descriptor is stored in the integer pointed - to by file_descriptor. - In case of failure, errno is set; the possible values are the ones of the - recvmsg(2) system call. - The behavior is undefined if the recv_fd does not match a send_fd* on the - other side. - - - int ancil_send_fds(socket, file_descriptors, num_file_descriptors) - int socket: the Unix socket - const int *file_descriptors: array of file descriptors - unsigned num_file_descriptors: number of file descriptors - Return value: 0 for success, -1 for failure - - Sends several file descriptors on a socket. - In case of failure, errno is set; the possible values are the ones of the - sendmsg(2) system call. - The maximum number of file descriptors that can be sent using this - function is ANCIL_MAX_N_FDS; the behavior is undefined in case of - overflow, probably a stack corruption. - - - int ancil_recv_fds(socket, file_descriptors, num_file_descriptors) - int socket: the Unix socket - int *file_descriptors: return array of file descriptors - unsigned num_file_descriptors: number of file descriptors - Return value: number of received fd for success, -1 for failure - - Receives several file descriptors from a socket, no more than - num_file_descriptors. - In case of success, the received file descriptors are stored in the array - pointed to by file_descriptors. - In case of failure, errno is set; the possible values are the ones of the - recvmsg(2) system call. - The maximum number of file descriptors that can be received using this - function is ANCIL_MAX_N_FDS; the behavior is undefined in case of - overflow, probably a stack corruption. - The behavior is undefined if the recv_fds does not match a send_fd* on - the other side, or if the number of received file descriptors is more than - num_file_descriptors. - - - int ancil_send_fds_with_buffer(socket, fds, num, buffer) - int socket: the Unix socket - const int *fds: array of file descriptors - unsigned num: number of file descriptors - void *buffer: buffer to hold the system data structures - Return value: 0 for success, -1 for failure - - Sends several file descriptors on a socket. - In case of failure, errno is set; the possible values are the ones of the - sendmsg(2) system call. - The buffer argument must point to a memory area large enough to hold the - system data structures, see ANCIL_FD_BUFFER. - - - int ancil_send_fds_with_buffer(socket, fds, num, buffer) - int socket: the Unix socket - int *fds: return array of file descriptors - unsigned num: number of file descriptors - void *buffer: buffer to hold the system data structures - Return value: number of received fd for success, -1 for failure - - Receives several file descriptors from a socket, no more than - num_file_descriptors. - In case of success, the received file descriptors are stored in the array - pointed to by file_descriptors. - In case of failure, errno is set; the possible values are the ones of the - recvmsg(2) system call. - The behavior is undefined if the recv_fds does not match a send_fd* on - the other side, or if the number of received file descriptors is more than - num_file_descriptors. - The buffer argument must point to a memory area large enough to hold the - system data structures, see ANCIL_FD_BUFFER. - - - ANCIL_MAX_N_FDS - - Maximum number of file descriptors that can be sent with the sent_fds and - recv_fds functions. If you have to send more at once, use the - *_with_buffer versions. The value is enough to send "quite a few" file - descriptors. - - - ANCIL_FD_BUFFER(n) - int n: number of file descriptors - - Expands to a structure data type large enough to hold the system data - structures for n file descriptors. So the address of a variable declared - of type ANCIL_FD_BUFFER(n) is suitable as the buffer argument for - *_with_buffer on n file descriptors. - To use this macro, you need and . Bevare: with - Solaris, the _XPG4_2 macro must be defined before sys/socket is included. - - -Tuning the compilation - - This library is designed to be included in projects, not installed in - /usr/lib. If your project does not use some of the functions, the - TUNE_OPTS variable in the Makefile allows not to build them. It is a list - of proprocessor options: - - -DNDEBUG: turn assertions off (see assert(3)) - -DSPARE_SEND_FDS: do not build ancil_send_fds - -DSPARE_SEND_FD: do not build ancil_send_fd - -DSPARE_RECV_FDS: do not build ancil_recv_fds - -DSPARE_RECV_FD: do not build ancil_recv_fd diff --git a/jni/libancillary/COPYING b/jni/libancillary/COPYING deleted file mode 100644 index 5bcd9c2b..00000000 --- a/jni/libancillary/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/jni/libancillary/Makefile b/jni/libancillary/Makefile deleted file mode 100644 index 3d32533f..00000000 --- a/jni/libancillary/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -########################################################################### -# libancillary - black magic on Unix domain sockets -# (C) Nicolas George -# Makefile - guess what -########################################################################### - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -CC=gcc -CFLAGS=-Wall -g -O2 -LDFLAGS= -LIBS= -AR=ar -RANLIB=ranlib -RM=rm -CP=cp -MKDIR=mkdir -TAR=tar -GZIP=gzip -9 - -NAME=libancillary -DISTRIBUTION=API COPYING Makefile ancillary.h fd_send.c fd_recv.c test.c -VERSION=0.9.1 - -OBJECTS=fd_send.o fd_recv.o - -TUNE_OPTS=-DNDEBUG -#TUNE_OPTS=-DNDEBUG \ - -DSPARE_SEND_FDS -DSPARE_SEND_FD -DSPARE_RECV_FDS -DSPARE_RECV_FD - -.c.o: - $(CC) -c $(CFLAGS) $(TUNE_OPTS) $< - -all: libancillary.a - -libancillary.a: $(OBJECTS) - $(AR) cr $@ $(OBJECTS) - $(RANLIB) $@ - -fd_send.o: ancillary.h -fd_recv.o: ancillary.h - -test: test.c libancillary.a - $(CC) -o $@ $(CFLAGS) $(LDFLAGS) -L. test.c -lancillary $(LIBS) - -clean: - -$(RM) -f *.o *.a test - -dist: - $(MKDIR) $(NAME)-$(VERSION) - $(CP) $(DISTRIBUTION) $(NAME)-$(VERSION) - $(TAR) -cf - $(NAME)-$(VERSION) | $(GZIP) > $(NAME)-$(VERSION).tar.gz - $(RM) -rf $(NAME)-$(VERSION) diff --git a/jni/libancillary/ancillary.h b/jni/libancillary/ancillary.h deleted file mode 100644 index 636d8677..00000000 --- a/jni/libancillary/ancillary.h +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - * libancillary - black magic on Unix domain sockets - * (C) Nicolas George - * ancillary.c - public header - ***************************************************************************/ - -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef ANCILLARY_H__ -#define ANCILLARY_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/*************************************************************************** - * Start of the readable part. - ***************************************************************************/ - -#define ANCIL_MAX_N_FDS 960 -/* - * Maximum number of fds that can be sent or received using the "esay" - * functions; this is so that all can fit in one page. - */ - -extern int -ancil_send_fds_with_buffer(int, const int *, unsigned, void *); -/* - * ancil_send_fds_with_buffer(sock, n_fds, fds, buffer) - * - * Sends the file descriptors in the array pointed by fds, of length n_fds - * on the socket sock. - * buffer is a writeable memory area large enough to hold the required data - * structures. - * Returns: -1 and errno in case of error, 0 in case of success. - */ - -extern int -ancil_recv_fds_with_buffer(int, int *, unsigned, void *); -/* - * ancil_recv_fds_with_buffer(sock, n_fds, fds, buffer) - * - * Receives *n_fds file descriptors into the array pointed by fds - * from the socket sock. - * buffer is a writeable memory area large enough to hold the required data - * structures. - * Returns: -1 and errno in case of error, the actual number of received fd - * in case of success - */ - -#define ANCIL_FD_BUFFER(n) \ - struct { \ - struct cmsghdr h; \ - int fd[n]; \ - } -/* ANCIL_FD_BUFFER(n) - * - * A structure type suitable to be used as buffer for n file descriptors. - * Requires . - * Example: - * ANCIL_FD_BUFFER(42) buffer; - * ancil_recv_fds_with_buffer(sock, 42, my_fds, &buffer); - */ - -extern int -ancil_send_fds(int, const int *, unsigned); -/* - * ancil_send_fds(sock, n_fds, fds) - * - * Sends the file descriptors in the array pointed by fds, of length n_fds - * on the socket sock. - * n_fds must not be greater than ANCIL_MAX_N_FDS. - * Returns: -1 and errno in case of error, 0 in case of success. - */ - -extern int -ancil_recv_fds(int, int *, unsigned); -/* - * ancil_recv_fds(sock, n_fds, fds) - * - * Receives *n_fds file descriptors into the array pointed by fds - * from the socket sock. - * *n_fds must not be greater than ANCIL_MAX_N_FDS. - * Returns: -1 and errno in case of error, the actual number of received fd - * in case of success. - */ - - -extern int -ancil_send_fd(int, int); -/* ancil_recv_fd(sock, fd); - * - * Sends the file descriptor fd on the socket sock. - * Returns : -1 and errno in case of error, 0 in case of success. - */ - -extern int -ancil_recv_fd(int, int *); -/* ancil_send_fd(sock, &fd); - * - * Receives the file descriptor fd from the socket sock. - * Returns : -1 and errno in case of error, 0 in case of success. - */ - -#ifdef __cplusplus -} -#endif - -#endif /* ANCILLARY_H__ */ diff --git a/jni/libancillary/fd_recv.c b/jni/libancillary/fd_recv.c deleted file mode 100644 index 46c2e694..00000000 --- a/jni/libancillary/fd_recv.c +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - * libancillary - black magic on Unix domain sockets - * (C) Nicolas George - * fd_send.c - receiving file descriptors - ***************************************************************************/ - -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _XPG4_2 /* Solaris sucks */ -# define _XPG4_2 -#endif - -#include -#include -#include -#include -#include -#if defined(__FreeBSD__) -# include /* FreeBSD sucks */ -#endif - -#include "ancillary.h" - -int -ancil_recv_fds_with_buffer(int sock, int *fds, unsigned n_fds, void *buffer) -{ - struct msghdr msghdr; - char nothing; - struct iovec nothing_ptr; - struct cmsghdr *cmsg; - int i; - - nothing_ptr.iov_base = ¬hing; - nothing_ptr.iov_len = 1; - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = ¬hing_ptr; - msghdr.msg_iovlen = 1; - msghdr.msg_flags = 0; - msghdr.msg_control = buffer; - msghdr.msg_controllen = sizeof(struct cmsghdr) + sizeof(int) * n_fds; - cmsg = CMSG_FIRSTHDR(&msghdr); - cmsg->cmsg_len = msghdr.msg_controllen; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - for(i = 0; i < n_fds; i++) - ((int *)CMSG_DATA(cmsg))[i] = -1; - - if(recvmsg(sock, &msghdr, 0) < 0) - return(-1); - for(i = 0; i < n_fds; i++) - fds[i] = ((int *)CMSG_DATA(cmsg))[i]; - n_fds = (msghdr.msg_controllen - sizeof(struct cmsghdr)) / sizeof(int); - return(n_fds); -} - -#ifndef SPARE_RECV_FDS -int -ancil_recv_fds(int sock, int *fd, unsigned n_fds) -{ - ANCIL_FD_BUFFER(ANCIL_MAX_N_FDS) buffer; - - assert(n_fds <= ANCIL_MAX_N_FDS); - return(ancil_recv_fds_with_buffer(sock, fd, n_fds, &buffer)); -} -#endif /* SPARE_RECV_FDS */ - -#ifndef SPARE_RECV_FD -int -ancil_recv_fd(int sock, int *fd) -{ - ANCIL_FD_BUFFER(1) buffer; - - return(ancil_recv_fds_with_buffer(sock, fd, 1, &buffer) == 1 ? 0 : -1); -} -#endif /* SPARE_RECV_FD */ diff --git a/jni/libancillary/fd_send.c b/jni/libancillary/fd_send.c deleted file mode 100644 index 01de87fd..00000000 --- a/jni/libancillary/fd_send.c +++ /dev/null @@ -1,92 +0,0 @@ -/*************************************************************************** - * libancillary - black magic on Unix domain sockets - * (C) Nicolas George - * fd_send.c - sending file descriptors - ***************************************************************************/ - -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _XPG4_2 /* Solaris sucks */ -# define _XPG4_2 -#endif - -#include -#include -#include -#include -#include -#if defined(__FreeBSD__) -# include /* FreeBSD sucks */ -#endif - -#include "ancillary.h" - -int -ancil_send_fds_with_buffer(int sock, const int *fds, unsigned n_fds, void *buffer) -{ - struct msghdr msghdr; - char nothing = '!'; - struct iovec nothing_ptr; - struct cmsghdr *cmsg; - int i; - - nothing_ptr.iov_base = ¬hing; - nothing_ptr.iov_len = 1; - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = ¬hing_ptr; - msghdr.msg_iovlen = 1; - msghdr.msg_flags = 0; - msghdr.msg_control = buffer; - msghdr.msg_controllen = sizeof(struct cmsghdr) + sizeof(int) * n_fds; - cmsg = CMSG_FIRSTHDR(&msghdr); - cmsg->cmsg_len = msghdr.msg_controllen; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - for(i = 0; i < n_fds; i++) - ((int *)CMSG_DATA(cmsg))[i] = fds[i]; - return(sendmsg(sock, &msghdr, 0) >= 0 ? 0 : -1); -} - -#ifndef SPARE_SEND_FDS -int -ancil_send_fds(int sock, const int *fds, unsigned n_fds) -{ - ANCIL_FD_BUFFER(ANCIL_MAX_N_FDS) buffer; - - assert(n_fds <= ANCIL_MAX_N_FDS); - return(ancil_send_fds_with_buffer(sock, fds, n_fds, &buffer)); -} -#endif /* SPARE_SEND_FDS */ - -#ifndef SPARE_SEND_FD -int -ancil_send_fd(int sock, int fd) -{ - ANCIL_FD_BUFFER(1) buffer; - - return(ancil_send_fds_with_buffer(sock, &fd, 1, &buffer)); -} -#endif /* SPARE_SEND_FD */ diff --git a/jni/libancillary/test.c b/jni/libancillary/test.c deleted file mode 100644 index d3c1fdac..00000000 --- a/jni/libancillary/test.c +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** - * libancillary - black magic on Unix domain sockets - * (C) Nicolas George - * test.c - testing and example program - ***************************************************************************/ - -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ancillary.h" - -void child_process(int sock) -{ - int fd; - int fds[3], nfds; - char b[] = "This is on the received fd!\n"; - - if(ancil_recv_fd(sock, &fd)) { - perror("ancil_recv_fd"); - exit(1); - } else { - printf("Received fd: %d\n", fd); - } - write(fd, b, sizeof(b)); - close(fd); - sleep(2); - - nfds = ancil_recv_fds(sock, fds, 3); - if(nfds < 0) { - perror("ancil_recv_fds"); - exit(1); - } else { - printf("Received %d/3 fds : %d %d %d.\n", nfds, - fds[0], fds[1], fds[2]); - } -} - -void parent_process(int sock) -{ - int fds[2] = { 1, 2 }; - - if(ancil_send_fd(sock, 1)) { - perror("ancil_send_fd"); - exit(1); - } else { - printf("Sent fd.\n"); - } - sleep(1); - - if(ancil_send_fds(sock, fds, 2)) { - perror("ancil_send_fds"); - exit(1); - } else { - printf("Sent two fds.\n"); - } -} - -int main(void) -{ - int sock[2]; - - if(socketpair(PF_UNIX, SOCK_STREAM, 0, sock)) { - perror("socketpair"); - exit(1); - } else { - printf("Established socket pair: (%d, %d)\n", sock[0], sock[1]); - } - - switch(fork()) { - case 0: - close(sock[0]); - child_process(sock[1]); - break; - case -1: - perror("fork"); - exit(1); - default: - close(sock[1]); - parent_process(sock[0]); - wait(NULL); - break; - } - return(0); -} diff --git a/jni/pdnsd/AUTHORS b/jni/pdnsd/AUTHORS deleted file mode 100644 index fa0454e4..00000000 --- a/jni/pdnsd/AUTHORS +++ /dev/null @@ -1,58 +0,0 @@ -Most of pdnsd was written by Thomas Moestl (tmoestl@gmx.net). -In the "par" versions large parts of the code have been revised -and several features have been added by Paul Rombouts. - -Small parts of this program are based on code that was taken from nmap (IP -checksumming), the isdn4k-utils (ippp interface uptest), glibc 2.1.2 (some -definitions for kernel 2.2.x missing in 2.0 glibcs) and FreeBSD -(SIZEOF_ADDR_IFREQ in netdev.c). -nmap was written by Fyodor. The insd4k-utils were written by Fritz Elfert and -others. The GNU C library (glibc) is copyright by the Free Software -Foundation. - -The following people have contributed code: -Andrew M. Bishop contributed support for server labels -Carsten Block contributed 'configure'-able rc scripts -Stephan Boettcher contributed the SCHEME= option. -P.J. Bostley contributed patches to get pdnsd working on - alpha -Frank Elsner contributed rc script fixes -Christian Engstler contributed patches for SuSE compatability -Bjoern Fischer contributed code to make pdnsd leave the case of names - in the cache unchanged -Torben Janssen contributed RedHat rc scripts -Olaf Kirch contributed a security fix for the run_as() - function -Bernd Leibing contributed fixes to the spec file. -Sourav K. Mandal contributed the autoconf/automake code, gdbm - caching facility and many suggestions -Markus Mohr contributed Debian rc scripts -Alexandre Nunes contributed autoconf fixes -Wolfgang Ocker contributed the server_ip option -Soenke J. Peters contributed patches and suggestions for RedHat - compatability -Roman Shterenzon contributed many helpful hints and patches for - FreeBSD compatability. -Andreas Steinmetz contributed the code for the query_port_start and - query_port_end options (which I changed slightly, - so blame any breakage on me ;) -Marko Stolle contributed the contrib/pdnsd_update.pl script that - makes pdnsd usable in a DHCP setup. -Lyonel Vincent extended the serve_aliases option to support an - arbitrary number of aliases -Paul Wagland contributed a patches for bind9-compatability - and for some memory leaks on error paths. -Sverker Wiberg contributed IPv6 build fixes -Michael Wiedmann contributed the pdnsd-ctl.8 man page. -Ron Yorston contributed the dev-uptest for Linux ppp dial- - on-demand devices -Nikita V. Youshchenko contributed extensions to the "if" uptest -Mahesh T. Pai contributed the pdnsd.8 man page. -Nikola Kotur contributed the Slackware start-up script. -Kiyo Kelvin Lee contributed a patch for Cygwin support. -Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support. -Jan-Marek Glogowski contributed a patch implementing the "use_nss" option. - -Please look into the THANKS file for people who helped me in various ways on -this project. -If this list is incomplete, pease drop me a mail! diff --git a/jni/pdnsd/COPYING b/jni/pdnsd/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/jni/pdnsd/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/jni/pdnsd/COPYING.BSD b/jni/pdnsd/COPYING.BSD deleted file mode 100644 index 99fe14ae..00000000 --- a/jni/pdnsd/COPYING.BSD +++ /dev/null @@ -1,26 +0,0 @@ -A small part of the pdnsd source is licensed under the following BSD-style -license: - -Copyright (C) 2001 Thomas Moestl - -This file is part of the pdnsd package. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/jni/pdnsd/ChangeLog b/jni/pdnsd/ChangeLog deleted file mode 100644 index fe774653..00000000 --- a/jni/pdnsd/ChangeLog +++ /dev/null @@ -1,3304 +0,0 @@ -2012-04-23 Paul A. Rombouts - - * src/dns_query.c - Refine the return values of p_dns_cached_resolve(), p_dns_resolve() and - p_recursive_query() so that they distinguish between answers found in - the cache and replies obtained by querying other servers. - This, among other things, can be used to prevent data that was recently - obtained from the cache needlessly being added back to the cache. - -2012-04-22 Paul A. Rombouts - - * configure.in - On the Linux platform, check if we can compile and link with the - -pthread flag instead of linking with -lpthread. - -2012-04-21 Paul A. Rombouts - - * src/dns_query.c - When following the delegation chain trying to get an authoritative - answer, pdnsd would answer with SERVFAIL if it failed to get a reply - from the last server in the chain. Instead pdnsd will now use the last - reply in the chain with RCode=0 that raised the AA or RA flag, if there - is one. - -2012-04-19 Paul A. Rombouts - - * src/cache.c - In report_cache_stat(), make copies of volatile data to get a - consistent data set before making calculations with cache size and - entry numbers. - -2012-04-16 Paul A. Rombouts - - * src/netdev.c - If we can't open /proc/net/if_inet6 in is_local_addr() log a warning - message. - -2012-04-15 Paul A. Rombouts - - * src/dns_query.c - The code checking for duplicate IP addresses obtained from NS records - in auth_ok() has been slightly optimized. - -2012-04-12 Paul A. Rombouts - - * src/dns_query.c - When resolving nameservers obtained from NS records, allow pdnsd to use - more than one IP address per nameserver. - In rare cases, using just one IP address for each nameserver will cause - unnecessary resolve failures if the address chosen for each nameserver - happens to be unreachable while the other addresses would lead to - successful resolution, as demonstrated by Yuri Vorobyev. - -2012-03-16 Paul A. Rombouts - - * src/cache.c - When adding RR records one by one to a cache entry using add_cent_rr(), - use the smallest ttl value in case of conflicting ttls. - Code for local/nonlocal conflict resolution has been taken out of - add_cent_rr_int() and put into add_cent_rr() and cr_check_add() - which should be slightly more efficient. - -2012-03-15 Paul A. Rombouts - - * src/dns_query.c - Enforcing strict RFC 2181 compliance by rejecting all the answers - with inconsistent ttl timestamps can cause undesirable resolve failures. - I have tried to implement a more compromising solution, whereby - inconsistent answers that should be normally rejected are still never - cached, but are nevertheless used as intermediary or temporary results - if all else fails. - -2012-03-13 Paul A. Rombouts - - * src/dns_query.c - Fixed a typo in rr_to_cache() that caused pdnsd to fail to compile when - configured with the --enable-strict-rfc2181 option. - Thanks to Gonzalo L. R. for reporting this problem. - Also changed the return value of rr_to_cache() from a simple boolean to - an RC code in order to properly distinguish between memory allocation - errors and time-stamp inconsistencies. - -2012-02-21 Paul A. Rombouts - - * src/dns_query.c - If we have used EDNS in a query and the remote server answered - with rcode "format error", try again with the OPT pseudo-record - removed from the additional section of the query. - - Also fixed a bug in p_exec_query() that caused pdnsd to behave - as if every reply with a non-empty additional section contained - an OPT record. - -2012-02-15 Paul A. Rombouts - - * src/dns_answer.c,src/helpers.c,src/helpers.h,src/icmp.c, - src/ipvers.h,src/main.c,src/netdev.c - Introduced a new macro SEL_IPVER() to reduce some of the clutter in the - code caused by having to support both IPv4 and IPv6. - -2012-01-31 Paul A. Rombouts - - * configure.in - Add AM_PROG_CC_C_O line to configure.in to prevent automake warning. - -2012-01-29 Paul A. Rombouts - - * src/cache.c - In report_cache_stat(), add the average number of bytes used per cache - entry when reporting the cache status, as suggested by M. Galabant. - -2012-01-28 Paul A. Rombouts - - * src/dns_answer.c,src/dns_query.c - Cleaned up the code a bit to avoid warning messages when - compiling with '-Wall -Winline' flags. - -2012-01-18 Paul A. Rombouts - - * src/conff.c - Set the default of the edns_query option to false. - -2011-07-31 Paul Rombouts - - * src/cache.c - Use a slightly more sophisticated merge-sort algorithm in sort_rrl(). - -2011-05-09 Paul Rombouts - - * src/dns_answer.c - In compose_answer(), also add an OPT pseudo-RR to the additional section - of a NXDOMAIN reply when appropriate. - -2011-05-08 Paul Rombouts - - * src/cache.c,src/cache.h,src/dns_query.c,src/status.c - Make the dns_cent_t struct more compact by putting the fields that are - only used for either non-existent or existent domains, but not both, - into a union so that these fields can share memory. - When saving the cache to file, only write the TTL and time-stamp for - a whole domain when it is negatively cached. - -2011-05-06 Paul Rombouts - - * src/cache.c,src/cache.h,src/dns_query.c - At the request of Andrei Caraman, the TTL of a negatively cached domain - is now adjusted in accordance with the min_ttl and max_ttl options, just - as it is done for (negatively) cached records. - Additional change to the TTL policy is that for negative records (and - negative domains) the neg_ttl setting overrides min_ttl if - neg_ttl < min_ttl. - -2011-04-26 Paul Rombouts - - * src/conf-parser.c - Fixed memory leak that can occur when the configuration file is reloaded - and an error is encountered while parsing the definition of a TXT - record. - -2011-03-21 Paul Rombouts - - * src/make_rr_types_h.pl,src/cache.h,src/cache.c,src/dns_answer.c - Introduced arrays rrmuiterlist and rrcachiterlist to make iterating - over all possible RR types in a cache entry in strict ascending order - a little more efficient. - -2011-03-09 Paul Rombouts - - * src/dns_query.c,src/conf-parser.c,src/conf-keywords.h - Implemented a new config option "outgoing_ip", which - makes it possible to bind outgoing connections to - a specific interface. - -2011-02-21 Paul Rombouts - - * src/netdev.c - Fixed UDP socket descriptors leak in the implementation of - is_local_addr() for the FreeBSD platform. Thanks to Ashish Shukla for - reporting this bug. - -2011-02-14 Paul Rombouts - - * src/cache.c - In purge_all_rrsets(), also free the rrext array if it has become empty after - purging all the RR sets. - -2011-02-04 Paul Rombouts - - * src/conff.c,src/conff.h,src/conf-parser.c,src/conf-keywords.h, - src/dns_query.c,src/dns_query.h,src/servers.c - Changed "edns_query" from a "global" option to a "server" - configuration option. - -2011-02-04 Paul Rombouts - - * src/conff.c,src/conff.h,src/dns_query.c,src/dns_query.h,src/servers.c, - src/conf-parser.c - The query uptest sometimes fails because some DNS servers are configured - to ignore empty queries. The new config option "query_test_name" makes - it possible to query for a specific name instead. - -2011-02-01 Paul Rombouts - - * src/dns_query.c - When processing a reply from a remote name server which seems to delegate - to other name servers, check if the names for which NS records have - been supplied have locally defined NS records. If so, the local - records will now override those supplied by the remote server. - -2011-01-31 Paul Rombouts - - * src/conf-parser.c - Added support for defining TXT records in the configuration file. - -2011-01-30 Paul Rombouts - - * src/dns_query.c - Do not cache additional records from a response that is rejected because - it contains IP addresses in the reject list, even when the reply - is processed as a NXDOMAIN reply. - -2011-01-25 Paul Rombouts - - * src/conf-parser.c - Modified the function scan_string() to allow back-slashed escape - sequences in strings. - -2011-01-21 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c,src/conff.h,src/conff.c, - src/conf-parser.c - Added support for EDNS (Extension mechanisms for DNS). - Currently this is only useful for allowing UDP message sizes - to be larger than 512 bytes. - -2011-01-20 Paul Rombouts - - * src/dns_answer.c - To avoid frequent reallocs when composing a DNS reply message, - grow the message buffer in multiples of a certain minimum chunk size. - -2011-01-19 Paul Rombouts - - * src/dns.c,src/dns.h,src/dns_answer.c - Extended debugging info with DNS-message lengths and flags of incoming - messages. - -2011-01-17 Paul Rombouts - - * src/conff.c,src/conff.h,src/conf-parser.c,src/dns_answer.c - Made "ignore_cd" option obsolete. It is now effectively always on. - -2010-12-27 Paul Rombouts - - * src/cache.c,src/cache.h,src/dns_answer.c,src/dns_query.c, - src/make_rr_types.pl,src/rr_types.in,src/rr_types.c - The array of pointers to rr_set_t structs in the dns_cent_t struct - contains mostly null pointers in practice, so is somewhat - inefficient in storage usage. This problem is exacerbated if we add - support for caching more RR-types. To ameliorate to the problem - I have decided to split the array in two, with one part fixed in the - dns_cent_t struct as before, and an extension part that will be - separately allocated, if necessary. If the extension part is used only - for very rarely cached types, in most cases the extension array will not - need to be allocated thus hopefully saving memory overall. - The lookup tables which are necessary to support the new cache entry - structure are cumbersome to write by hand, so I have written a perl - script to do this automatically. As an additional benefit, which RR - types are cache-able is now configurable for each type separately via - rr_types.in. - -2010-03-14 Paul Rombouts - - * src/dns_query.c - Using randomized source ports for outgoing queries in IPv6 mode failed - with the warning "Out of ports in the range 1024-65535, dropping query!", - because the pdnsd tried to bind to the fixed port for incoming queries, - instead of the dynamically chosen port. This is a very old bug, but it - has only become apparent since source port randomization has become the - default. - Thanks to Philip-André Fillion, Phil Sutter, Radoslaw Szkodzinski and - others for reporting this bug and sending patches. - -2009-12-25 Paul Rombouts - - * src/status.c,src/status.h,src/pdnsd-ctl/pdnsd-ctl.c - Add a magic number to pdnsd-ctl command codes to guard against - possible incompatibility between the pdnsd-ctl utility and the - pdnsd server. - -2009-10-18 Paul Rombouts - - * src/dns_query.c - Make root-server discovery a little more fault tolerant, i.e. if some - of the root-server names don't resolve don't necessarily reject the - whole result. - -2009-10-17 Paul Rombouts - - * src/servers.c,src/dns_query.c,src/dns_query.h - Implemented automatic root-server discovery, which can now be configured - by setting "root_server=discover". - -2009-06-14 Paul Rombouts - - * src/dns_query.c,src/consts.c,src/consts.h,src/conf-parser.c - Changed the default behaviour of the "neg_rrs_pol" option. The default - used to be to only cache records negatively in case the AA (authoritive - answer) bit in the reply was set. The new default is to also allow - negative caching in case the reply has the RA (recursion available) bit - set and the query had the RD (recursion desired) bit set. - This gives the behaviour that is usually wanted in case "proxy_only=on" - is set without having to set "neg_rrs_pol=on", which can be more - problematic. The new default can be explicitly set using - "neg_rrs_pol=default". The values "on","off" and "auth" are also - still available. - -2009-06-13 Paul Rombouts - - * src/conff.c,src/conff.h,src/dns_answer.c,src/conf-parser.c,src/conf-keywords.h - Included a patch contributed by Andreas Steinmetz that implements a new - global configuration option "ignore_cd". pdnsd used to check that the CD - bit in the DNS header of queries is zero and return the error code - "format error" if it is not. However, considering the meaning of this - bit today it appears to be harmless to ignore it, so the new "ignore_cd" - is on by default. Setting "ignore_cd=off" gives the earlier strict - behavior. - Also renamed the the Z1, AU, Z2 bits to correspond with their modern names - CD, AD, Z. - -2008-12-19 Paul Rombouts - - * pdnsd-1.2.7/src/dns_query.c - If pdnsd receives a SERVFAIL response with a non-empty answer section, - use the information tentatively if no better response is available. - The previous behaviour was to discard the reply completely, which could - cause failure to resolve some names. - Thanks to Rafal Wijata for providing an example involving PowerDNS servers - replying with CNAME records. - -2008-09-01 Paul Rombouts - - * src/dns_query.c - In p_dns_resolve(), try to reduce the burden on root servers further for - names ending in "arpa". - -2008-08-31 Paul Rombouts - - * src/dns_query.c - In p_exec_query(), if the reply from a remote name server is negative - (either because the rcode is NXDOMAIN or because the answer section - contains no records for the queried name), ignore the remaining records - in the answer section (in particular do not add them to the cache). - -2008-07-29 Paul Rombouts - - * src/conff.c,src/dns_query.c - Made the default of the configuration option query_port_start equal to - 1024. Also improved the algorithm used by pdnsd to select random source - ports to ensure that each (free) port gets an equal chance of being - selected. This should guarantee random source ports in the range - 1024-65535, making pdnsd less vulnerable to some of the issues described - in CERT VU#800113. - The old situation, where pdnsd lets the kernel select the source ports, - is still available by specifying query_port_start=none. - -2008-07-25 Paul Rombouts - - * src/dns_query.c - Fixed a dangling pointer bug in p_exec_query(), which could cause pdnsd - to crash when processing a long reply with many entries in the answer - section. - -2008-05-12 Paul Rombouts - - * src/conf-parser.c,src/conff.c - Added a recursive-depth counter to the read_config_file() and - confparse() functions to prevent the possibility of infinite - recursion when processing include files. - In confparse(), warn when in a server section the root_server option is - set in combination with policy=simple_only or policy=fqdn_only. - -2008-05-10 Paul Rombouts - - * src/ipvers.h - Included a patch contributed by Georg Schwarz which selectively undoes - a Debian patch contributed by Juliusz Chroboczek on platforms for which - the IPV6_RECVPKTINFO macro is not defined (e.g. MacOS X). - -2008-05-08 Paul Rombouts - - * src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - The pdnsd-ctl add command can now also be used to define NS records. - A wildcard record defined with this command now behaves the same way as - one defined in the config file. - -2008-05-07 Paul Rombouts - - * src/conf-parser.c,src/conf-keywords.h,src/conff.c - Added the ability to process "include" sections in the configuration - file. This makes it possible to place local definitions in separate - files and include them from the main configuration file. - -2008-05-05 Paul Rombouts - - * src/conff.c,src/conf-parser.c,src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - Implemented two new pdnsd-ctl commands, which make it easier to add - definitions to the pdnsd cache at run time. "pdnsd-ctl include" is - similar to "pdnsd-ctl config" but only processes configuration sections - that effect the cache and disallows global and server sections. - "pdnsd-ctl eval" directly parses its string arguments as if they were - part of a configuration (include) file. - -2007-09-15 Paul Rombouts - - * src/dns.h,src/dns_answer.c,src/dns_query.c - Changed the declarations of various packed structs, by moving the - __attribute__((packed)) specifiers from the field level to the struct level. - This was necessary to get the correct value for sizeof(rr_hdr_t) when - compiling with gcc for the ARM architecture. - Thanks to Dirk Armbrust for reporting the problem and supplying the solution. - -2007-08-10 Paul Rombouts - - * src/dns_answer.c - Applied a Debian patch contributed by Juliusz Chroboczek which - reportedly fixes a problem with pdnsd running in IPv6 mode - (IPV6_RECVPKTINFO instead of IPV6_PKTINFO). - -2007-08-04 Paul Rombouts - - * src/dns_query.c - When resolving a name recursively, pdnsd would stop querying further - name servers as soon as it received a reply with the authority (aa) flag - set. Unfortunately, it appears this flag is sometimes raised erroneously - in replies. I have implemented a work-around that ignores the aa flag - when there appears to be a clear delegation to a sub-domain. - Thanks to Nico Erfurth for reporting this problem. - - It appears that pdnsd would also fail to consult servers in the authority - section when configured with neg_rrs_pol=on. This has been fixed. - -2007-08-01 Paul Rombouts - - * src/pdnsd-ctl/pdnsd-ctl.c - Made the matching of pdnsd-ctl command names and most of the arguments - case-insensitive. - -2007-07-22 Paul Rombouts - - * src/dns_answer.c - Instead of sharing the responsibility for freeing the answer buffer in - case of an error amongst different functions, only free it in - compose_answer(). - - * configure.in, src/Makefile.am, src/test/Makefile.am - Merged patch contributed by Pierre Habouzit to deal with CFLAGS the - automake way (allowing packagers to override CFLAGS properly). - -2007-07-21 Paul Rombouts - - * src/dns_answer.c - For each target name in a SRV record in the answer section, add - addresses to the additional section of the response, as is recommended - by the RFCs. - -2007-07-14 Paul Rombouts - - * src/list.c,src/list.h - Made modifications to the implementation of dynamic arrays, which - should ensure proper alignment on all supported architectures. - -2007-07-10 Paul Rombouts - - * Upgraded pdnsd's license to GPL version 3. - -2007-07-08 Paul Rombouts - - * src/cache.h,src/dns_query.c - The data field of the rr_bucket_t struct is now aligned such that - it possible to use straightforward assignment to copy IP addresses, - making memcpy unnecessary for this purpose. - -2007-07-07 Paul Rombouts - - * src/dns_query.c - If pdnsd fails to connect to a name server using a IPv6 address, it will - now retry the connection using a IPv4 address, if available. This allows - pdnsd to recover from situations where IPv6 connectivity is temporarily - unavailable, but IPv4 connectivity still functions. - Thanks to Andreas Ferber for reporting this problem. - -2007-07-04 Paul Rombouts - - * src/dns_answer.c - I have reordered the arguments of the add_rr() and related - functions to make them more consistent with each other. - -2007-07-03 Paul Rombouts - - * src/cache.c,src/hash.c - pdnsd will no longer immediately abort in add_dns_hash() if it fails - to allocate memory for a new hash entry. - -2007-07-01 Paul Rombouts - - * src/conff.c,src/conff.h,src/consts.c,src/consts.h, - src/conf-parser.c,src/conf-keywords.h,src/dns_query.c - Implemented the new "reject", "reject_policy" and "reject_recursively" - options for the server section of the configuration file. - - * src/ipvers.h,src/conf-parser.c,src/dns.c,src/status.c, - src/pdnsd-ctl/pdnsd-ctl.c - Allow local AAAA records to be defined even if pdnsd is compiled - without --enable-ipv6, provided there is sufficient support in the - C libraries and --disable-new-rrs was not used. - -2007-06-30 Paul Rombouts - - * src/dns_answer.c - Previously, when the answer buffer was realloced in add_rr(), an - extra 2 bytes used to be reserved, which are unnecessary, as far - as I can tell. I have decided to do without these extra 2 bytes, - which originate from Thomas Moestl's code. As compensation, I have - added extra PDNSD_ASSERT() statements to check that the answer - buffer does not overflow. - -2007-06-27 Paul Rombouts - - * src/status.c, src/pdnsd-ctl/pdnsd-ctl.c - Extended the pdnsd-ctl 'add a' and 'add aaaa' commands to allow - multiple IP addresses to be specified. - -2007-06-25 Paul Rombouts - - * src/conff.c,src/conff.h,src/conf-parser.c,src/conf-keywords.h, - src/dns_query.c - Implemented a new option for the server section of the configuration - file: randomize_servers. - - * src/servers.c - Improved the debug messages in uptest(). - -2007-01-30 Paul Rombouts - - * src/icmp.c - Fixed up the code implementing the ping test in icmp.c, - which was broken for 64-bit systems. - Thanks to Michael Uleysky for reporting this bug. - -2007-01-09 Paul Rombouts - - * src/dns_query.c - auth_ok() now returns 1 if the cache entry has the DF_NEGATIVE flag set, - without providing a list of authoritative servers to continue querying. - Otherwise if we receive a non-authoritative NXDOMAIN reply and pdnsd - is configured with neg_domain_pol=on, pdnsd will continue to try to - get an authoritative answer. The intention is that pdnsd - stops querying as soon as it gets an "unknown domain" answer. - -2006-04-29 Paul Rombouts - - * src/main.c - pdnsd would segfault if it tried to call log_message() (via the - log_warn() and log_error() macros) before the FILE pointer to the debug - output stream was properly initialized. - Thanks to Thomas Cort for discovering this problem and suggesting a fix. - -2006-04-09 Paul Rombouts - - * src/conf-parser.c,src/helpers.c,src/conff.h,src/conff.c - I have included a patch contributed by Jan-Marek Glogowski, that - implements the configuration option "use_nss". With use_nss=off pdnsd - will avoid system functions that may use NSS (i.e. initgroups()), which - may need DNS for LDAP lookups, which can lead to long timeouts and - stalls if pdnsd itself is used for the DNS lookup. - -2006-03-26 Paul Rombouts - - * src/dns_query.c - Negative caching of RR sets is now also supported with lean_query=off. - -2006-03-25 Paul Rombouts - - * src/dns_query.c,src/conf-parser.c,src/main.c - I have implemented a new query method: udp_tcp. With this method a UDP - query is tried first and, if the UDP answer is truncated, the query is - repeated using TCP. This is the behaviour that seems to be recommended - by the DNS standards. However, pdnsd wil not discard the truncated - answer if the TCP requery fails. - -2006-03-24 Paul Rombouts - - * src/dns_answer.c - Previously, pdnsd would add at most one additional A (and AAA) record - for each record in the answer and authority sections. At the request of - Angel Marin, pdnsd will now add all A and AAA records it can find in the - cache for each name that produces additional records. - -2006-01-02 Paul Rombouts - - * src/dns_answer.c - compose_answer() would leak memory if the query contained - an unsupported QTYPE or QCLASS. This has now been fixed. - -2005-12-27 Paul Rombouts - - * configure.in - TCP-query support is now compiled in by default. - It can still be disabled using the configure option - --disable-tcp-queries. - -2005-12-23 Paul Rombouts - - * src/dns_answer.c - Queries received from clients with non-empty answer, authority or - additional sections are now treated as malformed and rejected with - rcode 1 (format error). - -2005-11-06 Paul Rombouts - - * src/conf-parser.c - Time intervals in the configuration files can now be expressed in - seconds, minutes, hours, days and weeks, using the suffixes - s,m,h,d,and w. - -2005-10-14 Paul Rombouts - - * src/consts.c - In the pdnsd configuration file, true/false and yes/no are now accepted - as synonyms for the constants on/off. - -2005-08-24 Paul Rombouts - - * src/helpers.c - I have fixed a potential buffer overflow problem that could occur with - the 'pdnsd-ctl dump' command. - In case of the root domain, the function rhn2str() would write 2 bytes - to the output buffer even if size==1. Theoretically (under pathological - circumstances) this could have allowed the dbuf buffer in the function - dump_cent() to overflow by one byte. - -2005-08-21 Paul Rombouts - - * acconfig.h,src/cache.c,src/conff.c,src/conf-parser.c,src/dns.c, - src/dns_answer.c,src/dns_query.c,src/error.h,src/helpers.c,src/main.c, - status.c - - It appears the newer versions of gcc won't convert a pointer to char - into a pointer to unsigned char and vice versa without complaining. - The changes I have made should get rid of these distracting warning - messages. Unfortunately I had to introduce casts in some cases, - which reduces type safety :-(. - -2005-08-16 Paul Rombouts - - * src/dns.h - Some changes were made to the endianess detection code to - address problems on Mac OS X v10.4 Tiger. - -2005-08-15 Paul Rombouts - - * configure.in - Some changes where made to address the reported problems with the - configure script on Mac OS X v10.4 Tiger. - -2005-08-05 Paul Rombouts - - * src/status.c,src/dns_answer.c - The output of the 'pdnsd-ctl status' command now includes some - statistics on the number of query threads. - -2005-07-29 Paul Rombouts - - * src/main.c - It appears that sigwait() can return EINTR under certain conditions. - This explains the problems reported by Sanjoy Mahajan with strace - and ACPI S3 sleep, which both caused pdnsd to exit prematurely. - The return value of sigwait() is now checked and sigwait() is retried - if the return value is EINTR. - -2005-07-04 Paul Rombouts - - * src/dns_query.c - It appears that some servers that do not support recursive queries - answer with "query refused" instead of "not supported". The - p_exec_query() function now takes that possibility into account. - -2005-07-01 Paul Rombouts - - * src/dns_query.c - In the processing of queries, I will make a distinction between - recoverable errors and non-recoverable ones (typically caused by out of - memory conditions). In the case of non-recoverable errors, no attempt to - query alternative name servers is made. - -2005-06-26 Paul Rombouts - - * src/dns_query.c - In p_recursive_query(), as soon as one of the servers in the q list - replied "no error" or "name error", only this reply was examined and - the other servers in the q list were ignored. Joshua Coombs has brought - to my attention that this strategy sometimes fails when this reply is not - authoritative and doesn't contain any usable references to name servers - in the authority section. - I have modified p_recursive_query() to allow pdnsd to continue querying - the remaining servers in the q list as long as we haven't received an - authoritative answer or usable authority information. This will allow - pdnsd to arrive at the correct answer in some cases where it would - formerly fail. - -2005-06-25 Paul Rombouts - - * src/status.c - The "pdnsd dump" command may now also be given an argument - consisting of a name beginning with a dot. This will dump information - about all names in the cache ending in the given name. An argument - consisting of a name without a leading dot will only give information - about the exact name, as it did before. - -2005-06-24 Paul Rombouts - - * src/servers.c,src/status.c - All uptests are now conducted by the server status thread. If a retest - is requested via a "pdnsd-ctl server", an existing server status thread - is signaled or a new server status thread is spawned if the old one has - exited. This has the effect that a "pdnsd-ctl server label retest" - command will now return immediately without waiting for the tests to - finish. - -2005-06-20 Paul Rombouts - - * src/conf-parser.c,src/servers.c,src/servers.h - At the request of Al-Junaid Walker I have added a new configuration - option for the uptest interval. With "interval=ontimeout" the server is - not tested at startup/reconfig, or at regular intervals, but only after - a DNS query to a server times out. However, once a server is declared - dead it is never considered again unless it is revived using a - "pdnsd-ctl config" or "pdnsd-ctl server" command. - -2005-06-19 Paul Rombouts - - * src/servers.c,src/dns_query.c,src/icmp.c - During an uptest the server configuration data is locked. Especially - with ping or query uptests of unresponsive servers this means that the - execution of "pdnsd-ctl config" or "pdnsd-ctl server" commands can be - delayed for a long time (or even time out). I have made modifications - that allow a "pdnsd-ctl config" or "pdnsd-ctl server" commands to - interrupt pending uptests to allow these commands to proceed without - delay in most cases. - - * src/thread.h - Use the POSIX sigaction() instead of signal() to install signal handlers. - -2005-06-08 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c - I have defined a struct dns_msg_t that includes a message length field. - In the case of sending a DNS message over TCP, we no longer need a - separate write() call to send the message length. This prevents possible - packet fragmentation. - -2005-06-07 Paul Rombouts - - * src/dns_query.c - The query_method=tcp_udp option only used to work with cooperative name - servers, i.e. servers that either send back a TCP reply or explicitly - refuse the TCP connection request. This wasn't sufficiently satisfactory - in practice, because some name servers are completely unresponsive to TCP - connection requests. I have made modifications to allow pdnsd to try UDP - queries in case TCP connections time out. When a short server timeout is - combined with a global timeout that is at least twice as long, this may - allow a query to a name server that only responds to UDP queries to - succeed with query_method=tcp_udp. - -2005-04-20 Paul Rombouts - - * src/cache.c,src/hash.c,src/conff.c,src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - The "pdnsd-ctl empty-cache" command now accepts additional arguments; - these are interpreted as include/exclude names. During execution of the - command the name of each cache entry is matched against the names in the - include/exclude list. If the name ends in a name to be included, the - cache entry is deleted, otherwise not. - This feature was added at the request of Joshua Coombs. - -2005-04-19 Paul Rombouts - - * src/cache.c, src/hash.c - pdnsd will now (temporarily) unlock the cache between emptying hash - buckets, this should allow pdnsd to remain responsive while executing - the "pdnsd-ctl empty-cache" command. However, this only applies to DNS - queries; pdnsd will not accept any new pdnsd-ctl commands while a - pdnsd-ctl command is still running. - -2005-03-29 Paul Rombouts - - * configure.in, src/hash.h - I have added a new configure option --with-hash-buckets=... - This makes it possible to specify a different number of - hash buckets without editing the source files. - -2005-03-17 Paul Rombouts - - * src/error.c - When running in both daemon and debug mode, print warning and - error messages to debug file as well as the syslog. - -2005-03-15 Paul Rombouts - - * src/dns_answer.c - Only call pthread_setspecific() in debug mode, because - pthread_getspecific() is also only used in debug mode. - If pthread_setspecific() fails, treat this as a non-fatal error. - -2005-03-10 Paul Rombouts - - * configure.in - On Linux systems the configure script will now try to detect automatically - whether the system implements the Native POSIX Thread Library, but - the method is not necessarily foolproof. - - * src/dns.c - Local PTR records generated for resolving numeric IPv6 addresses back into - names, are now based on ip6.arpa instead of ip6.int, because the latter domain - will be phased out eventually. - -2005-03-06 Paul Rombouts - - * Makefile.am,src/cache.c - Create an empty cache-file at install time and don't complain about empty - cache files at start up. - -2005-02-20 Paul Rombouts - - * acconfig.h,configure.in,src/conf-parser.c,src/conff.h,src/dns.h, - src/dns_answer.c,src/dns_query.c,src/error.h,src/helpers.h,src/icmp.c, - src/ipvers.h - - I have applied some changes to the code proposed by Rodney Brown to improve - portability. In particular, pdnsd should now compile on the Darwin platform - (Apple Mac OS X). - To support some of these changes, the source package is now built with a - slightly more modern version of autoconf (2.57) and automake (1.6.3). - -2005-01-29 Paul Rombouts - - * src/dns.c,src/dns_answer.c,src/dns_query.c - - I have added some extra debug code to make it easier to discover the - reason that pdnsd considers a query or reply malformed (format error). - -2005-01-12 Paul Rombouts - - * src/dns.c,src/dns_answer.c,src/dns_query.c - - I have extended some debug code contributed by Kiyo Kelvin Lee to dump - the data received by pdnsd in debug mode (queries from clients, replies - from name servers). Because this will give very verbose debug output, - I've arranged it so that this data dump only occurs if pdnsd has been - configured and compiled with --with-debug=9 and pdnsd has been called - with -v9. - - Additionally, in the case that pdnsd rejects a reply from a name server - because it is not well formed, I have refined the debug messages to - distinguish between format errors due to unexpected truncation and - others kinds of format errors. - -2004-10-30 Paul Rombouts - - * src/rr_types.c - I have included some changes proposed by Joseph Pecquet to address - the compilation problems reported by FreeBSD users. - -2004-10-18 Paul Rombouts - - * acconfig.h,configure.in,src/helpers.c,src/helpers.h,src/dns.h - I have merged a patch for CYGWIN support by Kiyo Kelvin Lee into - my version of the code. - -2004-10-15 Paul Rombouts - - * src/cache.c - Invalidating local records with the pdnsd-ctl did not work the way the - documentation described. An invalidated local record would be always be - purged at the next lookup, thus invalidation would practically have the - same effect as deletion. An invalidated local record is of no use at all and - would occupy space until it is purged during a lookup (but not by purge_cache). - The function invalidate_record() now behaves as the documentation describes, i.e. - invalidation of local records has no effect. - -2004-09-27 Paul Rombouts - - * doc/pdnsd.conf.5.in - A new man page describing the format of the pdnsd config file has been - added to the pdnsd package. I've used a customized Perl script to generate - one automatically from the html documentation. - -2004-09-14 Paul Rombouts - - * src/hash.c - The cache entries in a hash chain are now stored in order of increasing long hash - value. The advantage is that if an name is looked up that is not present in the - cache, this can be done by comparing with only half (on average) of the number - of entries in the hash chain. Not a huge speed up, but still worth while, I think. - Additionally, the number of hash computations for each add_cache() call has - been halved. - -2004-09-11 Paul Rombouts - - * src/cache.c - insert_rrl() will no longer add local records to the rr_l list, because - purge_cache() ignores them anyway. - -2004-09-08 Paul Rombouts - - * src/dns.h,src/cache.c,src/dns_query.c,src/dns_answer.c,src/conf-parser.c - I've started using GETINT16,GETINT32,PUTINT16,PUTINT32 macros, which are based - on the NS_GET/NS_PUT macros that can be found in the BIND source, instead of memcpy - for fetching and storing non-aligned integer data. - -2004-09-08 Paul Rombouts - - * src/cache.c,src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - New pdnsd-ctl command: "pdnsd-ctl dump" will print information about all the - entries contained in the cache. - "pdnsd-ctl dump " will only print entries belonging to . - The data fields of the more common rr-types will be printed in human readable - form, the remaining ones in a hexadecimal representation. - With thanks to Dan Jacobson for suggesting this feature. - -2004-08-31 Paul Rombouts - - * src/conf-parser.c - At the suggestion of Dan Tihelka, I have expanded to the server_ip= option - to allow the name of an interface to be specified instead of an IP address. - pdnsd will not bind to the interface name, but will lookup the address the - interface has at start up, and listen on that address. If the address - of the interface changes while pdnsd is running, pdnsd will not notice that. - -2004-08-30 Paul Rombouts - - * src/cache.h,src/cache.c - I've reversed the meaning of the CF_NOAUTH and renamed it CF_AUTH. - I've also added a domain level flag DF_AUTH, which is used to - mark cache entries obtained from authoritave replies in response to - a query of type * (all).. - -2004-08-30 Paul Rombouts - - * src/cache.c - I've changed the format of the cache file. A typical cache entry has empty - sets for most RR types (even more if DNS_NEW_RRS is defined). In the old - format, each empty RR set was represented by a zero byte. - In the new format only non-empty sets are respresented, leading - to a (modest) reduction is size. - -2004-08-28 Paul Rombouts - - * src/conf-parser.c - New option for "rr" sections in the config file: reverse=on/off. - If you want a locally defined name to resolve to a numeric address and vice - versa, you can now achieve this by setting reverse=on before defining the - A record, making it unnecessary to define a seperate PTR record for the reverse - resolving. - -2004-08-20 Paul Rombouts - - * src/cache.h,src/cache.c,src/conf-parser.c,src/dns_query.c - At the request of Daniel Black, I have added support for defining local wildcard records - in pdnsd. The only type supported presently is records beginning with '*.'. - -2004-08-10 Paul Rombouts - - * src/hash.c,src/cache.c,src/dns_query.c,src/dns_answer.c - Sampo Lehtinen has remarked that pdnsd sometimes failed to resolve classless - reversed-delegated IP addresses, and that this has something to do with the fact - that pdnsd did not accept '/' characters in domain names. After reading Sampo's - and Thomas' remarks, and also rfc2317 and some of the rfc's referenced in rfc2317, - I decided pdnsd should place no restrictions at all on the types of characters it - allows in domain names, only on the lengths of the byte sequences. - This led me to make some quite extensive internal changes to pdnsd. Among other - things domain names are now stored in transport format (sequences of bytes preceded - by length bytes) instead of C strings. This is also more efficient because there - is no need any more to convert from one representation to the other, except when - reading the config file, interacting with pdnsd-ctl or running in debug mode. - Conversion between the two representations isn't always possible, though. - For example, domain names in transport format might contain non-printable characters. - These are now printed as escape sequences (three octal digits preceded by a back slash). - Presently there are still restrictions on the characters in the domain names that can - be defined in local records. I doubt this will ever be considered a problem. - -2004-08-02 Paul Rombouts - - * src/dns_query.c - The code for handling NXT records was flawed. A response from a remote server - containing NXT records (even well-formed ones) could cause pdnsd to crash. - The code for handling NAPTR records contained incorrect PDNSD_ASSERT statements, - which could cause pdnsd to abort unnecessarily. - -2004-07-25 Paul A. Rombouts - - * src/list.h,src/list.c,src/dns.c,src/dns_query,src/dns_answer.c - I've noticed that some of the (dynamic) arrays that pdnsd uses are quite sparse. - Instead of using an array structure with elements that are large enough to contain - the largest possible domain name, I've implemented a "list" data structure that - is more compact. The elements of a list can only be accessed sequentially from - beginning to end, but it allows more efficient memory use in case the names are - significantly shorter that the maximum. - -2004-07-22 Paul Rombouts - - * src/conf-parser.c - I've expanded pdnsd's configuration options by adding support in pdnsd for reading - /etc/resolv.conf style files. Instead of specifying IP addresses in a server section, - the option "file=" can be used. - The IP addresses in the lines beginning with "nameserver" will be added to - the list of address for that section, the remaining lines will be ignored. - To avoid the possibility that pdnsd will query itself, local addresses are skipped - (unless pdnsd is configured to listen on a different port number). - -2004-07-21 Paul Rombouts - - * src/cache.h,src/cache.c,src/dns_query.c,src/conf-parser.c - New option for "server" sections in the config file: root_server=on/off. - In case a server section contains only addresses of root servers, which - usually only give the nameservers of top level domains in their reply, - setting root_server=on will enable certain optimizations. This involves using - cached information to reduce queries to the root servers, thus speeding up - the resolving of new names. This option is also necessary to make the - delegation_only option work in combination with root servers. - -2004-07-16 Paul Rombouts - - * src/cache.c,src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - New pdnsd-ctl command: "pdnsd-ctl empty-cache" will make pdnsd delete its entire - cache, freeing all entries. This is useful for debugging purposes, or in situations - where you suspect that stale cache entries are causing you problems, but you are not - sure which ones. - -2004-07-11 Paul Rombouts - - * src/cache.c,src/dns_query.c - I've removed the use of the function add_cache_rr_add(), which was used to - add additional RR records to the cache one at a time. I've changed the code - in dns_query.c such that additional (or off-topic) records are first collected - in arrays of dns_cent_t structures, and then added to the cache using add_cache(). - With this approach only one function, viz. add_cache(), is used for adding - new entries to the cache, which I believe leads to a cleaner programming - interface. Added benefit is that query serial numbers are no longer - necessary. - -2004-07-10 Paul Rombouts - - * src/cache.h,src/cache.c,src/dns_query.c,src/dns_answer.c - I've added two new field to the dns_cent_t struct, namely c_ns and c_soa. - These will be used to remember references to NS and SOA records in the authority - sections of replies from remote name servers. - This information can be used by pdnsd to fill in the authority section of its - own reply. - -2004-06-25 Paul Rombouts - - * src/dns_query.c,src/servers.c,src/consts.c - I've added an new server availability test which can be selected with "uptest=query". - This can be useful as an alternative to "uptest=ping" in case the remote server does not - respond to ICMP_ECHO requests at all, which unfortunately is quite common these days. - "uptest=query" causes pdnsd to send an empty query to remote nameservers. Any well-formed - response (apart from SERVFAIL) within the timeout period will be interpreted as a sign that the - server is "up". - In a sense this new availability test can actually be considered more reliable than the - other ones that pdnsd supports. - With thanks to Juliusz Chroboczek for suggesting this feature. - -2004-06-24 Paul Rombouts - - * src/helpers.c - Don't use getpwnam() while we are multi-threaded, because it returns a pointer to - a statically allocated structure. I will use getpwnam_r() instead, which is thread - safe. Unfortunately there seem to be some portability problems with getpwnam_r(). - For those platforms that lack getpwnam_r(), I will keep the old code with getpwnam() - as an alternative. - -2004-06-23 Paul Rombouts - - * src/servers.c - Check that the number of IP addresses in a server section is nonzero before - testing servers for availability. Otherwise pdnsd could crash in debug mode. - -2004-06-21 Paul Rombouts - - * src/conff.c,src/conf-parser.c,src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - New pdnsd-ctl command: "pdnsd-ctl config" will make pdnsd re-load its configuration file. - In most cases (but there are still some exceptions) this is preferable - to restarting pdnsd after making changes to the configuration file. - An important advantage is that there should be no perceptible interruption in the dns service - when using the reload command. - An alternative config file can be specified with "pdnsd-ctl config ". - -2004-05-31 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c,src/dns_query.h - I've made an adjustment to p_recursive_query() and related functions, so that - when pdnsd chases name servers in pursuit of authoritative records, it avoids - all the name servers already queried for the same name in the recursive calling - chain, not just the servers most recently used. - Although the hops counter will already break any possible cycles, this will - allow pdnsd to detect pathological cycles earlier and waste less resources. - - * src/cache.c - In add_cache(), don't add empty entries to the cache. Empty cache entries - waste memory and are more persistent than non-empty ones, because purge_cache() - cannot get rid of them. - -2004-05-30 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c,src/icmp.c,src/netdev.c - I've removed the calls to getprotobyname() and used the constants IPPROTO_TCP - and IPPROTO_UDP instead. First of all, it doesn't seem very efficient to call - a function repeatedly to look up the same well-known protocol numbers. - More importantly, getprotobyname() stores its results in a statically-allocated - structure and thus cannot be considered thread safe. (getprotobyname_r() - is thread safe, but is not portable.) - -2004-05-27 Paul Rombouts - - * src/dns_answer.c - I've noticed that when pdnsd is restarted shortly after it has answered a TCP - query, it is often not able to bind to the TCP socket again, resulting in a - disabled TCP server thread. The solution appears to be to set the SO_REUSEADDR - socket option before binding the socket. This allows you to use the same port even - if it is busy (in the TIME_WAIT state). - I found the code for this in a patch file from an old Debian package. - -2004-05-20 Paul Rombouts - - * src/dns_query.c - Joseph Pecquet has reported that version 1.1.11 does not compile under FreeBSD v4.x - because the macro ENONET is undefined. I've bypassed the problem by surrounding - the case line using this value with conditional preprocessor directives. - -2004-05-08 Paul Rombouts - - * src/rc/Slackware/rc.pdnsd - I've included a Slackware start-up script contributed by Nikola Kotur. - -2004-05-05 Paul Rombouts - - * doc/pdnsd.8 - I'm very grateful to Mahesh T. Pai for contributing a pdnsd man page, - which was still missing up till now. - -2004-04-30 Paul Rombouts - - * src/servers.c,src/dns_query.c - After considering some suggestions made by Juliusz Chroboczek I have made the - following changes: - - - After receiving a reply from a remote server mark the server up and update the - timestamp so that pdnsd doesn't bother testing this server for availability for a - while. - - After detecting an error with an send/recv call that indicates a server is - unavailable, mark a server down so that pdnsd doesn't bother testing this server - for a while. - - After server timeouts, uptests are never performed by a query/answer thread, - because this may delay the sending of an answer to the client. Instead the - timestamp of a server that needs to be tested for availability is set to zero and - a condition signal is sent to alert the server status thread, which will carry out - the test. Unresponsive servers with uptest=ping will not be marked down - immediately any more, but only after the ping test has definitely failed. - - * src/error.c,src/error.h - I've moved most of the code previously contained in the DEBUG_MSG macro to a new - function debug_msg(). - The DEBUG_MSG macro now simply expands to "if(debug_p) debug_msg();". - This should make the executable a little smaller, and be just as fast when - debugging is off. The DEBUG_MSG macro still expands to nothing if pdnsd is built - without debugging support. - -2004-04-28 Paul Rombouts - - * src/dns_query.h,src/dns_query.c - I've tried to simplify the finite state machine used for processing parallel - queries, by merging the "state" and "nstate" variables used by p_exec_query() and - p_query_sm() resp. into one "state" variable. - By introducing an extra field "iolen" to keep track of the number of bytes read - from or written to a socket, I could also reduce the number of states for TCP - queries. The new code has the additional advantage that it can handle situations - that require multiple read() calls to receive a response. - -2004-04-14 Paul Rombouts - - * src/dns_query.c - I've added an extra check comparing the number if poll/select events actually - handled to the return value of poll/select. This should reduce the chance that - pdnsd will get caught in a busy spin due to unknown remaining bugs. An error - message is logged and an error code is returned when this comparison fails. - -2004-04-13 Paul Rombouts - - * src/dns_query.h,src/dns_query.c - I got rid of the event field in the query_stat_t struct. - I think it is redundant, because its value can be quite simply derived from - the nstate field. - -2004-04-12 Paul Rombouts - - * src/dns_query.c - I appears there was flaw in the code for handling a "Not Implemented" response - from a remote server with the RA (recursion available) bit equal to zero. This - could cause pdnsd to get into a busy spin. I traced the flaw back to Thomas - Moestl's code, so it must be in all the versions of pdnsd I know of. In previous - versions of pdnsd the busy spin would eventually time out. Due to some recent - changes the loop would no longer time out, making the bug more noticeable. - With thanks to Nicolas George for reporting the bug. - - I also discovered a closely related flaw that would cause pdnsd to poll() closed - file descriptors. It usually works out OK in practice, but it is definitively not - the correct way to do it. - - Additionally, I discovered some opportunities to save memory, e.g. by replacing - the nsname buffer in the query_stat_t struct by a pointer to an already existing - copy of a name. - -2004-04-10 Paul Rombouts - - * src/cache.c - Nicolas George remarked that he thought it was strange that subdomains of domains - negated with "neg" sections in the config file were not also negated. I thought that - he had a point, and I've implemented a change so that negating example.com will - now also negate www.example.com, xxx.adserver.example.com, etc. - -2004-04-09 Paul Rombouts - - * src/error.c,src/error.h - I noticed that the code for the log_warn() and log_error() functions was almost - identical, even to the point that log_warn() called syslog() with LOG_ERR - priority. I've merged these two functions into one log_message() function. - -2004-04-08 Paul Rombouts - - * src/main.c,src/conf-parser.c - The -4 and -6 command-line options should now work as advertised. - This wasn't entirely trivial. The rule is that options on the command line - override those in the configuration file. The easiest way to implement this is to - process the command-line options after reading the configuration file. But this - doesn't work for the -4 and -6 options, because the run_ipv4 flag determines how - IP addresses in the config file are parsed. I've inserted some extra tests and - warning messages that will hopefully make this setting nearly foolproof. - - I've added two new command-line options, "-a" and "-i ". - With the -a flag pdnsd will try to detect automatically if IPv6 support is - available on a system, and fall back to IPv4 if not. The -a flag can be used - instead of -4 or -6. - - In IPv6 mode, pdnsd will now automatically convert IPv4 addresses to IPv6-mapped - addresses. The -i option can be used to specify a prefix for this mapping. The - default is ::ffff.0.0.0.0 - There is also a corresponding ipv4_6_prefix= option for the config file. - - In IPv4 mode, if IPv6 support is compiled in, pdnsd will now skip IPv6 addresses - in the config file (except for the server_ip and ping_ip options) with a warning - message. This allows you to have mixed sets of IPv4 and IPv6 address in the same - config file, although in IPv4 mode some server sections may become inactive. - - With thanks to Juliusz Chroboczek for suggesting these changes. - -2004-04-07 Paul Rombouts - - * src/cache.c - I've changed some of the cache-flag definitions to make debugging a little simpler. - Unfortunately, this makes the cache files of previous pdnsd versions incompatible - with the new one. I've introduced a cache version identifier to be added at the - beginning of each cache file. This enables pdnsd to recognize and discard - incompatible cache files. - -2004-04-05 Paul Rombouts - - * src/cache.h,src/cache.c - I've changed the way CACHE_LAT (cache latency, normally 120 secs) is used to - determine whether a cache entry has timed out. Instead of simply adding it to the - ttl (time to live), I use CACHE_LAT if the ttl is less then CACHE_LAT, else the - ttl itself, making CACHE_LAT the minimum ammount of time a cache entry stays in - the cache. - -2004-04-02 Paul Rombouts - - * src/dns_query.c - I've introduced a global timeout parameter. This is the minimum period of time - pdnsd will wait after sending the first query to a remote server before giving - up without having received a reply. - The timeout options in the configuration file are now only minimum timeout intervals. - Setting the global timeout option makes it possible to specify quite short timeout - intervals in the server sections. This will have the effect that pdnsd will start - querying additional servers fairly quickly if the first servers are slow to respond - (but will still continue to listen for responses from the first ones). - This may allow pdnsd to get an answer more quickly in certain situations. - - * src/dns_query.c - When receiving a NXDOMAIN (unknown domain) response from a remote name server, - I think it is still useful to process the authority and additional sections, - so that pdnsd can possibly add a SOA record to its own response. - -2004-04-01 Paul Rombouts - - * src/dns_query.c - In p_recursive_query(), I've slightly changed the way pdnsd does parallel - queries. Active queries or not canceled until we have received a useful response - from a remote name server, or all the queries have failed or timed out. - Thus the par_queries parameter is no longer the maximum number of parallel - queries, but rather the increment with which the number of parallel queries is - increased when the previous set has timed out. - In the worst case all the servers in the list of available servers will be queried - simultaneously. We may be wasting more system resources this way, but the advantage - is that we have a greater chance of catching a reply. - After all, if we wait longer anyway, why not for more servers. - -2004-03-31 Paul Rombouts - - * src/dns_answer.c - I've noticed that in compose_answer() that while adding the name in the query - section it was not passed through compress_name(). While it is true that the - first name occurrence cannot be compressed, it is still sensible to process the - query name with compress_name() so that the offset can be stored and provide - additional opportunities for future compressions. - I've tested this with dig and the responses of pdnsd are now usually a little - smaller in size or can hold more information within the 512 byte limit. - -2004-03-30 Paul Rombouts - - * src/cache.c - I've noticed that pdnsd stored rr records (of the same type) in reverse order - in the cache. - Although I don't see anything inherently wrong with that, I think it's neater to - store them in the order they are processed. - -2004-03-29 Paul Rombouts - - * src/cache.c - I've rearranged the order of the arguments of some of the functions in cache.c - to obtain a more consistent calling interface. - - * src/dns_answer.c - I've noticed that pdnsd would only add NS records to an authority section if it could - find such records matching the queried name (or the last CNAME in the answer) exactly. - However, I understand that a server should try to give NS records as close as possible - to the target name in the naming hierarchy. - I also understand that if a domain name is reported as nonexisting, or no record of - the requested type exists, it is customary to provide a SOA record, searching up the - name hierarchy if necessary. - I've tried to implement this in compose_answer(), although with some limitations. - I only look in the cache, I don't search more then three levels up, and stop before - the top level. - -2004-03-28 Paul Rombouts - - * src/cache.c,src/dns_answer.c - There were some issues with add_cache_rr_add(). - - First of all, the way it was used in rr_to_cache() (or rather not used) meant - that if an "off topic" record was added for a name that lacked an entry in the - cache, the rr set would be created with an incorrect serial number (namely zero). - I've rewritten add_cache_rr_add so that it can create new cache entries if necessary. - This simplifies the code in rr_to_cache() and ensures correct serial numbers. - - Secondly, in add_cache_rr_add() the ttl was compared with that of an existing rrset - without adjusting for the min_ttl and max_ttl options. This could lead to all the - previous records being deleted, retaining only the last one. - -2004-03-27 Paul Rombouts - - * src/dns_answer.c - In compose_answer(), if the rd (recursion desired) bit is set in the query - and the response contains a CNAME record (while a different type of record was - requested), always do a recursive query on the CNAME, even if we have already - added a record of the requested type to the response. - Failing to honor the rd bit will cause some resolver libraries to complain, - even if the answer contains a record of the requested type. - - I've slightly changed the calling interfaces of add_to_response() and add_rrset() - to make them more consistent and efficient. - - In add_rrset() I've fixed a memory leak on one of the error paths. - - In add_additional_rr(), the return value of add_rr() was not checked. - If add_rr() fails, it will free *ans, and functions higher up the calling - chain could be referencing freed memory. - - I've fixed a potential referencing of freed memory or double freeing in add_additional_a(). - If a call of add_additional_rr() fails, it will free *ans. - Previously, add_additional_rr() could be called a second time, in which case - the second call would be referencing freed memory or freeing it a second time.. - -2004-03-23 Paul Rombouts - - * configure.in, src/Makefile.in,src/pdnsd-ctl/Makefile.in,src/test/Makefile.in - Frédéric L. W. Meunier has reported that configure --srcdir option (for building - in directory separate from the source directory) was broken. - Should be fixed now. - -2004-03-20 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c,src/helpers.c,src/icmp.c,src/main.c,src/netdev.c,src/ipvers.h,src/test/if_up.c,src/test/is_local_addr.c,src/test/tping.c,src/test/random.c,src/conf-parser.c - I've eliminated the global variable run_ipv6 from the code. - Enabling both the IPv4 and IPv6 protocols at the same time is not supported - in pdnsd, so the value of run_ipv6 (if it is defined) is simply !run_ipv4. - - * src/dns.c,src/test/is_local_addr.c,src/test/tping.c - It appears the option to compile pdnsd without IPv4 support (i.e. only IPv6 - support) was broken. Should be fixed now. - -2004-03-19 Paul Rombouts - - * src/cache.c - I've discovered an incorrect use of cache locks in lookup_cache(). - We only read locks in place, it is possible for purge_cent() to delete a cache - entry while another thread is trying to read it at the same time, which could - lead to trouble. I've rewritten purge_cent() so that it can be used to test - whether something needs to be purged without actually deleting anything. - If something needs to be deleted, purge_cent() will be called again with - the proper read/write locks in place, excluding access to the cache for all - other threads. - -2004-03-18 Paul Rombouts - - * src/cache.c - I've added a new function sort_rrl() for sorting the rr_l list using a merge-sort - algorithm. Usually the insertion sort used by insert_rrl() is good enough, because - new entries belong near the end most of the time. Reading entries from disk forms - an exception, though, because the rrsets in the file are completely out of order - w.r.t. timestamps, leading to quadratic time complexity of the insertion sort method. - In that case it should be faster to simply append items at the end of the rr_l list - and sort using a more efficient algorithm afterwords. - pdnsd now seems to start up noticeably faster when reading large cache files. - I've also considered using a more sophisticated data structure than a doubly linked - list, but this will add considerable complexity to the code and use more memory. - -2004-03-13 Paul Rombouts - - * src/dns_answer.c - Changed a declaration in udp_answer_thread() so that the buffer used for passing - control messages on to sendmsg() is exactly the right size, instead of an arbitrary - 512 bytes. - Also initialized the msg_flags of the struct msghdr passed on to sendmsg() to zero, - to keep Valgrind from complaining about uninitialized bytes. - -2004-03-12 Paul Rombouts - - * src/icmp.c - Fixed an incorrect call to select() in ping4(). A file descriptor set for detecting - exceptions was initialized but not passed on to select(). This would lead subsequent - code always to behave as if an IO exception had occurred. - Valgrind seems to indicate that when a poll() call times out and returns 0, - the revents field of the struct pollfd is not necessarily set. - I've changed the code to check that the return value is > 0 before examining the - revents field. - -2004-02-06 Paul Rombouts - - * src/conf-parser.c,src/conf-parser.h,src/conf-keywords.h - I've rewritten the parser for the configuration file in C from scratch. - (f)lex and yacc/bison are no longer needed to build pdnsd. - -2004-01-16 Paul Rombouts - - * src/main.c - Load the cache from disk without locking cache access because pdnsd - is still single-threaded at that point. - -2004-01-15 Paul Rombouts - - * src/cache.c,src/hash.c - Moved the responsibility for freeing the cache entries referred by - the hash buckets from destroy_cache() to free_dns_hash() (which is called - by destroy_cache()). Previously, the cache and hash tables were already - completely destroyed by the time free_dns_hash() was called, and there was - nothing left for free_dns_hash() to free. - -2004-01-14 Paul Rombouts - - * src/hash.c,src/make_hashconvtable.c - The hash conversion table is now generated at build time instead - of at run time when pdnsd is started up. - -2004-01-13 Paul Rombouts - - * src/dns.c - In add_host() fixed incorrect generation of IPV6 type of name for PTR record - due to use of && instead of & as masking operator. - -2004-01-13 Paul Rombouts - - * src/icmp.c, src/dns_answer.c - Use unsigned long instead of int error counters to reduce the danger - of wraparound. - -2004-01-06 Paul Rombouts - - * src/main.c,src/thread.c,src/thread.h,src/server.c,src/status.c,src/dns_answer.c - Initialize a global thread attribute object in main.c and use it to create all the detached - threads, instead of initializing a separate attribute object for each new thread. - -2004-01-06 Paul Rombouts - - * src/dns_answer.c - Check the return value of pthread_create() in udp_server_thread() - and tcp_server_thread() to ensure that a new answer thread has actually - been created and free resources if not. - -2004-01-04 Paul Rombouts - - * src/helpers.c,src/cache.c,src/conff.c,src/status.c - Stop writing to control socket after an error has been detected. - -2004-01-03 Paul Rombouts - - * src/pdnsd-ctl/pdnsd-ctl.c - Tried to make the error messages of pdnsd-ctl more helpful. - The complete usage description is now only printed if the 'help' command - is used. For problems with other commands a much shorter message is generated - specific for that command. - -2004-01-02 Paul Rombouts - - * src/helpers.h - Changed the definition of rhnlen(). For valid data this will make no difference, - but it may change the behaviour of pdnsd in certain error situations. - -2004-01-02 Paul Rombouts - - * src/dns.c - Optimized compress_name() some more. - -2004-01-02 Paul Rombouts - - * src/dns_answer.c - Additional code cleanup in compose_answer(). - -2004-01-01 Paul Rombouts - - * doc/pdnsd-ctl.8 - Updated the pdnsd-ctl man page. - -2003-12-31 Paul Rombouts - - * src/pdnsd-ctl/pdnsd-ctl.c - Cleaned up some code. - -2003-12-31 Paul Rombouts - - * src/status.c,src/conff.h,src/conff.c - Some further code cleanup in status.c. - Labels for server sections are no longer limited to 32 chars, - but can have arbitrary length. The string that is used to specify - new DNS-addresses with the "pdnsd-ctl server" command can now also - have arbitrary length. - -2003-12-30 Paul Rombouts - - * doc/html/doc.html - Added information about CNAME and MX resource records, that were - previously undocumented. - -2003-12-26 Paul Rombouts - - * src/dns_query.c - Removed the function p_dns_resolve_from(). This function was essentially - a call to p_recursive_query() with a dummy nocache argument. - p_recursive_query() can now be called with nocache=NULL instead. - -2003-12-26 Paul Rombouts - - * src/dns_query.c - Using a variable length array instead of an malloced buffer to hold the struct pollfd array - in p_recursive_query(). This has the potential for causing portability problems, but I - think that's unlikely because almost all the major C compilers I work with support variable - length arrays nowadays. - -2003-10-18 Paul Rombouts - - * src/helpers.h,src/helpers.c - Fixed a mistake that caused a compile error when using the --with-random-device - configuration option. - Thanks to Daniel Black for reporting this bug. - -2003-10-02 Paul Rombouts - - * conf-lex.l.in,src/conf-parse.y,src/conff.h,src/conff.c,src/dns_query.c - Made the "delegation_only" feature configurable. - -2003-09-25 Paul Rombouts - - * src/helpers.c,src/helpers.h - Added alternative implementations of strdup, strndup, stpcpy, getline and asprintf - in an effort to make the code more portable. - -2003-09-22 Paul Rombouts - - * src/helpers.c,src/conf-parse.y - Made some changes to the parser of the configuration file so that domain names - missing a dot at the end will be tolerated. - -2003-09-21 Paul Rombouts - - * src/dns_query.c - Implemented a first version of the "delegation-only" feature. - It has been "hard-coded" to work for "com" and "net" zones, - and is not yet configurable. - -2003-09-21 Paul Rombouts - - * src/dns.c - Rewrote domain_match(). Also changed the way it is used. - I believe it has a cleaner semantics now. - -2003-09-21 Paul Rombouts - - * src/dns_query.c - Changed the order of the arguments of p_exec_query() and p_recursive_query() - to make it more consistent with the other functions. - -2003-09-18 Paul Rombouts - - * src/dns_answer.c - Reordered the code in process_query() so that a buffer for an error response is - allocated only when it is actually needed. - -2003-09-17 Paul Rombouts - - * src/cache.c - Added parentheses to correct mistaken operator precedence assumption in cache.c. - !cent->flags&DF_NEGATIVE is parsed as (!(cent->flags))&DF_NEGATIVE but I think - what Thomas Moestl must have intended was !((cent->flags)&DF_NEGATIVE). - -2003-09-12 Paul Rombouts - - * src/dns_query.c - Fixed a mistake which caused the effect of the proxy_only option to be reversed. - Thanks to Andrew M. Bishop for reporting this bug. - -2003-09-11 Paul Rombouts - - * src/helpers.c - Rewrote str2rhn() and rhn2str(). - -2003-09-10 Paul Rombouts - - * src/dns.c - Rewrote read_hosts(), the function that reads /etc/hosts-style input. - I believe the parsing algorithm is more robust now. - -2003-09-09 Paul Rombouts - - * src/status.c,src/pdnsd-ctl/pdnsd-ctl.c - Fixed a bug (my fault) that caused improper passing on of flags for the - pdnsd-ctl source command. - Also reordered some of the code, so that data is validated after all of it - has been read from the control socket. This should prevent a "broken pipe" - error message if data validation fails. - Also fixed the reporting of success or failure of the pdnsd-ctl "neg" command. - -2003-09-08 Paul Rombouts - - * src/list.c - Rewrote da_grow1() and da_resize() so that they automatically allocate an array - if given a NULL argument. This makes the use of da_create() redundant in most cases. - -2003-09-08 Paul Rombouts - - * src/conf-parse.y,src/servers.c - At the suggestion of Greg Norris, I changed the code to allow server sections in the - configuration file that don't specify any IP addresses. Such a section will remain - inactive until one or more IP addresses are assigned with the control utility pdnsd-ctl. - -2003-09-04 Paul Rombouts - - * src/dns_answer.c,src/dns_query.c - Oops: in my zeal to declare variables in the smallest possible scope, I ended up - using a pointer to a struct that was out of scope. My understanding of compilers tells me - it should work out OK in practice, but it is definitely a no-no. - Used a union declared in a larger scope instead (which is ugly in another way, - but equally efficient). - Also removed a section of redundant code in udp_server_thread(). - -2003-09-01 Paul Rombouts - - * src/dns_query.c - Corrected the iteration range of a for loop in p_dns_cached_resolve(), which would - otherwise cause an array to be indexed out of bounds in the function set_flags_ttl(). - -2003-08-31 Paul Rombouts - - * src/dns_answer.c - Added cleanup handlers for freeing the resources passed on to udp_answer_thread() and - tcp_answer_thread(). This should ensure the resources are freed even if the threads get - canceled. - -2003-08-30 Paul Rombouts - - * src/cache.c - Revised large portions of code in src/cache.c, used for adding and deleting entries in - the cache. In particular, I rewrote purge_cache(), which I believe was incorrect. - I wouldn't be surprised if this was the cause of the crashed (defunct) threads that some - people were reporting. - Also fixed some memory leaks. - -2003-08-28 Paul Rombouts - - * src/cache.c - Eliminated the overhead of allocation debugging in the case that ALLOC_DEBUG is not defined. - -2003-08-24 Paul Rombouts - - * src/conf-parse.y - No longer allow certain settings of the query_method option in the configuration file - if pdnsd is not compiled with the necessary support. - Thanks to Nikolaus Rath for reporting the bug. - -2003-08-23 Paul Rombouts - - * src/netdev.c - Fixed a bug in is_local_addr() where the result of fgetc(f) is restricted to type char - before being compared to EOF, which can result in the comparison always being false. - Thanks to Gerhard Tonn for reporting the bug. - -2003-07-28 Paul Rombouts - - * doc/html/index.html,doc/html/doc.html,doc/html/dl.html,doc/pdnsd-ctl.8,contrib/README - Revised the documentation. - -2003-07-21 Paul Rombouts - - * src/main.c,src/status.c,src/icmp.c - Setting stat_pipe=0 after opening or binding the control socket fails. - This should prevent further use of the control socket if a problem with - it has been detected previously. - Also properly initialized the global variable int ping_isocket in src/icmp.c - -2003-07-13 Paul Rombouts - - * src/main.c - Polished the code in main(). - -2003-07-04 Paul Rombouts - - * src/helpers.c,src/dns_answer.c,src/dns_query.c - Eliminated the use of inet_ntoa() in favor of the more modern inet_ntop(). - inet_ntop() makes more sense in threaded code and is also recommended in - the glibc info pages. - -2003-07-03 Paul Rombouts - - * src/dns_query.c - Fixed an allocation size error (not mine) in p_exec_query(). - The erroneous size is almost always larger than necessary, so in practice this bug - just wastes memory. But there is also a possibility that the allocated buffer is too - small, which would mean trouble. - Also fixed two memory leaks on some of the error paths in p_exec_query(). - -2003-06-28 Paul Rombouts - - * acconfig.h,configure.in,src/thread.h - Extended the configuration option --with-thread-lib. - Configuring with --with-thread-lib=linuxthreads2 will cause the alternative - definition of THREAD_SIGINIT suggested by Thomas Moestl to be used. - -2003-06-27 Paul Rombouts - - * src/consts.h,src/consts.c,src/conff.c,src/conf-parse.y,src/dns_answer.c - Added two new configuration options for policies of inclusion/exclusion lists. - The new policies options are "simple_only" and "fqdn_only". - This allows me to control to which name servers pdnsd will direct queries for - simple host names. - I also polished the code a bit in report_conf_stat(), used for reporting the current configuration. - -2003-06-20 Paul Rombouts - - * acconfig.h,configure.in,src/thread.h,src/thread.c - Added a configuration option --with-thread-lib=nptl. - This causes the macro THREAD_SIGINIT to be defined as empty in src/thread.h, - and thread_sig() in src/thread.c is never used. - -2003-06-11 Paul Rombouts - - * src/thread.h - Undid the change to the definition of THREAD_SIGINIT suggested to me by - Thomas Moestl, after receiving a report of a problem with this change - from someone running SuSE 7.0. - -2003-06-06 Paul Rombouts - - * src/dns_query.c: - Discovered that I failed to preserve the semantics of Thomas Moestl's code - when I rewrote a section of code in use_server(). Fixed. - -2003-05-19 Paul Rombouts - - * src/cache.c,src/conf-lex.l.in,src/conf-parse.y,src/conff.h,src/dns_answer.c,src/dns_query.c,src/servers.c: - Merged fixes contained in patch file sent to me by Thomas Moestl with my own version. - Changing the version to 1.1.8b1 as suggested by the patch file. - -2003-02-26 Paul Rombouts - - * pdnsd-1.1.7a-par.diff: - Made one big patch file from all the changes I made up till now. - Wrote a description of the changes in a file README.par - Posted patch file on the web so others can use it. - -2003-02-24 Paul Rombouts - - * src/cache.c - Changed the code that writes the cache to disk. - Data is now written strictly sequentially, eliminating the need for fseek(). - This seems to have successfully solved the problem I had with corrupt cache files. - -2002-05-27 Paul Rombouts - - * ChangeLog: - Started experimenting with the source code. - Made many changes between 2002-05-27 and 2002-07-13. - Too lazy to maintain the ChangeLog. - -2002-01-06 Thomas Moestl - - * version: Call it 1.1.7. - -2002-01-04 Thomas Moestl - - * src/dns_answer.c, src/dns_query.c: - Comment and debug message fixes, more assertions. - -2002-01-03 Thomas Moestl - - * src/dns.c, src/dns_answer.c, src/dns_query.c: - More harmless fixes, correct some comments and debug messages, add more - assertions. - - * NEWS, version: 1.1.7p2, correct NEWS entry. - - * src/helpers.c: - Make sure the calling thread of pdnsd_exit() terminates immediately. - -2002-01-02 Thomas Moestl - - * src/dns_answer.c, src/helpers.c, src/icmp.c: - Fix a few more harmless bugs, more paranoia. - - * src/status.c: Fix yet more, probably harmless, problems. - -2002-01-01 Thomas Moestl - - * src/dns.h, src/dns_answer.c, src/dns_query.c: - Fix a few more possible buffer size problems, and add a bunch of - assertions as last lines of defence. - -2001-12-30 Thomas Moestl - - * src/dns.c: Build fix (include error.h). - - * NEWS, version: Call it 1.1.7p1, and add a NEWS entry. - - * TODO: Reduce TODO to what actually is still needed. - - * src/dns.c, src/error.h, src/helpers.c: - Add a bunch of robustness PDNSD_ASSERT()'s. - - * src/dns_query.c: - Fix a bug which may possibly be remotely exploitable to gain access as - the user pdnsd runs as. - This was caused by a dumb single-character mistake :( - - * doc/Makefile.am, configure.in: - Avoid confusing automake 1.5 by not putting a comment into a make rule. - Fix CONFDIR passing. - - Submitted by: GoTaR - - * src/pdnsd-ctl/pdnsd-ctl.c: - Avoid crashing when the buffer contents received using the status command - are not terminated. - -2001-10-14 Thomas Moestl - - * src/rc/SuSE/pdnsd.in, THANKS: - Fix the stop case for the SuSE rc script: killproc requires the full - path of the binary as argument (reported by Bernhard Pelz). - -2001-09-23 Thomas Moestl - - * configure.in: - Revamp the OS autodetect test. OpenBSD and (hopefully) NetBSD are no longer - unsupported. - - * src/helpers.c, THANKS: - Do not try to use arc4random when compiling for NetBSD (submitted by - Thomas Stromberg). - -2001-09-10 Thomas Moestl - - * COPYING.BSD: s/REGENTS/AUTHOR/ in one place. - - * src/cache.c: - It is possible no record of the requested type is present after calling - cr_add_cent_rr_int() (when the record was marked as being local), so - check before dereferencing the pointer to the respective rrset. - Leave the record unmodified when cr_check_add() returns 0.x - -2001-07-26 Thomas Moestl - - * src/rc/RedHat/pdnsd.in: - Add a workaround for @sysconfdir@ substitutions containing ${prefix}. - Spotted by Robert Linden. - -2001-07-04 Thomas Moestl - - * src/rc/RedHat/pdnsd.in: - Add a condrestart handler to the Red Hat rc script, and do some general - cleanup. Contributed by Christian Engstler. - -2001-07-02 Thomas Moestl - - * src/error.h: - Attempt to detect a gcc that cannot yet handle ANSI variadic macros, - and work around this by using the old GCC-style variant. - - * src/conff.c: - Remove a + at the start of a line that got in when merging a diff by - hand. - - * src/servers.c: waitpid() returns a pid_t. - - * src/dns.c: - It's sizeof, not sizof. This should unbreak the IPv6 build. Also silence - some warnings with appropriate casts. - - * NEWS, version: Call it 1.1.6, and add a NEWS entry. - -2001-07-01 Thomas Moestl - - * src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns_query.c, THANKS, version, AUTHORS: - Added a modified version of Andreas Steinmetz's code for - query_port_start and query_port_range, and added him to AUTHORS and - THANKS. - -2001-06-23 Thomas Moestl - - * src/cache.c: - Fix a bogon: deleted would not be reset correctly in the first - purge_cache loop, which could cause pdnsd to loop forever when a - negative record was after a deleted rr. - -2001-06-21 Thomas Moestl - - * src/list.h: - Add (currently unused) list macros that are going to be used in future - code. - - * src/cache.c: - Fix a bogon in the rw lock code: we need to wake up a writer if there - are no readers. The old code was a leftover from a time when - SUSP_THRESH was just r_pend * x. - Fix a typo. - -2001-06-13 Thomas Moestl - - * AUTHORS: Add mention of FreeBSD code to AUTHORS. - - * src/netdev.c: - Add SIZEOF_ADDR_IFREQ (taken from FreeBSD: _SIZEOF_ADDR_IFREQ, net/if.h - rev. 1.58.2.1) and add an appropriate copyright notice. - The reason for this is that other BSDs don't have it, and we are not - supposed to use underscored macros in portable software. - -2001-06-12 Thomas Moestl - - * src/icmp.c: Fix double #inclusion of . - Noticed by Sebastian Stark. - -2001-06-08 Thomas Moestl - - * src/dns_query.c, THANKS: - Allow underscores in the query names reported back, as the comment next - to the decompress_name call already indicated (but the call gave NULL - as the uscore parameter, which disables underscores normally). - Add Michael Ströder, who spotted this, to THANKS. - -2001-06-06 Thomas Moestl - - * src/servers.c, THANKS: - Fix a bug discovered by Stefan Erhardt (and add him to THANKS): the - return value of waitpid was misinterpreted. - -2001-06-04 Thomas Moestl - - * Makefile.am, file-list.base.in, version: - Bump version to 1.1.6p1; wire up COPYING.BSD so that it gets included - in RPM's and tarballs. - - * COPYING.BSD: - Add the BSD-Style copyright notice so that it can be included in binary - distributions. - -2001-06-03 Thomas Moestl - - * src/dns.c, src/dns_answer.c, src/dns_query.c, src/helpers.c, src/status.c, NEWS, version: - Bump version to 1.1.5, and add a NEWS entry for this release. - - Miscellaneous cleanups, mainly in the status.c code; fix a bug that - could cause heap corruption (rhncpy always clobbered the whole buffer, - but only the needed space was reserved in add_rr). This should solve - the crashes some people were seeing (this bug is not an exploitable - security hole as far as I know; the respective buffer is on the heap, - as mentioned). - - * src/error.c: - Paranoia: do not use the argument to crash_msg as a format string - (crash_msg is only used with constant strings, though). - -2001-06-02 Thomas Moestl - - * src/dns.c, src/dns.h, src/dns_answer.c, src/dns_query.c, src/error.h, src/hash.c, src/helpers.c: - Correct underscore handling for SRV records, and a few comment fixes. - - * src/cache.c, src/conff.c, src/dns_query.c, src/error.h, src/helpers.h, src/status.c: - Numerous non-critical argument fixes for printf-like functions. - - * src/dns.c: Remove superfluous \n's. - - * src/conf-parse.y, src/dns_answer.c, src/status.c: - Correct some DEBUG_MSG nits, and fix two format string bugs. One of - them could allow users that are allowed to use pdnsd-ctl with the - server (when the status socket is enabled) to gain the privileges of - the user that runs (the run_as user or the user that started pdnsd on - Linux when strict_setuid is set to off) pdnsd. The status socket is - disabled by default, and if it is enabled, it's default permissions - are quite restrictive, so this isn't a problem for most. - -2001-05-30 Thomas Moestl - - * src/status.c: - Make the status permissions actually work (missed last time). - - * src/dns_answer.c, src/main.c, src/status.c, src/status.h: - Move the status socket initialization to a place where it gets executed - before any threads are started; this way, we can use umask to set the - permissions, and avoid a (in this case harmless, but anyway) race - condition. - While being there, remove obsoleted comments and places referring to - the now-socket as fifo. - -2001-05-29 Thomas Moestl - - * src/cache.c: - Replace a misuse of CF_LOCAL with DF_LOCAL. This had no effect, because - the values are the same. - -2001-05-22 Thomas Moestl - - * src/hash.c, src/helpers.c, THANKS, acconfig.h, configure.in: - Add an option for allowing underscores (_) in domain names. This - violates the RFC's if enabled (which it isn't by default). - Thanks to Eelco Vriezekolk for an initial patch. - - While being there, clean up configure.in and acconfig.c a bit. - - * src/helpers.c, src/status.c: - Add a few comments about security implications. - - * src/cache.c, src/dns_answer.c, src/dns_query.c, src/helpers.c: - Change some occurences of strcpy to strncpy. Again, no risk here, the - buffer lentgh was carefully chosen, and while the data was partially of - remote origin, it was carefully validated before entering the cache (and - thus having a chance of being used by us). - 3 occurences remain: 2 in cache.c, where we allocate a sufficient amount - of memory before (mimicking the non-portable strdup) and one where - we copy a constant and which is obviously correct. - - * src/dns.c: - Change two occurences of strcat to strncat. Again, no risk here, the - buffer lentgh was carefully chosen, the data was validated and supplied - by the starting user. - - * src/dns.c: - Change a sprintf to a snprintf and enlarge a buffer a bit. This is pure - paranoia (alrhough makes code review easier for others), because a.) the - lengths were carefully chosen so that no overrun could occur and - b.) this was locally supplied data. - -2001-05-21 Thomas Moestl - - * src/rc/RedHat/Makefile.am: - Add a missing semicolon in the RedHat rc Makefile.am (discovered by - Christian Engstler). - -2001-05-19 Thomas Moestl - - * HACKING: Remove the mostly outdated HACKING file. - - * src/debug.c: - Catch a corner case in the allocation debug helpers: realloc() with a - size of 0 is effectively a free operation. To my knowledge, this is - not done in the pdnsd sources, however. - - * src/test/test.sh: - Use the correct error function, forgotten in last commit. - - * src/test/clnt-test.sh, src/test/srv-test.sh, src/test/test.sh: - Misc small improvements in the regression test scripts, mostly - adding configuration variables and common error handlers. - Comment a little on the tests that are done in clnt-test.sh - - * src/rr_types.c: Fix a typo in a comment. - - * src/cache.c, src/debug.c, src/dns_answer.c, src/dns_query.c, src/error.h, src/hash.c, src/list.c, src/main.c, src/status.c, src/thread.c, src/thread.h: - New ANSI variadic debug macros (finally), which print a timestamp and - a thread ID now for easier debugging with many parallel queries. - It should be considered to make those inline functions instead. However, - we have the advantage that we use printf in place here and benefit - from parameter checking without specifying obscure function attributes. - - * src/rc/SuSE/.cvsignore, src/test/.cvsignore, src/rc/.cvsignore, src/rc/Debian/.cvsignore, src/rc/RedHat/.cvsignore, contrib/.cvsignore, doc/.cvsignore, src/.cvsignore, src/pdnsd-ctl/.cvsignore, .cvsignore: - Brush up the rotten (pre-autoconf!) .cvsignore files and add some where - necessary. - -2001-05-17 Thomas Moestl - - * src/rc/RedHat/Makefile.am, src/rc/RedHat/pdnsd.in, configure.in, pdnsd.spec.in: - Red Hat rc script and RPM improvements by Christian Engstler. - -2001-05-12 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c: - Fix a place missed when converting rr_info. - - * version: It's 1.1.4, finally. - - * src/rr_types.c, version: - Change some class values in the rr type structure to better values. - Bump beta version. - -2001-05-10 Thomas Moestl - - * src/cache.c, src/dns_answer.c, src/dns_query.c: - Fix a signedness bug that could cause erraneous 0 ttls to be returned. - Add some debug messages, and do some minor fixups. - -2001-05-09 Thomas Moestl - - * src/cache.c, src/rr_types.c: - Fix some bugs in the new conflict resolution code and make it more - complete. - - * src/cache.c, version: - Add conflict resolution code. This needs a bit more checking, and - the tables might still need to be tweaked. - Bump version. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/Makefile.am, src/cache.c, src/cache.h, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/consts.c, src/consts.h, src/debug.c, src/dns.c, src/dns_answer.c, src/dns_answer.h, src/dns_query.c, src/dns_query.h, src/error.c, src/error.h, src/hash.c, src/hash.h, src/helpers.c, src/helpers.h, src/icmp.c, src/icmp.h, src/list.c, src/main.c, src/netdev.c, src/netdev.h, src/rr_types.c, src/rr_types.h, src/servers.c, src/servers.h, src/status.c, src/status.h, src/thread.c, src/thread.h, configure.in, version: - Remove the old infrastructure that theoretically could have allowed for - multiple cache subsystems. This ability was never used, and if it should, - the caching should probably be split into two layers, a higher level - common one and the actual caching backends. - src/cacheing/cache.c and src/cacheing/native/*.[ch] were repo-copied to - src/. - Substitute "conf.h" with for includes. - Purge records a little more often (when adding records, and when - retrieving from the cache). Handle cache_size properly when using - purge_cent. - Introduce some infrastructure in rr_types.[ch] for a record conflict - checker which is to be introduced shortly to enforce cache consistency - even in the purge_cache=off case. - -2001-05-04 Thomas Moestl - - * src/rc/RedHat/pdnsd.in, src/rc/SuSE/pdnsd.in, src/rc/Debian/pdnsd.in: - Revert the last commit. It breaks the rc scripts by spamming them with - make style variable expansions. - - * src/rc/SuSE/pdnsd.in, src/rc/RedHat/pdnsd.in, src/rc/Debian/pdnsd.in, AUTHORS, THANKS: - Fix a rc script bug spotted by Frank Elsner, and add him to AUTHORS and - THANKS. - -2001-05-01 Thomas Moestl - - * version: Bump version to 1.1.4p2. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/status.c: - Fix some bogons and remove some unneeded code in the pdnsd-ctl - interface. - Fix spelling and line length bugs. - -2001-04-30 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c, src/conf-parse.y, src/status.c: - Some corrections for the authrec config file and the pdnsd-ctl noauth - support. - - * src/pdnsd-ctl/pdnsd-ctl.c: - Fix wrong argv index (using getopt changed the indices). - - * src/pdnsd-ctl/pdnsd-ctl.c, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns.c, src/dns.h, src/dns_query.c, src/status.c, THANKS, version, AUTHORS: - Accumulated changes that should go in before 1.1.4: - - merge Andrew M. Bishop's patch that adds a server label option - - make local records authoritative for the domain by default, and add - the authrec option to change this - - add the auth keyword to the pdnsd-ctl source option to support that - - fix a bug in the conf-parse.y grammar causing a shift/reduce conflict - - sync up AUTHORS and THANKS: add Andrew M. Bishop, Kevin A. Burton and - Michael Steinl - - bump version to 1.1.4p1 - - * src/conff.c, src/main.c: - Fix two small bugs: the wrong element of argv was used for the pidfile - option, which could cause pdnsd to segfault, and C_INCLUDED was always - used in slist_add, regardless of the tp parameter. - - * src/helpers.c: - Fix a bogon discovered by Michael Steiner: the fread() return value - was tested against bytes, not the number of items. - - * src/hash.c, src/hash.h, src/cache.c: - purge_cache used to walk over the cache quite inefficiently when it was - called from add_cache. Add a lazy mode for purge_cache which uses the - rrset_l to be efficient in this special case. - Add some #ifdef'ed-out-by-default code to debug the hash function. - -2001-04-12 Thomas Moestl - - * NEWS: Add NEWS entry for 1.1.3. - - * src/dns.c, src/helpers.c, src/icmp.c, contrib/Makefile.am, contrib/README, version: - IPv6, ICMP and build fixes. It's 1.1.3 now! - - * src/debug.c, src/debug.h: Add the new debug support files. - - * src/test/clnt-test.sh, src/cache.c, src/cache.h, src/error.h, src/list.c, src/list.h, src/main.c, src/status.c, src/status.h, src/Makefile.am, src/conf-parse.y, src/conff.h, src/dns.c, src/dns_answer.c, src/dns_query.c: - Add allocation debug support. Some small cleanups before the upcoming - 1.1.3 release. - - * src/dns_query.h, src/helpers.c, src/list.c, src/conff.c, src/dns.c, src/dns_answer.c, src/dns_query.c: - Lots of small bugfixes, cleanups, style and spelling fixes. - - * src/test/clnt-test.sh: Fix nc arguments. - - * src/test/clnt-test.sh, src/test/srv-test.sh, src/test/test.sh: - Add regression test scripts. - -2001-04-11 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c, src/cache.c, src/servers.c, src/dns_answer.c, src/helpers.c, src/helpers.h, src/icmp.c, src/main.c: - Further cleanups and bug, style and spelling fixes. - - * configure.in: Use -g again in the CFLAGS for a while. - - * version: Beta version bump. - - * src/rc/SuSE/pdnsd.in: - killproc does not seem to take the full path, but only the process name - (which is what one would expect). - - * src/hash.c, src/netdev.c, src/rr_types.c, src/status.c, src/conf-parse.y, src/conff.c, src/helpers.c: - Misc. smaller fixes, and fixes on the new features. Also clean up style - and spelling in some places. - - * src/dns_answer.c: - Bring the glibc pthread_cleanup_push/pthread_cleanup_pop return bug - workaround into the main tree. - Without this, a return between those two macros would cause pdnsd - to crash on system using a glibc between 2.1.2 and 2.2.2 (and possibly - others). This could e.g. be cause by a TCP connect() port scan. - -2001-04-10 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c: - Minor fixes, direct error messages to stderr. - - * src/list.c, src/list.h: Add the new list implementations. - - * src/cache.c, src/cache.h, src/conf-parse.y, src/dns.c, src/dns_answer.c, src/dns_query.c, src/helpers.c, src/helpers.h, src/conf-lex.l.in: - Introduce rhnlen and rhncpy and make use of it instead of kluged-up - strcpy/strlen in the appropriate places. - Check that incoming names contain only legal characters in - decompress_name, return RC_FORMAT otherwise (this would result in - wrong handling only, but not in a security hole). - Reorganzie compose_answer and make it more correct for multiple - questions. Get rid of the algorithm that tries to add a higher - level name server; this might be readded in another place somewhen. - Use some more da_* instead of hand-built lists. - Some style cleanups. - - * src/rc/RedHat/Makefile.am: - Add K45pdnsd links for rc6.d (reboot) and rc0.d (halt) following a - suggestion by Stas Sergeev. - -2001-04-06 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c, src/cache.h, src/error.h, src/helpers.c, src/helpers.h, src/main.c, src/servers.c, src/status.c, src/conf-parse.y, src/conff.c, src/conff.h, src/dns.c, src/dns.h, src/dns_answer.c, src/dns_query.c, src/Makefile.am, version: - Bump alpha version; introduce a generic dynamic array type and make use - of it to ged rid of some ugly casts and redundant code. - Minor fixes. - - * src/icmp.h, src/ipvers.h, src/conff.h, src/consts.h, src/dns.h, src/dns_answer.h, src/dns_query.h, src/helpers.h: - Use macros without an underscore as first character to protect the - headers. Underscores are reserved and should not be used in the - application name space. - - * src/error.h: Add PDNSD_ASSERT, change style a little. - -2001-04-03 Thomas Moestl - - * src/hash.c, src/netdev.c, src/servers.c, src/helpers.c, src/icmp.c, src/main.c: - Another slew of small bugfixes, minor updates and small fixes. - - * src/rr_types.c, src/consts.c: - Update rr_types.c copyright date, consts.c should have a rcsid string. - - * src/rr_types.c: cvs add rr_types.c. - - * src/dns.h, src/helpers.h, src/ipvers.h, src/rr_types.h, src/status.h, src/conf-parse.y, src/conff.h: - cvs add rr_types.h that got missed before, update copyright dates, - remove some old config cruft, some minor fixups. - - * src/conff.c, src/consts.c, src/dns_answer.c, src/error.c, src/conf-lex.l.in, src/conf-parse.y: - Update copyright dates, fix some minor bugs. Update copyright dates. - cvs add missed consts.c. - -2001-03-28 Thomas Moestl - - * src/cache.c, src/hash.c, src/error.c, src/servers.c, src/dns_answer.c, version: - Bump version to 1.1.3p4 - Fix some non-critical locking issues (none of them could be fatal). - Adjust copyright dates. - - * src/hash.c: Make the hash compare case insensitive. - -2001-03-25 Thomas Moestl - - * contrib/Makefile.am: Add Id tag to Makefile.am - - * src/cache.c, src/dns_answer.c, src/icmp.c: - Some more type fixes overlooked in last commit. - - * src/conf-parse.y, src/conff.h, src/dns.h, src/dns_answer.c, src/dns_query.c, src/icmp.c: - More type cleanups. Use time_t for time specifications throughout, and - make lengths singed longs. Cast cleanup in icmp.c to fix alpha - unalinged access faults. - - * contrib/dhcp2pdnsd, contrib/pdnsd_dhcp.pl, contrib/save_ram.pl, contrib/Makefile.am, contrib/README, configure.in, version, Makefile.am: - It's 1.1.3p3 now. - Change the contrib infrastructure: there is a Makfile.am in contrib/ - now. Rename Marko Stolle's pdnsd_update.pl to pdnsd_dhcp.pl and bring - it up to date (adding the rc script and save_ram.pl). - - * src/helpers.c, src/dns.c, src/dns_query.c, AUTHORS, THANKS: - Bring in Bjoern Fischer's changes to make pdnsd conserve the case of - cached names, and add him to AUTHORS and THANKS. - - * configure.in: The gdbm backend is discontinued. - - * src/cache.c, src/hash.c: - Cleanup and small bugfixes of the cache code (esp. locking). - - * AUTHORS, THANKS, file-list.base.in, pdnsd.spec.in: - SuSE fixes by Christian Engstler. - Add him to AUTHORS, THANKS. - -2001-03-14 Thomas Moestl - - * src/dns_query.c: - Fix a bug that could cause servers that were not used in the first - parallel query not to be used at all (failure would be returned - instead). - -2001-03-13 Thomas Moestl - - * src/icmp.c: Add define for ip_p equivalent on Linux. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/cache.c, src/dns_query.c, src/icmp.c, src/status.c, src/conf-parse.y, src/dns_answer.c, version: - Bump alpha version, more alignment fixes. All casts should be correct - now. - -2001-03-12 Thomas Moestl - - * src/dns_answer.c, src/dns_query.c, AUTHORS, THANKS: - Add the alpha fixes by P.J. Bostley, and add him to THANKS and AUTHORS. - -2001-03-10 Thomas Moestl - - * src/dns.h, src/helpers.h: - Remove prototype for removed function strtolower. - Use unit16_t and uint32_t instead of unsinged short/long for dns - protocol structures. - -2001-02-25 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c, src/status.c, src/conf-lex.l.in, src/conf-parse.y, AUTHORS, Makefile.am, version: - Add MX and CNAME for rr sections in the config file and MX setting - for pdnsd-ctl. - Typo fixes. - - * src/netdev.c: Two more fixes. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/cache.c, src/dns.c, src/main.c: - More small robustness fixes. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/netdev.c, src/status.c, src/status.h, src/conf-parse.y, src/helpers.c, src/main.c, configure.in, version, Makefile.am, NEWS: - A batch of robustness fixes. Move the status socket to the cache - directory. Various cleanups. - It's 1.3 now (hopefully to be released soon). - -2001-02-21 Thomas Moestl - - * src/main.c, src/conf-lex.l.in: - Fix breakage of the -mtu option and the query_method option (the parser - would not recognize constants that contained underscores). - -2001-02-20 Thomas Moestl - - * contrib/README, contrib/pdnsd_dhcp.pl, AUTHORS, Makefile.am, THANKS, file-list.base.in: - Add Marko Stolle's pdnsd_update.pl DHCP update script, add him to THANKS, - and bring a contrib/ directory in place. - -2001-02-15 Thomas Moestl - - * src/dns_answer.c, configure.in, version: - Some minor build & misc fixes. Bump version to 1.1.2a and release a - version with the spec file fixes to get proper Red Hat RPM's. - -2001-02-09 Thomas Moestl - - * NEWS: Bring NEWS up to date. - - * src/icmp.c: Do not close the socket on error. - - * pdnsd.spec.in: Add spec file fixes for man pages by Sourav K. Mandal - -2001-02-07 Thomas Moestl - - * version: It is now 1.1.2. - - * src/dns_query.c, src/main.c, Makefile.am, THANKS: - Fix a too strict length checking that could cause SERVFAIL to be returned - when the server returned NXDOMAIN. Add Markus Storm to THANKS (he has - reported this bug and supplied helpful information). - Minor tweaking in main.c. - Remove emptying of GZIP_ENV in Makefile.am (this normally contains --best). - -2001-01-27 Thomas Moestl - - * AUTHORS, THANKS: - Add Michael Wiedmann to AUTHORS and THANKS for his pdnsd-ctl.8 man page. - - * doc/Makefile.am, doc/pdnsd-ctl.8, configure.in, Makefile.am: - Add the pdnsd-ctl man page contributed by Michael Wiedmann. For this to - build in a correct way, add doc/Makefile.am and move all doc and - pdnsd.conf.sample related stuff in there. - -2001-01-25 Thomas Moestl - - * src/main.c: Removed unneeded for the non-O_NOFOLLOW case. - -2001-01-24 Thomas Moestl - - * src/main.c: - Add a fchown and a fchmod to the new non-O_NOFOLLOW case (not yet used). - - * src/conf-parse.y, src/main.c, src/status.c: Misc small fixups. - - * version: It's called 1.1.1 now. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/status.c, src/main.c: - Fix command line parsing. Add code to securely create pid files under - OSs that do not support the O_NOFOLLOW flag (those OSs are not supported - yet, though). - Fix a possible race condition in socket creation/chmod. We now create - a directory in /tmp (or whatever TEMPDIR was set) to hold the socket. - - * src/dns.c, src/dns_answer.c, src/icmp.c, src/main.c, src/status.c: - Another slew of copyright notice upgrades. - - * version, configure.in: - Bump beta revision, fix typo (missing $) in configure.in - - * src/dns.c, src/dns_answer.c, src/status.c: - Silence BSD compile time warnings. - - * configure.in: - Cleanup, add autoconf code for building pdnsd on FreeBSD-CURRENT with the - new additionally-linked libc_r. - -2001-01-16 Thomas Moestl - - * src/dns_answer.c, src/icmp.c, version: - Bump beta revision, fix a comment. Also, generate ping id's using pdnsd's - random wrappers instead of using rand() for paranoia. - -2001-01-15 Thomas Moestl - - * src/helpers.c, configure.in: Improve wording. - - * src/helpers.c: Update copyright year (forgotten in last commit). - - * src/dns_answer.c, src/helpers.c, src/main.c, acconfig.h, configure.in, version: - Bump versions. Small fixes (move socket intitializations from - udp_server_thread to init_udp_sockets to prevent warning when startup - takes long. - Make arc4random an option for a query id RNG and make it the default - on FreeBSD. - -2000-12-07 Thomas Moestl - - * src/conf-parse.y, src/main.c, version: - We are at 1.1.1p1. Removed the exec-uptest security warning printef if no - explicit user is given in the strict_setuid case (it is not needed there, - and confuses users). - -2000-11-28 Thomas Moestl - - * src/cache.c, src/helpers.c: - Converted cache locks to use condition vars and have lock contention - prevention. Added comments where not converted. - -2000-11-25 Thomas Moestl - - * AUTHORS, THANKS, pdnsd.spec.in: - Added spec file patches by Bernd Leibing and added him to AUTHORS and - THANKS. - -2000-11-21 Thomas Moestl - - * src/rc/SuSE/Makefile.am: Fixed a hopefully last SuSE rpm build bug. - - * src/rc/SuSE/Makefile.am: - Another one: allow rc.conf manipulation to fail for a clean - rpm build (SuSE only). - - * file-list.base.in: - Last-minute fix: correct filelist for rpm build to reflect the new name - for the sample configuration. - - * version: It's 1.1.0 now. - -2000-11-18 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl.c, src/cache.c, src/dns_query.c, version: - Fixed a condition where the cache code did not give up a lock. - Made the udp code use connect(). - Some small changes. - -2000-11-16 Thomas Moestl - - * version: Calling it 1.1.0b3. - -2000-11-15 Thomas Moestl - - * src/test/Makefile.am, src/pdnsd-ctl/Makefile.am, src/cache.c, src/Makefile.am, src/dns_answer.c, src/error.h, src/icmp.c, src/icmp.h, src/main.c, src/netdev.c, src/servers.c, src/thread.c, Makefile.am, configure.in, version: - Enabled new rr support by default (some resolvers don't seem to like not - supported answers - not our bug, but well). - Made some globals volatile to avoid being bitten by optimisations. - -2000-11-12 Thomas Moestl - - * TODO, version: Called it the first beta. - -2000-11-11 Thomas Moestl - - * src/cache.c, src/conf-lex.l.in, src/conf-parse.y, doc/pdnsd.conf.in: - renanmed rrneg to neg in the config file. - Misc small fixes. - pdnsd-ctl record xxx inval will now also invalidate local records. - - * src/conf-lex.l.in, src/conf-parse.y, src/dns_answer.c, src/status.c, pdnsd.spec.in: - Added --sysconfdir=/etc as argument to configure in the spec file. - Implemented the new rrneg config file section. - - * src/test/Makefile.am, src/pdnsd-ctl/Makefile.am, src/pdnsd-ctl/pdnsd-ctl.c, src/cache.c, src/cache.h, src/status.c, src/status.h, TODO: - Added the neg option to pdnsd-ctl. - - * src/cache.c, src/Makefile.am, src/conf-lex.l.in, src/consts.h, src/dns.c, src/dns.h, src/dns_answer.c, src/dns_query.c, src/helpers.c, src/main.c, configure.in: - Assorted fixes. The new features should be stabilized by now, will - integrate the missing few features now. - Also actived the tcp server by default. - -2000-11-07 Thomas Moestl - - * src/dns_answer.c, src/dns_query.c, src/icmp.c, src/ipvers.h, THANKS, TODO: - Fixed a possible memory and socket leak reported by Erich Reitz. - Implemented udp source address discovery for FreeBSD. - - * src/dns_query.c: Part 2 of yesterdays fix. - -2000-11-06 Thomas Moestl - - * src/dns_query.c, version: - Fixed a bug reported by Erich Reitz: pdnsd could leak fd's and memory if - queries timed out. - - * src/cache.c, src/cache.h, src/Makefile.am, src/dns_answer.c, src/dns_query.c, TODO, configure.in: - Sorted out some bugs for the new neg cacheing. - -2000-11-05 Thomas Moestl - - * src/cache.c, src/dns_query.c, TODO: - Negative cacheing support is now present, but largely untested. - - * src/conff.c, TODO: - The output of pdnsd-ctl status is now complete with all currently - supported options. - - * src/conf-parse.y, src/conff.c, src/conff.h, src/consts.h, src/conf-lex.l.in: - Added the config file options for the nefative cacheing support. - -2000-11-04 Thomas Moestl - - * src/cache.c, src/cache.h, src/conf-parse.y, src/dns.c, src/dns_query.c, src/status.c, version: - The new cache infrastructure for negative cacheing is in place. - Using and testing it remains. - - * src/cache.c, src/cache.h: - First changes to support negative cacheing. This should not break - anything, but the cache file format will be incompatible. - - * src/main.c, src/dns_answer.c: - init_udp_socket() and init_tcp_socket() are now called after - daemonizing on FreeBSD, as bind wants to lock the fd which - can cause later calls to fail after an exit. - -2000-11-03 Thomas Moestl - - * src/dns_query.c, src/icmp.c, src/servers.c: - Minor bugfixes and repository cleanup. - -2000-11-02 Thomas Moestl - - * src/icmp.c, TODO, version: - Called it 1.0.16p4. Fixed some compatability problems with the new code; - the ipv4 implementation seems to be fairly stable, the ipv6 one needs - some testing with dest unreach messages. - - * src/icmp.c, src/main.c: - Rewrote large parts of the ping implementation to be more portable. - -2000-11-01 Thomas Moestl - - * acconfig.h, configure.in, version: - Some config fixes, version to 1.0.16p3. SOCKET_LOCKING should be - off by default, as sendmsg can block. - - * src/pdnsd-ctl/pdnsd-ctl.c, src/error.h, configure.in: - Removed -W* arguments from CFLAGS that were implied by -Wall. - - * src/thread.c, configure.in: - Added some more safety tests to configure.in, and made it give - an error on some conditions. Also made configure do poll and usleep - detectione. - - * src/cache.h, src/test/Makefile.am, src/dns_answer.c, src/error.c, src/error.h, src/helpers.c, src/main.c, src/servers.c, src/status.c, src/thread.c, src/thread.h, src/Makefile.am: - Code cleanup. Beautified some macros, and moved the thread - specific things from error.[ch] over to the new thread.[ch]. - Also introduced usleep_r which tries to be thread safe for - different Unices. - -2000-10-31 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl, src/pdnsd-ctl/pdnsd-ctl.c: - The pdnsd-ctl binary got into cvs. Fixed that. - - * src/pdnsd-ctl/pdnsd-ctl, src/cache.c, src/cache.h, src/error.c, src/helpers.c, src/main.c, version: - Another set of FreeBSD compatability patches. This seems to catch - most of the problems, and pdnsd should be useable with libc_r now. - -2000-10-30 Thomas Moestl - - * src/pdnsd-ctl/pdnsd-ctl, src/conff.c, src/dns_answer.c, src/dns_query.c, src/helpers.c, src/icmp.c, src/main.c, AUTHORS, Makefile.am, THANKS, configure.in, version: - FreeBSD fixes, mostly contributed by Roman Shterenzon. - -2000-10-25 Thomas Moestl - - * src/pdnsd-ctl/Makefile.am, src/pdnsd-ctl/pdnsd-ctl: - pdnsd-ctl was not in cvs. - - * src/dns_query.c, src/error.h, configure.in: Some fixups for 1.0.15. - -2000-10-23 Thomas Moestl - - * src/dns_answer.c, src/dns_query.c, configure.in: - Several fixes for pdnsd to work better when it receives error replys. - - * src/dns.c, src/dns_answer.c: - Fixed another memory leak on an error path in dns_answer.c and did - a pointer signedness fixup in dns.c - -2000-10-21 Thomas Moestl - - * src/dns_answer.c, AUTHORS: - Applied a patch by Paul Wagland that fixes some spelling mistakes - and some memory leaks on error paths. - - * src/dns_query.c, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns_answer.c, NEWS, version: - Bug fixes. Added the randomize_recs option and turned it on - by default. - -2000-10-20 Thomas Moestl - - * src/helpers.c, src/dns.c, src/dns_query.c: - Fixes for the paranoid option to work with root servers - properly. - - * src/dns_query.c, src/dns.h, src/dns_answer.c, AUTHORS, THANKS: - Applied a patch by Paul Wagland for bind9-compatability and added - him to AUTHORS and THANKS. - -2000-10-19 Thomas Moestl - - * src/dns_answer.c, NEWS, version: - Another POLL_* fix. It is now called 1.0.14. - - * src/dns_answer.c, src/dns_query.c, src/icmp.c: BSD build fixes. - - * src/dns_query.c: - Made p_recurdive_query return immediately if a query returns - NXDOMAIN. - - * src/dns_query.c, Makefile.am: - Some bugifixes. It is now called 1.0.13. Releasing. - - * src/cache.c, src/dns_query.c, AUTHORS, NEWS: - Updated AUTHORS and NEWS. Made destroy_cache() lock the cache so - that no thread can access the cache afterwards (could lead to - crashes). - - * src/helpers.c, NEWS, THANKS: - Integrated a security fix contributed by Olaf Kirch: when - changing user IDs, pdnsd did not reinitialize the supplementary - group list, meaning that the process still had the privileges - of the supplementary groups the original user was member of. - - * src/conf-lex.l.in, src/conf-parse.y, Makefile.am, TODO, version: - Introduced the par_queries option. - - * src/dns_answer.c, src/dns_query.c, TODO: - Updated TODO, did some fixups for string handling. - - * HACKING: Added HACKING with some comments about coding style. - -2000-10-18 Thomas Moestl - - * src/dns_answer.c, src/dns_query.c, src/error.h, src/main.c, TODO: - Revieved and fixed the new dns_query.c-poll/select loops. - - * src/test/tping.c, src/dns_query.c, src/icmp.c: - Fixed the new poll/select ping support. - -2000-10-17 Thomas Moestl - - * src/dns_query.c, src/icmp.c, TODO: - Got rid of the O_NONBLOCK loop in the icmp.c ping implementation. - Beta tesing pending. - - * src/rc/Debian/Makefile.am, src/conff.c, src/conff.h, src/dns_query.c, src/dns_query.h, THANKS, TODO, acconfig.h, configure.in: - Corrected the Debian rc script (bug reported by Michael Müller). - Got rid of the nonblocking socket things in dns_query.c, and - using poll/select now. - Testing (esp. --no-poll) remains. - - * src/dns_answer.c: - Got rid of O_NONBLOCK read loops in dns_answer.c, using poll/select - now instead (after one issue about boundaries was cleared up). - -2000-10-16 Thomas Moestl - - * src/rc/SuSE/Makefile.am, src/rc/RedHat/Makefile.am, src/rc/Debian/Makefile.am: - The generated rc scripts do not need to be in the distribution. - - * src/conff.c, src/main.c: - Fixed a server structure members in conff.c. Only delete the socket - if we are in status pipe mode now. - - * src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns_answer.c, src/dns_query.c, acconfig.h, configure.in: - Added the --enable-tcp-subseq and --with-tcp-qtimeout configure - options, added the tcp_qtimeout conf file option, tested things. - 1.0.12 is ready for release. - -2000-10-15 Thomas Moestl - - * src/dns_answer.c, TODO, acconfig.h: - Added TCP timeouts to the answer code. Still need an option in the - conf file and documentation for that (besides beta testing). - - * src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/consts.h, src/dns_query.c, src/helpers.c, src/helpers.h, NEWS, TODO: - Introduced domain inclusion/exclusion lists in the server section - (new options include=, exclude=, policy=). - -2000-10-14 Thomas Moestl - - * src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns_answer.c, src/main.c, NEWS, TODO, version: - Upped version, updated NEWS and TODO and implemented a process - count limit. - -2000-10-13 Thomas Moestl - - * src/rc/Debian/pdnsd.in, src/main.c: - Added the --pdnsd-user option, and made the Debian rc script - use it rather than trying to parse the config file itself. - -2000-10-11 Thomas Moestl - - * src/rc/SuSE/pdnsd, src/rc/SuSE/pdnsd.in, src/rc/RedHat/pdnsd, src/rc/RedHat/pdnsd.in, src/rc/Debian/pdnsd, src/rc/Debian/pdnsd.in, AUTHORS, THANKS, configure.in: - Added the 'configure'-able rc scripts contributed by Carsten Block - and added him to THANKS and AUTHORS. - - * src/main.c: - Added O_NOFOLLOW to the pidfile open() call (if it is defined) - to prevent users creating files as the pdnsd user (using links) - if the admin put the pidfile in a world-writeable directory - against all good advice. - This is not a bug fix! Admins were not, and are still not supposed - to put the pidfile in a directory that is writeable for untrusted - users! - -2000-10-10 Thomas Moestl - - * THANKS: Added Milan P. Stanic to THANKS. - - * src/main.c: - Fixed a missing O_WRONLY in the open() call for pidfile operation. - -2000-10-08 Thomas Moestl - - * src/Makefile.am, src/dns.c, src/dns_answer.c, configure.in, version, acconfig.h: - Released 1.0.11. - Two security fixes in dns.c and dns_answer.c, and misc. smaller issues. - - * src/Makefile.am, src/conf-parse.y, src/dns_answer.c, src/dns_query.c, src/icmp.c, src/servers.c, AUTHORS, THANKS, TODO, acconfig.h, configure.in, version: - 1.0.10 was released some time ago ;-) - This had some IPv6 fixes. - Also fixed minor bug when using SOCKET_LOCKING. - -2000-08-28 Thomas Moestl - - * src/dns_answer.c: Fixed a parameter mismatch in getsockopt() - - * Makefile.am: - Applied Sourav K. Mandal's rpm build patch to the toplevel - Makefile.am - -2000-08-27 Thomas Moestl - - * src/conf-lex.l.in, src/conf-parse.y, src/consts.h, src/servers.c, version: - Added diald support. It's now called 1.0.9. - - * src/conf-parse.y, src/conff.c, src/netdev.c, pdnsd.spec.in: - Fixed some ugly typos in conf-parse.y and netdev.c. - Since I have no further bug reports and these bugs make some - things inconvenient, I will release 1.0.9 immediately. - -2000-08-26 Thomas Moestl - - * pdnsd.spec.in: small spec fix. - - * NEWS, configure.in: Last fixups for 1.0.8. Released it. - - * Makefile.am: Set mode and owner for cache file. - - * src/conf-parse.y, src/dns_answer.c, src/netdev.c, acconfig.h, configure.in, version: - Misc fixes. Hopefully fixed the UDP socket problems under Linux SMP. - -2000-08-20 Thomas Moestl - - * src/cache.c, src/dns_answer.c, AUTHORS, THANKS, configure.in, pdnsd.spec.in, version: - Build fixes by Alexandre Nunes, spec fixes (does now set distro for - configure), first attempt at an "error in udp send"-fix, and fix - for a problem with having records for the root domain in the disk - cache file. - -2000-08-13 Thomas Moestl - - * src/netdev.h, src/servers.c, src/status.c, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/consts.h, src/dns.c, src/dns.h, src/main.c, src/netdev.c, AUTHORS, THANKS: - Some minor fixes. Integrated the ppp device patch by Ron Yorston. - -2000-08-12 Thomas Moestl - - * configure.in: - configure.in was missing in repository. Also removed debugging - flag for build. - - * src/main.c: Made the pid file handling safe for directories. - - * src/dns.c: Part II of the last fix. - - * src/dns.c: - Fixed a nasty bug in decompress_name which would produce errors very - rarely. That was a off-by-one bug, but on the safe side (no overflow, - stopping one by too early). - - * src/main.c: - Fixed several possible problems with strncat(). None of these was - critical or involved remote data. - -2000-08-08 Thomas Moestl - - * src/main.c: Changed FreeBSD signal latency to 250 ms. - - * src/main.c, acconfig.h: - A set of last-minute FreeBSD fixes. pdnsd does now NEED linuxthreads on - BSD. - -2000-08-07 Thomas Moestl - - * version: It's now called 1.0.7. - - * src/main.c, doc/pdnsd.conf.in, Makefile.am: Misc build&BSD fixes. - - * src/conff.c, src/conf-parse.y, version: - Version set to the hopefully last beta. Fixed the proxy_only option. - -2000-08-05 Thomas Moestl - - * src/rc/SuSE/Makefile.am, src/rc/RedHat/Makefile.am, src/rc/Debian/Makefile.am, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns_query.c, src/status.c, doc/pdnsd.conf.in, Makefile.am, TODO: - Added the proxy_only options. Some build fixups. - -2000-07-30 Thomas Moestl - - * src/rc/SuSE/Makefile.am, src/rc/RedHat/Makefile.am, src/rc/Debian/Makefile.am, src/rc/Makefile.am, src/main.c, src/status.h, AUTHORS, INSTALL, Makefile.am, TODO, version: - Many small fixups for 1.0.7. - -2000-07-29 Thomas Moestl - - * src/rc/SuSE/Makefile.am, src/rc/RedHat/Makefile.am, src/rc/Debian/Makefile.am, src/rc/README, src/status.c, src/servers.c, Makefile.am, TODO, acconfig.h: - Assorted fixes. - - * src/cache.c, src/hash.c, src/dns.h, src/dns_answer.c, src/dns_query.c, src/icmp.c, src/ipvers.h, src/servers.c, src/servers.h, src/status.c, src/status.h, src/Makefile.am, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns.c, AUTHORS, Makefile.am, THANKS: - Big heap of updates and fixes. Incorporated build changes from Sourav - K. Mandal and pcmcia SCHEME support by Stephan Boettcher. - -2000-07-22 Thomas Moestl - - * src/rc/Debian/pdnsd: - Applied a patch by Markus Mohr to his debian rc script, which I had - broken in some way. - -2000-07-21 Thomas Moestl - - * src/cache.c, src/main.c, src/status.c, src/status.h: - Worked on the new status socket (pdnsd-ctl) option. - - * src/Makefile.am, version: Upped version, fixed Makefile.am - - * src/cache.c, src/hash.c, src/hash.h, src/cache.h, src/Makefile.am, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/dns.c, src/dns.h, src/dns_answer.c, src/dns_query.c, src/dns_query.h, src/helpers.c, src/helpers.h, src/ipvers.h, src/main.c, src/status.c, src/status.h, AUTHORS, Makefile.am, THANKS, acconfig.h: - Updated AUTHORS and THANKS. Merged in patches by Sourav K. Mandal - and Lyonel Vincent. - -2000-07-20 Thomas Moestl - - * doc/pdnsd.conf: Added pdnsd.conf. Well... - - * src/dns_query.c, src/dns_query.h, doc/pdnsd.conf: - Added some ommited files. - - * src/test/Makefile.am, src/test/if_up.c, src/test/is_local_addr.c, src/test/random.c, src/test/tping.c, src/rc/SuSE/Makefile.am, src/rc/SuSE/pdnsd, src/rc/RedHat/Makefile.am, src/rc/RedHat/pdnsd, src/rc/Debian/pdnsd, src/rc/Makefile.am, src/rc/README, src/Makefile.am, src/conf-lex.l.in, src/conf-parse.y, src/conff.c, src/conff.h, src/consts.h, src/dns.c, src/dns.h, src/dns_answer.c, src/dns_answer.h, src/error.c, src/error.h, src/helpers.c, src/helpers.h, src/icmp.c, src/icmp.h, src/ipvers.h, src/main.c, src/netdev.c, src/netdev.h, src/servers.c, src/servers.h, src/status.c, src/status.h, doc/pdnsd.conf.in, Makefile.am, acconfig.h, file-list.base.in, pdnsd.spec.in: - Checked in the pdnsd files at their new locations. - - * doc/pdnsd.conf, Makefile, a-conf.sh, cache.c, cache.h, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, consts.h, dns.c, dns.h, dns_answer.c, dns_answer.h, dns_query.c, dns_query.h, error.c, error.h, exec-flex.sh, hash.c, hash.h, helpers.c, helpers.h, icmp.c, icmp.h, ipvers.h, main.c, netdev.c, netdev.h, pdnsd-redhat.spec.templ, pdnsd-suse.spec.templ, servers.c, servers.h, status.c, status.h, version: - Removed the moved files. Will add the new ones soon. - -2000-07-16 Thomas Moestl - - * TODO: New tasks in TODO. - -2000-07-15 Thomas Moestl - - * TODO: - Updated TODO: Autoconf support was contributed by Sourav K. Mandal - - * conff.h, dns_query.c, ipvers.h, cache.c: - Fixed some minor bugs and a showstopper in cache.c that caused - crashes in some situations. - -2000-07-12 Thomas Moestl - - * dns_query.c, error.c, error.h, main.c: - Made pdnsd ignore SIGPIPE, which seemed to be responsible for some - crashes. - Accept (grudgingly) SOA rr's where NS ones would be The Right Thing. - -2000-07-10 Thomas Moestl - - * AUTHORS, THANKS, conff.c: - Updated AUTHORS, THANKS, and the fprintfs for the status pipe in - conff.c - - * TODO, config.h.templ, dns.h, dns_answer.c, dns_query.c, dns_query.h, main.c, version: - Added UDP queries and gave the user the choice between TCP and UDP - queries (UDP is the default now). Made the TCP server optional. - Fixed a authoritative record handling bug. Added pidfile support. - -2000-07-07 Thomas Moestl - - * doc/pdnsd.conf: - Inserted run_as="nobody"; again, it is The Right Thing and people - should use it. - - * Makefile: - The pdnsd cache directory is now created as nobody, since the - default run_as in the example pdnsd.conf is also nobody. - - * doc/pdnsd.conf: - Commented the run_as option out (people may run into permission - problems). - - * version: Upped version to 1.0.5 - - * AUTHORS, THANKS, conf.l.templ, conf.y, conff.c, conff.h, dns_answer.c, icmp.c, icmp.h, main.c, version: - Folded in the server_ip option code as contributed by Wolfgang Ocker - and extended it to IPv6. Fixed a bug in IPv4 ping in IPv6 mode. - -2000-07-06 Thomas Moestl - - * cache.c, dns_query.c: - Killed a bug which could cause crashes with more than 2 servers. - - * cache.c: Fixed a bug reported by Bert Frederiks that would break the - serve_aliases option when only one character was between official - name and alias in the /etc/hosts-style file. - -2000-07-04 Thomas Moestl - - * pdnsd-suse.spec.templ: The SuSE spec now uses the new makefile rule. - - * Makefile, THANKS, dns_query.c, helpers.c, version: - Added people to THANKS, fixed a bug that caused uppercase hosts/ - rr-section entries to be ignored in the cache, fixed the SuSE - makefile for pdnsd to run_as nobody, and other small fixups. - -2000-07-03 Thomas Moestl - - * dns_answer.c: - First change after release of 1.0.4: The questions received - are now properly written into the debug file when starting - with -g -d. - - * config.h.templ, dns_query.c: - Fixed a possible way to get around paranoid restrictions. - - * version: Set version to 1.0.4 - - * doc/pdnsd.conf: Added an entry for the paranoid option. - - * cache.c, config.h.templ, dns_answer.c, dns_query.c, ipvers.h: - Revisions and fixups. The complete code revision is now complete. - -2000-06-29 Thomas Moestl - - * dns_query.c: Overhaul. - - * dns_answer.c, dns_query.c, config.h.templ: - Code overhault continued. dns_answer.c is finished. - -2000-06-27 Thomas Moestl - - * conff.c, dns_answer.c, icmp.c, netdev.c, servers.c, status.c: - Continued code overhaul. Fixed several bugs, and simplified some - code. - - * conf.l.templ, conf.y, conff.c, ipvers.h, version: Fixups. - -2000-06-26 Thomas Moestl - - * hash.c: Revised; fixed a minor bug. - - * cache.c: Overhauled. - - * dns_query.c, error.c, helpers.c, helpers.h, ipvers.h, main.c, version, dns.c: - Manual code overhaul. Numerous small patches, greatly simplified - decompress_name(). - -2000-06-25 Thomas Moestl - - * config.h.templ: - Made the C random() RNG the default (using /dev/urandom, we suck up - too much randomness on high load). - - * error.c, error.h, icmp.c, icmp.h, main.c: - Small cleanups. Makes the testsuite compilation easier. - - * Makefile, config.h.templ: Preparing for release of 1.0.4. - -2000-06-24 Thomas Moestl - - * Makefile, THANKS, a-conf.sh, dns_answer.c, dns_query.c, error.c, version: - Fixed bugs with the paranoid option, connect() timeout handling, and - a incompatability in response handling that caused the glibc - resolver to misunderstand error messages pdnsd generated on unknown - query types. This bug, that was reported by James MacLean, could - for example cause ssh to hang some time. - - * Makefile, NEWS, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, dns.c, dns_query.c, dns_query.h, helpers.c, helpers.h, icmp.c, icmp.h, main.c: - Added the paranoid option, and modified the ping uptest so that it - works with strict_setuid. Also made strict_setuid=on the default. - 1.0.4 should be out soon. - -2000-06-23 Thomas Moestl - - * doc/pdnsd.conf: Added a run_as= line, which is sensible normally. - - * Makefile, conf.l.templ, conf.y, conff.c, conff.h, dns_answer.c, dns_answer.h, helpers.c, helpers.h, main.c, servers.c, status.c, version: - Some fixups, added the run_as and strict_setuid security options. - - * THANKS: Updated. - - * AUTHORS, ipvers.h, main.c, netdev.c, version: - Fixed some definitions for glibc2.0-users. Repaced the return at the - end of main() with _exit(). Should not build and run OK on glibc 2.0 - boxen. - Fixed a typo in netdev.c - - * ipvers.h: - Fixed a typo in ipvers.h to fix compile problems on systems without - an IPv6-supporting C library, and possible IPv6 problems using the - status pipe. - - * error.c, version: - Fixed a bug that could cause signals to be delivered to the wrong - process. - -2000-06-22 Thomas Moestl - - * version: Set version to 1.0.1. - - * cache.c, dns_answer.c, error.c, error.h, main.c, pdnsd-suse.spec.templ: - Fixed misc issues reported by Jonathan Hudson and Joachim Dorner, one - of them a real showstopper in cache.c. - - * Makefile, NEWS, README, cache.h, config.h.templ, version: - Updated things for 1.0.0 and released it finally. - - * AUTHORS, THANKS: Updated THANKS and AUTHORS - - * NEWS, a-conf.sh, cache.c, conf.l.templ, conf.y, conff.c, conff.h, dns_answer.c, dns_query.c, error.c, error.h, main.c, servers.c, status.c: - Fixed a-conf.sh and cleaned up signal handling as far as it can be - done ;-). Added the max_ttl option. - -2000-06-21 Thomas Moestl - - * dns_answer.c, error.c, error.h, main.c, servers.c, status.c: - More signal fixes. This is a real pain with LinuxThreads. - - * NEWS, cache.c, dns_answer.c, error.c, error.h, helpers.c, helpers.h, main.c, servers.c, status.c, version: - Fixups for signal handling. This is more than only a little tricky - using the linuxthreads library. This hopefully fixes the deadlocks - we had on signals. - -2000-06-13 Thomas Moestl - - * AUTHORS, THANKS: Updated credits. - - * a-conf.sh: - A primitive configure-like script intended as drop-in replacement - until autoconf support finally comes. - - * .cvsignore, Makefile, cache.c, dns_query.c, ipvers.h, servers.c, version: - Added a primitive configuration script as drop-in. Killed some bugs - and changed the recently added linkdown_kluge option following - suggestions from Daniel Smolik. - -2000-06-12 Thomas Moestl - - * dns_query.h, exec-flex.sh, Makefile, cache.c, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, dns_query.c: - Numerous cleanups and fixes. Implemented the linkdown_kluge option - as proposed by Daniel Smolik. Hope to get ready for 1.0.0 know. - -2000-06-10 Thomas Moestl - - * Makefile, NEWS, TODO, dns_answer.c: - Modified some stuff in dns_answer.c (if no nameserver for a knot in - the dns namespace is found now, its predecessors are tried now in - order to return accurate authority results). This will be paid with a - little more beta time, so the Makefile has developer switches again. - Corrected NEWS and TODO. - - * Makefile, config.h.templ, dns_answer.c, dns_query.c, dns_query.h, hash.h, helpers.c, version: - Removed some dead code, fixed some really minor bugs. Version is up - to 1.0.0p7, which is hopefully the last beta. - - * Makefile, config.h.templ: - Fixed things up for the 1.0.0 distribution version - -2000-06-06 Thomas Moestl - - * Makefile, config.h.templ, icmp.c, netdev.c: - Some minor comment fixes. - - * Makefile, TODO, main.c, version: - BSD fix in Makefile and help update. It is now called 1.0.0p6. TODO - was updated to reflect the project status. - - * dns_answer.c: - BSD & misc fixes. pdnsd runs now nicely on my FreeBSD 4.0 box. - - * dns_answer.c, ipvers.h: - Fixed IPv6 UDP dest address recovery. Also fixed a real stupid bug in - ipvers.h. - - * cache.h, dns_query.c, error.h: - Added DEBUG_MSG6 macros. Cleaned up requery handling. - - * dns.c, dns_answer.c, dns_query.c, dns_query.h: - Fixed another heap of bugs, introduced some sanity checks, no requery - on answers that have ra not set now. - -2000-06-05 Thomas Moestl - - * cache.c: - Fixed write_disk_cache. - - * cache.c, cache.h: - Fixes for rr handling. - -2000-06-04 Thomas Moestl - - * cache.c, dns_answer.c, dns_query.c: - Fixes again: some missing checks for rrset existence added. - - * cache.c, dns_answer.c, helpers.c, icmp.c: - Fixes for the new/modified code and its side effects on old code ;-) - - * ChangeLog.old, NEWS, cache.c, conf.l.templ, conf.y, conff.c, config.h.templ, dns.c, dns_answer.c, dns_query.c, error.c, hash.c, helpers.c, icmp.c, main.c, netdev.c, servers.c, status.c: - Folded the ChangeLog and NEWS of the 0.9.x tree back in and added NEWS for the - upcoming 1.0.0 release. Some compile fixes. Reorganized config.h.templ. Made - the inclusion of the rcsid strings into the executable optional. - - * cache.c, dns_answer.c: - Pile of fixes on recently added/modified code. - -2000-06-03 Thomas Moestl - - * .cvsignore, Makefile, lex.inc.h: - lex.inc.h should not be in CVS (it is automatically generated by - exec-flex.sh). It should also be deleted by 'make mclean'. - - * TODO, cache.c, dns_answer.c, dns_query.c, lex.inc.h: - rfc2181 conformance should be reached by now. Updated TODO. Bugfixing - remains. - - * doc/html/.cvsignore, doc/html/dl.html, doc/html/doc.html, doc/html/faq.html, doc/html/index.html: - Removed the html documentation from CVS. It is maintained separately. - - * doc/pdnsd.conf: - Added CVS/RCS $Id$ tag. - - * cache.h, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, consts.h, dns.c, dns.h, dns_answer.c, dns_answer.h, dns_query.c, dns_query.h, error.c, error.h, exec-flex.sh, hash.c, hash.h, helpers.c, helpers.h, icmp.c, icmp.h, ipvers.h, main.c, netdev.c, netdev.h, pdnsd-redhat.spec.templ, pdnsd-suse.spec.templ, servers.c, servers.h, status.c, status.h, version, AUTHORS, INSTALL, Makefile, NEWS, README, THANKS, TODO, cache.c: - Added CVS/RCS $Id$ tags to most files, did some cleanups, introduced - the new rrset granularity caching. The new code is still much of beta, - use with care. - -2000-06-01 Thomas Moestl - - * Makefile, cache.c, hash.c, helpers.c, icmp.c, netdev.c: - Yet another set of BSD fixes (test programs do now work for me - under FreeBSD). Some other minor fixes. - - * Makefile, error.c, error.h, helpers.c, helpers.h: - Transplanted kill_pdnsd from error.c to helpers.c in order to get the - tests compiled without the thread library. - -2000-05-31 Thomas Moestl - - * pdnsd: - Ooops, executable got in. - - * Makefile, pdnsd: - Added test suite programs. - - * icmp.c, netdev.c: - All basic BSD patches have been folded in. pdnsd will now compile on - FreeBSD with (hopefully) all features. - - * dns_answer.c, Makefile: - Disabled udp targed address discovery for BSD builds (this sadly ist - OS specific at least for IPv4. Must be rewritten under BSD as it is - an RFC compatability issue under some circumstances) - - * cache.c, cache.h, conf.y, conff.c, conff.h, config.h.templ, dns_answer.c, helpers.c, icmp.c, ipvers.h, netdev.c, Makefile: - BSD include & misc build fixes. More to follow... - - * Makefile, cache.h: - BSD Fixes: Makefile should work with BSD make, sed command line, - sorted out naming clash in cache.h - - * .cvsignore: - Added ChangeLog to .cvsignore - - * THANKS, conff.c: - Fixed a bug reported by Jonathan Hudson and added him to THANKS - - * ChangeLog.old: - Added the pre-CVS ChangeLog. - - * .cvsignore, AUTHORS, COPYING, INSTALL, Makefile, NEWS, README, THANKS, TODO, cache.c, cache.h, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, consts.h, dns.c, dns.h, dns_answer.c, dns_answer.h, dns_query.c, dns_query.h, doc/.cvsignore, doc/html/dl.html, doc/html/doc.html, doc/html/faq.html, doc/html/index.html, doc/pdnsd.conf, doc/txt/.cvsignore, error.c, error.h, exec-flex.sh, hash.c, hash.h, helpers.c, helpers.h, icmp.c, icmp.h, ipvers.h, lex.inc.h, main.c, netdev.c, netdev.h, pdnsd-redhat.spec.templ, pdnsd-suse.spec.templ, servers.c, servers.h, status.c, status.h, version: - Initial import of pdnsd-1.0.0p3 source tree into CVS. - - - * .cvsignore, AUTHORS, COPYING, INSTALL, Makefile, NEWS, README, THANKS, TODO, cache.c, cache.h, conf.l.templ, conf.y, conff.c, conff.h, config.h.templ, consts.h, dns.c, dns.h, dns_answer.c, dns_answer.h, dns_query.c, dns_query.h, doc/.cvsignore, doc/html/dl.html, doc/html/doc.html, doc/html/faq.html, doc/html/index.html, doc/pdnsd.conf, doc/txt/.cvsignore, error.c, error.h, exec-flex.sh, hash.c, hash.h, helpers.c, helpers.h, icmp.c, icmp.h, ipvers.h, lex.inc.h, main.c, netdev.c, netdev.h, pdnsd-redhat.spec.templ, pdnsd-suse.spec.templ, servers.c, servers.h, status.c, status.h, version: - New file. - diff --git a/jni/pdnsd/ChangeLog.old b/jni/pdnsd/ChangeLog.old deleted file mode 100644 index 0b3553e2..00000000 --- a/jni/pdnsd/ChangeLog.old +++ /dev/null @@ -1,161 +0,0 @@ -2000-02-15 - Version 0.2. First working alpha with the extended feature set. - -2000-02-16 - Version 0.3 with many bugfixes, better standard conformity and - some new features. - -2000-02-17 - Did a lint on the code, implemented soft timeouts, again bugfixes, - drastically reduced cache memory requirements, implemented local - records. - Version 0.4 released. - -2000-02-19 - Recursive query finally implemented. Version 0.5 out. - -2000-02-20 - Various bugfixes. The server now always tries to get an AA answer - if possible; this implies recursion. This is to deal better with - caching servers that may return incomplete results on * queries. - This may be a little sub-optimal since it may not take the full - effect of caching, but it is the only real possibility of getting - complete records. - Redid the deps in the makefile for now. - Version is now 0.6. - -2000-02-21 - Another set of bugfixes. Version is 0.6.1. - -2000-02-22 - Another set of bugfixes. It should stabilize by now. Answer compression - is there finally. Version is therefore up again, 0.7 by now. - -2000-02-23 - Minor bugfixes, isdn interface uptest added. The new record types as of - rfc1700 are implemented, but as a compile-time option, since normally - there is no need to waste space for them. - Version is 0.7.1. - -2000-02-24 - Version 0.7.2 with all rrs up to KX (36). #define DNS_NEW_RRS in - config.h and (re)compile if you want to use them. Delete the cache - file before using a version with this option changed! - NSAP-PTR does NOT WORK (any incoming answer containing it may cause - a format error) because it is ill-designed (see TODO). Never mind, it - is officially deprecated anyway. - The secure DNS extension record types defined in RFC 2065 (KEY, SIG, - NXT) are cached only and therefore useless. - -2000-02-26 - Version 0.8 with parallel query (and probably new bugs) introduced. - -2000-02-27 - Version 0.8.1 with minor bugfixes on the new features. - -2000-02-27 - Version 0.8.5 with authority support and the usual bugifxes. Some issues - with standard conformity were also fixed (wow, two versions a day). - -2000-02-28 - Implemented caching of non-authoritative records. This allows better - usage of other caching name servers. This may return non-authoritative - records to any non-wildcard query. If a wildcard query arrives, we - always look for authoritative records, so we do if the non-authoritative - answer does not contain at least one answering record to the query. - This fixes the sub-optimal behaviour since 0.6. - Version is therefore up to 0.8.7 (0.8.6 was also released today - containing bugfixes) - -2000-02-29 - Better thread support, avoiding deadlocks in signal handling. The cost - is unfortunately one more thread. - New option server_port in config file. - Version is 0.8.8. - -2000-03-01 - Nailed a renitent memory leak bug to the wall (shame, what a trivial - mistake). Also improved handling of error conditions slightly. - Version is 0.8.9. - -2000-03-01 - Cache code cleanup. The development of the non-parallel query code - is discontinued, although it still works. If you want serial query, - just set PAR_QUERIES to 1. - Additional information finally implemented. - We are up to 0.9. - -2000-03-02 - Fixed a DoS possibility. - More rfc compatability fixups and a smarter resolver logic. - Version 0.9.1 - -2000-03-02 - Added the source section to the config file handling. This allows to - source your /etc/hosts file. Version 0.9.2. - -2000-03-02 - Avoiding double additional records now. Version 0.9.3. - -2000-03-09 - Fixed some REALLY STUPID bugs. Uuummph, thought it was finished. - However, the number of bugs remaining is always n+1... - Anyway, we are up to 0.9.4. Hope that there are no mean bugs left. - -2000-03-14 - Added another uptest, exec. See README for details. Also grained the - cache size finer (it's now specified in kB). Version 0.9.5 - -2000-04-07 - Fixed some really stupid bugs, what else? Version is 0.9.6 - To be more exact: fixed misc bugs, cleaned up hash.c and cache.c - -2000-04-20 - Again fixed some bugs, version is now 0.9.7. - -2000-04-29 - Fixed a build problem caused by some missing #defines in glibc2.0 and a - minor bug. - Version is up to 0.9.8 - -2000-04-30 - Fixed some unclean C code and did a general C lint. Thanks to Byrial - Jensen for pointing out some issues. Now using stricter compiler flags. - Also replaced the daemon() call in main.c for improved portability. - Pre-Released 0.9.9p1 - -2000-05-03 - Released 0.9.9p2 with the changes of 0.9.9p1, Documentation updates, - bugfixes, and the Red Hat rc scripts contributed by Torben Janssen. - Also, the meaning of the command line option -v has changed. - There is a new config file option "lean_query" that is on by - default. It is an optimization, so please look in the docs when - updating whether you want it switched on or not. - Removed the long-dead serial query code from the distribution tree. - Some resolvers seem to be broken somehow in a respect that it cares - about order in which the records appear. In particular, it wants - cname to appear before other records. Ok, so it be... - - -2000-05-04 - Save all names in lower case in the rrs. - Tidying up the source tree. - The long-awaited cache structure changes have been started. Please - delete you cache files before using this new release. - -2000-05-05 - Fixed several bugs in the old and in the new source tree. - Use time_t instead of long for internal time storage for compatibility. - - -2000-05-06 - Version 0.9.10. - This fixes a bug in uptest=if. Red Hat and configuration fixes - suggested by Soeren J. Peters were included. - -2000-05-08 - Version 0.9.11 - This fixes a locally exploitable security problem (pdnsd.cache was - world-writeable). This is actually a one-line fix; for a description of - possible dangers, please refer to the html documentation. - Thanks to Alan Swanson for reporting. diff --git a/jni/pdnsd/INSTALL b/jni/pdnsd/INSTALL deleted file mode 100644 index 03991892..00000000 --- a/jni/pdnsd/INSTALL +++ /dev/null @@ -1,190 +0,0 @@ -The installation instructions are in doc/html/doc.html and doc/txt/manual.txt. -The system requirements are listed in doc/html/index.html and doc/txt/intro.txt. -I recommend using the html version. -Following are generic installation instructions for autoconf programs. -I strongly recommend to read the Installation section in the docs! - - -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - diff --git a/jni/pdnsd/Makefile.am b/jni/pdnsd/Makefile.am deleted file mode 100644 index 146c32a5..00000000 --- a/jni/pdnsd/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ - -SUBDIRS = src doc contrib - -EXTRA_DIST = version ChangeLog.old COPYING.BSD README.par README.par.old PKGBUILD - -# The sample configuration is handled in doc/Makefile.am -install-data-hook: - $(mkinstalldirs) "$(DESTDIR)$(cachedir)" - test -f "$(DESTDIR)$(cachedir)/pdnsd.cache" || \ - touch "$(DESTDIR)$(cachedir)/pdnsd.cache" - if test `whoami` = "root"; then \ - chown $(def_id) "$(DESTDIR)$(cachedir)/pdnsd.cache"; \ - chown $(def_id) "$(DESTDIR)$(cachedir)"; \ - fi - chmod 0640 "$(DESTDIR)$(cachedir)/pdnsd.cache" - chmod 0750 "$(DESTDIR)$(cachedir)" - -dist-hook: $(PACKAGE).spec.in - sed -e '/^%{!?distro: %define distro /c\ - %if 0%{!?distro:1}\ - %if "%{_vendor}" == "redhat"\ - %define distro RedHat\ - %else\ - %if "%{_vendor}" == "suse"\ - %define distro SuSE\ - %else\ - %if "%{_vendor}" == "SuSE"\ - %define distro SuSE\ - %endif\ - %endif\ - %endif\ - %endif' \ - -e 's:[@]PACKAGE[@]:$(PACKAGE):g' \ - -e 's:[@]VERSION[@]:$(VERSION):g' \ - -e 's:[@]fullversion[@]:$(fullversion):g' \ - -e 's:[@]packagerelease[@]:$(packagerelease):g' \ - -e 's:[@]cachedir[@]:/var/cache/$(PACKAGE):g' \ - -e 's:[@]def_id[@]:$(PACKAGE):g' \ - $(PACKAGE).spec.in > $(distdir)/$(PACKAGE).spec - diff --git a/jni/pdnsd/Makefile.in b/jni/pdnsd/Makefile.in deleted file mode 100644 index a865d546..00000000 --- a/jni/pdnsd/Makefile.in +++ /dev/null @@ -1,734 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = . -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/PKGBUILD.in \ - $(srcdir)/config.h.in $(srcdir)/file-list.base.in \ - $(srcdir)/pdnsd.spec.in $(top_srcdir)/configure AUTHORS \ - COPYING ChangeLog INSTALL NEWS THANKS TODO acconfig.h compile \ - depcomp install-sh missing -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno config.status.lineno -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = pdnsd.spec file-list.base PKGBUILD -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(distdir)"; }; } -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = src doc contrib -EXTRA_DIST = version ChangeLog.old COPYING.BSD README.par README.par.old PKGBUILD -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -.SUFFIXES: -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ - $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - $(am__cd) $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -$(am__aclocal_m4_deps): - -config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status config.h -$(srcdir)/config.h.in: $(am__configure_deps) $(top_srcdir)/acconfig.h - ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 -pdnsd.spec: $(top_builddir)/config.status $(srcdir)/pdnsd.spec.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -file-list.base: $(top_builddir)/config.status $(srcdir)/file-list.base.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -PKGBUILD: $(top_builddir)/config.status $(srcdir)/PKGBUILD.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - test -d "$(distdir)" || mkdir "$(distdir)" - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook - -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -755 \ - -exec chmod u+rwx,go+rx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r "$(distdir)" -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ - *.tar.xz*) \ - xz -dc $(distdir).tar.xz | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - test -d $(distdir)/_build || exit 0; \ - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ - && cd "$$am__cwd" \ - || exit 1 - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' -distuninstallcheck: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: check-recursive -all-am: Makefile config.h -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-hdr distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ - ctags-recursive install-am install-data-am install-strip \ - tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-generic \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ - distcheck distclean distclean-generic distclean-hdr \ - distclean-tags distcleancheck distdir distuninstallcheck dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am - - -# The sample configuration is handled in doc/Makefile.am -install-data-hook: - $(mkinstalldirs) "$(DESTDIR)$(cachedir)" - test -f "$(DESTDIR)$(cachedir)/pdnsd.cache" || \ - touch "$(DESTDIR)$(cachedir)/pdnsd.cache" - if test `whoami` = "root"; then \ - chown $(def_id) "$(DESTDIR)$(cachedir)/pdnsd.cache"; \ - chown $(def_id) "$(DESTDIR)$(cachedir)"; \ - fi - chmod 0640 "$(DESTDIR)$(cachedir)/pdnsd.cache" - chmod 0750 "$(DESTDIR)$(cachedir)" - -dist-hook: $(PACKAGE).spec.in - sed -e '/^%{!?distro: %define distro /c\ - %if 0%{!?distro:1}\ - %if "%{_vendor}" == "redhat"\ - %define distro RedHat\ - %else\ - %if "%{_vendor}" == "suse"\ - %define distro SuSE\ - %else\ - %if "%{_vendor}" == "SuSE"\ - %define distro SuSE\ - %endif\ - %endif\ - %endif\ - %endif' \ - -e 's:[@]PACKAGE[@]:$(PACKAGE):g' \ - -e 's:[@]VERSION[@]:$(VERSION):g' \ - -e 's:[@]fullversion[@]:$(fullversion):g' \ - -e 's:[@]packagerelease[@]:$(packagerelease):g' \ - -e 's:[@]cachedir[@]:/var/cache/$(PACKAGE):g' \ - -e 's:[@]def_id[@]:$(PACKAGE):g' \ - $(PACKAGE).spec.in > $(distdir)/$(PACKAGE).spec - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/NEWS b/jni/pdnsd/NEWS deleted file mode 100644 index 9a83bba1..00000000 --- a/jni/pdnsd/NEWS +++ /dev/null @@ -1,324 +0,0 @@ -Version 1.2.9a fixes a bug in the 1.2.9 release that causes a build failure when -pdnsd is configured with --enable-strict-rfc2181. Unless you use this option to -compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a. - -Version 1.2.9 has support for many additional RR types, in particular those -needed for DNSSEC (though no support for the DNSSEC protocol itself yet in -pdnsd). Caching data structures are now more efficient when they only store the -most commonly used RR types. Fine-grained configurability over which RR-types -are cache-able. Pdnsd now has support for EDNS (Extension mechanisms for DNS), -although its usefulness is currently limited to enabling UDP messages larger -than 512 bytes. Defining local TXT records in the configuration file is now -supported. A new configuration option provides a fix in case the query uptest -fails due to remote servers ignoring empty queries. Several bugs have been fixed -including a UDP socket descriptor leak that affected the FreeBSD platform, and -an IPv6 port binding bug. - -Version 1.2.8 implements support for automatic discovery of root servers. -There are also some improvements in the resolver and a new default setting for -the neg_rrs_pol configuration option. - -Version 1.2.7-par fixes some security problems. It contains a fix for a -"dangling pointer" bug that could cause pdnsd to crash when it received a long -reply. It also addresses some of the issues raised in the CERT vulnerability -note VU#800113 by making the default of query_port_start equal to 1024, thereby -ensuring that source ports are randomly selected by the pdnsd resolver in the -range 1024-65535. This release also fixes problems with compiling pdnsd for the -ARM architecture and for the Darwin platform (Max OS X). There are a number of -(minor) new features. pdnsd now supports "include" files, essentially -configuration files that only contain definitions for local records. It is now -possible to define interactively, using pdnsd-ctl, any local record that can be -defined in a configuration file. - -Version 1.2.6-par has an upgraded license: GPL version 3. -A bug has been fixed which which caused pdnsd to handle NXDOMAIN replies -inefficiently when configured with neg_domain_pol=on. Also the code for the -ping test has been fixed, which was broken for 64-bit systems. A new option -randomize_servers can be used to give each server in a section of the -configuration file an equal chance of being queried. The new options reject, -reject_policy and reject_recursively make it possible to check for the presence -of certain IP addresses in the replies of name servers and to correct some types -of unwanted replies or to censor these IP addresses. -The pdnsd-ctl 'add a' and 'add aaaa' commands now allow multiple IP addresses to -be specified for the same name. There are some further improvements to pdnsd's -recursive resolver. - -Version 1.2.5-par introduces a new query method: udp_tcp. With this method a UDP -query is tried first and, if the UDP answer is truncated, the query is repeated -using TCP, which is the behaviour that seems to be recommended by the DNS -standards. There is a new configuration option use_nss, which can be turned off -to prevent lengthy timeouts and stalls in certain situations. A bug has been -fixed which could cause pdnsd to crash if debug output was generated before the -debug output stream was properly initialized. - -In version 1.2.4-par a memory leak and a minor buffer-overflow problem have been -fixed. There is now a fix for some situations that would previously cause pdnsd -to exit prematurely (such as ACPI S3 sleep or trying to attach strace to pdnsd). -Time intervals specified in the configuration file can now be expressed in -minutes, hours, days and weeks as well as seconds. Support for Apple Mac OS X -v10.4 Tiger has been improved. The "pdnsd-ctl status" command now also provides -some information about the status of the running threads. There are some further -improvements in the debugging information provided by pdnsd. -TCP-query support is now compiled in by default (but can still be disabled using -the configure option --disable-tcp-queries). - -In version 1.2.3-par the "pdnsd-ctl empty-cache" command can be provided with an -include/exclude list, allowing the user to specify a selection of names to be -removed, instead of emptying the cache completely. -Additional improvements: pdnsd should now remain responsive while executing the -"pdnsd-ctl empty-cache" command. With the query_method=tcp_udp option pdnsd will -now also try a UDP query after a TCP connection times out, which should allow -pdnsd to resolve the same names with query_method=tcp_udp as with -query_method=udp_only, although perhaps with an occasional delay. -"pdnsd-ctl config" or "pdnsd-ctl server" commands should now run without delays, -even if pdnsd is performing ping or query uptests at the time. A problem with -resolving certain names using root servers has been fixed. - -Version 1.2.2-par has a number of important portability improvements. A bug has -been fixed that prevented pdnsd from compiling successfully on some 64 bit -architectures. The code for determining endianness (most significant or least -significant byte first) should now be more portable. This release has -(experimental) support for the Darwin (Apple Mac OS X) platform. On Linux -systems, the configure script will now try to detect automatically whether the -system implements the Native POSIX Thread Library, but the method used may not -necessarily be foolproof. In addition, the debug features have been improved and -should make it easier to find out why pdnsd considers some queries or replies -malformed. - -Version 1.2.1-par has improved support for non-Linux platforms. This release has -(experimental) support for the Cygwin platform, and should also fix some -compilation glitches that have been reported by FreeBSD users. - -Version 1.2-par is a new and improved version of pdnsd! Most of the changes -effect the internal workings of pdnsd, but there are also a number of -interesting new features (well, I think they are interesting). Among the bugs -fixed are two rather nasty ones which involve the handling of NXT and NAPTR -records and which can cause pdnsd to crash or abort. The new features include a -new server availability test which can be specified with uptest=query, support -for reading the DNS configuration from resolv.conf files, a new option for -optimizing the use of root servers, a new option that makes defining local -records for reverse resolving easier, support for defining wildcard records, a -new pdnsd-ctl command for reloading the config file without restarting pdnsd, -and a new pdnsd-ctl command for dumping information about the names stored in -the cache. -The documentation has also been updated: there is now a pdnsd.conf man page. For -a more complete list of the changes I'll have to refer you to README.par and the -ChangeLog. - -Version 1.1.11a-par contains a fix for FreeBSD users that bypasses a problem -with the macro ENONET, which can cause a compilation failure when it is -undefined. Linux users will notice no difference between 1.1.11a-par and -1.1.11-par. - -Version 1.1.11-par has a rather large number of small changes, which are rather -difficult to summarize. Among the bugs fixed are a race condition in the cache -lookup code, a flaw in the code that caused a busy spin when a remote server -answered with "Not Implemented", and problems with the -4 and -6 command-line -options. Among the improvements are an alternative sorting algorithm which -should allow pdnsd to start up faster when reading a large cache file from disk, -automatic mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat -more efficient memory use, better compression of the replies and changes in the -parallel querying algorithm that should improve the chances of catching a reply -from a remote server. For a more complete list of the changes I'll have to -refer you to README.par and the ChangeLog. - -Version 1.1.10-par has a new parser for configuration files, completely -rewritten from scratch in C. The main advantages are: (f)lex and yacc/bison are -no longer needed to build pdnsd, more informative error messages instead of -merely "parse error", and string literals no longer need to be enclosed in -quotes in most cases. Furthermore, a bug has been fixed that caused incorrect -IPV6-type PTR records to be generated when sourcing /etc/hosts like files. -There have been other small changes, more details can be found in the ChangeLog. - -Version 1.1.9-par adds some missing pieces to the documentation (the pdnsd -manual and the man page for pdnsd-ctl). The changes to the code consist mostly -of optimizations, removal of some size limits due to fixed-size buffers, and -some cleaning up. I've also tried to make the error responses of pdnsd-ctl more -helpful. More details can be found in the ChangeLog. - -Version 1.1.8b1-par8 introduces a "delegation-only" feature that may be useful -for blocking Verisign's Sitefinder. The parser for the configuration file now -tolerates domain names missing a dot at the end. I have provided alternative -implementations for some GNU extensions that I used in an effort to make the -code more portable. In particular, the code should build on FreeBSD again. More -details can be found in the README.par file. - -Version 1.1.8b1-par7 fixing a number of bugs. I have also reworked some of the -code for adding and removing entries in the cache in an effort to improve -efficiency and stability. More details can be found in the ChangeLog. - -Version 1.1.8b1-par6 introduces some further code cleanup. In addition the -documentation has been revised. - -Version 1.1.8b1-par5 fixes a troublesome allocation size error that has been -discovered in Thomas Moestl's code. In practice this bug only wastes memory but -it could also potentially lead to memory corruption. Upgrading is -recommended. More details can be found in the ChangeLog. - -Version 1.1.8b1-par4 has been released. Due to incompatibilities between -various implementations of the pthread library on Linux systems, problems can -occur with signal handling in pdnsd. The usual symptom is failure by pdnsd to -save the cache to disk, and /var/cache/pdnsd/pdnsd.cache remaining empty. If you -experience this kind of trouble, try reconfiguring with different values for the -new --with-thread-lib option. The allowable values are described in the -documentation. - -pdnsd is no longer maintained by Thomas Moestl: I have not had time to maintain -pdnsd for quite a while now, and have been very slow to respond to issues, or -did not respond at all. It is time that I officially announce that pdnsd is no -longer actively maintained; I apologize to all those who reported bugs or asked -questions without receiving any reply. However, Paul A. Rombouts has published a -patch set against the last released version at -http://www.phys.uu.nl/~rombouts/pdnsd.html, which cleans up a lot of code fixes -many bugs. - -Version 1.1.7a fixes a reversed assertion that would cause pdnsd to terminate -if used with the ping uptest. No other changes were made. - -Version 1.1.7 fixes some problems that might be remotely exploitable to -gain access as the user pdnsd runs as (an unprivileged user by default). To do -this, an attacker needs to control a name server that is queried by pdnsd, and -send a malicious reply to such a query. Upgrading is strongly recommended! -There are also minor bug fixes and stability improvements. - -Version 1.1.6 adds the query_port_start and query_port_end options (contributed -by Andreas Steinmetz), that allow confining the ports pdnsd uses for outgoing -queries to a certain range. It also fixes numerous bugs, one of which could -cause pdnsd to hang; update is therefore recommended. - -Version 1.1.5 contains a fix for a security bug that would allow local users -that are allowed to use pdnsd-ctl on a running pdnsd server to execute -arbitrary code as the user that pdnsd runs as (or on Linux, when strict_setuid -is not enabled, as the user that started pdnsd). The danger of this is usually -quite limited; the status socket is not enabled by default, it's default -permissions do only allow the user pdnsd runs as to use the socket, -strict_setuid is enabled by default and pdnsd runs as an unprivileged user. -There is also a new configure option, --enable-underscores, that will make -pdnsd allow underscores in domain names. Furthermore, the SRV record handling -has been fixed to allow underscores in any case (this was not allowed -previously, but is required by the RFC). SOA records are not put in the -answer section any more if no answers are found (this violates the RFC's). -It may be put in the authority section in a later version. -There are also various bugfixes in this release. -Upgrade is recommended. - -Version 1.1.4 fixes various smaller bugs, and should also improve the cache -write performance especially for larger caches. There are also two new -features: servers can now be given a label (using the label server option) -which can be used to identify them for the pdnsd-ctl server command -(contributed by Andrew M. Bishop), and local records can be marked to make -the domain record authoritative in pdnsd's cache (which means that pdnsd will -assume that records that are not present in the cache for that domain are -non-existent); this is on by default now, and can be controlled using the new -authrec server option). - -Version 1.1.3 added contrib/ and had a lot of robustness fixes. -This release addresses a security hole that affects only Linux systems. Due to -a bug in glibc, pdnsd could crash during a port scan. This release contains -a workaround for this, as well as a fix for a deadlock under heavy load -conditions. It also fixes a possible problem that could be triggered by -malicious servers, and contains numerous bug fixes. -A script, contributed by Marko Stolle, makes pdnsd useful in a DHCP setup. -pdnsd also preservers the case of names in the cache, and should work much -better on alpha machines (thanks for the contributions by Bjoern Fischer -and P.J. Bostley that made this possible). New types were dded for rr -sections and pdnsd-ctl. -Upgrade is recommended. - -Version 1.1.2 has a fix for a bug that could cause SERVFAIL to be -returned when NXDOMAIN would be appropriate. The bug surfaced only when -pdnsd queried name servers with a behaviour different from BIND's in the -NXDOMAIN case, e.g. pdnsd querying another pdnsd or e.g. djbdns. - -Version 1.1.1 fixes a possible race condition in status socket creation. -This race might be used by a local attacker to change the access -permissions of a certain file in /tmp. The risk of this is probably -negligible. The default setup uses a non-privileged user, default mode -0600, and the status socket is disabled normally, so this should be -relatively safe. I don't see any possibility to exploit this, it is -more of a paranoia fix. -There are also some other minor fixes and documentation improvements. -Upgrade is recommended. - -Version 1.1.0 introduces negative cacheing, pdnsd-ctl enhancements and -a much improved FreeBSD support. The cache file format has changed from -prior releases. Some configuration defaults have changed, too. - -Version 1.0.15 is mostly a bugfix release. It also has a new option: -randomize_recs in the global section. - -Version 1.0.14 has a fix in icmp.c that will make it build properly -on FreeBSD and older Linux systems. - -Version 1.0.13 has some code cleanup, a fix for the Debian rc install, -and a security fix (contributed by Olaf Kirch): when changing -user and group id, pdnsd did not drop supplementary group IDs that -the original user was member of. - -Version 1.0.12 is a bugfix release and contains some security -enhancements. There are also inclusion/exclusion lists for servers -(new options include=, exclude=, policy= in the server -section). - -Version 1.0.11 fixes two bugs that might be used for denial-of-service -attacks, upgrading is recommended. - -Versions 1.0.9 and 1.0.10 are bugfix releases. - -Version 1.0.8 introduces special linux ppp device support contributed -by Ron Yorston, and has some bugfixes. - -Version 1.0.7 introduces autoconf support, many new config file options and -the new pdnsd-ctl run-time configuration program. - -Version 1.0.6 has another set of bugfixes, in addition to higher compile- -time configurability and UDP query support. It also contains Debian rc -scripts contributed by Markus Mohr. - -Version 1.0.5 has some bugfixes and the new "server_ip" option -contributed by Wolfgang Ocker. - -Version 1.0.4 introduces the new options run_as, strict_setuid and -paranoid. These new options are optional security enhancements. - -Versions 1.0.1, 1.0.2 and 1.0.3 are bugfix releases. - -Version 1.0.0 has a lot of changes compared to the 0.9.x tree, but much of -them "under the hood": -- IPv6 support (experimental; compile- and run-time configurable) -- FreeBSD (and such hopefully *BSD) support -- better rfc2181 compatability -- new options: - - serve_aliases in source section - - linkdown_kluge in global section - - max_ttl in global section -- cache-code reorganization, only one unified hash (of variable depth) -- Optimizations & cleanups -- Automatic deps (only interesting for developers ;-) - -Version 0.9.11 fixes a locally exploitable security hole (the cache file was -world writeable by default). Please see ChangeLog.old for details. - -Version 0.9.10 fixes some bugs and improves build on Red Hat. - -Version 0.9.9 contains the rc scripts for Red Hat Linux contributed by Torben -Janssen, in addition to code cleanups and bugfixes. -The meaning of the option -v has changed in this release. -There is also a new config file option "lean_query" that is on by default. It -is an optimization, so please look in the docs when updating whether you want -it switched on or not. - -When compiling versions after 0.9.8, you will probably get more -compiler warningsthan before. This is because the C compiler settings -have been made stricter. - -Version 0.9.8 fixes a minor bug some build problems with glibc2.0 systems. - -The versions 0.9.6 and 0.9.7 are bugfix releases. - -Version 0.9.5 introduces uptest=exec, and a modified config file syntax (cache -sizes are now specified in kB). - -Version 0.9.4 was the first to be released to the public. For information on -changes, see ChangeLog. - diff --git a/jni/pdnsd/PKGBUILD.in b/jni/pdnsd/PKGBUILD.in deleted file mode 100644 index 3d617651..00000000 --- a/jni/pdnsd/PKGBUILD.in +++ /dev/null @@ -1,24 +0,0 @@ -# Package build script for Arch Linux, -# contributed by Alexander Drozdov. - -pkgname=@PACKAGE@ -pkgver=@VERSION@ -pkgrel=@packagerelease@ -pkgdesc="pdnsd is a proxy DNS server with permanent caching (the cache contents are written to hard disk on exit) that is designed to cope with unreachable or down DNS servers." -url="http://members.home.nl/p.a.rombouts/pdnsd.html" -license="GPLv3" -depends=() -makedepends=(glibc) -conflicts=() -replaces=() -backup=() -install= -source=(http://members.home.nl/p.a.rombouts/pdnsd/releases/$pkgname-$pkgver-$pkgrel.tar.gz) -md5sums=() - -build() { - cd $startdir/src/$pkgname-$pkgver - ./configure --prefix=/usr --enable-ipv6 --sysconfdir=/etc --with-distribution=ArchLinux - make || return 1 - make DESTDIR=$startdir/pkg install -} diff --git a/jni/pdnsd/README b/jni/pdnsd/README deleted file mode 100644 index 7042e934..00000000 --- a/jni/pdnsd/README +++ /dev/null @@ -1,22 +0,0 @@ -You can find the documentation for pdnsd in the doc/ directory. The html -documentation (which I recommend) is in the doc/html/ subdirectory. -The pure text documentation (which is generated automatically from the -html documentation) is in doc/txt/. -The following documents are available: - -index.html / intro.txt Overview, system requirements -doc.html / manual.txt Building, installation and usage instructions -faq.html / faq.txt The FAQ - -Share and enjoy! - Thomas - - -For news about recent changes in pdnsd the following files may be of -interest to you: - - README.par - ChangeLog - NEWS - -Last revised: 08 July 2007 by Paul Rombouts diff --git a/jni/pdnsd/README.par b/jni/pdnsd/README.par deleted file mode 100644 index ea181bc6..00000000 --- a/jni/pdnsd/README.par +++ /dev/null @@ -1,216 +0,0 @@ - pdnsd version 1.2.9a by Paul Rombouts - ===================================== - -This file describes the version of pdnsd that I maintain personally and am -making available so other people can enjoy the latest features and fixes. Thomas -Moestl no longer maintains pdnsd himself, so I am effectively the new -maintainer. This README describes the new features in version 1.2. This version -has a rather large number of internal changes and also some new features, which -I am rather pleased with, even if I say so myself. I think the changes are -significant enough to warrant increasing the minor version number from 1.1 to -1.2. The differences between my previous "official" release 1.1.11 and Thomas' -last release 1.1.7a are described in my previous README, which I have renamed -REAME.par.old. In this README I restrict myself to describing changes between -1.1.11 and 1.2. -The main difference between versions 1.2 and 1.2.1, aside from some minor -changes, is that 1.2.1 has (experimental) support for the Cygwin platform. -Version 1.2.2 has further improvements in portability and should in -particular now also compile on the Darwin (Apple Mac OS X) platform. -Version 1.2.4 has some important fixes for a memory leak, a minor buffer- -overflow problem and some situations which could cause pdnsd to exit -prematurely. Note that TCP-query support is now compiled in by default, but can -still be disabled using a configure option. -The main new feature of version 1.2.5 is the new query method "udp_tcp". -Version 1.2.6 has an updated license: GPL version 3. The main new feature of -version 1.2.6 is the "reject" option, which makes it possible to censor or -correct for unwanted IP addresses in replies. -Version 1.2.7 contains an important fix for a "dangling pointer" bug and -attempts to make pdnsd less vulnerable to the issues raised in CERT -vulnerability note VU#800113. It also contains some improvements for defining -local records interactively using the pdnsd-ctl utility. -The main new feature of version 1.2.8 is automatic discovery of root servers, -as well as some minor improvements in the resolver. -Version 1.2.9 among other things supports many addtional RR types, uses data -structures that should be more slightly more memory efficient and has support -for EDNS, which allows DNS UDP messages to be larger than 512 bytes. -Version 1.2.9a is a simple bugfix release that fixes a problem with compiling -1.2.9 after configuring with --enable-strict-rfc2181. Unless you use this option -to compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a. - -For instructions how to compile and install pdnsd see doc/html/doc.html or -doc/txt/manual.txt. Note that I am no longer distributing a patch w.r.t. Thomas' -version because the (compressed) patch file is barely smaller than the -(compressed) tar archive. - -Here follows a list of some of changes in version 1.2 from a user's perspective. -For a more technical description of some of the changes in the code see the ChangeLog. -For a short history about recent releases have a look at NEWS or doc/html/index.html. - -- First of all, two potentially rather nasty bugs have been fixed in the code - for the handling of NXT and NAPTR records. A response from a remote server - containing NXT records (even well-formed ones) will very likely cause pdnsd to - crash. The code for handling NAPTR records contained incorrect ASSERT - statements, which could cause pdnsd to abort in a controlled fashion, but - completely unnecessarily. - -- Sampo Lehtinen has remarked that pdnsd sometimes failed to resolve classless - reversed-delegated IP addresses, and that this has something to do with the - fact that pdnsd didn't accept '/' characters in domain names. After reading - some of the relevant RFCs I decided to remove all restrictions on the types - of characters that pdnsd accepts in domain names. Of course for most - applications, there are many characters which don't make sense in domain - names, but I feel that it is the responsibility of the client application to - reject these, not the proxy server. - -- At the suggestion of Dan Tihelka, I have expanded to the server_ip= option to - allow the name of an interface to be specified instead of an IP address. - Presently this has been tested on Linux only. Can someone running pdnsd on - *BSD tell me if the code for getting the address of an interface is different - for Linux and BSD-type systems? - -- At the suggestion of Juliusz Chroboczek I've added an new server availability - test which can be specified with uptest=query. This can be useful as an - alternative to "uptest=ping" in case the remote server does not respond to - ICMP_ECHO requests at all, which unfortunately is quite common these days. - "uptest=query" causes pdnsd to send an empty query to remote name servers. Any - well-formed response (apart from SERVFAIL) within the timeout period will be - interpreted as a sign that the server is "up". - -- Instead of specifying the IP addresses of the name servers that pdnsd should - query in a server section of the config file, you may also specify a - resolv.conf-style file. Preferably this should not be /etc/resolv.conf. If the - contents of the resolv.conf type file changes while pdnsd is running, you can - make pdnsd aware of the changes with the "pdnsd-ctl config" command, see - below. Example: - - server { - label=myisp; - file=/etc/ppp/resolv.conf; - timeout=10; - } - -- There is a new option for "server" sections in the config file: - root_server=on/off. - In case a server section contains only addresses of root servers, which - usually only give the name servers of top level domains in their reply, - setting root_server=on will enable certain optimizations. This involves using - cached information to reduce queries to the root servers, thus speeding up the - resolving of new names. - -- New option for "rr" sections in the config file: reverse=on/off. - If you want a locally defined name to resolve to a numeric address and vice - versa, you can now achieve this by setting reverse=on before defining the A - record, making it unnecessary to define a separate PTR record for the reverse - resolving. - Example: - - rr { - name = localhost; - reverse = on; - a = 127.0.0.1; - } - - has the same effect as: - - rr { - name = localhost; - a = 127.0.0.1; - } - rr { - name = 1.0.0.127.in-addr.arpa; - ptr = localhost; - } - -- In rr sections it is now possible to specify a wildcard name, i.e. a name - starting with the label *. The * in a wildcard can match one or more labels in - a queried name, but only whole labels. For example, *.mydomain will match - a.mydomain or www.a.mydomain, but not mydomain. Before you can specify an rr - section with name=*.mydomain you must define some records for mydomain, - typically NS and/or SOA records. - Example: - - rr { - name = mydomain; - ns = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - rr { - name = *.mydomain; - a = 192.168.1.10; - } - -- There is a slight backwards compatibility problem which involves the name= and - owner= options in rr sections. The new version does not allow you to place - owner= before name=. On the other hand, you may now freely mix the owner - option with the a,ptr,cname,mx and soa options and define as many records of - this type as you like (including zero). - -- pdnsd-ctl has three new commands: - - config: Reloads pdnsd's configuration file. This is more efficient than - restarting pdnsd, and should not cause only noticeable interruption in DNS - service. However, some types of configuration changes cannot be put into - effect this way, and you will be prompted to restart pdnsd instead. - - empty-cache: Empties the cache completely, freeing all existing entries. - In version 1.2.3 you can specify a selection of entries to delete by providing - a list of include/exclude patterns. - - dump: Prints information about all the names stored in the cached. This is - mainly useful for diagnostic purposes. - -- There is now a pdnsd.conf(5) man page, describing pdnsd's configuration file. - The man page has been generated from the html documentation using a customized - Perl script. - -- New in version 1.2.4: Time intervals in the configuration files can now be - expressed in seconds, minutes, hours, days and weeks, using the suffixes - s,m,h,d,and w. - Example: 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds. - -- Version 1.2.5 introduces a new configuration option, contributed by Jan-Marek - Glogowski, called "use_nss" which can be turned off to prevent nasty delays in - certain situations. - Besides the query methods "udp_only", "tcp_only" and "tcp_udp" you can now - also specify "udp_tcp", which more closely adheres to the behaviour - recommended by DNS standards. - -- Version 1.2.6 introduces the "randomize_servers" and "reject" options. By - setting "randomize_servers" on you can give each server in a server section an - equal chance of being queried, which is useful when resolving from root - servers, for instance. The "reject" option can be used to censor certain IP - addresses or correct for unwanted replies from servers you don't completely - trust. - -- Version 1.2.7 contains support for "include" files which can be referenced - from configuration files or read interactively using pdnsd-ctl. These files - can be used to add local definitions to the cache without reconfiguring pdnsd. - The new "pdnsd-ctl eval" command can be used to interactively define local - records that could previously only be defined in configuration files but not - with the "pdnsd-ctl add" command. - -- Version 1.2.8 contains support for automatic discovery of root servers. - Instead of supplying a complete list of IP addresses of root servers in a - server section of the configuration file, you need only enter one or two - addresses of name servers which know the names and addresses of the root - servers and set "root_server=discover". - The "neg_rrs_pol" option has a new default setting, which should allow - sensible negative caching of RRs in most situations, even if "proxy_only=on". - -- Version 1.2.9 contains support for EDNS (Extension mechanisms for DNS), which - allows UDP messages to be larger than 512 bytes. Whether pdnsd uses EDNS in - outgoing queries is determined by the configuration option "edns_query". If - pdnsd receives a query using EDNS, it will reply using EDNS regardless of the - configuration settings. - Local TXT records can now be defined in the configuration file. - If the query uptest fails due to remote servers ignoring empty queries, this - can now be remedied using the new "query_test_name" config option. - -The new features are described in greater detail in the manual doc/html/doc.html -or doc/txt/manual.txt. - -Enjoy! - -If you have any questions about my version of pdnsd, you can send these -to . Questions about the original (unmaintained) pdnsd -version should be sent to or . diff --git a/jni/pdnsd/README.par.old b/jni/pdnsd/README.par.old deleted file mode 100644 index 4bf0edaf..00000000 --- a/jni/pdnsd/README.par.old +++ /dev/null @@ -1,249 +0,0 @@ - pdnsd maintenance version 1.1.11-par by Paul Rombouts - ======================================================= - -This file describes the version of pdnsd that I maintain personally and am -making available so other people can enjoy the latest features and fixes. -Thomas Moestl no longer maintains pdnsd himself, so I am effectively the new -maintainer. The current version is 1.1.11-par, which has a rather large number -of small changes. Among the bugs fixed are a race condition in the cache lookup -code, a flaw in the code that caused a busy spin when a remote server answered -with "Not Implemented", and problems with the -4 and -6 command-line options. -Among the improvements are an alternative sorting algorithm which should allow -pdnsd to start up faster when reading a large cache file from disk, automatic -mapping of IPv4 to IPv6 addresses when running in IPv6 mode, somewhat more -efficient memory use, and better compression of the replies. Some of the new -features are described in the second half of this file (look for "new in version -1.1.11"). For the rest of the changes I will have to refer you to the ChangeLog. -For a short history about recent releases have a look at doc/html/index.html. - -Since version 1.1.9 I've added some missing pieces to the documentation (the -manual doc/html/doc.html,doc/txt/manual.txt and the man page doc/pdnsd-ctl.8). -Version 1.1.11 finally has a man page doc/pdnsd.8, thanks to a contribution by -Mahesh T. Pai. - -The first part of this file describes how to patch, compile, install and run -pdnsd. The second part describes some of the changes I've made to Thomas -Moestl's code. - -Unless you're using the pre-patched source archive pdnsd-1.1.11-par.tar.gz you -must first apply my patch file pdnsd-1.1.11-par.diff.gz before compiling and -installing pdnsd according to Thomas Moestl's instructions described in the the -documentation. Use a freshly untarred copy of Thomas Moestl's original version -1.1.7a source, cd into the source directory pdnsd-1.1.7a and apply the command: - -gzip -cd /pdnsd-1.1.11-par.diff.gz | patch -p2 -N -Z - -Note: I have used GNU extensions so there may be some portability issues. I have -supplied alternatives for some of the less portable functions. There should be no -problem with most Linux distributions. - -That's it! You should now be able to compile, install and run pdnsd. See the -documentation in doc/html/doc.html or doc/txt/manual.txt for more detailed -instructions. - -Some people may want change the compiler optimization flag. I use the -O2 flag, -but it might be safer to use a lower level of optimization or no optimization at -all. In that case prefix the configure command with the desired compiler flags -like this (assuming you're using a bash shell): - - CFLAGS="-O1 -g -Wall" ./configure ... - -I have added a new configuration option "--with-thread-lib=", which you -should use if you experience problems with signal handling under Linux. The -usual symptom is failure by pdnsd to save the cache to disk, and -/var/cache/pdnsd/pdnsd.cache remaining empty. If you experience this kind of -trouble, try reconfiguring with different values for the --with-thread-lib -option. The allowable values are "linuxthreads" (the default), "linuxthreads2" -(or "lt2" for short), and "nptl". I recommend that you first configure and -compile without the --with-thread-lib option, then if you experience trouble try -again with --with-thread-lib=lt2 and recompile. -If your Linux system has an implementation of the Native POSIX Thread Library, -which is the case with Red Hat 9 for instance, you should use ---with-thread-lib=nptl . -Ideally, I would like to write a configure script which automatically detects -which kind of thread library is being used on a Linux system, but I don't have a -clue yet how to do this. If you can help me with this please write to me at the -email address listed at the end of this file. - -The rest of this file describes some of the modifications I've made, but you -don't have to read it if you simply want to run pdnsd as you're used to. - - -- The main new feature I've added enables you to change the server addresses - that pdnsd uses at run-time using pdnsd-ctl. I've done this because the ISPs I - use do not specify fixed DNS server addresses, but expect their clients to use - dynamic DNS configuration (DHCP in the case of the cable connection, RFC1877 - in case of isdn). I've extended the options that can be given with the - "server" command to pdnsd-ctl, to allow IP addresses to be specified as an - additional argument after "up|down|retest". This allows me to put something - like this in my ifup-local script: - - pdnsd-ctl server isp-label up "$DNS1 $DNS2" - - For more details how to use pdnsd-ctl read the updated documentation in - the doc/html directory. There is also a manpage for pdnsd-ctl. - This was quite tricky to implement because there might be pending queries - while the addresses are being changed. It certainly was an interesting - exercise in writing multi-threaded code for me. - - -- I've implemented a feature which allowed me to specify multiple IP addresses - per server section in the configuration file. This allowed for a much more - compact configuration file (3 server sections instead of 7 in my case), - because most configuration options are identical for servers belonging to the - same ISP. It also made the output of "pdnsd-ctl status" more compact. And it - was necessary to enable a satisfactory implementation of the previous feature. - Example of the new syntax: - - ip = 123.456.789.001, 123.456.789.002, 123.456.789.003; - - At the suggestion of Greg Norris server sections no longer have to specify IP - addresses. A server section without IP addresses will remain inactive until it - is assigned one more addresses at run-time with pdnsd-ctl. - -- I've changed the implementation of dynamic arrays to make it slightly more - efficient, and improve type safety. I also got rid of several arrays of fixed - size in favor of dynamically allocated arrays. In particular, I got rid of - all occurrences of MAXPATH. I also made several static variables "automatic". - -- The output of the "status" command of pdnsd-ctl now gives more meaningful - constant names "ping|none|if|exec" instead of numbers for the "uptest" option. - I've also added some information that was previously missing. - -- I've fixed I a problem that caused pdnsd to use up a lot of CPU time and slow - down my system considerably when it received a query that took a long time to - resolve. It turned out that pdnsd can get into a "busy spin" when one of the - DNS servers pdnsd is querying refuses the connection. Apart from fixing this - bug, to speed things up additionally, I thought it would be a good idea to - mark a server down (without retesting it) after detecting errno==ECONNREFUSED. - This gives me very satisfactory performance, with the problematic server being - tried only once during every testing interval. - - New in version 1.1.11: An additional busy spin condition, triggered when a - remote server answers with "Not Implemented", has been discovered and fixed. - In case there are remaining bugs in the multiplexing code, I've added a test - that checks if the number of events reported by poll/select matches the number - of events handled by pdnsd. If not, pdnsd will log an error message and give - up. Although the bugs still need to be reported and fixed, at least this - should prevent pdnsd from wasting CPU cycles. - -- Due to a bug in Thomas' code, pdnsd tries, but fails, to remove the control - socket "pdnsd.status" before exiting. This has also been fixed. In version - 1.1.8b1-par6 I have cleaned this up some more so that pdnsd will handle - situations where it can't open or bind the control socket more gracefully. - -- I've rewritten some of the code that saves the contents of the cache to the - file "pdnsd.cache" just before pdnsd exits. This is because I noticed in my - logfiles that pdnsd occasionally had problems reading this file back at - startup. I eliminated the use of fseek() in Thomas' code. I could not find - anything that was demonstrably incorrect about his use of fseek(), but it - seemed better to me to do without it and write the file in a strictly - sequential order. Anyway, it turned out my hunch paid off: no more error - messages about "pdnsd.cache" in my logfile. - - New in version 1.1.11: I've added some new code for sorting the queue used for - purging stale cache entries. This should allow pdnsd to start up faster when - reading large cache files from disk. - -- I've extended the configuration options for policies of inclusion/exclusion - lists in server sections. The new policies options are "simple_only" and - "fqdn_only". Setting policy=simple_only will cause the server to used only for - simple hostnames if no other rule matches. On the other hand, setting - policy=fqdn_only will cause the server to be used only for fully qualified - domain names (i.e. the name has at least one dot in-between). I find these - options useful for controlling which name servers (if any) will be used by - pdnsd for simple host names. - -- I've added a new "delegation_only" option that can be used to undo the - unwanted effects of DNS "wildcards". It works roughly as the feature by the - same name in BIND. It is turned off by default. To block Verisign's - Sitefinder, add the following line to the global section of the configuration - file: - - delegation_only= com, net; - - If you find that this feature blocks some legitimate domain names, you will - probably need to add the address of a nameserver that provides good authority - information. More information can be found at - http://www.phys.uu.nl/~rombouts/pdnsd/delegationonly.html - -- It is no longer mandatory that domain names in the configuration file end in a - dot. - -- The parser for configuration files has been rewritten purely in C, so (f)lex - and yacc/bison are no longer needed to build pdnsd. - It is no longer necessary to place strings between quotes in the configuration - file, unless a string contains a special character such as whitespace, a token - that normally starts a comment, or one of the characters ",;{}". Note that - these special characters are illegal in domain names anyway. - -- New in version 1.1.11: Negating whole domains with a neg section in the - config file will result in all the subdomains being negated as well. - For example, adding the lines - - neg {name=doubleclick.com; types=domain;} - neg {name=doubleclick.net; types=domain;} - - will also negate ad.doubleclick.com, ad.fr.doubleclick.net, etc. - -- New in version 1.1.11: When running in IPv6 mode, pdnsd will now automatically - map any IPv4 addresses it reads in the config file to IPv6 addresses. - When pdnsd has been compiled with IPv6 support and runs in IPv4 mode, it will - skip IPv6 addresses with a warning message. This may result in certain server - sections becoming inactive, though. - - The -4 and -6 options should now work as advertised. - I've added two new command-line options, "-a" and "-i ". - With the -a flag pdnsd will try to detect automatically if IPv6 support is - available on a system, and fall back to IPv4 if not. The -a flag can be used - instead of -4 or -6. - The -i option can be used to specify a prefix for mapping IPv4 to IPv6 - address. The default is ::ffff.0.0.0.0. There is also a corresponding - ipv4_6_prefix= option for the config file. - -- New in version 1.1.11: I've slightly changed the way pdnsd does parallel - queries. Active queries or not canceled until we have received a useful - response from a remote name server, or all the queries have failed or timed - out. Thus the par_queries parameter is no longer the maximum number of - parallel queries, but rather the increment with which the number of parallel - queries is increased when the previous set has timed out. In the worst case - there will be pending queries to all the servers in the list of available - servers simultaneously. We may be wasting more system resources this way, but - the advantage is that we have a greater chance of catching a reply. After all, - if we wait longer anyway, why not for more servers. - I've also introduced a global timeout parameter. This is the minimum period of - time pdnsd will wait after sending the first query to a remote server before - giving up without having received a reply. The timeout options in the - configuration file are now only minimum timeout intervals. Setting the global - timeout option makes it possible to specify quite short timeout intervals in - the server sections. This will have the effect that pdnsd will start querying - additional servers fairly quickly if the first servers are slow to respond - (but will still continue to listen for responses from the first ones). This - may allow pdnsd to get an answer more quickly in certain situations. - - After receiving a reply from a remote server the server is marked up and its - time stamp is updated. This will have the effect that pdnsd doesn't bother - testing this server for availability for a period of time, and thus the - overhead caused by testing is reduced. After server timeouts, uptests are - performed by the separate server status thread, not by threads that have to - answer queries. Unresponsive servers with uptest=ping will not be marked down - immediately any more, but only after the ping test has definitely failed. - -I've also included a number of bug-fixes contained in a patch file supplied to -me by Thomas Moestl. In addition to the things I had already fixed, the -following issues are addressed: some memory leaks, dropping of root privileges -before calling uptest scripts in case pdnsd was started setuid root (which is a -bad idea anyway), passing on open fd's to uptests, integer overruns in the -status reporting code, fixing string passing from the lexer, more consistent -treatment of underscores in domain names. - -In addition to the things I've listed above, I've made various little changes to -fix minor bugs, improve efficiency or elegance, or simply to suit my my own -coding style. These changes are too numerous to list here, but some of them are -listed in the ChangeLog. Of course if you are really interested in the -nitty-gritty you can always compare the source of my version with Thomas' -original code. - -If you have any questions about the modifications I've made, you can send these -to . Questions about the original pdnsd version should -be sent to or . diff --git a/jni/pdnsd/THANKS b/jni/pdnsd/THANKS deleted file mode 100644 index 9c7e3bbc..00000000 --- a/jni/pdnsd/THANKS +++ /dev/null @@ -1,66 +0,0 @@ -This is a (hopefully complete) list of people I have to thank for helping me -develop and improve pdnsd: - -David G. Andersen -Andrew M. Bishop -Daniel Black -Carsten Block -Stephan Boettcher -P.J. Bostley -Rodney Brown -Kevin A. Burton -Juliusz Chroboczek -Joachim Dorner -Frank Elsner -Christian Engstler -Stefan Erhardt -Bjoern Fischer -Stefan Förster -Bert Frederiks -Mike Hammer -Jonathan Hudson -Torben Janssen -Byrial Jensen -Olaf Kirch -Nikola Kotur -Kiyo Kelvin Lee -Bernd Leibing -Patrick Loschmidt -James MacLean -Sourav K. Mandal -Fraser McCrossan -Markus Mohr -Michael Müller -Gustavo Niemeyer -Alexandre Nunes -Wolfgang Ocker -Mahesh T. Pai -Bernhard Pelz -Soenke J. Peters -Erich Reitz -Paul A. Rombouts -Brian Schroeder -Roman Shterenzon -Daniel Smolik -Milan P. Stanic -Michael Steiner -Norbert Steinl -Andreas Steinmetz -Marko Stolle -Markus Storm -Michael Ströder -Thomas Stromberg -Alan Swanson -Lyonel Vincent -Eelco Vriezekolk -Paul Wagland -Sverker Wiberg -Michael Wiedmann -Ron Yorston -Nikita V. Youshchenko -Jan-Marek Glogowski -Thomas Cort -Pierre Habouzit -Dirk Armbrust -Georg Schwarz -Ashish Shukla diff --git a/jni/pdnsd/TODO b/jni/pdnsd/TODO deleted file mode 100644 index f6a1650a..00000000 --- a/jni/pdnsd/TODO +++ /dev/null @@ -1,20 +0,0 @@ -- Implement a reference counter to ensure that newly entered records are not - purged immediately (really needed?) -- Perhaps do a two-step form of recursive query: first query those servers we - have got cached, then (if unsuccessful) look the others up and query again. - The impact of this optimisation may not be very big, because all sane servers - give A records for NS records if possible. -- Test for compatibility on other Unix-like Systems other than the BSDs and - Linux; rewrite the functions in netdev.c and icmp.c for those OSs if - necessary. Also try to get compatibility for other compilers than gcc. -- Write an install rule for the Slackware start-up script. -- Update the FAQ. -- Implement DNSSEC support. Since version 1.2.9, pdnsd is able to cache the RR - types necessary for DNSSEC, but the resolver is not yet security aware. -- Implement a lookup table (hash table) for queries in progress. This would - enable a thread that is resolving a query that is already being handled by - another thread to wait for that other thread to finish and copy its result - rather than independently query remote servers. It is very common for - resolvers to resend UDP queries if they don't get a reply within a timeout - period and if the answer is not yet cached, this will result in multiple - threads duplicating each others work in the current implementation. diff --git a/jni/pdnsd/acconfig.h b/jni/pdnsd/acconfig.h deleted file mode 100644 index c8640712..00000000 --- a/jni/pdnsd/acconfig.h +++ /dev/null @@ -1,191 +0,0 @@ -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in! - * config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */ - -/* Define your Target here. Currently defined are TARGET_LINUX (any - * architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully - * works for other BSD variants) and TARGET_CYGWIN. */ -#define TARGET TARGET_LINUX - -/* change the #undef to #define if you do not want to compile with special - * ISDN support for Linux. Note that the ISDN support will not compile ok on - * unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches, - * it may work fine). This is not on by default because it will cause compile - * problems on some systems */ -#undef ISDN_SUPPORT - -/* The following regulates the IP Protocol support. Supported types are IPv4 - * and IPv6 (aka IPng). You may enable either or both of these protocols. - * Enabling in this context means that support for the respective protocol - * will be in the binary. When running the binary, one of the protocols may - * be activated via command line switches. Note that activating both IPv4 and - * IPv6 is pointless (and will not work because two UDP and two TCP threads - * will be started that concur for ports). Because of that, it is not allowed. - * When pdnsd runs with IPv6 activated it should be able to service queries - * from IPv6 as well as from IPv4 hosts, provided that you host is configured - * properly. - * For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6 - * control whether support for the respective protocol is available in the - * binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd - * startup by default. 1 means IPv4, while 0 means IPv6. If support for - * a protocol was included in the executable, you can specify command line - * parameters to activate or deactivate that protocol (the options are -4 and - * -6), but it makes more sense to use the run_ipv4=on/off option in the - * configuration file. - * Make your choice. Note that IPv6 support is experimental in pdnsd. - * In normal operation, you will currently only need IPv4. */ -#undef ENABLE_IPV4 -#define DEFAULT_IPV4 1 -#undef ENABLE_IPV6 - -/* In all pdnsd versions before 1.0.6, DNS queries were always done over - * TCP. Now, you have the choice. You can control that behaviour using - * the -m command line switch, and you can give a preset here. There - * are 3 different modes: - * UDP_ONLY: This is undoubtedly the fastest query method, because - * no TCP negotiation needs to be done. - * TCP_ONLY: This is slower than uo, but generally more secure - * against DNS spoofing. Note that some name servers on the - * internet do not support TCP queries, notably dnscache. - * TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"- - * error or times out, the query is retried using UDP. - * UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set), - * the query is retried using TCP. */ -#define M_PRESET UDP_ONLY - -/* In addition to choosing the presets, you may also completely disable - * one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY). - * This saves some executable space. */ -#undef NO_UDP_QUERIES -#undef NO_TCP_QUERIES - -/* With the following option, you can disable the TCP server functionality - * of pdnsd. Nearly no program does TCP queries, so you probably can do - * this safely and save some executable space and one thread. - * You also can turn off the TCP server at runtime with the --notcp option. */ -#undef NO_TCP_SERVER - -/* By undefining the following, you can disable the UDP source address - * discovery code. This is not recommended, but you may need it when - * running into compilation problems. */ -#undef SRC_ADDR_DISC - -/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are - * unsure about what this means, just leave this as it is.*/ -#undef NO_POLL - -/* Define this for "hard" RFC 2181 compliance: this RFC states that - * implementations should discard answers whose RR sets have multiple - * different time stamps. While correct answers are generated, incorrect - * ones are normally tolerated and corrected. Full RFC compliance is - * however only achieved by deactivating this behaviour and thus being - * intolerant. */ -#undef RFC2181_ME_HARDER - -/* Define this to the device you want to use for getting random numbers. - * Leave this undefined if you wand to use the standard C library random - * function, which basically should be sufficient. - * Linux and FreeBSD have two random number devices: /dev/random and - * /dev/urandom. /dev/urandom might be less secure in some cases, but - * should still be more than sufficient. The use of /dev/random is - * discouraged, as reading from this device blocks when new random bits - * need to be gathered. */ -#undef RANDOM_DEVICE -#undef R_DEFAULT -#undef R_RANDOM -#undef R_ARC4RANDOM -/*#define RANDOM_DEVICE "/dev/urandom"*/ - -/* Designate which database manager to use for cacheing. - * default: native; others: gdbm */ -#define CACHE_DBM DBM_NATIVE - -#define CACHEDIR "/var/cache/pdnsd" - -#define TEMPDIR "/tmp"; - -/* This is for various debugging facilities that produce debug output and - * double-check some values. You can enable debug messages with the -g option. - * Normally, you can switch this off safely by setting the number after DEBUG - * to 0. This will increase speed (although only marginally), save space - * in the executable (only about 12kB) and some stack space per thread - * (which may be significant if you have many threads running simultaneously). - * However, it may be an aid when debugging config files. - * The only defined debug levels by now are in the range 0 - 9. - * Define this to 9 if you want hex dumps of all the queries and replies pdnsd - * receives (you must also call pdnsd with -v9 to actually see the hex dumps). - * When in doubt, leave it defined to 1. */ -#define DEBUG 1 - -/* This defines the default verbosity of informational messages you will get. - This has nothing to to with the debug option (-g), but may be set with -v - option. 0 is for normal operation, up to 3 for debugging. - Unlike the debug messages, these messages will also be written to the syslog.*/ -#define VERBOSITY 0 - -/* Redefine this if you want another hash size. - * The number of hash buckets is computed as power of two (1< sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH])dnl -_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 5 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 16 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl -dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, - [m4_fatal([AC_INIT should be called with package and version arguments])])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl -]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The `parallel-tests' driver may need to know about EXEEXT, so add the -dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. -AC_CONFIG_COMMANDS_PRE(dnl -[m4_provide_if([_AM_COMPILER_EXEEXT], - [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -]) - -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not -dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further -dnl mangled by Autoconf and run in a shell conditional statement. -m4_define([_AC_COMPILER_EXEEXT], -m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_arg=$1 -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 6 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([missing])dnl -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 5 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[[\\\"\#\$\&\'\`$am_lf]]*) - AC_MSG_ERROR([unsafe absolute working directory name]);; -esac -case $srcdir in - *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Copyright (C) 2006, 2008 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. -# This macro is traced by Automake. -AC_DEFUN([_AM_SUBST_NOTMAKE]) - -# AM_SUBST_NOTMAKE(VARIABLE) -# --------------------------- -# Public sister of _AM_SUBST_NOTMAKE. -AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - diff --git a/jni/pdnsd/compile b/jni/pdnsd/compile deleted file mode 100644 index 1b1d2321..00000000 --- a/jni/pdnsd/compile +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand `-c -o'. - -scriptversion=2005-05-14.22 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; -esac - -ofile= -cfile= -eat= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` - -# Create the lock directory. -# Note: use `[/.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/jni/pdnsd/config.h b/jni/pdnsd/config.h deleted file mode 100644 index 2bfa2686..00000000 --- a/jni/pdnsd/config.h +++ /dev/null @@ -1,437 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.in by autoheader. */ -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in! - * config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */ - -/* Define your Target here. Currently defined are TARGET_LINUX (any - * architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully - * works for other BSD variants) and TARGET_CYGWIN. */ -#define TARGET TARGET_LINUX - -/* change the #undef to #define if you do not want to compile with special - * ISDN support for Linux. Note that the ISDN support will not compile ok on - * unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches, - * it may work fine). This is not on by default because it will cause compile - * problems on some systems */ -/* #undef ISDN_SUPPORT */ - -/* The following regulates the IP Protocol support. Supported types are IPv4 - * and IPv6 (aka IPng). You may enable either or both of these protocols. - * Enabling in this context means that support for the respective protocol - * will be in the binary. When running the binary, one of the protocols may - * be activated via command line switches. Note that activating both IPv4 and - * IPv6 is pointless (and will not work because two UDP and two TCP threads - * will be started that concur for ports). Because of that, it is not allowed. - * When pdnsd runs with IPv6 activated it should be able to service queries - * from IPv6 as well as from IPv4 hosts, provided that you host is configured - * properly. - * For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6 - * control whether support for the respective protocol is available in the - * binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd - * startup by default. 1 means IPv4, while 0 means IPv6. If support for - * a protocol was included in the executable, you can specify command line - * parameters to activate or deactivate that protocol (the options are -4 and - * -6), but it makes more sense to use the run_ipv4=on/off option in the - * configuration file. - * Make your choice. Note that IPv6 support is experimental in pdnsd. - * In normal operation, you will currently only need IPv4. */ -#define ENABLE_IPV4 1 -#define DEFAULT_IPV4 1 -#undef ENABLE_IPV6 - -/* In all pdnsd versions before 1.0.6, DNS queries were always done over - * TCP. Now, you have the choice. You can control that behaviour using - * the -m command line switch, and you can give a preset here. There - * are 3 different modes: - * UDP_ONLY: This is undoubtedly the fastest query method, because - * no TCP negotiation needs to be done. - * TCP_ONLY: This is slower than uo, but generally more secure - * against DNS spoofing. Note that some name servers on the - * internet do not support TCP queries, notably dnscache. - * TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"- - * error or times out, the query is retried using UDP. - * UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set), - * the query is retried using TCP. */ -#define M_PRESET TCP_ONLY - -/* In addition to choosing the presets, you may also completely disable - * one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY). - * This saves some executable space. */ -/* #undef NO_UDP_QUERIES */ -/* #undef NO_TCP_QUERIES */ - -/* With the following option, you can disable the TCP server functionality - * of pdnsd. Nearly no program does TCP queries, so you probably can do - * this safely and save some executable space and one thread. - * You also can turn off the TCP server at runtime with the --notcp option. */ -/* #undef NO_TCP_SERVER */ - -/* By undefining the following, you can disable the UDP source address - * discovery code. This is not recommended, but you may need it when - * running into compilation problems. */ -#define SRC_ADDR_DISC 1 - -/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are - * unsure about what this means, just leave this as it is.*/ -/* #undef NO_POLL */ - -/* Define this for "hard" RFC 2181 compliance: this RFC states that - * implementations should discard answers whose RR sets have multiple - * different time stamps. While correct answers are generated, incorrect - * ones are normally tolerated and corrected. Full RFC compliance is - * however only achieved by deactivating this behaviour and thus being - * intolerant. */ -/* #undef RFC2181_ME_HARDER */ - -/* Define this to the device you want to use for getting random numbers. - * Leave this undefined if you wand to use the standard C library random - * function, which basically should be sufficient. - * Linux and FreeBSD have two random number devices: /dev/random and - * /dev/urandom. /dev/urandom might be less secure in some cases, but - * should still be more than sufficient. The use of /dev/random is - * discouraged, as reading from this device blocks when new random bits - * need to be gathered. */ -/* #undef RANDOM_DEVICE */ -#define R_DEFAULT 1 -/* #undef R_RANDOM */ -/* #undef R_ARC4RANDOM */ -/*#define RANDOM_DEVICE "/dev/urandom"*/ - -/* Designate which database manager to use for cacheing. - * default: native; others: gdbm */ -#define CACHE_DBM DBM_NATIVE - -#define CONFDIR "/data/data/net.typeblog.socks" - -#define CACHEDIR "/data/data/net.typeblog.socks" - -#define TEMPDIR "/data/data/net.typeblog.socks/cache"; - -/* This is for various debugging facilities that produce debug output and - * double-check some values. You can enable debug messages with the -g option. - * Normally, you can switch this off safely by setting the number after DEBUG - * to 0. This will increase speed (although only marginally), save space - * in the executable (only about 12kB) and some stack space per thread - * (which may be significant if you have many threads running simultaneously). - * However, it may be an aid when debugging config files. - * The only defined debug levels by now are in the range 0 - 9. - * Define this to 9 if you want hex dumps of all the queries and replies pdnsd - * receives (you must also call pdnsd with -v9 to actually see the hex dumps). - * When in doubt, leave it defined to 1. */ -#define DEBUG 1 - -/* This defines the default verbosity of informational messages you will get. - This has nothing to to with the debug option (-g), but may be set with -v - option. 0 is for normal operation, up to 3 for debugging. - Unlike the debug messages, these messages will also be written to the syslog.*/ -#define VERBOSITY 0 - -/* Redefine this if you want another hash size. - * The number of hash buckets is computed as power of two (1< and it should be used (not on Ultrix). - */ -#define HAVE_ALLOCA_H 1 - -/* Define to 1 if you have the `asprintf' function. */ -#define HAVE_ASPRINTF 1 - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -/* #undef HAVE_DOPRNT */ - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if you have the `getline' function. */ -#if defined(__aarch64__) || defined(__x86_64__) -#define HAVE_GETLINE 1 -#endif - -/* Define to 1 if you have the `getpwnam_r' function. */ -//#define HAVE_GETPWNAM_R 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the `inet_ntop' function. */ -#define HAVE_INET_NTOP 1 - -/* Define to 1 if you have the `inet_pton' function. */ -#define HAVE_INET_PTON 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the `pthread' library (-lpthread). */ -#define HAVE_LIBPTHREAD 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MALLOC_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `mempcpy' function. */ -//#define HAVE_MEMPCPY 1 - -/* Define to 1 if you have the `mkfifo' function. */ -#define HAVE_MKFIFO 1 - -/* Define to 1 if you have the `nanosleep' function. */ -#define HAVE_NANOSLEEP 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NET_IF_H 1 - -/* Define to 1 if you have the `poll' function. */ -#define HAVE_POLL 1 - -/* Define to 1 if you have the `select' function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the `snprintf' function. */ -#define HAVE_SNPRINTF 1 - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if the system has the type `socklen_t'. */ -#define HAVE_SOCKLEN_T 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `stpcpy' function. */ -#if defined(__aarch64__) || defined(__x86_64__) -#define HAVE_STPCPY 1 -#endif - -/* Define to 1 if you have the `stpncpy' function. */ -//#define HAVE_STPNCPY 1 - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcpy' function. */ -/* #undef HAVE_STRLCPY */ - -/* Define to 1 if you have the `strndup' function. */ -#define HAVE_STRNDUP 1 - -/* Define to 1 if the system has the type `struct ifreq'. */ -#define HAVE_STRUCT_IFREQ 1 - -/* Define to 1 if the system has the type `struct in6_addr'. */ -#define HAVE_STRUCT_IN6_ADDR 1 - -/* Define to 1 if the system has the type `struct in_pktinfo'. */ -#define HAVE_STRUCT_IN_PKTINFO 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYSLOG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_POLL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have that is POSIX.1 compatible. */ -#define HAVE_SYS_WAIT_H 1 - -/* Define to 1 if you have the `uname' function. */ -#define HAVE_UNAME 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `vasprintf' function. */ -#define HAVE_VASPRINTF 1 - -/* Define to 1 if you have the `vprintf' function. */ -#define HAVE_VPRINTF 1 - -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -/* #undef NO_MINUS_C_MINUS_O */ - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* Define as the return type of signal handlers (`int' or `void'). */ -#define RETSIGTYPE void - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -/* #undef STACK_DIRECTION */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME 1 - -/* Define to 1 if your declares `struct tm'. */ -/* #undef TM_IN_SYS_TIME */ - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# define _ALL_SOURCE 1 -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# define _POSIX_PTHREAD_SEMANTICS 1 -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# define _TANDEM_SOURCE 1 -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# define __EXTENSIONS__ 1 -#endif - - -/* Define to 1 if on MINIX. */ -/* #undef _MINIX */ - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -/* #undef _POSIX_1_SOURCE */ - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -/* #undef _POSIX_SOURCE */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define to `int' if does not define. */ -/* #undef pid_t */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ diff --git a/jni/pdnsd/config.h.in b/jni/pdnsd/config.h.in deleted file mode 100644 index c4ac9948..00000000 --- a/jni/pdnsd/config.h.in +++ /dev/null @@ -1,430 +0,0 @@ -/* config.h.in. Generated from configure.in by autoheader. */ -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -/* ONLY EDIT acconfig.h, NEVER config.h or config.h.in! - * config.h MAY BE OVERWRITTEN BY make, config.h.in by autoheader! */ - -/* Define your Target here. Currently defined are TARGET_LINUX (any - * architecture), TARGET_BSD (experimental; tested on FreeBSD, hopefully - * works for other BSD variants) and TARGET_CYGWIN. */ -#define TARGET TARGET_LINUX - -/* change the #undef to #define if you do not want to compile with special - * ISDN support for Linux. Note that the ISDN support will not compile ok on - * unpatched kernerls earlier than 2.2.12 (if you did apply newer isdn patches, - * it may work fine). This is not on by default because it will cause compile - * problems on some systems */ -#undef ISDN_SUPPORT - -/* The following regulates the IP Protocol support. Supported types are IPv4 - * and IPv6 (aka IPng). You may enable either or both of these protocols. - * Enabling in this context means that support for the respective protocol - * will be in the binary. When running the binary, one of the protocols may - * be activated via command line switches. Note that activating both IPv4 and - * IPv6 is pointless (and will not work because two UDP and two TCP threads - * will be started that concur for ports). Because of that, it is not allowed. - * When pdnsd runs with IPv6 activated it should be able to service queries - * from IPv6 as well as from IPv4 hosts, provided that you host is configured - * properly. - * For each of the protocols there are two options: ENABLE_IPV4 and ENABLE_IPV6 - * control whether support for the respective protocol is available in the - * binary. DEFAULT_IPV4 selects which protocol is enabled on pdnsd - * startup by default. 1 means IPv4, while 0 means IPv6. If support for - * a protocol was included in the executable, you can specify command line - * parameters to activate or deactivate that protocol (the options are -4 and - * -6), but it makes more sense to use the run_ipv4=on/off option in the - * configuration file. - * Make your choice. Note that IPv6 support is experimental in pdnsd. - * In normal operation, you will currently only need IPv4. */ -#undef ENABLE_IPV4 -#define DEFAULT_IPV4 1 -#undef ENABLE_IPV6 - -/* In all pdnsd versions before 1.0.6, DNS queries were always done over - * TCP. Now, you have the choice. You can control that behaviour using - * the -m command line switch, and you can give a preset here. There - * are 3 different modes: - * UDP_ONLY: This is undoubtedly the fastest query method, because - * no TCP negotiation needs to be done. - * TCP_ONLY: This is slower than uo, but generally more secure - * against DNS spoofing. Note that some name servers on the - * internet do not support TCP queries, notably dnscache. - * TCP_UDP: TCP, then UDP. If the TCP query fails with a "connection refused"- - * error or times out, the query is retried using UDP. - * UDP_TCP: UDP, then TCP. If the UDP reply is truncated (i.e. the tc flag is set), - * the query is retried using TCP. */ -#define M_PRESET UDP_ONLY - -/* In addition to choosing the presets, you may also completely disable - * one of the protocols (TCP for preset UDP_ONLY and UDP for preset TCP_ONLY). - * This saves some executable space. */ -#undef NO_UDP_QUERIES -#undef NO_TCP_QUERIES - -/* With the following option, you can disable the TCP server functionality - * of pdnsd. Nearly no program does TCP queries, so you probably can do - * this safely and save some executable space and one thread. - * You also can turn off the TCP server at runtime with the --notcp option. */ -#undef NO_TCP_SERVER - -/* By undefining the following, you can disable the UDP source address - * discovery code. This is not recommended, but you may need it when - * running into compilation problems. */ -#undef SRC_ADDR_DISC - -/* NO_POLL specifies not to use poll(2), but select(2) instead. If you are - * unsure about what this means, just leave this as it is.*/ -#undef NO_POLL - -/* Define this for "hard" RFC 2181 compliance: this RFC states that - * implementations should discard answers whose RR sets have multiple - * different time stamps. While correct answers are generated, incorrect - * ones are normally tolerated and corrected. Full RFC compliance is - * however only achieved by deactivating this behaviour and thus being - * intolerant. */ -#undef RFC2181_ME_HARDER - -/* Define this to the device you want to use for getting random numbers. - * Leave this undefined if you wand to use the standard C library random - * function, which basically should be sufficient. - * Linux and FreeBSD have two random number devices: /dev/random and - * /dev/urandom. /dev/urandom might be less secure in some cases, but - * should still be more than sufficient. The use of /dev/random is - * discouraged, as reading from this device blocks when new random bits - * need to be gathered. */ -#undef RANDOM_DEVICE -#undef R_DEFAULT -#undef R_RANDOM -#undef R_ARC4RANDOM -/*#define RANDOM_DEVICE "/dev/urandom"*/ - -/* Designate which database manager to use for cacheing. - * default: native; others: gdbm */ -#define CACHE_DBM DBM_NATIVE - -#define CACHEDIR "/var/cache/pdnsd" - -#define TEMPDIR "/tmp"; - -/* This is for various debugging facilities that produce debug output and - * double-check some values. You can enable debug messages with the -g option. - * Normally, you can switch this off safely by setting the number after DEBUG - * to 0. This will increase speed (although only marginally), save space - * in the executable (only about 12kB) and some stack space per thread - * (which may be significant if you have many threads running simultaneously). - * However, it may be an aid when debugging config files. - * The only defined debug levels by now are in the range 0 - 9. - * Define this to 9 if you want hex dumps of all the queries and replies pdnsd - * receives (you must also call pdnsd with -v9 to actually see the hex dumps). - * When in doubt, leave it defined to 1. */ -#define DEBUG 1 - -/* This defines the default verbosity of informational messages you will get. - This has nothing to to with the debug option (-g), but may be set with -v - option. 0 is for normal operation, up to 3 for debugging. - Unlike the debug messages, these messages will also be written to the syslog.*/ -#define VERBOSITY 0 - -/* Redefine this if you want another hash size. - * The number of hash buckets is computed as power of two (1< and it should be used (not on Ultrix). - */ -#undef HAVE_ALLOCA_H - -/* Define to 1 if you have the `asprintf' function. */ -#undef HAVE_ASPRINTF - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -#undef HAVE_DOPRNT - -/* Define to 1 if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have the `getline' function. */ -#undef HAVE_GETLINE - -/* Define to 1 if you have the `getpwnam_r' function. */ -#undef HAVE_GETPWNAM_R - -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define to 1 if you have the `inet_ntop' function. */ -#undef HAVE_INET_NTOP - -/* Define to 1 if you have the `inet_pton' function. */ -#undef HAVE_INET_PTON - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `pthread' library (-lpthread). */ -#undef HAVE_LIBPTHREAD - -/* Define to 1 if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `mempcpy' function. */ -#undef HAVE_MEMPCPY - -/* Define to 1 if you have the `mkfifo' function. */ -#undef HAVE_MKFIFO - -/* Define to 1 if you have the `nanosleep' function. */ -#undef HAVE_NANOSLEEP - -/* Define to 1 if you have the header file. */ -#undef HAVE_NETINET_IN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_NET_IF_H - -/* Define to 1 if you have the `poll' function. */ -#undef HAVE_POLL - -/* Define to 1 if you have the `select' function. */ -#undef HAVE_SELECT - -/* Define to 1 if you have the `snprintf' function. */ -#undef HAVE_SNPRINTF - -/* Define to 1 if you have the `socket' function. */ -#undef HAVE_SOCKET - -/* Define to 1 if the system has the type `socklen_t'. */ -#undef HAVE_SOCKLEN_T - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the `stpcpy' function. */ -#undef HAVE_STPCPY - -/* Define to 1 if you have the `stpncpy' function. */ -#undef HAVE_STPNCPY - -/* Define to 1 if you have the `strdup' function. */ -#undef HAVE_STRDUP - -/* Define to 1 if you have the `strerror' function. */ -#undef HAVE_STRERROR - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the `strlcpy' function. */ -#undef HAVE_STRLCPY - -/* Define to 1 if you have the `strndup' function. */ -#undef HAVE_STRNDUP - -/* Define to 1 if the system has the type `struct ifreq'. */ -#undef HAVE_STRUCT_IFREQ - -/* Define to 1 if the system has the type `struct in6_addr'. */ -#undef HAVE_STRUCT_IN6_ADDR - -/* Define to 1 if the system has the type `struct in_pktinfo'. */ -#undef HAVE_STRUCT_IN_PKTINFO - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYSLOG_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_IOCTL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_POLL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TIME_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have that is POSIX.1 compatible. */ -#undef HAVE_SYS_WAIT_H - -/* Define to 1 if you have the `uname' function. */ -#undef HAVE_UNAME - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to 1 if you have the `vasprintf' function. */ -#undef HAVE_VASPRINTF - -/* Define to 1 if you have the `vprintf' function. */ -#undef HAVE_VPRINTF - -/* Define to 1 if you have the `vsnprintf' function. */ -#undef HAVE_VSNPRINTF - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define as the return type of signal handlers (`int' or `void'). */ -#undef RETSIGTYPE - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -#undef STACK_DIRECTION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to 1 if you can safely include both and . */ -#undef TIME_WITH_SYS_TIME - -/* Define to 1 if your declares `struct tm'. */ -#undef TM_IN_SYS_TIME - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# undef _ALL_SOURCE -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# undef _GNU_SOURCE -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# undef _POSIX_PTHREAD_SEMANTICS -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# undef _TANDEM_SOURCE -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# undef __EXTENSIONS__ -#endif - - -/* Define to 1 if on MINIX. */ -#undef _MINIX - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -#undef _POSIX_1_SOURCE - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `int' if does not define. */ -#undef pid_t - -/* Define to `unsigned int' if does not define. */ -#undef size_t diff --git a/jni/pdnsd/configure b/jni/pdnsd/configure deleted file mode 100644 index a3b78220..00000000 --- a/jni/pdnsd/configure +++ /dev/null @@ -1,11389 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.63. -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell bug-autoconf@gnu.org about your system, - echo including any error possibly output before this message. - echo This can help us improve future autoconf versions. - echo Configuration will now proceed without shell functions. -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= - -ac_unique_file="src" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='am__EXEEXT_FALSE -am__EXEEXT_TRUE -LTLIBOBJS -LIBOBJS -ALLOCA -thread_CFLAGS -RANLIB -threadlib -specbuild -def_id -cachedir -distribution -packagerelease -fullversion -EGREP -GREP -CPP -am__fastdepCC_FALSE -am__fastdepCC_TRUE -CCDEPMODE -AMDEPBACKSLASH -AMDEP_FALSE -AMDEP_TRUE -am__quote -am__include -DEPDIR -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -am__untar -am__tar -AMTAR -am__leading_dot -SET_MAKE -AWK -mkdir_p -MKDIR_P -INSTALL_STRIP_PROGRAM -STRIP -install_sh -MAKEINFO -AUTOHEADER -AUTOMAKE -AUTOCONF -ACLOCAL -VERSION -PACKAGE -CYGPATH_W -am__isrc -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_dependency_tracking -with_distribution -with_target -with_cachedir -enable_isdn -enable_ipv4 -enable_ipv6 -enable_ipv4_startup -enable_ipv6_startup -enable_udp_queries -enable_tcp_queries -with_query_method -enable_tcp_server -enable_src_addr_disc -enable_socket_locking -enable_poll -enable_new_rrs -enable_strict_rfc2181 -with_random_device -enable_underscores -with_default_id -with_debug -with_verbosity -with_hash_buckets -enable_hash_debug -enable_rcsids -with_tcp_qtimeout -enable_tcp_subseq -with_par_queries -with_max_nameserver_ips -enable_specbuild -with_thread_lib -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 - { (exit 1); exit 1; }; } - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { $as_echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { $as_echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --enable-isdn Enable ISDN support (may cause problems on - some systems; only for Linux) - --disable-ipv4 Disable IPv4 networking support - (default=enabled) - --enable-ipv6 Enable IPv6 networking support - --disable-ipv4-startup Disable IPv4 on pdnsd startup by default - (default=enabled) - --enable-ipv6-startup Enable IPV6 on pdnsd startup by default - (default=IPv4) - --disable-udp-queries Disable udp as query method. - --disable-tcp-queries Disable tcp as query method. - --disable-tcp-server Disable the TCP serving ability of pdnsd - --disable-src-addr-disc Disable the UDP source address discovery - --enable-socket-locking Enable the UDP socket locking - --disable-poll Disable poll(2) and use select(2) - (default=enabled) - --disable-new-rrs Disable new DNS RR types (obsolete, currently ignored) - --enable-strict-rfc2181 Enforce strict RFC 2181 compliance - --enable-underscores Allow _ in domain names (obsolete, currently ignored) - --enable-hash-debug Debug hash tables (warning: massive output) - --enable-rcsids Enable RCS IDs in executables (obsolete, currently ignored) - --enable-tcp-subseq Enable multiple dns querys using one - tcp connection - --enable-specbuild Only used when building pdnsd from spec files - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-distribution=distro Specify target distribution (default=Generic; - others: RedHat, SuSE, Debian, ArchLinux) - --with-target=platform Change compilation target platform (default: - autodetect; others: Linux, BSD, Cygwin) - --with-cachedir=dir Default directory for pdnsd cache - (default=/var/cache/pdnsd) - --with-query-method=qm Specify the query method (default=udponly; - others: tcponly, tcpudp, udptcp) - --with-random-device=device Specify random device other than - /dev/random; default: C Library random() PRNG; - special value arc4random for BSD C Library - arc4random function (default on FreeBSD) - --with-default-id=id Specify default uid/gid for pdnsd - (default=nobody) - --with-debug=level Specify debugging level (0 means no debug support) - --with-verbosity=level Specify default message verbosity - --with-hash-buckets=num Number of hash buckets to use (default=1024). - The number actually used is the smallest power of two - greater or equal to the number specified here. - --with-tcp-qtimeout=secs Specify default tcp query timeout (default=30) - --with-par-queries=num Specify default parallel query number (default=2) - --with-max-nameserver-ips=num Specify maximum number of IP addresses used per nameserver obtained from NS records (default=3) - --with-thread-lib=lib Specify thread library, overriding automatic detection (for Linux only). - Possible values: LinuxThreads, - LinuxThreads2 (implements a fix for newer glibcs) - or NPTL (Native POSIX Thread Library) - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -configure -generated by GNU Autoconf 2.63 - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.63. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" -done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then - { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - - - - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -package="pdnsd" -version=`cut -d - -f 1 "$srcdir"/version` -fullversion=`cat "$srcdir"/version` -packagerelease=`cut -d - -f 2- "$srcdir"/version` - -distribution="Generic" -target="autodetect" -cachedir="/var/cache/$package" -ipv4_default=1 -have_ipv4="yes" -#newrrs="yes" -query_m="udponly" -have_tcp_server="yes" -adisc="default" -slock="no"; -def_id="nobody" -#have_rcsids="no" -udp_queries="yes" -tcp_queries="yes" -tempdir="/tmp" -randomdev=default -freebsd_pthread="4" -specbuild=no -threadlib=default - -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - -done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -$as_echo_n "checking whether build environment is sane... " >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 -$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} - { (exit 1); exit 1; }; };; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 -$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} - { (exit 1); exit 1; }; };; -esac - -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -$as_echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac -fi -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if test x"${install_sh}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - -{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 -$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext - break 3;; - esac - done - done -done -IFS=$as_save_IFS - -fi - - if test "${ac_cv_path_mkdir+set}" = set; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version - MKDIR_P="$ac_install_sh -d" - fi -fi -{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } - fi -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE=$package - VERSION=$version - - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - - -ac_config_headers="$ac_config_headers config.h" - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo this is the am__doit target -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from `make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi - - -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - -# Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { (ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi - -{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -rm -f conftest$ac_cv_exeext -{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - if test "${ac_cv_header_minix_config_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 -$as_echo_n "checking for minix/config.h... " >&6; } -if test "${ac_cv_header_minix_config_h+set}" = set; then - $as_echo_n "(cached) " >&6 -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -$as_echo "$ac_cv_header_minix_config_h" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 -$as_echo_n "checking minix/config.h usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 -$as_echo_n "checking minix/config.h presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 -$as_echo_n "checking for minix/config.h... " >&6; } -if test "${ac_cv_header_minix_config_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_header_minix_config_h=$ac_header_preproc -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -$as_echo "$ac_cv_header_minix_config_h" >&6; } - -fi -if test "x$ac_cv_header_minix_config_h" = x""yes; then - MINIX=yes -else - MINIX= -fi - - - if test "$MINIX" = yes; then - -cat >>confdefs.h <<\_ACEOF -#define _POSIX_SOURCE 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _POSIX_1_SOURCE 2 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _MINIX 1 -_ACEOF - - fi - - - - { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if test "${ac_cv_safe_to_define___extensions__+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_safe_to_define___extensions__=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_safe_to_define___extensions__=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - cat >>confdefs.h <<\_ACEOF -#define __EXTENSIONS__ 1 -_ACEOF - - cat >>confdefs.h <<\_ACEOF -#define _ALL_SOURCE 1 -_ACEOF - - cat >>confdefs.h <<\_ACEOF -#define _GNU_SOURCE 1 -_ACEOF - - cat >>confdefs.h <<\_ACEOF -#define _POSIX_PTHREAD_SEMANTICS 1 -_ACEOF - - cat >>confdefs.h <<\_ACEOF -#define _TANDEM_SOURCE 1 -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$fullversion" -_ACEOF - - - - - -# Check whether --with-distribution was given. -if test "${with_distribution+set}" = set; then - withval=$with_distribution; distribution=$withval -fi - - - - -# Check whether --with-target was given. -if test "${with_target+set}" = set; then - withval=$with_target; target=$withval -fi - -case $target in - Linux|linux) - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_LINUX -_ACEOF - - target="Linux" - ;; - BSD| bsd) - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_BSD -_ACEOF - - target="BSD" - ;; - Cygwin|CYGWIN|cygwin) - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_CYGWIN -_ACEOF - - target="cygwin" - ;; - autodetect) - ;; - *) - { { $as_echo "$as_me:$LINENO: error: --with-target must have Linux, BSD or Cygwin as parameter." >&5 -$as_echo "$as_me: error: --with-target must have Linux, BSD or Cygwin as parameter." >&2;} - { (exit 1); exit 1; }; } - ;; -esac - - -# Check whether --with-cachedir was given. -if test "${with_cachedir+set}" = set; then - withval=$with_cachedir; cachedir=$withval -fi - -cat >>confdefs.h <<_ACEOF -#define CACHEDIR "$cachedir" -_ACEOF - - - -# Check whether --enable-isdn was given. -if test "${enable_isdn+set}" = set; then - enableval=$enable_isdn; test $enableval = "yes" && cat >>confdefs.h <<\_ACEOF -#define ISDN_SUPPORT 1 -_ACEOF - -fi - - -# Check whether --enable-ipv4 was given. -if test "${enable_ipv4+set}" = set; then - enableval=$enable_ipv4; have_ipv4=$enableval -fi - - -test $have_ipv4 = "yes" && cat >>confdefs.h <<\_ACEOF -#define ENABLE_IPV4 1 -_ACEOF - - -# Check whether --enable-ipv6 was given. -if test "${enable_ipv6+set}" = set; then - enableval=$enable_ipv6; if test $enableval = "yes" ; then - cat >>confdefs.h <<\_ACEOF -#define ENABLE_IPV6 1 -_ACEOF - - if test $have_ipv4 != "yes" ; then - ipv4_default=0 - fi - fi -fi - - -# Check whether --enable-ipv4-startup was given. -if test "${enable_ipv4_startup+set}" = set; then - enableval=$enable_ipv4_startup; if test $enableval = "yes" ; then - ipv4_default=1 - else - ipv4_default=0 - fi -fi - - -# Check whether --enable-ipv6-startup was given. -if test "${enable_ipv6_startup+set}" = set; then - enableval=$enable_ipv6_startup; if test $enableval = "yes" ; then - ipv4_default=0 - else - ipv4_default=1 - fi -fi - - -cat >>confdefs.h <<_ACEOF -#define DEFAULT_IPV4 $ipv4_default -_ACEOF - - -# Check whether --enable-udp-queries was given. -if test "${enable_udp_queries+set}" = set; then - enableval=$enable_udp_queries; udp_queries=$enableval -fi - - -# Check whether --enable-tcp-queries was given. -if test "${enable_tcp_queries+set}" = set; then - enableval=$enable_tcp_queries; tcp_queries=$enableval -fi - - - -# Check whether --with-query-method was given. -if test "${with_query_method+set}" = set; then - withval=$with_query_method; query_m=$withval -fi - -case $query_m in - udponly|UDPonly) - cat >>confdefs.h <<\_ACEOF -#define M_PRESET UDP_ONLY -_ACEOF - - udp_queries=yes; - ;; - tcponly|TCPonly) - cat >>confdefs.h <<\_ACEOF -#define M_PRESET TCP_ONLY -_ACEOF - - tcp_queries=yes; - ;; - tcpudp|TCPUDP) - cat >>confdefs.h <<\_ACEOF -#define M_PRESET TCP_UDP -_ACEOF - - udp_queries=yes; - tcp_queries=yes; - ;; - udptcp|UDPTCP) - cat >>confdefs.h <<\_ACEOF -#define M_PRESET UDP_TCP -_ACEOF - - udp_queries=yes; - tcp_queries=yes; - ;; - *) - { { $as_echo "$as_me:$LINENO: error: --with-query-method must have udponly, tcponly, tcpudp or udptcp as parameter." >&5 -$as_echo "$as_me: error: --with-query-method must have udponly, tcponly, tcpudp or udptcp as parameter." >&2;} - { (exit 1); exit 1; }; } - ;; -esac - -test $udp_queries != "yes" && cat >>confdefs.h <<\_ACEOF -#define NO_UDP_QUERIES 1 -_ACEOF - -test $tcp_queries != "yes" && cat >>confdefs.h <<\_ACEOF -#define NO_TCP_QUERIES 1 -_ACEOF - - -# Check whether --enable-tcp-server was given. -if test "${enable_tcp_server+set}" = set; then - enableval=$enable_tcp_server; have_tcp_server=$enableval -fi - - -test $have_tcp_server != "yes" && cat >>confdefs.h <<\_ACEOF -#define NO_TCP_SERVER 1 -_ACEOF - - -# Check whether --enable-src-addr-disc was given. -if test "${enable_src_addr_disc+set}" = set; then - enableval=$enable_src_addr_disc; adisc=$enableval -fi - - -# Check whether --enable-socket-locking was given. -if test "${enable_socket_locking+set}" = set; then - enableval=$enable_socket_locking; slock=$enableval -fi - - -test $slock = "yes" && cat >>confdefs.h <<\_ACEOF -#define SOCKET_LOCKING 1 -_ACEOF - - -# Check whether --enable-poll was given. -if test "${enable_poll+set}" = set; then - enableval=$enable_poll; test $enableval != "yes" && cat >>confdefs.h <<\_ACEOF -#define NO_POLL 1 -_ACEOF - -fi - - -# Check whether --enable-new-rrs was given. -if test "${enable_new_rrs+set}" = set; then - enableval=$enable_new_rrs; newrrs=$enableval -fi - - -# Check whether --enable-strict-rfc2181 was given. -if test "${enable_strict_rfc2181+set}" = set; then - enableval=$enable_strict_rfc2181; test $enableval = "yes" && cat >>confdefs.h <<\_ACEOF -#define RFC2181_ME_HARDER 1 -_ACEOF - -fi - - - -# Check whether --with-random-device was given. -if test "${with_random_device+set}" = set; then - withval=$with_random_device; randomdev=$withval -fi - - -if test "$randomdev" = arc4random ; then - cat >>confdefs.h <<\_ACEOF -#define R_ARC4RANDOM 1 -_ACEOF - -elif test "$randomdev" = random ; then - cat >>confdefs.h <<\_ACEOF -#define R_RANDOM 1 -_ACEOF - -elif test "$randomdev" = default ; then - cat >>confdefs.h <<\_ACEOF -#define R_DEFAULT 1 -_ACEOF - -else - cat >>confdefs.h <<_ACEOF -#define RANDOM_DEVICE "$randomdev" -_ACEOF - -fi - -# Check whether --enable-underscores was given. -if test "${enable_underscores+set}" = set; then - enableval=$enable_underscores; underscores=$enableval -fi - - - -# Check whether --with-default-id was given. -if test "${with_default_id+set}" = set; then - withval=$with_default_id; def_id=$withval -fi - - - - -# Check whether --with-debug was given. -if test "${with_debug+set}" = set; then - withval=$with_debug; cat >>confdefs.h <<_ACEOF -#define DEBUG $withval -_ACEOF - -fi - - - -# Check whether --with-verbosity was given. -if test "${with_verbosity+set}" = set; then - withval=$with_verbosity; cat >>confdefs.h <<_ACEOF -#define VERBOSITY $withval -_ACEOF - -fi - - - -# Check whether --with-hash-buckets was given. -if test "${with_hash_buckets+set}" = set; then - withval=$with_hash_buckets; powof2=1 - hashsz=0 - - while test $powof2 -lt "$withval" - do - powof2=`expr 2 '*' $powof2` - hashsz=`expr $hashsz '+' 1` - done - cat >>confdefs.h <<_ACEOF -#define HASH_SZ $hashsz -_ACEOF - - -fi - - -# Check whether --enable-hash-debug was given. -if test "${enable_hash_debug+set}" = set; then - enableval=$enable_hash_debug; test $enableval = "yes" && cat >>confdefs.h <<\_ACEOF -#define DEBUG_HASH 1 -_ACEOF - -fi - - -# Check whether --enable-rcsids was given. -if test "${enable_rcsids+set}" = set; then - enableval=$enable_rcsids; have_rcsids=$enableval -fi - - - -# Check whether --with-tcp-qtimeout was given. -if test "${with_tcp_qtimeout+set}" = set; then - withval=$with_tcp_qtimeout; cat >>confdefs.h <<_ACEOF -#define TCP_TIMEOUT $withval -_ACEOF - -fi - - -# Check whether --enable-tcp-subseq was given. -if test "${enable_tcp_subseq+set}" = set; then - enableval=$enable_tcp_subseq; test $enableval = "yes" && cat >>confdefs.h <<\_ACEOF -#define TCP_SUBSEQ 1 -_ACEOF - -fi - - - -# Check whether --with-par-queries was given. -if test "${with_par_queries+set}" = set; then - withval=$with_par_queries; cat >>confdefs.h <<_ACEOF -#define PAR_QUERIES $withval -_ACEOF - -fi - - - -# Check whether --with-max-nameserver-ips was given. -if test "${with_max_nameserver_ips+set}" = set; then - withval=$with_max_nameserver_ips; cat >>confdefs.h <<_ACEOF -#define MAXNAMESERVIPS $withval -_ACEOF - -fi - - -# Check whether --enable-specbuild was given. -if test "${enable_specbuild+set}" = set; then - enableval=$enable_specbuild; specbuild=$enableval -fi - - - - - -# Check whether --with-thread-lib was given. -if test "${with_thread_lib+set}" = set; then - withval=$with_thread_lib; threadlib=$withval -fi - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - -# Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:$LINENO: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -$as_echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; }; } - -# Provide some information about the compiler. -$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_g=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c89=$ac_arg -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -depcc="$CC" am_compiler_list= - -{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -$as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi - - - -am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc - -if test "x$CC" != xcc; then - { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } -fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* - -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - -cat >>confdefs.h <<\_ACEOF -#define NO_MINUS_C_MINUS_O 1 -_ACEOF - -fi - -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - -done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - - -if test "$target" = "autodetect" ; then - { $as_echo "$as_me:$LINENO: checking for autodetect build target" >&5 -$as_echo_n "checking for autodetect build target... " >&6; } - uname_sys=`uname` - if test $? -ne 0 ; then - { $as_echo "$as_me:$LINENO: result: failed" >&5 -$as_echo "failed" >&6; } - { { $as_echo "$as_me:$LINENO: error: uname failed or was not found in path" >&5 -$as_echo "$as_me: error: uname failed or was not found in path" >&2;} - { (exit 1); exit 1; }; } - else - case "${uname_sys}" in - Linux) - { $as_echo "$as_me:$LINENO: result: Linux" >&5 -$as_echo "Linux" >&6; } - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_LINUX -_ACEOF - - target="Linux" - ;; - FreeBSD|NetBSD|OpenBSD|Darwin) - { $as_echo "$as_me:$LINENO: result: \"${uname_sys}\"" >&5 -$as_echo "\"${uname_sys}\"" >&6; } - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_BSD -_ACEOF - - target="BSD" - ;; - CYGWIN*) - { $as_echo "$as_me:$LINENO: result: \"${uname_sys}\"" >&5 -$as_echo "\"${uname_sys}\"" >&6; } - cat >>confdefs.h <<\_ACEOF -#define TARGET TARGET_CYGWIN -_ACEOF - - target="cygwin" - ;; - *) - { $as_echo "$as_me:$LINENO: result: failed" >&5 -$as_echo "failed" >&6; } - { { $as_echo "$as_me:$LINENO: error: Your system type could not be identified. Try setting it manually using ---with-target" >&5 -$as_echo "$as_me: error: Your system type could not be identified. Try setting it manually using ---with-target" >&2;} - { (exit 1); exit 1; }; } - ;; - esac - fi -fi - -#if test "$target" = BSD ; then -# uname_sys=`uname` -# if test "$uname_sys" = FreeBSD ; then -# AC_MSG_CHECKING([for FreeBSD version]) -# osrel=`sysctl -n kern.osreldate` -# if test $osrel -ge 500016 ; then -# AC_MSG_RESULT([5.0 (>= 500016)]) -# freebsd_pthread="5" -# else -# AC_MSG_RESULT([<=5.0 (< 500016)]) -# freebsd_pthread="4" -# fi -# fi -#fi - -if test "$adisc" = "default"; then - if test "$target" = "cygwin" ; then -# Don't do UDP source address discovery on Cygwin platform by default. - adisc="no" - else - adisc="yes" - fi -fi - -test "$adisc" = "yes" && cat >>confdefs.h <<\_ACEOF -#define SRC_ADDR_DISC 1 -_ACEOF - - - -if test "$target" = "Linux"; then -{ $as_echo "$as_me:$LINENO: checking if we can compile and link with -pthread" >&5 -$as_echo_n "checking if we can compile and link with -pthread... " >&6; } -old_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -pthread" -cat >conftest.$ac_ext <<_ACEOF - -#include - -void *thread_func(void *data) -{ - *((int *)data)=1; - return data; -} - -int main() -{ - pthread_t thread; - void *retval; - int val; - - if(pthread_create(&thread, NULL, thread_func, &val)) - return 1; - - if(pthread_join(thread,&retval)) - return 1; - - return (*((int *)retval)!=1); -} - -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - gcc_pthread_flag="yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - gcc_pthread_flag="no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS="$old_CFLAGS" -{ $as_echo "$as_me:$LINENO: result: $gcc_pthread_flag" >&5 -$as_echo "$gcc_pthread_flag" >&6; } - - if test "$gcc_pthread_flag" = yes ; then - thread_CFLAGS="-pthread" - - else - -{ $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 -$as_echo_n "checking for pthread_create in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpthread $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pthread_create (); -int -main () -{ -return pthread_create (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_lib_pthread_pthread_create=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_lib_pthread_pthread_create=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 -$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } -if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPTHREAD 1 -_ACEOF - - LIBS="-lpthread $LIBS" - -fi - - fi -fi -if test "$target" = "BSD" -a `uname` != Darwin ; then -# if test $freebsd_pthread = 4 ; then - thread_CFLAGS="-pthread" - -# else -# AC_CHECK_LIB(c_r, pthread_create, , -# AC_MSG_ERROR([You must have libc_r installed to build/run pdnsd!])) -# fi; -fi - -if test "$target" = "Linux" -a "$threadlib" = default; then -{ $as_echo "$as_me:$LINENO: checking if this is an NPTL-based system" >&5 -$as_echo_n "checking if this is an NPTL-based system... " >&6; } -old_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $thread_CFLAGS" -if test "$cross_compiling" = yes; then - - { $as_echo "$as_me:$LINENO: result: couldn't run test program" >&5 -$as_echo "couldn't run test program" >&6; } - threadlib=linuxthreads - -else - cat >conftest.$ac_ext <<_ACEOF - -#include -#include -#include -#include -#include -#include - -/* All this function does is return its PID (in a roundabout way). */ -void *thread_func(void *data) -{ - *((int *)data)=getpid(); - return data; -} - -int main() -{ - pthread_t thread; - void *retval; - int err,mainpid,thrdpid; - - err=pthread_create(&thread, NULL, thread_func, &thrdpid); - if(err) { - fprintf(stderr,"pthread_create failed: %s\n",strerror(err)); - return 1; - } - err=pthread_join(thread,&retval); - if(err) { - fprintf(stderr,"pthread_join failed: %s\n",strerror(err)); - return 1; - } - mainpid=getpid(); - /* In LinuxThreads implementations, the pids of the threads will usually differ - in a non Posix-compliant way. */ - fprintf(stderr,"main pid=%d, thread pid=%d\n",mainpid,*((int *)retval)); - return (*((int *)retval)!=mainpid); -} - -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - threadlib=nptl - -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) - - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - threadlib=linuxthreads - -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -CFLAGS="$old_CFLAGS" -fi - -if test "$threadlib" = nptl -o "$threadlib" = NPTL; then - cat >>confdefs.h <<\_ACEOF -#define THREADLIB_NPTL 1 -_ACEOF - -elif test "$threadlib" = linuxthreads2 -o "$threadlib" = LinuxThreads2 -o "$threadlib" = lt2; then - cat >>confdefs.h <<\_ACEOF -#define THREADLIB_LINUXTHREADS2 1 -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 -$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } -if test "${ac_cv_header_sys_wait_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#ifndef WEXITSTATUS -# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) -#endif -#ifndef WIFEXITED -# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) -#endif - -int -main () -{ - int s; - wait (&s); - s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_sys_wait_h=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_sys_wait_h=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 -$as_echo "$ac_cv_header_sys_wait_h" >&6; } -if test $ac_cv_header_sys_wait_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_SYS_WAIT_H 1 -_ACEOF - -fi - - - - - - - -for ac_header in fcntl.h malloc.h sys/ioctl.h sys/time.h syslog.h unistd.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 -$as_echo_n "checking $ac_header usability... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_header_compiler=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_compiler=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 -$as_echo_n "checking $ac_header presence... " >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_header_preproc=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi - -rm -f conftest.err conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - - ;; -esac -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - -fi -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - - - -for ac_header in sys/types.h sys/socket.h net/if.h netinet/in.h sys/poll.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_SYS_SOCKET_H -# include -#endif - - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_c_const=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_c_const=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -cat >>confdefs.h <<\_ACEOF -#define const /**/ -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for pid_t" >&5 -$as_echo_n "checking for pid_t... " >&6; } -if test "${ac_cv_type_pid_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_pid_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (pid_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((pid_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_pid_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 -$as_echo "$ac_cv_type_pid_t" >&6; } -if test "x$ac_cv_type_pid_t" = x""yes; then - : -else - -cat >>confdefs.h <<_ACEOF -#define pid_t int -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 -$as_echo_n "checking for size_t... " >&6; } -if test "${ac_cv_type_size_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_size_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if (sizeof ((size_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_size_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -$as_echo "$ac_cv_type_size_t" >&6; } -if test "x$ac_cv_type_size_t" = x""yes; then - : -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 -$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if test "${ac_cv_header_time+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include - -int -main () -{ -if ((struct tm *) 0) -return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_time=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_time=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 -$as_echo "$ac_cv_header_time" >&6; } -if test $ac_cv_header_time = yes; then - -cat >>confdefs.h <<\_ACEOF -#define TIME_WITH_SYS_TIME 1 -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 -$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if test "${ac_cv_struct_tm+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include - -int -main () -{ -struct tm tm; - int *p = &tm.tm_sec; - return !p; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_struct_tm=time.h -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_struct_tm=sys/time.h -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 -$as_echo "$ac_cv_struct_tm" >&6; } -if test $ac_cv_struct_tm = sys/time.h; then - -cat >>confdefs.h <<\_ACEOF -#define TM_IN_SYS_TIME 1 -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for socklen_t" >&5 -$as_echo_n "checking for socklen_t... " >&6; } -if test "${ac_cv_type_socklen_t+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_socklen_t=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof (socklen_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof ((socklen_t))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_socklen_t=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_socklen_t" >&5 -$as_echo "$ac_cv_type_socklen_t" >&6; } -if test "x$ac_cv_type_socklen_t" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_SOCKLEN_T 1 -_ACEOF - - -else - cat >>confdefs.h <<\_ACEOF -#define socklen_t int -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for struct in6_addr" >&5 -$as_echo_n "checking for struct in6_addr... " >&6; } -if test "${ac_cv_type_struct_in6_addr+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_struct_in6_addr=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof (struct in6_addr)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof ((struct in6_addr))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_struct_in6_addr=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_struct_in6_addr" >&5 -$as_echo "$ac_cv_type_struct_in6_addr" >&6; } -if test "x$ac_cv_type_struct_in6_addr" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IN6_ADDR 1 -_ACEOF - - -fi -{ $as_echo "$as_me:$LINENO: checking for struct in_pktinfo" >&5 -$as_echo_n "checking for struct in_pktinfo... " >&6; } -if test "${ac_cv_type_struct_in_pktinfo+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_struct_in_pktinfo=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof (struct in_pktinfo)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof ((struct in_pktinfo))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_struct_in_pktinfo=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_struct_in_pktinfo" >&5 -$as_echo "$ac_cv_type_struct_in_pktinfo" >&6; } -if test "x$ac_cv_type_struct_in_pktinfo" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IN_PKTINFO 1 -_ACEOF - - -fi -{ $as_echo "$as_me:$LINENO: checking for struct ifreq" >&5 -$as_echo_n "checking for struct ifreq... " >&6; } -if test "${ac_cv_type_struct_ifreq+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_cv_type_struct_ifreq=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof (struct ifreq)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ -if (sizeof ((struct ifreq))) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_struct_ifreq=yes -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_struct_ifreq" >&5 -$as_echo "$ac_cv_type_struct_ifreq" >&6; } -if test "x$ac_cv_type_struct_ifreq" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IFREQ 1 -_ACEOF - - -fi - - -{ $as_echo "$as_me:$LINENO: checking for CPP C99 Variadic macro support" >&5 -$as_echo_n "checking for CPP C99 Variadic macro support... " >&6; } -cat >conftest.$ac_ext <<_ACEOF - -#define a(...) junk(0,__VA_ARGS__) -extern void junk(int i,...); -int main() -{ - a(0); - a("a"); - a(0, "a", 1); - return 0; -} - -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - cpp_c99_variadic="yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cpp_c99_variadic="no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:$LINENO: result: $cpp_c99_variadic" >&5 -$as_echo "$cpp_c99_variadic" >&6; } -if test $cpp_c99_variadic = yes; then - cat >>confdefs.h <<\_ACEOF -#define CPP_C99_VARIADIC_MACROS 1 -_ACEOF - -else - if test "$GCC" != yes; then - { { $as_echo "$as_me:$LINENO: error: Compiler must support C99 or gcc variadic macros" >&5 -$as_echo "$as_me: error: Compiler must support C99 or gcc variadic macros" >&2;} - { (exit 1); exit 1; }; } - fi; -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -{ $as_echo "$as_me:$LINENO: checking for working alloca.h" >&5 -$as_echo_n "checking for working alloca.h... " >&6; } -if test "${ac_cv_working_alloca_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -char *p = (char *) alloca (2 * sizeof (int)); - if (p) return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_working_alloca_h=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_working_alloca_h=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 -$as_echo "$ac_cv_working_alloca_h" >&6; } -if test $ac_cv_working_alloca_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA_H 1 -_ACEOF - -fi - -{ $as_echo "$as_me:$LINENO: checking for alloca" >&5 -$as_echo_n "checking for alloca... " >&6; } -if test "${ac_cv_func_alloca_works+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include -# define alloca _alloca -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int -main () -{ -char *p = (char *) alloca (1); - if (p) return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func_alloca_works=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func_alloca_works=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 -$as_echo "$ac_cv_func_alloca_works" >&6; } - -if test $ac_cv_func_alloca_works = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_ALLOCA 1 -_ACEOF - -else - # The SVR3 libPW and SVR4 libucb both contain incompatible functions -# that cause trouble. Some versions do not even contain alloca or -# contain a buggy version. If you still want to use their alloca, -# use ar to extract alloca.o from them instead of compiling alloca.c. - -ALLOCA=\${LIBOBJDIR}alloca.$ac_objext - -cat >>confdefs.h <<\_ACEOF -#define C_ALLOCA 1 -_ACEOF - - -{ $as_echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 -$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } -if test "${ac_cv_os_cray+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if defined CRAY && ! defined CRAY2 -webecray -#else -wenotbecray -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "webecray" >/dev/null 2>&1; then - ac_cv_os_cray=yes -else - ac_cv_os_cray=no -fi -rm -f conftest* - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 -$as_echo "$ac_cv_os_cray" >&6; } -if test $ac_cv_os_cray = yes; then - for ac_func in _getb67 GETB67 getb67; do - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - -cat >>confdefs.h <<_ACEOF -#define CRAY_STACKSEG_END $ac_func -_ACEOF - - break -fi - - done -fi - -{ $as_echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 -$as_echo_n "checking stack direction for C alloca... " >&6; } -if test "${ac_cv_c_stack_direction+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -find_stack_direction () -{ - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; -} - -int -main () -{ - return find_stack_direction () < 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_stack_direction=1 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_c_stack_direction=-1 -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 -$as_echo "$ac_cv_c_stack_direction" >&6; } - -cat >>confdefs.h <<_ACEOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -_ACEOF - - -fi - -if test $ac_cv_c_compiler_gnu = yes; then - { $as_echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 -$as_echo_n "checking whether $CC needs -traditional... " >&6; } -if test "${ac_cv_prog_gcc_traditional+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_pattern="Autoconf.*'x'" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -Autoconf TIOCGETP -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then - ac_cv_prog_gcc_traditional=yes -else - ac_cv_prog_gcc_traditional=no -fi -rm -f conftest* - - - if test $ac_cv_prog_gcc_traditional = no; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -Autoconf TCGETA -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then - ac_cv_prog_gcc_traditional=yes -fi -rm -f conftest* - - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 -$as_echo "$ac_cv_prog_gcc_traditional" >&6; } - if test $ac_cv_prog_gcc_traditional = yes; then - CC="$CC -traditional" - fi -fi - -{ $as_echo "$as_me:$LINENO: checking for working memcmp" >&5 -$as_echo_n "checking for working memcmp... " >&6; } -if test "${ac_cv_func_memcmp_working+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_memcmp_working=no -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Some versions of memcmp are not 8-bit clean. */ - char c0 = '\100', c1 = '\200', c2 = '\201'; - if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) - return 1; - - /* The Next x86 OpenStep bug shows up only when comparing 16 bytes - or more and with at least one buffer not starting on a 4-byte boundary. - William Lewis provided this test program. */ - { - char foo[21]; - char bar[21]; - int i; - for (i = 0; i < 4; i++) - { - char *a = foo + i; - char *b = bar + i; - strcpy (a, "--------01111111"); - strcpy (b, "--------10000000"); - if (memcmp (a, b, 16) >= 0) - return 1; - } - return 0; - } - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_memcmp_working=yes -else - $as_echo "$as_me: program exited with status $ac_status" >&5 -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_memcmp_working=no -fi -rm -rf conftest.dSYM -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 -$as_echo "$ac_cv_func_memcmp_working" >&6; } -test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in - *" memcmp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" - ;; -esac - - -{ $as_echo "$as_me:$LINENO: checking return type of signal handlers" >&5 -$as_echo_n "checking return type of signal handlers... " >&6; } -if test "${ac_cv_type_signal+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include - -int -main () -{ -return *(signal (0, 0)) (0) == 1; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_signal=int -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_signal=void -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 -$as_echo "$ac_cv_type_signal" >&6; } - -cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal -_ACEOF - - - -for ac_func in vprintf -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -{ $as_echo "$as_me:$LINENO: checking for _doprnt" >&5 -$as_echo_n "checking for _doprnt... " >&6; } -if test "${ac_cv_func__doprnt+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub__doprnt || defined __stub____doprnt -choke me -#endif - -int -main () -{ -return _doprnt (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_func__doprnt=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_func__doprnt=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -$as_echo "$ac_cv_func__doprnt" >&6; } -if test "x$ac_cv_func__doprnt" = x""yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF - -fi - -fi -done - - -{ $as_echo "$as_me:$LINENO: checking for library containing nanosleep" >&5 -$as_echo_n "checking for library containing nanosleep... " >&6; } -if test "${ac_cv_search_nanosleep+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char nanosleep (); -int -main () -{ -return nanosleep (); - ; - return 0; -} -_ACEOF -for ac_lib in '' rt; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_search_nanosleep=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_nanosleep+set}" = set; then - break -fi -done -if test "${ac_cv_search_nanosleep+set}" = set; then - : -else - ac_cv_search_nanosleep=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_nanosleep" >&5 -$as_echo "$ac_cv_search_nanosleep" >&6; } -ac_res=$ac_cv_search_nanosleep -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -{ $as_echo "$as_me:$LINENO: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if test "${ac_cv_search_socket+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char socket (); -int -main () -{ -return socket (); - ; - return 0; -} -_ACEOF -for ac_lib in '' socket; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib -lnsl $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_search_socket=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_socket+set}" = set; then - break -fi -done -if test "${ac_cv_search_socket+set}" = set; then - : -else - ac_cv_search_socket=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } -ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -{ $as_echo "$as_me:$LINENO: checking for library containing inet_aton" >&5 -$as_echo_n "checking for library containing inet_aton... " >&6; } -if test "${ac_cv_search_inet_aton+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char inet_aton (); -int -main () -{ -return inet_aton (); - ; - return 0; -} -_ACEOF -for ac_lib in '' resolv; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - ac_cv_search_inet_aton=$ac_res -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext - if test "${ac_cv_search_inet_aton+set}" = set; then - break -fi -done -if test "${ac_cv_search_inet_aton+set}" = set; then - : -else - ac_cv_search_inet_aton=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_inet_aton" >&5 -$as_echo "$ac_cv_search_inet_aton" >&6; } -ac_res=$ac_cv_search_inet_aton -if test "$ac_res" != no; then - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - - - - - - - - - - -for ac_func in nanosleep gettimeofday mkfifo select socket strerror uname snprintf vsnprintf -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - true -else - { { $as_echo "$as_me:$LINENO: error: One of the functions required for pdnsd were not found." >&5 -$as_echo "$as_me: error: One of the functions required for pdnsd were not found." >&2;} - { (exit 1); exit 1; }; } -fi -done - - -for ac_func in poll -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - true -else - cat >>confdefs.h <<\_ACEOF -#define NO_POLL 1 -_ACEOF - -fi -done - - - - - - - - - - - - - -for ac_func in strdup strndup stpcpy stpncpy strlcpy mempcpy getline asprintf vasprintf getpwnam_r inet_ntop inet_pton -do -as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 -$as_echo_n "checking for $ac_func... " >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - eval "$as_ac_var=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -as_val=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -ac_config_files="$ac_config_files pdnsd.spec Makefile file-list.base contrib/Makefile doc/Makefile doc/pdnsd.8 doc/pdnsd.conf.5 doc/pdnsd.conf src/Makefile src/pdnsd-ctl/Makefile src/rc/Makefile src/rc/RedHat/Makefile src/rc/RedHat/pdnsd src/rc/SuSE/Makefile src/rc/SuSE/pdnsd src/rc/Debian/Makefile src/rc/Debian/pdnsd src/rc/Slackware/Makefile src/rc/Slackware/rc.pdnsd src/rc/ArchLinux/Makefile src/rc/ArchLinux/pdnsd src/test/Makefile PKGBUILD" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - if test -n "$EXEEXT"; then - am__EXEEXT_TRUE= - am__EXEEXT_FALSE='#' -else - am__EXEEXT_TRUE='#' - am__EXEEXT_FALSE= -fi - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi - -: ${CONFIG_STATUS=./config.status} -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTION]... [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2008 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -MKDIR_P='$MKDIR_P' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - { $as_echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { $as_echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "pdnsd.spec") CONFIG_FILES="$CONFIG_FILES pdnsd.spec" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "file-list.base") CONFIG_FILES="$CONFIG_FILES file-list.base" ;; - "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; - "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "doc/pdnsd.8") CONFIG_FILES="$CONFIG_FILES doc/pdnsd.8" ;; - "doc/pdnsd.conf.5") CONFIG_FILES="$CONFIG_FILES doc/pdnsd.conf.5" ;; - "doc/pdnsd.conf") CONFIG_FILES="$CONFIG_FILES doc/pdnsd.conf" ;; - "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; - "src/pdnsd-ctl/Makefile") CONFIG_FILES="$CONFIG_FILES src/pdnsd-ctl/Makefile" ;; - "src/rc/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/Makefile" ;; - "src/rc/RedHat/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/RedHat/Makefile" ;; - "src/rc/RedHat/pdnsd") CONFIG_FILES="$CONFIG_FILES src/rc/RedHat/pdnsd" ;; - "src/rc/SuSE/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/SuSE/Makefile" ;; - "src/rc/SuSE/pdnsd") CONFIG_FILES="$CONFIG_FILES src/rc/SuSE/pdnsd" ;; - "src/rc/Debian/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/Debian/Makefile" ;; - "src/rc/Debian/pdnsd") CONFIG_FILES="$CONFIG_FILES src/rc/Debian/pdnsd" ;; - "src/rc/Slackware/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/Slackware/Makefile" ;; - "src/rc/Slackware/rc.pdnsd") CONFIG_FILES="$CONFIG_FILES src/rc/Slackware/rc.pdnsd" ;; - "src/rc/ArchLinux/Makefile") CONFIG_FILES="$CONFIG_FILES src/rc/ArchLinux/Makefile" ;; - "src/rc/ArchLinux/pdnsd") CONFIG_FILES="$CONFIG_FILES src/rc/ArchLinux/pdnsd" ;; - "src/test/Makefile") CONFIG_FILES="$CONFIG_FILES src/test/Makefile" ;; - "PKGBUILD") CONFIG_FILES="$CONFIG_FILES PKGBUILD" ;; - - *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - $as_echo "$as_me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=' ' -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\).*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\).*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 -$as_echo "$as_me: error: could not setup config files machinery" >&2;} - { (exit 1); exit 1; }; } -_ACEOF - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then - break - elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 -$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 -$as_echo "$as_me: error: could not setup config headers machinery" >&2;} - { (exit 1); exit 1; }; } -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - ac_file_inputs="$ac_file_inputs '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac - ac_MKDIR_P=$MKDIR_P - case $MKDIR_P in - [\\/$]* | ?:[\\/]* ) ;; - */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -s&@MKDIR_P@&$ac_MKDIR_P&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; - esac \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 -$as_echo "$as_me: error: could not create $ac_file" >&2;} - { (exit 1); exit 1; }; } - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 -$as_echo "$as_me: error: could not create -" >&2;} - { (exit 1); exit 1; }; } - fi -# Compute "$ac_file"'s index in $config_headers. -_am_arg="$ac_file" -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $_am_arg | $_am_arg:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || -$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$_am_arg" : 'X\(//\)[^/]' \| \ - X"$_am_arg" : 'X\(//\)$' \| \ - X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'`/stamp-h$_am_stamp_count - ;; - - :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files - # are listed without --file. Let's play safe and only enable the eval - # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac - shift - for mf - do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done - done -} - ;; - - esac -done # for ac_tag - - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/jni/pdnsd/configure.in b/jni/pdnsd/configure.in deleted file mode 100644 index 473abf17..00000000 --- a/jni/pdnsd/configure.in +++ /dev/null @@ -1,548 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(src) - -package="pdnsd" -version=`cut -d - -f 1 "$srcdir"/version` -fullversion=`cat "$srcdir"/version` -packagerelease=`cut -d - -f 2- "$srcdir"/version` - -distribution="Generic" -target="autodetect" -cachedir="/var/cache/$package" -ipv4_default=1 -have_ipv4="yes" -#newrrs="yes" -query_m="udponly" -have_tcp_server="yes" -adisc="default" -slock="no"; -def_id="nobody" -#have_rcsids="no" -udp_queries="yes" -tcp_queries="yes" -tempdir="/tmp" -randomdev=default -freebsd_pthread="4" -specbuild=no -threadlib=default - -AM_INIT_AUTOMAKE($package, $version, [no-define]) -AM_CONFIG_HEADER(config.h) -AC_GNU_SOURCE -AC_DEFINE_UNQUOTED(VERSION,"$fullversion") -AC_SUBST(fullversion) -AC_SUBST(packagerelease) - -AC_ARG_WITH(distribution, -[ --with-distribution=distro Specify target distribution (default=Generic; - others: RedHat, SuSE, Debian, ArchLinux)], - distribution=$withval) -AC_SUBST(distribution) - -AC_ARG_WITH(target, -[ --with-target=platform Change compilation target platform (default: - autodetect; others: Linux, BSD, Cygwin)], - target=$withval) -case $target in - Linux|linux) - AC_DEFINE(TARGET, TARGET_LINUX) - target="Linux" - ;; - BSD| bsd) - AC_DEFINE(TARGET, TARGET_BSD) - target="BSD" - ;; - Cygwin|CYGWIN|cygwin) - AC_DEFINE(TARGET, TARGET_CYGWIN) - target="cygwin" - ;; - autodetect) - ;; - *) - AC_MSG_ERROR([--with-target must have Linux, BSD or Cygwin as parameter.]) - ;; -esac - -AC_ARG_WITH(cachedir, -[ --with-cachedir=dir Default directory for pdnsd cache - (default=/var/cache/pdnsd)], - cachedir=$withval) -AC_DEFINE_UNQUOTED(CACHEDIR, "$cachedir") -AC_SUBST(cachedir) - -AC_ARG_ENABLE(isdn, -[ --enable-isdn Enable ISDN support (may cause problems on - some systems; only for Linux)], - test $enableval = "yes" && AC_DEFINE(ISDN_SUPPORT)) - -AC_ARG_ENABLE(ipv4, -[ --disable-ipv4 Disable IPv4 networking support - (default=enabled)], - have_ipv4=$enableval) - -test $have_ipv4 = "yes" && AC_DEFINE(ENABLE_IPV4) - -AC_ARG_ENABLE(ipv6, -[ --enable-ipv6 Enable IPv6 networking support], -[ if test $enableval = "yes" ; then - AC_DEFINE(ENABLE_IPV6) - if test $have_ipv4 != "yes" ; then - ipv4_default=0 - fi - fi]) - -AC_ARG_ENABLE(ipv4-startup, -[ --disable-ipv4-startup Disable IPv4 on pdnsd startup by default - (default=enabled)], -[ if test $enableval = "yes" ; then - ipv4_default=1 - else - ipv4_default=0 - fi]) - -AC_ARG_ENABLE(ipv6-startup, -[ --enable-ipv6-startup Enable IPV6 on pdnsd startup by default - (default=IPv4)], -[ if test $enableval = "yes" ; then - ipv4_default=0 - else - ipv4_default=1 - fi]) - -AC_DEFINE_UNQUOTED(DEFAULT_IPV4, $ipv4_default) - -AC_ARG_ENABLE(udp-queries, -[ --disable-udp-queries Disable udp as query method.], - udp_queries=$enableval) - -AC_ARG_ENABLE(tcp-queries, -[ --disable-tcp-queries Disable tcp as query method.], - tcp_queries=$enableval) - -AC_ARG_WITH(query-method, -[ --with-query-method=qm Specify the query method (default=udponly; - others: tcponly, tcpudp, udptcp)], - query_m=$withval) -case $query_m in - udponly|UDPonly) - AC_DEFINE(M_PRESET, UDP_ONLY) - udp_queries=yes; - ;; - tcponly|TCPonly) - AC_DEFINE(M_PRESET, TCP_ONLY) - tcp_queries=yes; - ;; - tcpudp|TCPUDP) - AC_DEFINE(M_PRESET, TCP_UDP) - udp_queries=yes; - tcp_queries=yes; - ;; - udptcp|UDPTCP) - AC_DEFINE(M_PRESET, UDP_TCP) - udp_queries=yes; - tcp_queries=yes; - ;; - *) - AC_MSG_ERROR([--with-query-method must have udponly, tcponly, tcpudp or udptcp as parameter.]) - ;; -esac - -test $udp_queries != "yes" && AC_DEFINE(NO_UDP_QUERIES) -test $tcp_queries != "yes" && AC_DEFINE(NO_TCP_QUERIES) - -AC_ARG_ENABLE(tcp-server, -[ --disable-tcp-server Disable the TCP serving ability of pdnsd], - have_tcp_server=$enableval) - -test $have_tcp_server != "yes" && AC_DEFINE(NO_TCP_SERVER) - -AC_ARG_ENABLE(src-addr-disc, -[ --disable-src-addr-disc Disable the UDP source address discovery], - adisc=$enableval) - -AC_ARG_ENABLE(socket-locking, -[ --enable-socket-locking Enable the UDP socket locking], - slock=$enableval) - -test $slock = "yes" && AC_DEFINE(SOCKET_LOCKING) - -AC_ARG_ENABLE(poll, -[ --disable-poll Disable poll(2) and use select(2) - (default=enabled)], - test $enableval != "yes" && AC_DEFINE(NO_POLL)) - -AC_ARG_ENABLE(new-rrs, -[ --disable-new-rrs Disable new DNS RR types (obsolete, currently ignored)], - newrrs=$enableval) - -AC_ARG_ENABLE(strict-rfc2181, -[ --enable-strict-rfc2181 Enforce strict RFC 2181 compliance], - test $enableval = "yes" && AC_DEFINE(RFC2181_ME_HARDER)) - -AC_ARG_WITH(random-device, -[ --with-random-device=device Specify random device other than - /dev/random; default: C Library random() PRNG; - special value arc4random for BSD C Library - arc4random function (default on FreeBSD)], - randomdev=$withval) - -if test "$randomdev" = arc4random ; then - AC_DEFINE(R_ARC4RANDOM) -elif test "$randomdev" = random ; then - AC_DEFINE(R_RANDOM) -elif test "$randomdev" = default ; then - AC_DEFINE(R_DEFAULT) -else - AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$randomdev") -fi - -AC_ARG_ENABLE(underscores, -[ --enable-underscores Allow _ in domain names (obsolete, currently ignored)], - underscores=$enableval) - -AC_ARG_WITH(default-id, -[ --with-default-id=id Specify default uid/gid for pdnsd - (default=nobody)], - def_id=$withval) -AC_SUBST(def_id) - -AC_ARG_WITH(debug, -[ --with-debug=level Specify debugging level (0 means no debug support)], - AC_DEFINE_UNQUOTED(DEBUG, $withval)) - -AC_ARG_WITH(verbosity, -[ --with-verbosity=level Specify default message verbosity], - AC_DEFINE_UNQUOTED(VERBOSITY, $withval)) - -AC_ARG_WITH(hash-buckets, -[ --with-hash-buckets=num Number of hash buckets to use (default=1024). - The number actually used is the smallest power of two - greater or equal to the number specified here.], - powof2=1 - hashsz=0 - - while test $powof2 -lt "$withval" - do - powof2=`expr 2 '*' $powof2` - hashsz=`expr $hashsz '+' 1` - done - AC_DEFINE_UNQUOTED(HASH_SZ, $hashsz) -) - -AC_ARG_ENABLE(hash-debug, -[ --enable-hash-debug Debug hash tables (warning: massive output)], - test $enableval = "yes" && AC_DEFINE(DEBUG_HASH)) - -AC_ARG_ENABLE(rcsids, -[ --enable-rcsids Enable RCS IDs in executables (obsolete, currently ignored)], - have_rcsids=$enableval) - -AC_ARG_WITH(tcp-qtimeout, -[ --with-tcp-qtimeout=secs Specify default tcp query timeout (default=30)], - AC_DEFINE_UNQUOTED(TCP_TIMEOUT, $withval)) - -AC_ARG_ENABLE(tcp-subseq, -[ --enable-tcp-subseq Enable multiple dns querys using one - tcp connection], - test $enableval = "yes" && AC_DEFINE(TCP_SUBSEQ)) - -AC_ARG_WITH(par-queries, -[ --with-par-queries=num Specify default parallel query number (default=2)], - AC_DEFINE_UNQUOTED(PAR_QUERIES, $withval)) - -AC_ARG_WITH(max-nameserver-ips, -[ --with-max-nameserver-ips=num Specify maximum number of IP addresses used per nameserver obtained from NS records (default=3)], - AC_DEFINE_UNQUOTED(MAXNAMESERVIPS, $withval)) - -AC_ARG_ENABLE(specbuild, -[ --enable-specbuild Only used when building pdnsd from spec files], - specbuild=$enableval) - -AC_SUBST(specbuild) - -AC_ARG_WITH(thread-lib, -[ --with-thread-lib=lib Specify thread library, overriding automatic detection (for Linux only). - Possible values: LinuxThreads, - LinuxThreads2 (implements a fix for newer glibcs) - or NPTL (Native POSIX Thread Library)], - threadlib=$withval) - -AC_SUBST(threadlib) - -dnl Checks for programs. -AC_PROG_CC -AM_PROG_CC_STDC -AM_PROG_CC_C_O -AC_PROG_INSTALL - -dnl For dbm subsystem libraries -AC_PROG_RANLIB - -if test "$target" = "autodetect" ; then - AC_MSG_CHECKING([for autodetect build target]) - uname_sys=`uname` - if test $? -ne 0 ; then - AC_MSG_RESULT([failed]) - AC_MSG_ERROR([uname failed or was not found in path]) - else - case "${uname_sys}" in - Linux) - AC_MSG_RESULT(Linux) - AC_DEFINE(TARGET, TARGET_LINUX) - target="Linux" - ;; - FreeBSD|NetBSD|OpenBSD|Darwin) - AC_MSG_RESULT("${uname_sys}") - AC_DEFINE(TARGET, TARGET_BSD) - target="BSD" - ;; - CYGWIN*) - AC_MSG_RESULT("${uname_sys}") - AC_DEFINE(TARGET, TARGET_CYGWIN) - target="cygwin" - ;; - *) - AC_MSG_RESULT([failed]) - AC_MSG_ERROR( -[Your system type could not be identified. Try setting it manually using ---with-target]) - ;; - esac - fi -fi - -#if test "$target" = BSD ; then -# uname_sys=`uname` -# if test "$uname_sys" = FreeBSD ; then -# AC_MSG_CHECKING([for FreeBSD version]) -# osrel=`sysctl -n kern.osreldate` -# if test $osrel -ge 500016 ; then -# AC_MSG_RESULT([5.0 (>= 500016)]) -# freebsd_pthread="5" -# else -# AC_MSG_RESULT([<=5.0 (< 500016)]) -# freebsd_pthread="4" -# fi -# fi -#fi - -if test "$adisc" = "default"; then - if test "$target" = "cygwin" ; then -# Don't do UDP source address discovery on Cygwin platform by default. - adisc="no" - else - adisc="yes" - fi -fi - -test "$adisc" = "yes" && AC_DEFINE(SRC_ADDR_DISC) - - -dnl Checks for libraries. -if test "$target" = "Linux"; then -AC_MSG_CHECKING([if we can compile and link with -pthread]) -old_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -pthread" -AC_LINK_IFELSE([ -#include - -void *thread_func(void *data) -{ - *((int *)data)=1; - return data; -} - -int main() -{ - pthread_t thread; - void *retval; - int val; - - if(pthread_create(&thread, NULL, thread_func, &val)) - return 1; - - if(pthread_join(thread,&retval)) - return 1; - - return (*((int *)retval)!=1); -} -], - gcc_pthread_flag="yes", gcc_pthread_flag="no") -CFLAGS="$old_CFLAGS" -AC_MSG_RESULT([$gcc_pthread_flag]) - - if test "$gcc_pthread_flag" = yes ; then - thread_CFLAGS="-pthread" - AC_SUBST(thread_CFLAGS) - else - AC_CHECK_LIB(pthread, pthread_create) - fi -fi -if test "$target" = "BSD" -a `uname` != Darwin ; then -# if test $freebsd_pthread = 4 ; then - thread_CFLAGS="-pthread" - AC_SUBST(thread_CFLAGS) -# else -# AC_CHECK_LIB(c_r, pthread_create, , -# AC_MSG_ERROR([You must have libc_r installed to build/run pdnsd!])) -# fi; -fi - -if test "$target" = "Linux" -a "$threadlib" = default; then -AC_MSG_CHECKING([if this is an NPTL-based system]) -old_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $thread_CFLAGS" -AC_RUN_IFELSE([ -#include -#include -#include -#include -#include -#include - -/* All this function does is return its PID (in a roundabout way). */ -void *thread_func(void *data) -{ - *((int *)data)=getpid(); - return data; -} - -int main() -{ - pthread_t thread; - void *retval; - int err,mainpid,thrdpid; - - err=pthread_create(&thread, NULL, thread_func, &thrdpid); - if(err) { - fprintf(stderr,"pthread_create failed: %s\n",strerror(err)); - return 1; - } - err=pthread_join(thread,&retval); - if(err) { - fprintf(stderr,"pthread_join failed: %s\n",strerror(err)); - return 1; - } - mainpid=getpid(); - /* In LinuxThreads implementations, the pids of the threads will usually differ - in a non Posix-compliant way. */ - fprintf(stderr,"main pid=%d, thread pid=%d\n",mainpid,*((int *)retval)); - return (*((int *)retval)!=mainpid); -} -], -[ - AC_MSG_RESULT([yes]) - threadlib=nptl -], -[ - AC_MSG_RESULT([no]) - threadlib=linuxthreads -], -[ - AC_MSG_RESULT([couldn't run test program]) - threadlib=linuxthreads -]) -CFLAGS="$old_CFLAGS" -fi - -if test "$threadlib" = nptl -o "$threadlib" = NPTL; then - AC_DEFINE(THREADLIB_NPTL) -elif test "$threadlib" = linuxthreads2 -o "$threadlib" = LinuxThreads2 -o "$threadlib" = lt2; then - AC_DEFINE(THREADLIB_LINUXTHREADS2) -fi - -dnl Checks for header files. -AC_HEADER_STDC -AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS(fcntl.h malloc.h sys/ioctl.h sys/time.h syslog.h unistd.h) -AC_CHECK_HEADERS(sys/types.h sys/socket.h net/if.h netinet/in.h sys/poll.h,,, -[#include -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_SYS_SOCKET_H -# include -#endif -]) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_TYPE_PID_T -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_CHECK_TYPES(socklen_t,, AC_DEFINE(socklen_t,int),[#include -#include -#include -#include ]) -AC_CHECK_TYPES([struct in6_addr, struct in_pktinfo, struct ifreq],,,[#include -#include -#include -#include ]) - -AC_MSG_CHECKING([for CPP C99 Variadic macro support]) -AC_COMPILE_IFELSE([ -#define a(...) junk(0,__VA_ARGS__) -extern void junk(int i,...); -int main() -{ - a(0); - a("a"); - a(0, "a", 1); - return 0; -} -], - cpp_c99_variadic="yes", cpp_c99_variadic="no") -AC_MSG_RESULT([$cpp_c99_variadic]) -if test $cpp_c99_variadic = yes; then - AC_DEFINE(CPP_C99_VARIADIC_MACROS) -else - if test "$GCC" != yes; then - AC_MSG_ERROR([Compiler must support C99 or gcc variadic macros]) - fi; -fi - -dnl Checks for library functions. -AC_FUNC_ALLOCA -AC_PROG_GCC_TRADITIONAL -AC_FUNC_MEMCMP -AC_TYPE_SIGNAL -AC_FUNC_VPRINTF -AC_SEARCH_LIBS(nanosleep, rt) -AC_SEARCH_LIBS(socket, socket,,,-lnsl) -AC_SEARCH_LIBS(inet_aton, resolv) -AC_CHECK_FUNCS(nanosleep gettimeofday mkfifo select socket strerror uname snprintf vsnprintf, true, - AC_MSG_ERROR([One of the functions required for pdnsd were not found.])) -AC_CHECK_FUNCS(poll, true, AC_DEFINE(NO_POLL)) -AC_CHECK_FUNCS(strdup strndup stpcpy stpncpy strlcpy mempcpy getline asprintf vasprintf getpwnam_r inet_ntop inet_pton) - -AC_OUTPUT([ -pdnsd.spec -Makefile -file-list.base -contrib/Makefile -doc/Makefile -doc/pdnsd.8 -doc/pdnsd.conf.5 -doc/pdnsd.conf -src/Makefile -src/pdnsd-ctl/Makefile -src/rc/Makefile -src/rc/RedHat/Makefile -src/rc/RedHat/pdnsd -src/rc/SuSE/Makefile -src/rc/SuSE/pdnsd -src/rc/Debian/Makefile -src/rc/Debian/pdnsd -src/rc/Slackware/Makefile -src/rc/Slackware/rc.pdnsd -src/rc/ArchLinux/Makefile -src/rc/ArchLinux/pdnsd -src/test/Makefile -PKGBUILD -]) diff --git a/jni/pdnsd/contrib/Makefile.am b/jni/pdnsd/contrib/Makefile.am deleted file mode 100644 index 5bdec20a..00000000 --- a/jni/pdnsd/contrib/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ - -EXTRA_DIST = pdnsd_dhcp.pl dhcp2pdnsd change_pdnsd_server_ip.pl README diff --git a/jni/pdnsd/contrib/Makefile.in b/jni/pdnsd/contrib/Makefile.in deleted file mode 100644 index a400dfe9..00000000 --- a/jni/pdnsd/contrib/Makefile.in +++ /dev/null @@ -1,323 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = contrib -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -EXTRA_DIST = pdnsd_dhcp.pl dhcp2pdnsd change_pdnsd_server_ip.pl README -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu contrib/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/contrib/README b/jni/pdnsd/contrib/README deleted file mode 100644 index 19e4f44d..00000000 --- a/jni/pdnsd/contrib/README +++ /dev/null @@ -1,30 +0,0 @@ -Last revised: 27 July 2003 by Paul Rombouts - -This directory contains user-contributed scripts for use with pdnsd. -So far there are: - -pdnsd_dhcp.pl, save_ram.pl - A perl script contributed by Marko Stolle (derived from a script by - Mike Stella) to watch a ISC DHCPD leases file and add local records for - the hosts listed there. This makes pdnsd useable in a DHCP setup. - Please look into the script for usage instructions (you will probably - also need to customize some settings there). - For details about save_ram.pl, please look into pdnsd_dhcp.pl - -dhcp2pdnsd - A rc script for pdnsd, also by Marko Stolle. You might need to change - it slightly to make it run with your distro. - -change_pdnsd_server_ip.pl - A perl script contributed by Paul Rombouts for automatically updating - the configuration file if the DNS server configuration has changed. - For instance, you could place the following line in the script - /sbin/ifup-local - - /usr/local/sbin/change_pdnsd_server_ip.pl isplabel "$DNS" /etc/pdnsd.conf - - where $DNS contains the IP addresses (in comma separated format) of the - DNS servers obtained by DHCP negotiation. The perl script only - overwrites /etc/pdnsd.conf if the DNS configuration has actually - changed, in which case the previous configuration file is saved as - /etc/pdnsd.conf.save diff --git a/jni/pdnsd/contrib/change_pdnsd_server_ip.pl b/jni/pdnsd/contrib/change_pdnsd_server_ip.pl deleted file mode 100644 index 1eafca0d..00000000 --- a/jni/pdnsd/contrib/change_pdnsd_server_ip.pl +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/perl -w -# -# A Perl script to change the ip addresses of dns servers -# in the pdnsd configuration file. -# -# Written by Paul A. Rombouts -# -# This file Copyright 2002, 2004 Paul A. Rombouts -# It may be distributed under the GNU Public License, version 2, or -# any higher version. See section COPYING of the GNU Public license -# for conditions under which this file may be redistributed. -# - -use strict; - -unless(@ARGV) {die "Error: no label specified.\n"} -my $label=shift; -unless(@ARGV) {die "Error: no DNS addresses specified.\n"} -my $dns_str=shift; -my $pdnsd_conf='/etc/pdnsd.conf'; -if(@ARGV) { - $pdnsd_conf=shift; - if(@ARGV) {warn "Warning: spurious arguments ignored: @ARGV\n"} -} - -#unless($label =~ /^\".*\"$/) {$label="\"$label\""} -#unless($dns_str =~ /^\".*\"$/) {$dns_str =~ s/^[\s,]*/\"/; $dns_str =~ s/[\s,]*$/\"/} -#unless($dns_str =~ /\"\s*\,\s*\"/) {$dns_str =~ s/[\s,]+/","/g} - -my @lines=(); -my $found_section=0; -my $changed=0; -my $ip_patt = qr/^((?:[^#]*?(?:\{|;))*?)(\s*ip\s*=\s*)("?[\w.:]+"?(?:\s*,\s*"?[\w.:]+"?)*)\s*;/; - -open(CONFFILE,$pdnsd_conf) or die "Can't open $pdnsd_conf: $!\n"; - -while() { - if(/^\s*server\s*\{/) { - my $sect_beg=$#lines+1; - my $sect_end; - my $found_label=0; - LOOP: { - do { - push @lines,$_; - if(/^(?:.*(?:\{|;))?\s*label\s*=\s*"?\Q$label\E"?\s*;/) { - if($found_label++) { - warn "Server section with multiple labels found.\n"; - close(CONFFILE); - exit 2; - } - } - if(/\}\s*$/) { - $sect_end=$#lines; - last LOOP; - } - } while(); - } - unless(defined($sect_end)) { - warn "Server section without proper ending found.\n"; - close(CONFFILE); - exit 2; - } - if(!$found_label) {next} - if(!($found_section++)) { - my $found_ip=0; - for(my $i=$sect_beg; $i<=$sect_end;++$i) { - if($lines[$i] =~ $ip_patt) { - my $matched=''; my $rest; - do { - $rest=$'; - if(!($found_ip++)) { - if($3 eq $dns_str) { - $matched.=$&; - } - else { - $matched.="$1$2$dns_str;"; - $changed=1; - } - } - else { - $matched.=$1; - $changed=1; - } - } while($rest =~ $ip_patt); - $lines[$i] = $matched.$rest; - } - } - if(!$found_ip) { - unless($lines[$sect_end] =~ s/\}\s*$/ ip=$dns_str;\n$&/) { - warn "Can't add ip specification to server section labeled $label.\n"; - close(CONFFILE); - exit 2; - } - $changed=1; - } - } - else { - splice @lines,$sect_beg; - $changed=1; - } - } - else {push @lines,$_} -} - -close(CONFFILE) or die "Can't close $pdnsd_conf: $!\n"; - -if(!$found_section) { - warn "No server sections labeled $label found.\n"; - exit 2; -} -elsif(!$changed) { - exit 0; -} - -rename($pdnsd_conf,"$pdnsd_conf.save") or die "Can't rename $pdnsd_conf: $!\n"; - -unless((open(CONFFILE,">$pdnsd_conf") or (warn("Can't open $pdnsd_conf for writing: $!\n"),0)) and - (print CONFFILE (@lines) or (warn("Can't write to $pdnsd_conf: $!\n"),0)) and - (close(CONFFILE) or (warn("Can't close $pdnsd_conf after writing: $!\n"),0))) { - rename("$pdnsd_conf.save",$pdnsd_conf) or die "Can't rename $pdnsd_conf.save: $!\n"; - exit 3; -} - -exit 1; diff --git a/jni/pdnsd/contrib/dhcp2pdnsd b/jni/pdnsd/contrib/dhcp2pdnsd deleted file mode 100644 index 73b631cc..00000000 --- a/jni/pdnsd/contrib/dhcp2pdnsd +++ /dev/null @@ -1,45 +0,0 @@ -#! /bin/sh -# -# dhcp2pdnsd Start/Stop DHCP to DNS update script -# -# chkconfig: 345 96 99 -# description: DHCP to DNS update script -# processname: dhcp2pdnsd.pl -# -# $Id: dhcp2pdnsd,v 1.1 2001/03/25 20:01:34 tmm Exp $ - -where="/usr/local/bin/" -name="pdnsd_dhcp.pl" - -# Source function library. -. /etc/rc.d/init.d/functions - -# Get config. -. /etc/sysconfig/network - -# See how we were called. -case "$1" in - start) - $where$name > /dev/null 2> /dev/null & - action "Starting DHCP to DNS update script: " /bin/true - ;; - stop) - p=`ps h -C $name | awk '{print $1}'` - [ $p -gt 0 ] 2> /dev/null && kill $p && action "Stopping DHCP to DNS update script: " /bin/true - [ $p -gt 0 ] 2> /dev/null || action "Stopping DHCP to DNS update script: " /bin/false - ;; - status) - p=`ps h -C $name | awk '{print $1}'` - [ $p -gt 0 ] 2> /dev/null && echo 'running as '$p - [ $p -gt 0 ] 2> /dev/null || echo 'not running' - ;; - restart|reload) - $0 stop - $0 start - ;; - *) - echo "Usage: dhcp2pdnsd {start|stop|status|restart|reload}" - exit 1 -esac - -exit 0 diff --git a/jni/pdnsd/contrib/pdnsd_dhcp.pl b/jni/pdnsd/contrib/pdnsd_dhcp.pl deleted file mode 100644 index 9cf0c879..00000000 --- a/jni/pdnsd/contrib/pdnsd_dhcp.pl +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/perl -# $Id: pdnsd_dhcp.pl,v 1.2 2001/03/25 20:01:34 tmm Exp $ -########################################################################## -# -# Filename: pdnsd_dhcp.pl -# Description: Dynamic DNS-DHCP update script for pdnsd -# Author: Mike Stella -# Modified by: Marko Stolle -# Created: November 19, 2001 -# Last Updated: February 28, 2001 -# Email: fwd2m@gmx.de -# -########################################################################### -# -# This code is Copyright (c) 1998-2001 by Mike Stella and Marko Stolle -# -# NO WARRANTY is given for this program. If it doesn't -# work on your system, sorry. If it eats your hard drive, -# again, sorry. It works fine on mine. Good luck! -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -########################################################################### -# -# This script reads a dhcpd.leases file and dynamically updates pdnsd with -# hostname and ip information. -# -# It assumes that your DHCP server recieves hostnames from the -# clients, and that your clients offer their hostnames to the server. -# Some versions of Linux DHCP clients don't do that. I use ISC's -# DHCPD, found at http://www.isc.org - though others may work just -# fine. -# -# This version of the script updates the pdnsd database. The status -# control socket of pdnsd has to be enabled (psnsd -d -s). -# -########################################################################### -# -# 02/20/2001 - first working version -# 02/21/2001 - security patches by Thomas Moestl -# 02/22/2001 - re-read dhcpd.leases if ttl has expireds since last update -# 02/24/2001 - try to get domainname if not specified -# 02/28/2001 - randomized temporary filename -# added possibility to save some RAM (read below) -# -########################################################################### - - -# You may save some memory if you use absolute values with sysopen -# in sub update_dns and don't use tmpnam().. -# Just switch the '#' in front of the 'until sysopen' in the sub -# update_dns, check the necessary modes on your system using save_ram.pl -# and add a '#' in front of the following three lines. -# Not using the tmpnam() function may open a security breach on systems -# with not absolute trustworthy local users (Risk: a user may write a -# script which creates files with the same names as this script and block -# it that way. Unlikely because the filenames are now even without tmpnam() -# randomized and an attacker has to create a very large number of files.) - -use Fcntl; -use strict; -use POSIX qw(tmpnam); - -$|=1; - -########################################################################### -### Globals - you can change these as needed - -# Domain name -# if not changed script will try to get it from the system -my $domain_name = "domain"; - -# DHCPD lease file -my $lease_file = "/var/lib/dhcp/dhcpd.leases"; - -# path to pdnsd-ctl -my $pdnsd_ctl = "/usr/local/sbin/pdnsd-ctl"; - -# owning name server for the newly added records -my $nameserver = "localhost."; - -# TTL (Time To Live) for the new records -my $ttl = "86400"; - -# number of seconds to check the lease file for updates -my $update_freq = 30; - -my $debug = 0; - -########################################################################### -### Don't mess with anything below unless you REALLY need to modify the -### code. And if you do, please let me know, I'm always interested in -### in improving this program. - -# Make a pid file -`echo $$ > /var/run/pdnsd_update.pid`; - -my $logstr; -my $modtime = 0; -my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMP} || $ENV{TEMP}; - -use vars qw (%db); - -my $version = "1.03"; - - -########################################################################### -# Main Loop - - # try to find domainname if necessary - if ($domain_name eq "domain") { - $domain_name = `dnsdomainname`; - } - else { - $domain_name = "$domain_name\n"; - } - -while (1) { - - # check the file's last updated time, if it's been changed, update - # the DNS and save the time. Update DNS even if there a no changes on - # the leases file if ttl since last DNS update has expired. - # This will ALWAYS run once - on startup, since $modtime starts at zero. - - - my @stats = stat ($lease_file); - - - if (($stats[9] > $modtime) or (time >= $modtime+$ttl)){ - - # clear the old hash - undef %db; - - printf STDERR "updating DNS with dhcpd.leases\n"; - $modtime = time; - &read_lease_file; - &update_dns; - } - - # wait till next check time - sleep $update_freq; - -} # end main -########################################################################### - - -### write out the import file -sub update_dns { - my ($ip, $hostname, $fname); - - do { $fname = tmpnam() } - until sysopen(DNSFILE, $fname, O_WRONLY|O_CREAT|O_EXCL, 0600); -# do { $fname = "$temp_dir/d2d".int(rand(time())) } -# until sysopen(DNSFILE, $fname, 1|64|128, 0600); - - while (($hostname,$ip) = each (%db)) { - print DNSFILE "$ip $hostname.$domain_name"; - } - close DNSFILE; - - system ("$pdnsd_ctl source $fname $nameserver $ttl"); - unlink($fname); -} - - -### reads the lease file & makes a hash of what's in there. -sub read_lease_file { - - unless (open(LEASEFILE,$lease_file)) { - #`logger -t dns_update.pl error opening dhcpd lease file`; - print STDERR "Can't open lease file\n"; - return; - } - - my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - my $curdate = sprintf "%02d%02d%02d%02d%02d%20d%20d", - ($year+1900),($mon+1),$mday,$hour,$min,$sec; - - ## Loop here, reading from LEASEFILE - while () { - my ($ip, $hostname, $mac, $enddate,$endtime); - - if (/^\s*lease/i) { - - # find ip address - $_ =~ /^\s*lease\s+(\S+)/; - $ip = $1; - - # do the rest of the block - we're interested in hostname, - # mac address, and the lease time - while ($_ !~ /^}/) { - $_ = ; - # find hostname - if ($_ =~ /^\s*client/i) { - #chomp $_; - #chop $_; - $_ =~ /\"(.*)\"/; - $hostname = $1; - - # change spaces to dash, remove dots - microsoft - # really needs to not do this crap - $hostname =~ s/\s+/-/g; - $hostname =~ s/\.//g; - } - # get the lease end date - elsif ($_ =~ /^\s*ends/i) { - $_ =~ m/^\s*ends\s+\d\s+([^;]+);/; - $enddate = $1; - $enddate =~ s|[/: ]||g; - } - } - # lowercase it - stupid dhcp clients - $hostname =~ tr/[A-Z]/[a-z]/; - - ($debug < 1 ) || print STDERR "$hostname $ip $enddate $curdate\n"; - - # Store hostname/ip in hash - this way we can do easy dupe checking - if (($hostname ne "") and ($enddate > $curdate)) { - $db{$hostname} = $ip; - } - } - } - close LEASEFILE; -} - -### left around for testing -sub print_db { - my ($key,$value); - - while (($key,$value) = each (%db)) { - print "$key - $value\n"; - } -} - diff --git a/jni/pdnsd/depcomp b/jni/pdnsd/depcomp deleted file mode 100644 index 04701da5..00000000 --- a/jni/pdnsd/depcomp +++ /dev/null @@ -1,530 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2005-07-09.11 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` - tmpdepfile="$stripped.u" - if test "$libtool" = yes; then - "$@" -Wc,-M - else - "$@" -M - fi - stat=$? - - if test -f "$tmpdepfile"; then : - else - stripped=`echo "$stripped" | sed 's,^.*/,,'` - tmpdepfile="$stripped.u" - fi - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - - if test -f "$tmpdepfile"; then - outname="$stripped.o" - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" - sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mecanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no - for arg in "$@"; do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix="`echo $object | sed 's/^.*\././'`" - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test $1 != '--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - "$@" || exit $? - IFS=" " - for arg - do - case "$arg" in - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/jni/pdnsd/doc/Makefile.am b/jni/pdnsd/doc/Makefile.am deleted file mode 100644 index b3e21984..00000000 --- a/jni/pdnsd/doc/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ - -man_MANS = pdnsd.8 pdnsd-ctl.8 pdnsd.conf.5 - -# Note: pdnsd-ctl.8, pdnsd.conf.5.in, dl.html and the txt docs are handled by dist-hook rule. -EXTRA_DIST = pdnsd.conf.in pdnsd.8.in \ - html/dl.html.in html/doc.html html/faq.html html/index.html \ - doc_makefile html/doc_makefile txt/doc_makefile \ - html2confman.pl html/htmlsubst.pl - -# XXX: Do not insist to set the config file owner to root to avoid breaking RPM -# builds -install-data-hook: - $(mkinstalldirs) "$(DESTDIR)$(sysconfdir)" - if test `whoami` = "root"; then \ - $(INSTALL) -o 0 -g 0 -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \ - else \ - $(INSTALL) -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \ - fi - -dist-hook: doc_makefile - @$(MAKE) -f doc_makefile doc - cp -p --parents pdnsd-ctl.8 pdnsd.conf.5.in \ - html/dl.html txt/faq.txt txt/intro.txt txt/manual.txt \ - $(distdir) - -distclean-local: doc_makefile - @$(MAKE) -f doc_makefile clean - diff --git a/jni/pdnsd/doc/Makefile.in b/jni/pdnsd/doc/Makefile.in deleted file mode 100644 index 7f07fe69..00000000 --- a/jni/pdnsd/doc/Makefile.in +++ /dev/null @@ -1,483 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = doc -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/pdnsd.8.in $(srcdir)/pdnsd.conf.5.in \ - $(srcdir)/pdnsd.conf.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = pdnsd.8 pdnsd.conf.5 pdnsd.conf -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -man5dir = $(mandir)/man5 -am__installdirs = "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" -man8dir = $(mandir)/man8 -NROFF = nroff -MANS = $(man_MANS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -man_MANS = pdnsd.8 pdnsd-ctl.8 pdnsd.conf.5 - -# Note: pdnsd-ctl.8, pdnsd.conf.5.in, dl.html and the txt docs are handled by dist-hook rule. -EXTRA_DIST = pdnsd.conf.in pdnsd.8.in \ - html/dl.html.in html/doc.html html/faq.html html/index.html \ - doc_makefile html/doc_makefile txt/doc_makefile \ - html2confman.pl html/htmlsubst.pl - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu doc/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -pdnsd.8: $(top_builddir)/config.status $(srcdir)/pdnsd.8.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -pdnsd.conf.5: $(top_builddir)/config.status $(srcdir)/pdnsd.conf.5.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -pdnsd.conf: $(top_builddir)/config.status $(srcdir)/pdnsd.conf.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -install-man5: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list=''; test -n "$(man5dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ - done; } - -uninstall-man5: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man5dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } -install-man8: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | while read p; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; echo "$$p"; \ - done | \ - sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ - sed 'N;N;s,\n, ,g' | { \ - list=; while read file base inst; do \ - if test "$$base" = "$$inst"; then list="$$list $$file"; else \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ - fi; \ - done; \ - for i in $$list; do echo "$$i"; done | $(am__base_list) | \ - while read files; do \ - test -z "$$files" || { \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically \`make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am -check: check-am -all-am: Makefile $(MANS) -installdirs: - for dir in "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-local - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man5 install-man8 - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-man - -uninstall-man: uninstall-man5 uninstall-man8 - -.MAKE: install-am install-data-am install-strip - -.PHONY: all all-am check check-am clean clean-generic dist-hook \ - distclean distclean-generic distclean-local distdir dvi dvi-am \ - html html-am info info-am install install-am install-data \ - install-data-am install-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-man5 \ - install-man8 install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am uninstall-man uninstall-man5 uninstall-man8 - - -# XXX: Do not insist to set the config file owner to root to avoid breaking RPM -# builds -install-data-hook: - $(mkinstalldirs) "$(DESTDIR)$(sysconfdir)" - if test `whoami` = "root"; then \ - $(INSTALL) -o 0 -g 0 -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \ - else \ - $(INSTALL) -m 644 pdnsd.conf "$(DESTDIR)$(sysconfdir)/pdnsd.conf.sample" ; \ - fi - -dist-hook: doc_makefile - @$(MAKE) -f doc_makefile doc - cp -p --parents pdnsd-ctl.8 pdnsd.conf.5.in \ - html/dl.html txt/faq.txt txt/intro.txt txt/manual.txt \ - $(distdir) - -distclean-local: doc_makefile - @$(MAKE) -f doc_makefile clean - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/doc/doc_makefile b/jni/pdnsd/doc/doc_makefile deleted file mode 100644 index f5e8f86d..00000000 --- a/jni/pdnsd/doc/doc_makefile +++ /dev/null @@ -1,38 +0,0 @@ -# This file was written by Paul Rombouts. -# Because pdnsd currently has a very idiosyncratic method of building documentation -# I prefer to keep the actual build rules outside of the Makefiles an ordinary user -# would use to compile pdnsd and therefore I have put them into separate 'doc_makefile's. -# -# To rebuild pdnsd docs after you have modified something that other files depend on, -# run 'make -f doc_makefile doc' in the doc/ directory. -# This makefile is also invoked when you build a pdnsd distribution tarball -# using 'make dist' in the toplevel pdnsd source directory. -# -# If anyone thinks there is a much more elegant method for building the pdnsd docs -# using a conventional autoconf/automake process, please let me know. - -versionfile = ../version - -doc: pdnsd-ctl.8 pdnsd.conf.5.in html txt -.PHONY: pdnsd-ctl.8 doc html txt clean - -pdnsd-ctl.8: - @pver=`cat $(versionfile)` && \ - mver=`perl -e 'while(<>) {if(/^\s*\.TH(?:\s+(?:"[^"]*"|[^"\s]+)){3}\s+"pdnsd\s+([^"]*)"/) {print "$$1\n";exit 0}} \ - die "Cannot find version in $$ARGV\n"' $@` && { \ - test "$$mver" = "$$pver" || { \ - perl -p -i.makesave -e 's/^(\s*\.TH(?:\s+(?:"[^"]*"|[^"\s]+)){3}\s+"pdnsd\s+)[^"]*(")/$${1}'"$$pver"'$${2}/' $@ && \ - echo "Updated version in $@: $$mver -> $$pver"; \ - }; \ - } - -pdnsd.conf.5.in: html/doc.html html2confman.pl - perl html2confman.pl $< > $@ - -html txt: - @cd $@ && $(MAKE) -f doc_makefile - -clean: - @rm -fv pdnsd.conf.5.in - @cd html && $(MAKE) -f doc_makefile clean - @cd txt && $(MAKE) -f doc_makefile clean diff --git a/jni/pdnsd/doc/html/dl.html b/jni/pdnsd/doc/html/dl.html deleted file mode 100644 index 3f9c6140..00000000 --- a/jni/pdnsd/doc/html/dl.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - pdnsd Download Page - - - - - - - - - - - - - -
- pdnsd Homepage - - pdnsd FAQ - - Documentation - - GNU GPL (pdnsd's License) - - Download Section -
- -

pdnsd Download Page

- -

The original author of pdnsd is Thomas Moestl, - but since 2003, he no longer maintains pdnsd. - However, Paul A. Rombouts has extensively revised the code and maintains - a version with many fixes and improvements at - http://members.home.nl/p.a.rombouts/pdnsd.html.
- He has pre-patched tarballs and RPM packages available for download at this site.
-

-

- If you are interested in the very latest code or if you want to participate in - pdnsd development, checkout the pdnsd git repository - at gitorious.org. -

- - The most recent tarball is pdnsd-1.2.9b-par.tar.gz - (GPG signature).
- The most recent RPM packages are: - - - - - - - - - - - - - - - - - - - - - -
Package NameSizeDescription
pdnsd-1.2.9b-par.src.rpm514kBSource RPM (binary packages can also be built directly from the tarball). -
pdnsd-1.2.9b-par_sl6.i686.rpm???i686 binary built on a Scientific Linux 6.2 system. -
pdnsd-1.2.9b-par_sl6.x86_64.rpm282kBx86_64 binary built on a Scientific Linux 6.2 system. -
- If you want to check the signatures on these packages you will need a copy of my GPG key - which you can get here - or from a public key server. -

- There are also Debian, - Ubuntu, - Gentoo, - Mandriva - and FreeBSD - packages, but these may not include the latest version.
- If you are looking for other versions released by Paul Rombouts, visit this - download directory. -

-
-
-

- Last revised: 24 Apr 2012 by Paul A. Rombouts -

- - diff --git a/jni/pdnsd/doc/html/dl.html.in b/jni/pdnsd/doc/html/dl.html.in deleted file mode 100644 index dffe2b02..00000000 --- a/jni/pdnsd/doc/html/dl.html.in +++ /dev/null @@ -1,96 +0,0 @@ - - - - pdnsd Download Page - - - - - - - - - - - - - -
- pdnsd Homepage - - pdnsd FAQ - - Documentation - - GNU GPL (pdnsd's License) - - Download Section -
- -

pdnsd Download Page

- -

The original author of pdnsd is Thomas Moestl, - but since 2003, he no longer maintains pdnsd. - However, Paul A. Rombouts has extensively revised the code and maintains - a version with many fixes and improvements at - http://members.home.nl/p.a.rombouts/pdnsd.html.
- He has pre-patched tarballs and RPM packages available for download at this site.
-

-

- If you are interested in the very latest code or if you want to participate in - pdnsd development, checkout the pdnsd git repository - at gitorious.org. -

- - The most recent tarball is pdnsd-$version.tar.gz - (GPG signature).
- The most recent RPM packages are: - - - - - - - - - - - - - - - - - - - - - -
Package NameSizeDescription
pdnsd-$version.src.rpm$sizeof("$HOME/rpmbuild/SRPMS/pdnsd-$version.src.rpm")Source RPM (binary packages can also be built directly from the tarball). -
pdnsd-${version}${extver}.${arch}.rpm$sizeof("$HOME/rpmbuild/RPMS/pdnsd-${version}${extver}.${arch}.rpm")${arch} binary built on a $system. -
pdnsd-${version}${extver}.${arch2}.rpm$sizeof("$HOME/rpmbuild/RPMS/pdnsd-${version}${extver}.${arch2}.rpm")${arch2} binary built on a $system. -
- If you want to check the signatures on these packages you will need a copy of my GPG key - which you can get here - or from a public key server. -

- There are also Debian, - Ubuntu, - Gentoo, - Mandriva - and FreeBSD - packages, but these may not include the latest version.
- If you are looking for other versions released by Paul Rombouts, visit this - download directory. -

-
-
-

- Last revised: $date by Paul A. Rombouts -

- - diff --git a/jni/pdnsd/doc/html/doc.html b/jni/pdnsd/doc/html/doc.html deleted file mode 100644 index 95828c5c..00000000 --- a/jni/pdnsd/doc/html/doc.html +++ /dev/null @@ -1,2630 +0,0 @@ - - - - pdnsd Documentation - - - - - - - - - - - - - - -
- pdnsd Homepage - - pdnsd FAQ - - Documentation - - GNU GPL (pdnsd's License) - - Download Section -
- -

pdnsd Documentation

- This is the "official" pdnsd documentation and reference written by - Thomas Moestl with revisions by - Paul A. Rombouts.
- This manual is a part of the pdnsd package, and may be distributed in - original or modified form under terms of the GNU General Public - License, as published by the Free Software Foundation; either version - 3, or (at your option) any later version.
- You can find a copy of the GNU GPL in the file COPYING in the source or documentation directory.
- This manual is up-to-date for version 1.2.9b. For older documentation, please refer to the doc - directory of the respective pdnsd package.
- If you want a quicker introduction to pdnsd, you can try some of the - HOWTOs available on the web. - For Apple Mac users, Brian Wells has published a good HOWTO at - http://web.mac.com/brianwells/main/pdnsd.html. - - -

0. Installation

-

0.1 Installing binary RPM's

- To install a binary RPM, just do
-

rpm -i pdnsd-<version>.rpm

- This should install pretty much everything automatically. The only thing left - for you to do is adapt your configuration file (stored in /etc/pdnsd.conf) - according to your needs (see below). - In the Red Hat and SuSE RPMs, a start script is also installed; read the section - 0.4, Start at Boot Time about that. - -
-

0.2 Building RPM's

- It is possible to build a binary RPM from a source package using the command
-

rpmbuild --rebuild pdnsd-<version>.src.rpm

- or alternatively from a tarball using the command
-

rpmbuild -tb pdnsd-<version>.tar.gz

- You can do this as root, but it is safer to build a binary package first as a normal user, - and then, when all has gone well, install the resulting binary package as root as in the previous section. - How to build an RPM package without being root is described at - - http://www.ibm.com/developerworks/linux/library/l-rpm1/.

- Several pdnsd-specific options are available when building RPM packages: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- --with isdn - - Has the same effect as --enable-isdn (see below). -
- --without poll - - Has the same effect as --disable-poll (see below). -
- --without nptl - - Has the same effect as --with-thread-lib=linuxthreads (see below). -
- --with ipv6 - - Has the same effect as --enable-ipv6 (see below). -
- --without tcpqueries - - Has the same effect as --disable-tcp-queries (see below). -
- --without debug - - Has the same effect as --with-debug=0 (see below). -
- --define "distro <distro>" - - Has the same effect as --with-distribution=<distro> (see below). -
- --define "run_as_user <user>" - - Has the same effect as --with-default-id=<user> (see below).
- For RPMs the default <user> is "pdnsd". -
- --define "run_as_uid <uid>" - - If the user defined by the previous option does not exist when the RPM is installed, - the pre-install script will try to create a new user with numerical id <uid>. - The default is to let the system choose the numerical id at install time. -
- --define "cachedir <dir>" - - Has the same effect as --with-cachedir=<dir> (see below). -
- You can also configure which compiler flags will be used by setting the environment variable - CFLAGS. - Using a bash shell, you can do that on the command line like this: -  CFLAGS="-O1 -Wall" rpmbuild ...
- This is useful if you prefer a different level of optimization, for instance. - -
-

0.3 Installing from pure sources (tar archives or git repositories)

-

0.3.1 Setting up the source code tree

- Source code is available in the form of snapshots (tarballs) or a git repository - with the very latest development code and a (nearly) complete history of all the revisions. - Cloning a git repository is useful if you need a recent fix or feature - that is not yet contained in a main release or you want to participate in pdnsd development. - Otherwise you will probably find the tarballs more convenient because they are much more compact. -
0.3.1.1 Unpacking a tar archive
- The pdsnsd snapshot releases come in the form of a gzip'ed tar archive. - To decompress it (using a modern tar) do
-

tar -xzf pdnsd-<version>.tar.gz

- If your tar doesn't do this, use:
-

gzip -dc pdnsd-<version>.tar.gz | tar -xf -

-
0.3.1.2 Cloning a git repository
- To clone a git repository you need to install, if not already installed, - the git version control system, which is available as a package in most modern Linux distributions. - Then run the command:
-

git clone git://gitorious.org/pdnsd/pdnsd.git pdnsd

- In rare cases, if you are behind some kind of firewall, the special git protocol can't be used - and you will need to fall back to the http protocol. - See the gitorious.org website or git documentation for more information. - -

0.3.2 Configuring the source

- Change into the pdnsd source directory and run configure. It takes the following command line - options (if you do not specify an option, defaults will be used):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- --prefix=dir - - Specify the prefix directory. The pdnsd files are installed in subdirectories - of the prefix, the pdnsd and pdnsd-ctl executables are for example installed - in the sbin subdirectory of the prefix. The default for this is /usr/local; - you might want to set this to /usr (using --prefix=/usr). -
- --sysconfdir=dir - - Specify the config directory. pdnsd expects its pdnsd.conf file to reside - there if the -c option is not given at startup. - The default for this is the etc subdirectory of your prefix, e.g. /usr/local/etc - if you did not specify a prefix. To set this e.g. to /etc, use --sysconfdir=/etc. -
- --with-distribution=distro - - Specify target distribution (default=Generic; others: RedHat, SuSE, Debian)
- See below for the effect of these settings. -
- --with-target=platform - - Change compilation target platform (default: autodetect; others: Linux, BSD, Cygwin).
- autodetect will attempt to detect whether you are using Linux, *BSD or Cygwin and - should normally be sufficient. If this does not work, try specifying - your system manually (for the Darwin platform (Apple Mac OS X) specify BSD here). -
- --with-cachedir=dir - - Default directory for pdnsd cache (default=/var/cache/pdnsd)
- This setting can be changed via config file settings when pdnsd has been built. -
- --with-hash-buckets=num - - Number of hash buckets to use (default=1024). The default should be - sufficient for most purposes, but if you want to store a large number of names - in the cache, cache lookups may be faster if the number of hash buckets - is comparable to the number of names stored in the cache. - The number actually used is the smallest power of two - greater or equal to the number specified here. -
- --enable-isdn - - Enable ISDN support
- This option will work only on Linux and may cause problems with 2.0.x or - old 2.2.x kernels. You will need it for a proper if uptest - under Linux for ISDN ppp devices. -
- --disable-ipv4 - - Disable IPv4 networking support (default=enabled) -
- --enable-ipv6 - - Enable IPv6 networking support.
- If your OS does support IPv6 properly, you should be able to serve also - IPv4 queries using this. Normally, this is disabled and you won't need - it. -
- --disable-ipv4-startup - - Disable IPv4 on pdnsd startup by default (default=enabled) -
- --enable-ipv6-startup - - Enable IPV6 on pdnsd startup by default (default=IPv4). - These options are only defaults, you can specify on - the command line or in the config files which IP version - will really be used. - Normally, you won't need to change these. -
- --disable-udp-queries - - Disable UDP as query method. You shouldn't need to change - this. -
- --disable-tcp-queries - - Disable TCP as query method. This only effects the querying of - name servers by pdnsd, not the ability of pdnsd to answer - TCP queries from clients. - TCP queries are slower than UDP queries, but can be more secure - against certain types of attacks and are able to handle large answers. - For normal use this can be disabled. - (Note that the default has changed: TCP-query support - is now compiled in by default, but it still depends on the run-time - options whether it is actually used.) -
- --with-query-method=qm - - Specify the query method (default=udponly, others: tcponly, tcpudp, udptcp). - If you have enabled both UDP and TCP queries, this lets you control - which query method pdnsd will use by default. tcpudp will try TCP - first and fall back to UDP if TCP is not supported by the server; - udptcp will try UDP first and, if the answer was truncated, will repeat - the query using TCP. - udponly and tcponly should be clear. Note that this only effects - the compiled-in default; the query method can still be changed using - command-line options or options in the configuration file. -
- --disable-tcp-server - - Disable the TCP server. - In this case pdnsd will not be able to respond to TCP queries from clients. - This may cause problems with very large answers. -
- --disable-src-addr-disc - - Disable the UDP source address discovery.
- You need this only if you have trouble with messages saying - "could not discover udp source address".
- For the Cygwin target, this option is disabled by default. -
- --disable-poll - - Disable poll(2) and use select(2) (default=enabled)
- You will normally not need this. -
- --disable-new-rrs - - Since version 1.2.9 this option is obsolete and ignored. - It is now possible to configure for each RR type separately whether it is - cacheable by pdnsd by editing the file src/rr_types.in. - The comments in this file explain how to do this. -
- --enable-strict-rfc2181 - - Enforce strict RFC 2181 compliance.
- This will cause pdnsd to reject DNS answers with incorrect - timestamp settings (multiple RRs of the same type and for the same domain with - different TTLs). Normally not needed. -
- --enable-underscores - - This option is obsolete. Since version 1.2, pdnsd places no restrictions - on the types of characters in domain names (there are still a few restrictions - for locally defined names, though). -
- --with-random-device=device - - Specify random device; default: C Library random() PRNG
- pdnsd uses (pseudo-) random numbers as query IDs for security reasons - (this makes forging DNS answers more difficult). This option - controls where pdnsd gets these from. The default is the C library - random() function, which is relatively weak. - You can specify a device like /dev/urandom here if you like; pdnsd will read - random numbers from it 16-bit-wise. /dev/urandom is present under Linux and - most BSD derivates. You should not use /dev/random - it is more secure, but - may block and delay pdnsd's answers for a long time.
- You can specify arc4random to use the BSD arc4random() - library function (default for FreeBSD target), which is considered safe.
- You can also specify random as device to use the C Library - random() function (described above). -
- --with-default-id=user - - Specify default user for pdnsd (default=nobody). - This is the user that will be entered for the run_as - option in the config file (see below) that will be installed during make install. - You can change this any time in your config file. -
- --with-debug=level - - Specify debugging level. Normally you can safely switch debugging off - by setting the level to 0. This will increase speed (although only - marginally) and save space in the executable (only about 12kB). - However, more significant may be the savings in stack space, especially - if pdnsd is put under heavy load and there are many simultaneous - running threads.
- Presently the only defined debug levels are in the range 0 - 9. - Setting the level to 9 enables hex dumps of the queries and replies - pdnsd receives and should normally not be needed. Debug output will only - be generated if you turn on special switches; it might be useful for - debugging your config files, so I recommend using the default (1). - However, if you use pdnsd under heavy load, a better strategy may be - to compile one version of pdnsd without debug support (configured with - --with-debug=0) for production use, and one version with - with debug support (e.g. --with-debug=9) - for diagnostic purposes. -
- --with-verbosity=level - - Specify default message verbosity. The default should be ok. -
- --enable-rcsids - - Enable RCS IDs in executables (default=disabled).
- For personal use, there is no need to do this. If you build rpm's, it - might have advantages. -
- --enable-tcp-subseq - - Enable subsequent tcp queries. The DNS protocol standard - requires that servers must be capable of answering multiple - subsequent queries that are sent over the same tcp connection, and that - the server may only close the connection by himself after a certain - timeout. This feature is rarely used, but may make denial-of-service - attacks easier, as it allows for an attacker to hold a connection open - a long time (although the attacker's IP is most likely revealed then). - For full standard compliance, you should use this option. - If you do not use --enable-tcp-server, is option is not honored. -
- --with-tcp-qtimeout=secs - - Specify default tcp query timeout after which the connection is closed - if no full query has been received. The default is 30s. - You can also change this option at run time using the tcp_qtimeout - config file option. - If you do not use --enable-tcp-server, is option is not honored. -
- --with-par-queries=num - - Specify the default number of queries that can be executed in parallel. - You can also change this option at run time using the par_queries - config file option. See the description of that option for an explanation - of what it really does.
- The default for this option is 2. -
- --with-max-nameserver-ips=num - - New in version 1.2.9b: - Specify the maximum number of IP addresses that can be used per nameserver obtained - from NS records (when resolving names recursively). - Just one IP address per nameserver is sufficient in the vast majority of cases - (and this was the strategy used by pdnsd in previous versions), - but in rare cases this will cause unnecessary resolve failures if the address chosen - for each nameserver happens to be unreachable while the other addresses would lead to - successful resolution.
- The default for this option is 3. -
- --with-thread-lib=lib - - Added by Paul Rombouts: Use this option if you experience problems with - signal handling under Linux. The usual symptom is that pdnsd fails to save - the cache to disk, and /var/cache/pdnsd/pdnsd.cache remains empty. - If you experience this kind of trouble, try reconfiguring with different values - for the --with-thread-lib option. The allowable values are - linuxthreads (or lt for short), linuxthreads2 - (or lt2 for short), and nptl. - By default the configure script tries to detect automatically whether - linuxthreads or nptl is more appropriate for your system, - but the method used is not foolproof. Look for the line: - checking if this is an NPTL-based system...
- If the automatic test mistakenly indentifies the thread library on your system as - NPTL based, you should reconfigure with --with-thread-lib=lt and recompile. - If the result of the automatic test is "no" or if - --with-thread-lib=lt does not have the desired effect, try again using - --with-thread-lib=lt2 . -
- Normally, you will need only --prefix, --sysconfdir and - --with-distribution. - If you specify your distribution using --with-distribution, this has the - following effects: -
    -
  • An rc script is copied in the appropriate localtion, which enables pdnsd to start - at machine boot time (see 0.4) -
  • Distribution-specific portions might be included in the generated pdnsd.spec - file (only important if you want to build rpm archives yourself). -
- If you choose Generic, no rc script is installed, and a generic spec - file is generated.
- - Further instructions are in the INSTALL document in the pdnsd source directory. - ./configure --help will give you a list of all supported command line - options.

- Note added by Paul Rombouts: Some people may want change the compiler optimization flag. - I use the -O2 flag, but it might be safer to use a lower level of - optimization or no optimization at all. In that case prefix the - configure command with the desired compiler flags like this - (assuming you're using a bash shell): -

CFLAGS="-O1 -Wall" ./configure ...

- - -
-

0.3.3 Building & installing

- Type make in the source directory. Should work by now.
- To install, type make install or do the installation by hand (see 0.3.4).
- make install will do the following ($prefix is the prefix directory; see above):
-
    -
  1. copies pdnsd to $(prefix)/sbin/ -
  2. copies pdnsd-ctl to $(prefix)/sbin/ -
  3. copies docs/pdnsd.conf.sample (a sample configuration) to the pdnsd config directory. -
  4. creates your cache directory if it is not there. - After installation, you should check the file permissions and create or edit - /etc/pdnsd.conf to fit your needs (see below). - If you use the run_as option, please make sure that your - cache directory is owned by the user you specified with this option! -
- You must be root for this installation!
- Security notes: never make the pdnsd cache directory - writeable for untrusted users, or you will get several security holes: - the users might modify the cache contents, or plant dangerous links.
- If you use a pidfile, you should be aware that you introduce security - problems if you place the pidfile in a directory in a NFS filesystem that - is writeable for untrusted users. Generally, the pidfile directory - (typically /var/run) should not be writeable for untrusted users. -
-

0.3.4 Manual installation

- For a manual installation, you need to do the following steps: -
    -
  1. Copy pdnsd and pdnsd-ctl from your build directory to an appropriate location (e.g. /usr/sbin). -
  2. Copy docs/pdnsd.conf into the directory you want it to reside (/etc by default, - and change it according to your needs (see below). -
  3. Create your caching directory; default is /var/cache/pdnsd (you may change this - in your pdnsd.conf); Permissions should be at max rwxr-xr-x (if you want to - protect your cache and status socket, make it rwx------). -
- Thats it! -
- -

0.4 Start at boot time

- In the src/rc folder of the pdnsd distribution are start scripts - for pdnsd designed for different Linux distros. There are scripts - for SuSE, Redhat, Debian, Arch Linux and Slackware now.
- The start scripts are automatically installed during RPM install, and also during make install - if you specified your distro.
- For Slackware Linux there is a start-up script contributed by Nikola Kotur, but presently - it must be installed manually. - See src/rc/README and src/rc/Slackware/rc.pdnsd for details. - -

0.4.1 SuSE Linux startup

- rc/SuSE/pdnsd is a start script for SuSE Linux. It was tested for 6.? but should run on some - versions below. You can do make install as root in the rc/SuSE - directory to install it, or you can install manually:
- - - - - - - -
- manual installation -
- For manual installation, copy rc/SuSE/pdnsd into /sbin/init.d/, go to - /sbin/init.d/rc2.d/ and create there the following two symlinks:
- S11pdnsd to ../pdnsd (do ln -s ../pdnsd S11pdnsd in that dir)
- K34pdnsd to ../pdnsd (do ln -s ../pdnsd K34pdnsd in that dir)
- The numbers dictate the order different services are started and - might need to be modified. Then edit your /etc/rc.config file and - add the line START_PDNSD=yes to start pdnsd at boot time. -
-

- If you used the make install command, START_PDNSD=yes has been - appended to your /etc/rc.config file, causing pdnsd to be started - at boot time. If you don't want that, change the yes into no. -

- This start script was created from /sbin/init.d/skeleton by me, so the - most is copyrighted by SuSE. They put it under the GPL, however, so - the license stated in COPYING also applies to this script. - There is NO WARRANTY OF ANY KIND on these scripts. - This is no official SuSE script, and SuSE naturally does NO support - for it. -

0.4.2 Red Hat Linux startup

- rc/Redhat/pdnsd is a start script for Red Hat Linux. It was contibuted by Torben - Janssen.
- This was tested for 6.1 but should run on 5.0+. You can do make install as root in the - rc/Redhat directory to install it, or you can install manually:
- - - - - - - -
- manual installation -
- For manual installation, copy rc/Redhat/pdnsd into /etc/rc.d/init.d/
- Then go to /etc/rc.d/rc3.d and create there the following symlink:
- S78pdnsd -> ../init.d/pdnsd - (do ln -f -s ../init.d/pdnsd S78pdnsd in that dir)
- - Then go to /etc/rc.d/rc0.d and create there the following symlink:
- K78pdnsd -> ../init.d/pdnsd - (do ln -f -s ../init.d/pdnsd K78pdnsd in that dir)
- - Then go to /etc/rc.d/rc6.d and create there the following symlink:
- K78pdnsd -> ../init.d/pdnsd - (do ln -f -s ../init.d/pdnsd K78pdnsd in that dir) -
- This script is also covered by license stated in COPYING. - Again, there is NO WARRANTY OF ANY KIND on these scripts. - This is no offical Redhat script, and Redhat naturally does NO support - for it -
-

0.5 Notes for FreeBSD users

- The special handling of ISDN ppp devices is only supported on Linux. It is not needed in FreeBSD, the normal - device handling also works fine with isdn4bsd devices.
- When compiled for FreeBSD, pdnsd as a small RFC compatability issue: RFC2181 demands answers on dns querys - to be sent with the same source address the query packet went to. In seldom cases, this will not be the case, - because the kernel selects the source address depending on the interface that was used for sending the answer.
- Setting the source address currently does not work for IPv4. I have written a kernel patch that will provide an easy way - to program this. We'll see if or when it gets commited.
-
-
-

1 Invocation

- When invoking pdnsd, you can specify various options at the command line. Command line options - always override config file options. The various --noX options are present to override - config file options. -

- pdnsd --help (or -h) gives you an overview of the pdnsd command line options. -

-

- pdnsd --version (or -V for short) prints licence and version information. -

-

- To start pdnsd as background daemon, specifiy --daemon (or -d for short) on - the command line. Diagnostic and error messages after the actual daemon start - will be printed to the syslog instead of the console. --nodaemon will disable this. -

-

- When starting pdnsd as a daemon, the -p option may be helpful: It writes the pid - of the server process to the file of the name given as argument to this option.
- Example: pdnsd -d -p /var/run/pdnsd.pid -

-

- If you want to specify a configuration file other than /etc/pdnsd.conf, specify - -c or --config-file on the command line, followed by a filename. -

-

- If pdnsd was compiled with debugging support, you may specify -g or - --debug on the command line. This will cause extra diagnostic messages to be - printed. When pdnsd runs in daemon mode, the messages will be written to the pdnsd.debug - file in your cache directory. --nodebug disables debugging. -

-

- pdnsd -vn sets the verbosity level of pdnsd. n is normally a digit from 0 to 3, - where 0 means normal operation, while 3 will most verbose. - Level 9 can be used in combination with the --debug option for very - extensive debug information.
- Note: The current implementation mostly ignores the verbosity level, - so you may not notice much difference between the various levels. -

-

- The option -s or --status enables the status control socket. This is a named socket in - the cache directory called pdnsd.status. This socket allows run-time configuration of pdnsd - using the utility pdnsd-ctl. See below for more details about pdnsd-ctl. - --nostatus disables status control. - See also the configuration option status_ctl in the global section. -

-

- The option --notcp disables the seldom needed TCP server thread, which may - save you some resources. -t or --tcp will enable it. - See also the tcp_server configuration option. -

-

- Using the -m option, you can select the method pdnsd uses to query other name servers. - Following methods are supported (see also the query_method - configuration option):
- -muo: pdnsd will use UDP only. This is the fastest method, and should be supported by all name servers - on the Internet.
- -mto: pdnsd will use TCP only. TCP queries usually take longer time than UDP queries, but are more secure - against certain attacks, where an attacker tries to guess your query id and to send forged answers. TCP queries - are not supported by some name servers.
- -mtu: pdnsd will try to use TCP, and will fall back to UDP if its connection is refused or times out.
- -mut: New in version 1.2.5: pdnsd will try to use UDP, and will repeat the query using TCP if the UDP reply was truncated - (i.e. the tc bit is set). This is the behaviour recommended by the DNS standards.
-

-

- The -4 option switches to IPv4 mode, providing pdnsd was compiled with IPv4 support.
- The -6 option switches to IPv6 mode, providing pdnsd was compiled with IPv6 support.
- The -a option is only available when pdnsd was compiled with both IPv4 and IPv6 support. - With this option, pdnsd will try to detect automatically if a system supports IPv6, and fall back to IPv4 otherwise.
-

-

- With -i prefix or --ipv4_6_prefix=prefix you can set the prefix pdnsd uses (when running in IPv6 - mode) to map IPv4 addresses in the configuration file to IPv6 addresses. - There is also a corresponding option for the config file, see below. - Must be a valid IPv6 address. - The default is ::ffff:0.0.0.0 -

- -

2 The configuration file

- This section describes the layout of the configuration file and the available - configuration options. - The default location of the file is /etc/pdnsd.conf. This may be changed - with the -c command line option. - An example pdnsd.conf comes with the pdnsd distribution in the docs directory - and will be installed to /etc/ by make install. - -
-

2.1 Layout

- The configuration file is divided into sections. Each section is prefixed with - the section name and opening curlies ({) and closed with closing curlies (}). - In each section, configuration options can be given in the form -
- option_name=option_value; -
- Option value may be a string literal, a number, a time specification or a constant. - In previous versions of pdnsd strings had to be enclosed - in quotes ("), but since version 1.1.10 this is no longer necessary, unless - a string contains a special character such as whitespace, a token that normally starts - a comment, or one of ",;{}\". - Since version 1.2.9 a backslash (\) inside a string is interpreted as an escape character, - so it is possible to include special characters in strings (both quoted or unquoted) - by preceding them with a backslash. Some escape sequences are in interpreted as in the C - programming language, e.g. \t becomes a tab, - \n becomes a new-line control char.
- A time specification consists a sequence of digits followed by a one-letter suffix. - The following suffixes are recognized: - s (seconds), m (minutes), h (hours), - d (days) and w (weeks). - If the suffix is missing, seconds are assumed. - If several time specifications are concatenated, their values are added together; - e.g. 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds.
- Some options take more than one value; in this case, the values are separated with commas.
- If you may supply one of a set of possible values to an option, this is noted - in the documentation as - (option1|option2|option3|...)
- The constants true|false and yes|no - are accepted as synonyms for the constants on|off.
- Comments may be enclosed in /* and */, nested comments are possible. If the - # sign or two slashes (//) appear in the configuration file, everything from - these signs to the end of the current line is regarded as a comment and ignored.
- There are examples for nearly all options in the sample config file. -
-

2.1.1 global Section

- The global section specifies parameters that affect the overall behaviour of the - server. If you specify multiple global sections, the settings of those later in - the file will overwrite the earlier given values.
- These are the possible options:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- perm_cache=(number|off);
- Switch the disk cache off or supply a maximum cache size in kB. If the disk - cache is switched off, 8 bytes will still be written to disk. - The memory cache is always 10kB larger than the file cache. - This value is 2048 (2 MB) by default. -
- cache_dir=string;
- Set the directory you want to keep the cache in. - The default is "/var/cache/pdnsd" - (unless pdnsd was compiled with a different default). -
- server_port=number;
- Set the server port. This is especially useful when you want to start the - server and are not root. Note that you may also not specify uptest=ping in - the server section as non-root.
- The default port is 53, the RFC-standard one. Note that you should only use - non-standard ports when you only need clients on your machine to communicate - with the server; others will probably fail if the try to contact the server - on the basis of an NS record, since the A record that supplies the address for - (among others) name servers does not have a port number specification. -
- server_ip=string;
- or
- interface=string;
- Set the IP address pdnsd listens on for requests. This can be useful - when the host has several interfaces and you want pdnsd not to listen on - all interfaces. For example, it is possible to bind pdnsd to listen on - 127.0.0.2 to allow pdnsd to be a forwarder for BIND. - The default setting for this option is server_ip=any, which means that - pdnsd will listen on all of your local interfaces. - Presently you can only specify one address here; if you want pdnsd to listen on multiple - interfaces but not all you will have to specify server_ip=any - and use firewall rules to restrict access.
- The IP address used to need quotation marks around it, but since version 1.1.10 - this is no longer necessary.
- If pdnsd has been compiled with both IPv4 and IPv6 support, and you want to - specify an IPv6 address here, then unless pdnsd was compiled to start up in IPv6 mode - by default, you will need to use the -6 command-line option or - set run_ipv4=off first (see below) in order to ensure that the - IPv6 address is parsed correctly.
- If pdnsd is running in IPv6 mode and you specify an IPv4 address here, - it will automatically be mapped to an IPv6 address.
- New in version 1.2: You may also give the name of an interface - such as "lo" or "eth0" here, instead of an IP address - (this has been tested on Linux, and may or may not work on other platforms). - pdnsd will not bind to the interface name, but will look up the address of the - interface at start-up and listen on that address. If the address of the interface - changes while pdnsd is running, pdnsd will not notice that. You will need to - restart pdnsd in that case. -
- outgoing_ip=string;
- or
- outside_interface=string;
- New in version 1.2.9: - Set the IP address of the interface used by pdnsd for outgoing queries. - This can be useful when the host has several interfaces and you want pdnsd - to send outgoing queries via only one of them. - For example, if pdnsd is running on a host with one interface with IP address - 192.168.1.1 connected to the local network, and another with IP address 123.xxx.yyy.zzz - connected to the internet, you may specify server_ip=192.168.1.1 - and outgoing_ip=123.xxx.yyy.zzz to enforce that pdnsd only responds - to queries received from the local network, and only sends outgoing queries via - the interface connected to the internet.
- The default setting for this option is any, which means that - the kernel is free to decide which interface to use. - Like with the server_ip option, you may also give the name of an - interface here, instead of an IP address. -
- linkdown_kluge=(on|off);
- This option enables a kluge that some people might need: when all servers are - marked down, with this option set the cache is not even used when a query is - received, and a DNS error is returned in any case. The only exception from this - is that local records (as specified in rr and source - sections are still served normally. - In general, you probably want to get cached entries even when the network is down, - so this defaults to off. -
- max_ttl=timespec;
- This option sets the maximum time a record is held in cache. All dns - resource records have a time to live field that says for what period of time the - record may be cached before it needs to be requeried. If this is more than the - value given with max_ttl, this time to live value is set to max_ttl. - This is done to prevent records from being cached an inappropriate long period of time, because - that is almost never a good thing to do. Default is 604800s (one week). -
- min_ttl=timespec;
- This option sets the minimum time a record is held in cache. All dns - resource records have a time to live field that says for what period of time the - record may be cached before it needs to be requeried. If this is less than the - value given with min_ttl, this time to live value is set to min_ttl. - Default is 120 seconds. -
- neg_ttl=timespec;
- This option sets the time that negatively cached records will remain valid in the - cache if no time to live can be determined. This is always the case when whole - domains are being cached negatively, and additionally when record types are cached - negatively for a domain for which no SOA record is known to pdnsd. If a SOA is present, - the ttl of the SOA is taken. -
- neg_rrs_pol=(on|off|auth|default);
- This sets the RR set policy for negative caching; this tells pdnsd under which circumstances - it should cache a record type negatively for a certain domain. off will - turn the negative caching of record types off, on will always add a negative - cache entry when a name server did not return a record type we asked it for, and auth - will only add such entries if the answer came from an authoritative name server for that - domain.
- New in version 1.2.8: The default setting will add a negatively cached record - if either the answer was authoritive or the answer indicated the name server had "recursion available" - while the query explicitly requested such recursion.
- The preset is "default" (used to be auth). -
- neg_domain_pol=(on|off|auth);
- This is analogue to neg_rrs_pol for whole domain negative caching. It should be safe - to set this on, because I have not seen a caching server that will falsely claim that a - domain does not exist.
- The default is auth. -
- run_as=string;
- This option allows you to let pdnsd change its user and group id after operations that needed - privileges have been done. This helps minimize security risks and is therefore recommended. The - supplied string gives a user name whose user id and primary group id are taken.
- A little more details: after reading the config file, becoming a daemon (if specified) and starting - the server status thread, the main thread changes its gid and uid, as do all newly created threads - thereafter. By taking another uid and gid, those threads run with the privileges of the - specified user. - Under Linux and FreeBSD, the server status thread runs with the original privileges only when the strict_setuid option - is set to off (see below, on by default), because these may be needed - for exec uptests. The manager thread also retains its original privileges in this case. - You should take care that the user you specify has write permissions on your cache file and - status pipe (if you need a status pipe). You should look out for error messages like "permission denied" - and "operation not permitted" to discover permission problems.
-
- strict_setuid=(on|off);
- When used together with the run_as option, this option lets you specify that all threads of the - program will run with the privileges of the run_as user. This provides higher security than - the normal run_as - option, but is not always possible. See the run_as option for further discussion.
- This option is on by default.
- Note that this option has no effect on Non-Linux systems. -
- paranoid=(on|off);
- Normally, pdnsd queries all servers in recursive mode (i.e. instructs servers to query other servers themselves - if possible, - and to give back answers for domains that may not be in its authority), and accepts additional records with information - for servers that are not in the authority of the queried server. This opens the possibility of so-called cache poisoning: - a malicious attacker might set up a dns server that, when queried, returns forged additional records. This way, he might - replace trusted servers with his own ones by making your dns server return bad IP addresses. This option protects - you from cache poisoning by rejecting additional records - that do not describe domains in the queried servers authority space and not doing recursive queries any more. - An exception - to this rule are the servers you specify in your config file, which are trusted.
- The penalty is a possible performance decrease, in particular, more queries might be necessary for the same - operation.
- You should also notice that there may be other similar security problems, which are essentially problems of - the DNS, i.e. - any "traditional" server has them (the DNS security extensions solve these problems, but are not widely - supported). - One of this vulnerabilities is that an attacker may bombard you with forged answers in hopes that one may match a - query - you have done. If you have done such a query, one in 65536 forged packets will be succesful (i.e. an average packet - count of 32768 is needed for that attack). pdnsd can use TCP for queries, - which has a slightly higher overhead, but is much less vulnerable to such attacks on sane operating systems. Also, pdnsd - chooses random query ids, so that an attacker cannot take a shortcut. If the attacker is able to listen to your network - traffic, this attack is relatively easy, though.
- This vulnerability is not pdnsd's fault, and is possible using any conventional - name server (pdnsd is perhaps a little more secured against this type of attacks if you make it use TCP).
- The paranoid option is off by default.
-
- ignore_cd=(on|off);
- New in version 1.2.8: This option lets you specify that the CD bit of a DNS query will be ignored. - Otherwise pdnsd will reply FORMERR to clients that set this bit in a query. - It is safe to enable this option, as the CD bit refers to 'Checking Disabled' - which means that the client will accept non-authenticated data.
- This option is on by default. Turn it off if you want the old behaviour (before version 1.2.8). -
- scheme_file=string;
- In addition to normal uptests, you may specify that some servers shall only be queried when a certain - pcmcia-cs scheme is active (only under linux). For that, pdnsd needs to know where the file resides that - holds the pcmcia scheme information. Normally, this is either /var/lib/pcmcia/scheme or - /var/state/pcmcia/scheme. -
- status_ctl=(on|off);
- This has the same effect as the -s command line option: the status control is enabled when - on is specified.
- Added by Paul Rombouts: Note that pdnsd-ctl allows run-time configuration of pdnsd, - even the IP addesses of the name servers can be changed. If you're not using pdnsd-ctl and - you want maximum security, you should not enable this option. It is disabled by default. -
- daemon=(on|off);
- This has the same effect as the -d command line option: the daemon mode is enabled when - on is specified.
- Default is off. -
- tcp_server=(on|off);
- tcp_server=on has the same effect as the -t or --tcp - command-line option: it enables TCP serving. - Similarly, tcp_server=off is like the --notcp command-line option.
- Default is on. -
- pid_file=string;
- This has the same effect as the -p command line option: you can specify a file that pdnsd - will write its pid into when it starts in daemon mode. -
- verbosity=number;
- This has the same effect as the -v command line option: you can set the verbosity of pdnsd's - messages with it. The argument is a number between 0 (few messages) to 3 (most messages). -
- query_method=(tcp_only|udp_only|tcp_udp|udp_tcp);
- This has the same effect as the -m command line option. - Read the documentation for the command line option on this. - tcp_only corresponds to the to, udp_only to the uo, - tcp_udp to the tu and udp_tcp to the ut - argument of the command line option.
- If you use query_method=tcp_udp, it is recommended that you also set the global timeout option to at least twice the longest server timeout. -
- run_ipv4=(on|off);
- This has the same effect as the -4 or -6 command line option: - if on is specified, IPv4 support is enabled, and IPv6 support is disabled (if available). - If off is specified, IPv4 will be disabled and IPv6 will be enabled. - For this option to be meaningful, pdnsd needs to be compiled with support for the protocol you choose. - If pdnsd was compiled with both IPv4 and IPv6 support, and you want to include IPv6 addresses - in the configuration file, you will probably need to specify run_ipv4=off first to - ensure that the IPv6 addresses are parsed correctly. -
- debug=(on|off);
- This has the same effect as the -g command line option: the debugging messages are enabled when - on is specified. -
- ctl_perms=number;
- This option allows you to set the file permissions that the pdnsd status control socket will have. These - are the same as file permissions. The owner of the file will be the run_as user, or, if none is specified, - the user who started pdnsd. If you want to specify the permissions in octal (as usual), don't forget - the leading zero (0600 instead of 600!). To use the status control, write access is needed. The default - is 0600 (only the owner may read or write).
- Please note that the socket is kept in the cache directory, and that the cache directory permissions - might also need to be adjusted. Please ensure that the cache directory is not writeable for untrusted - users. -
- proc_limit=number;
- With this option, you can set a limit on the pdnsd threads that will be active simultaneously. If - this number is exceeded, queries are queued and may be delayed some time. - See also the procq_limit option.
- The default for this option is 40. -
- procq_limit=number;
- When the query thread limit proc_limit is exceeded, connection attempts to pdnsd will be queued. - With this option, you can set the maximum queue length. - If this length is also exceeded, the incoming queries will be dropped. - That means that tcp connections will be closed and udp queries will just be dropped, which - will probably cause the querying resolver to wait for an answer until it times out.
- See also the proc_limit option. A maximum of proc_limit+procq_limit - query threads will exist at any one time (plus 3 to 6 threads that will always - be present depending on your configuration).
- The default for this option is 60. -
- tcp_qtimeout=timespec;
- This option sets a timeout for tcp queries. If no full query has been received on a tcp connection - after that time has passed, the connection will be closed. The default is set using the - --with-tcp-qtimeout option to configure. -
- par_queries=number;
- This option used to set the maximum number of remote servers that would be queried simultaneously, - for every query that pdnsd receives.
- Since version 1.1.11, the meaning of this option has changed slightly. - It is now the increment with which the number of parallel queries is - increased when the previous set of servers has timed out. - For example, if we have a list server1, server2, server3, etc. of available servers - and par_queries=2, then pdnsd will first send queries to server1 and server2, - and listen for responses from these servers.
- If these servers do not send a reply within their timeout period, pdnsd will send additional - queries to server3 and server4, and listen for responses from - server1, server2, server3 and server4, and so on until a useful reply is - received or the list is exhausted.
- In the worst case there will be pending queries to all the servers in the list of available servers. - We may be using more system resources this way (but only if the first servers in the list - are slow or unresponsive), but the advantage is that we have a greater chance of catching a reply. - After all, if we wait longer anyway, why not for more servers.
- See also the explanation of the global timeout option below.
- 1 or 2 are good values for this option. - The default is set at compile time using the --with-par-queries option to configure. -
- timeout=timespec;
- This is the global timeout parameter for dns queries. - This specifies the minimum period of time pdnsd will wait after sending the - first query to a remote server before giving up without having - received a reply. The timeout options in the configuration file are - now only minimum timeout intervals. Setting the global timeout option - makes it possible to specify quite short timeout intervals in the - server sections (see below). This will have the effect that pdnsd will start - querying additional servers fairly quickly if the first servers are - slow to respond (but will still continue to listen for responses from - the first ones). This may allow pdnsd to get an answer more quickly in - certain situations.
- If you use query_method=tcp_udp it is recommended that - you make the global timeout at least twice as large as the largest - server timeout, otherwise pdnsd may not have time to try a UDP query - if a TCP connection times out.
- Default value is 0. -
- randomize_recs=(on|off);
- If this option is turned on, pdnsd will randomly reorder the cached records of one type - when creating an answer. This supports round-robin DNS schemes and increases fail - safety for hosts with multiple IP addresses, so this is usually a good idea.
- On by default. -
- query_port_start=(number|none);
- If a number is given, this defines the start of the port range used for queries of pdnsd. The - value given must be >= 1024. The purpose of this option is to aid certain firewall - configurations that are based on the source port. Please keep in mind that another application - may bind a port in that range, so a stateful firewall using target port and/or process uid may - be more effective. In case a query start port is given pdnsd uses this port as the first port of a - specified port range (see query_port_end) used for queries. - pdnsd will try to randomly select a free port from this range as local port for the query.
- To ensure that there are enough ports for pdnsd to use, the range between query_port_start and - query_port_end should be adjusted to at least (par_queries * proc_limit). - A larger range is highly recommended for security reasons, and also because other applications may - allocate ports in that range. If possible, this range should be kept out of the space - that other applications usually use.
- The default for this option is 1024. Together with the default value of query_port_end, - this makes it the hardest for an attacker to guess the source port used by the pdnsd resolver. - If you specify none here, pdnsd will let the kernel choose the source port, but - this may leave pdnsd more vulnerable to an attack. -
- query_port_end=number;
- Used if query_port_start is not none. Defines the last port of the range started by query_port_start - used for querys by pdnsd. The default is 65535, which is also the maximum legal value for this option. - For details see the description of query_port_start. -
- delegation_only=string;
- Added by Paul Rombouts: This option specifies a "delegation-only" zone. - This means that if pdnsd receives a query for a name that is in a - subdomain of a "delegation-only" zone but the remote name server - returns an answer with an authority section lacking any NS RRs for - subdomains of that zone, pdnsd will answer NXDOMAIN (unknown domain). - This feature can be used for undoing the undesired effects of DNS - "wildcards". Several "delegation-only" zones may be specified together. - If you specify root servers in a server section it is - important that you set root_server=on in such a section.
- Example: -

delegation_only="com","net";

- This feature is off by default. It is recommended that you only use - this feature if you actually need it, because there is a risk that - some legitimate names will be blocked, especially if the remote - name servers queried by pdnsd return answers with empty authority - sections. -
- ipv4_6_prefix=string;
- This option has the same effect as the -i command-line option. - When pdnsd runs in IPv6 mode, this option specifies the prefix pdnsd uses to convert IPv4 addresses in - the configuration file (or addresses specified with pdnsd-ctl) - to IPv6-mapped addresses. - The string must be a valid IPv6 address. Only the first 96 bits are used. - Note that this only effects the parsing of IPv4 addresses listed after this option.
- The default is "::ffff.0.0.0.0". -
- use_nss=(on|off);
- If this option is turned on, pdnsd will call initgroups() to set up the group access list, - whenever pdnsd changes its user and group id (see run_as option). - There is a possible snag, though, if initgroups() uses NSS (Name Service Switch) and - NSS in turn uses DNS. In such a case you may experience lengthy timeouts and stalls. - By setting use_nss=off, you can disable the initgroups() call - (only possible in versions 1.2.5 and later).
- This option was contributed by Jan-Marek Glogowski.
- On by default. -
- udpbufsize=number;
- New in version 1.2.9: - This option sets the upper limit on the size of UDP DNS messages. The default is 1024.
- See also the edns_query server option below. -
- -
-

2.1.2 server Section

- Each server section specifies a set of name servers that pdnsd should try to get - resource records or authoritative name server information from. The servers are - queried in the order of their appearance (or parallel to a limited extend). - If one fails, the next one is taken and so on.
- You probably want to specify the dns server in your LAN, the caching dns servers - of your internet provider or even a list of root servers in one or more server sections.
- The supported options in this section are:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- label=string;
- Specify a label for the server section. This can be used to refer to this section - when using pdnsd-ctl, the pdnsd control utility.
- You can give several server sections the same label, but if you want to change the addresses - of a server section (see ip option below) during run-time with - "pdnsd-ctl server label up dns1,dns2,...", - the label must be unique. -
- ip=string;
- Give the IP (the address, not the host name) of the server.
- Multiple IP addresses can be given per server section. - This can be done by entering multiple lines of the form ip=string; - or a single line like this: -

ip=string,string,string;

- IP addresses do not have to be specified in the configuration file. - A server section without IP addresses will remain inactive until it is assigned - one or more addresses with pdnsd-ctl, - the pdnsd control utility.
- If pdnsd has been compiled with both IPv4 and IPv6 support, any IPv6 addresses you specify - here will be skipped with a warning message, unless pdnsd is running in IPv6 mode. - Thus, unless pdnsd was compiled to startup in IPv6 mode by default, you need to use the - command-line option -6 or set run_ipv4=off - first (see global section) in order to ensure - that IPv6 addresses are parsed correctly.
- If pdnsd is running in IPv6 mode and you specify an IPv4 address here, - it will automatically be mapped to an IPv6 address. -
- file=string;
- New in version 1.2: This option allows you to give the name of a resolv.conf-style file. - Of the lines beginning with the nameserver keyword, the second field will be parsed as an - IP address, as if it were specified with the ip= option. The remaining lines will be ignored. - If the contents of the file changes while pdnsd is running, you can make pdnsd aware of the changes through the - use of pdnsd-ctl, the pdnsd control utility. - This is usually most conveniently done by placing the command "pdnsd-ctl config" in a script - that is automatically run whenever the DNS configuration changes.
- For example, suppose you have a ppp client that writes the DNS configuration for your ISP to the file - /etc/ppp/resolv.conf and runs the script /etc/ppp/ip-up when a new - connection is established. One way of ensuring that pdnsd is automatically reconfigured is to - add a server section in the config file with file=/etc/ppp/resolv.conf and to - add the command "pdnsd-ctl config" to /etc/ppp/ip-up. -
- port=number;
- Give the port the remote name server listens on. Default is 53 (the official - dns port) -
- uptest=(ping|none|if|dev|diald|exec|query);
- Determine the method to check whether the server is available. Currently - defined methods are: - -
    -
  • ping: Send an ICMP_ECHO request to the server. If it doesn't respond - within the timeout, it is regarded to be unavailable until the next probe. -
  • none: The availability status is not changed, only the time stamp is updated. -
  • if: Check whether the interface (specified in the interface= option) is - existent, up and running. This currently works for all "ordinary" - network interfaces, interfaces that disappear when down (e.g. ppp?), - and additionally for Linux isdn interfaces (as of kernel 2.2). Note that - you need a /dev/isdninfo device file (major#45, minor#255), or the - isdn uptest will always fail. -
  • dev and diald: Perform an if uptest, and, if that - was succesful, additionally check whether a program is running that - has locked a given (modem-) device. The needed parameters are an interface (specified as for the if - uptest, e.g. "ppp0") and a device relative to /dev (e.g. - "modem" for /dev/modem specified using the device= option. - pdnsd will then look for a pid file for the given interface in /var/lock (e.g. - /var/run/ppp0.pid) and for a lockfile for the given device (e.g. /var/lock/LCK..modem), - and then test whether the locking process is the process that created the pid file and this process is still - alive. If this is the case, the normal if uptest is executed for the given interface.
    - The dev option is for pppd dial-on-demand, diald is the same for diald users. -
  • exec: Executes a given command in the /bin/sh shell - (as /bin/sh -c <command>) - and evaluates the result (the return code of the last command) in the shell's way of handling return codes, - i.e. 0 indicates success, all other indicate failure. The shell's process name will be - uptest_sh. The command is given with the uptest_cmd option (see below). - For secuity issues, also see that entry. -
  • query: New in version 1.2: - This works like the ping test, except it sends an (empty) DNS query to the remote server. - If the server sends a well-formed response back within the timeout period (except SERVFAIL), - it will be regarded as available. - This test is useful if a remote server does not respond to ICMP_ECHO requests at all, - which unfortunately is quite common these days. - It can also happen that a remote server is online but ignores empty DNS queries. - Then you will need the set the query_test_name option (see below). - In many cases this test will be a more reliable indicator of availability - than the ones mentioned before. -
-

- The default value is none. -

- NOTE: If you use on-demand dialing, use none, if, - dev, diald or exec, - since ping or query will send packets - in the specified interval and the interface will thus frequently dial! -

- ping_timeout=number;
- Sets the timeout for the ping test in tenths of seconds - (this unit is used for legacy reasons; actually the current implementation is - only accurate to a second).
- The default is 600 (one minute). -
- ping_ip=string;
- The IP address for the ping test. The default is the IP of the name server. -
- query_test_name=string;
- New in version 1.2.9: - Sets the name to be queried when using uptest=query availability test. - If the string is the unquoted constant none, - an empty query is used (this the default), otherwise a query of type A will be - sent for the domain name specified here. It is not necessary for the domain name - to exist or have a record of type A in order for the uptest to succeed.
- If the the remote server ignores empty queries, you will probably want to set - query_test_name="." (the root domain). -
- uptest_cmd=string,string;
- or
- uptest_cmd=string;
- Sets the command for the uptest=exec function to the first string. - If the second string is given, it specifies a user with whose user - id and primary group id the command is executed.
- This is especially useful if you are executing the server as root, - but do not want the uptest to be performed with root privileges. - In fact, you should never execute the uptest as root if you can help - it.
- If the server is running setuid or setgid, the privileges thus gained - are attempted to be dropped even before changing identity to the - specified user to prevent setuid/gid security holes (otherwise, any - user might execute commands as root if you setuid the executable).
- Note that this is not always possible, and that pdnsd should never - be installed as setuid or setgid. - The command is executed using /bin/sh, so you should be able to use - shell builtin commands. -
- interval=(timespec|onquery|ontimeout);
- Sets the interval for the server up-test. The default is 900 seconds; - however, a test is forced when a query times out and the timestamp is reset then.
- If you specify onquery instead of a timeout, the interface will be - tested before every query. This is to prevent automatically dialing - interfaces (diald/pppd or ippp) to dial on dns queries. It is intended to be - used in connection with an interface-testing uptest ;-)
- Note that using uptest=exec, you might run into performance problems - on slow machines when you use that option. - DON'T use onquery with uptest=ping or - uptest=query, as it may cause delays if the server does not answer - (btw, it doesn't make sense anyway). - Note also that using onquery is no guarantee that the interface - will not be used. When another (reachable) dns server tells pdnsd - to query a third dns server for data, pdnsd will do that and has - no means of checking whether this will dial up the interface or not. - This however should be a rare situation.
- New in version 1.2.3: - A third possibility is to specify interval=ontimeout. - In this case the server is not tested at startup/reconfiguration, nor at regular intervals, - but only after a DNS query to a server times out. Certain types of network problems - such as a refused connection will also cause the server to be considered unavailable. - However, once a server is declared dead it is never considered again unless it is revived using a - pdnsd-ctl config or server command. - The idea behind this option is to minimize uptests by assuming all - servers are available until there is reason to believe otherwise. -
- interface=string;
- The network interface (or network device, e.g. "eth0") for the uptest=if option. - Must be specified if uptest=if is given. -
- device=string;
- The (modem-) device that is used for the dev uptest. If you use this for a dial-on-demand - ppp uptest (together with uptest=dev), you need to enter the device you are using for your - pppd here, e.g. modem for /dev/modem.
- Must be specified if uptest=dev is given. -
- timeout=timespec;
- Set the timeout for the dns query. The default is 120 seconds. You probably want to set this lower.
- Timeouts specified in the configuration file are only treated as the - minimum period of time to wait for a reply. A queries to a remote - server are not canceled until a useful reply has been received, or all - the other queries have timed out or failed.
- If you have also set the global timeout option, you may consider setting a fairly small value here. - See the explanation of the timeout option in the global - section for what that means. -
- purge_cache=(on|off);
- In every fetched dns record, there is a cache timeout given, which - specifies how long the fetched data may be cached until it needs to be - reloaded. If purge_cache is set to off, the stale records are not purged - (unless the cache size would be exceeded, in this case the oldest records are purged). - Instead, they are still served if they cannot succesfully be - updated (e.g. because all servers are down).
- Default is off. -
- caching=(on|off);
- Specifies if caching shall be performed for this server at all. Default is - on. -
- lean_query=(on|off);
- Specifies whether to use the "lean" query mode. In this mode, only the - information actually queried from pdnsd is resolved and cached. This has - the advantage that usually less cache space is used and the query is - usually faster. In 90% of the cases, only address (A) records are needed - anyway. If switched off, pdnsd will always cache all data about a host - it can find and will specifically ask for all available records - (well, at least it is a good approximation for what it really does ;-) - This will of course increase the answer packet sizes.
- Some buggy name servers may not deliver CNAME records when not asked for - all records. I do not know if such servers are around, but if you have - trouble resolving certain host names, try turning this option off.
- A last note: If you use multiple pdnsd's that access each other, turning - this option on is probably a big win.
- This on by default. -
- edns_query=(on|off);
- New in version 1.2.9: - Specifies whether to use EDNS (Extension mechanisms for DNS) for outgoing queries. - Currently this is only useful for allowing UDP message sizes larger than 512 bytes. - Note that setting this option on can give problems in combination with some legacy - systems or software, including, embarrassingly enough, previous versions of pdnsd.
- The default is off, but if your network can handle UDP payloads - significantly larger than 512 bytes, the recommended value is on.
- Note that this option only effects outgoing queries. If pdnsd receives a query using - EDNS, it will reply using EDNS regardless of the value of this option. -
- See also the udpbufsize option above. -
- scheme=string;
- You can specify a pcmcia-cs scheme that is used in addition to the uptests. If you specify - a scheme here, the server this section is for will only be queries if the given scheme - is active. Shell wildcards (* and ?) are allowed in the string under their special - meanings. You need to use the scheme_file option on the global - section to make this option work. -
- preset=(on|off);
- This allows you to specify the initial state of a server before any uptest is performed. - on specifies that the server is regarded available. The default is on. - This is especially useful when you set uptest=none; and want to change - the status of a server only via pdnsd-ctl. -
- proxy_only=(on|off);
- When this option is set to on, answers given by the servers are always accepted, and no - other servers (as, for example, specified in the NS records of the query domain) are - queried. If you do not turn this option on, pdnsd will do such queries in some cases - (in particular when processing ANY queries).
- This option is useful when you do not want pdnsd to make connections to outside servers - for some reasons (e.g. when a firewall is blocking such queries).
- I recommend that you turn on lean_query when using this option.
- Default is off. -
- root_server=(on|off|discover);
- Set this option to on if the servers specified in a section are root servers. - A root server will typically only give the name servers for the top-level domain in its reply. - Setting root_server=on will cause pdnsd to try to use cached information about - top-level domains to reduce to number of queries to root servers, making the resolving of - new names more efficient. - You can get a list of available root servers by running the command - "dig . ns".
- This option is also necessary if you use the delegation_only option.
- New in version 1.2.8: This option may also be set to "discover". - This will cause pdnsd to query the servers provided with the ip= option - to obtain the full list of root servers. The root-server addresses will replace the addresses - specified with the ip= option. - This will only be done once on startup, or after a "pdnsd-ctl config" command. - In this case the name servers specified with the ip= option don't have to be - root servers, they just have to know the names and addresses of the root servers. - After root-server discovery pdnsd will behave just as if root_server=on - had been specified.
- Default is off. -
- randomize_servers=(on|off);
- New in version 1.2.6: Set this option to on to give each name server - in this section an equal chance of being queried. If this option is off, the name servers - are always queried starting with the first one specified. Even with this option on, the - query order is not truly random. Only the first server is selected randomly; the following - ones are queried in consecutive order, wrapping around to the beginning of the list when - the end is reached. Note that this option only effects the order within a section. The - servers in the first (active) section are always queried before those in the second one, - etc.
The default is off, but if you are resolving from root servers setting this - option on is highly recommended. If root_server=on this option also effects - the query order of the name servers for the top-level domains. -
- reject=string;
- New in version 1.2.6: This option can be used to make pdnsd reject replies that - contain certain IP addresses. You can specify a single IP address, which will be matched - exactly, or a range of addresses using an address/mask pair. - The mask can be specified as a simple integer, indicating the number of initial 1 bits in - the mask, or in the usual IP address notation. IP addresses may be either IPv4 or IPv6 - (provided there is sufficient support in the C libraries and support for AAAA records was - not disabled). - When addresses in the reject list are compared with those in a reply, only the bits - corresponding to those set in the netmask are significant, the rest are ignored.
- Multiple addresses or address/mask pairs may be specified; this can be done by entering - multiple lines of the form reject=string; - or a single line like this: -

reject=string,string,string;

- How pdnsd reacts when an address in the reply matches one in the reject list, - depends on the reject_policy option, see below. -
- reject_policy=(fail|negate);
- New in version 1.2.6: - This option determines what pdnsd does when an address in the reply from a name server - matches the reject list (see above). If this option is set to - fail, pdnsd will try another server, or, if there no more servers to try, - return the answer SERVFAIL. If this option is set to negate, pdnsd will - immediately return the answer NXDOMAIN (unknown domain) without querying additional - servers. The fail setting is useful if you don't always trust the servers in - this section, but do trust the servers in the following section. The negate - setting can be used to completely censor certain IP addresses. In this case you should put - the same reject list in every server section, and also set the - reject_recursively option (see below) to true.
- The default is fail. -
- reject_recursively=(on|off);
- New in version 1.2.6: Normally pdnsd checks for addresses in the - reject list (see above) only when the reply comes directly from a name server - listed in the configuration file. With this option set to on, pdnsd will - also do this check for name servers that where obtained from NS records in the authority - section of a previous reply (which was incomplete and non-authoritative).
- Default is off. -
- policy=(included|excluded|simple_only|fqdn_only);
- pdnsd supports inclusion/exclusion lists for server sections: with include= - and exclude= (see below) you can specify domain names for which this server - will be used or will not be used. The first match counts (i.e., the first include or - exclude rule in a server section that matches a domain name is applied, and the - search for other rules is terminated). If no rule matched a given domain name, - the policy= option determines whether this server is used for the - lookup for that domain name; when included is given, the server will - be asked, and when excluded is given, it will not. - If simple_only is given the server will be used if the name to lookup - is a simple (single-label) domain name, on the other hand if fqdn_only - is given the server will be used only for names consisting of two or more labels - (i.e. the name has at least one dot in-between).
- If no server is available for a queried domain, pdnsd will return an error message - to the client that usually will stop the client's attempts to resolve a specific - domain from this server (the libc resolver will e.g. return an error to the application that - tried to resolve the domain if no other servers are available in the resolv.conf). - This may be of use sometimes.
- Note: the simple_only and fqdn_only constants - were added by Paul Rombouts. - They are useful for controlling which name servers (if any) will be used by - pdnsd for resolving simple (single-label) host names. - fqdn_only used to stand for "fully qualified domain name only", but this is - actually a misnomer. The names in queries received by pdnsd are always considered to be - fully qualified. If you do not exactly understand what the options simple_only and - fqdn_only are good for, you are probably better off not using them.
- The default for this option is included. -
- include=string;
- This option adds an entry to the exclusion/inclusion list. If a domain matches - the name given as string, the server is queried if this was the first matching rule - (see also the entry for policy).
- If the given name starts with a dot, the whole subdomain - of the given name including the one of that name is matched, e.g. ".foo.bar." - will match the domain names a.foo.bar., a.b.c.foo.bar. and foo.bar.
- If it does not start in a dot, only exactly the given name (ignoring the case, of course) - will be matched (hint: if you want to include all subdomains, but not the domain of the given - name itself, place an exact-match exclude rule before the include rule, e.g: - exclude="foo.bar."; include=".foo.bar.";
- Previous versions of pdnsd - required that names given with this and the next option ended in a dot, but since - version 1.1.8b1-par8, pdnsd automatically adds a dot at the end if it - is missing.
- pdnsd now also accepts a more compact notation for adding several "include" entries in - one line, e.g.: -

include=".foo",".bar",".my.dom";

-
- exclude=string;
- This option adds an entry to the exclusion/inclusion list. If a domain matches - the name given as string, the server is not queried if this was the first matching rule - (see also the entry for policy).
- If the given name starts with a dot, the whole subdomain - of the given name including the one of that name is matched, e.g. ".foo.bar." - will match the domain names a.foo.bar., a.b.c.foo.bar. and foo.bar.
- If it does not start in a dot, only exactly the given name (ignoring the case, of course) - will be matched (hint: if you want to exclude all subdomains, but not the domain of the given - name itself, place an exact-match include rule before the exclude rule, e.g: - include="foo.bar."; exclude=".foo.bar.";
- pdnsd now also accepts a more compact notation for adding several "exclude" entries in - one line, e.g.: -

exclude=".foo",".bar",".my.dom";

-
-
-

2.1.3 rr Section

- Every rr section specifies a dns resource record that is stored locally. It - allows you to specify own dns records that are served by pdnsd in a limited way. - Only A, PTR, CNAME, MX, NS and SOA records are implemented.
- This option is intended to allow you to define RRs for 1.0.0.127.in-addr.arpa. - and localhost. (and perhaps even one or two hosts) without having to start an - extra named if your cached name servers do not serve those records. - It is NOT intended and not capable to work as a full-featured name server. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- name=string;
- Specifies the name of the resource records, i.e. the domain name of - the resource the record describes. This option must be specified - before any a, ptr, cname, - mx, ns or soa records. - Names are interpreted as absolute domain names - (i.e. pdnsd assumes they end in the root domain). - For this and all following arguments that take domain names, you need to - specify domain names in dotted notation (example venera.isi.edu.).
- Previous versions of pdnsd - required that domain names given in the configuration file ended in a - dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a - dot at the end if it is missing.
- New in version 1.2: It is also possible to specify a name starting - with the label *. Such a name is called a wildcard. The * in a wildcard - can match one or more labels in a queried name, but only whole labels. - Any other * characters in a wildcard, apart from the leading one, - will only match a literal *.
- For example, *.mydomain will match a.mydomain or www.a.mydomain, but not - mydomain. *.a*.mydomain will match www.a*.mydomain, but not www.ab.mydomain. - *a.mydomain will only match itself.
- Before you can specify an rr section with name=*.mydomain - you must define some records for mydomain, typically NS and/or SOA records. - Example: -
-    rr {
-	name = mydomain;
-	ns = localhost;
-	soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400;
-    }
-    rr {
-	name = *.mydomain;
-	a = 192.168.1.10;
-    }
- In this example, www.mydomain and ftp.mydomain will resolve to the numeric - address 192.168.1.10 (unless you add rr sections explicitly - specifying different addresses for www.mydomain or ftp.mydomain). - If you want mydomain also to resolve to a numeric address, - add an A record to the first rr section. -
- ttl=timespec;
- Specifies the ttl (time to live) for all resource records in this section after this entry. - This may be redefined. The default is 86400 seconds (=1 day). -
- authrec=(on|off);
- If this is turned on, pdnsd will create authoritative local records for this rr section. - This means that pdnsd flags the domain record so that records of this domain that are not - present in the cache are treated as non-existent, i.e. no other servers are queried for - that record type, and an response containing none of those records is returned. This is - most time what people want: if you add an A record for a host, and it has no AAAA record - (thus no IPv6 address), you normally don't want other name servers to be queried for it.
- This is on by default.
- Please note that this only has an effect if it precedes the name option! -
- reverse=(on|off);
- New in version 1.2: If you want a locally defined name to resolve to a numeric address - and vice versa, you can achieve this by setting reverse=on before defining the A record - (see below). The alternative is to define a separate PTR record, but you will - probably find this option much more convenient.
- The default is off. -
- a=string;
- Defines an A (host address) record. The argument is an IPv4 address in dotted notation. - pdnsd will serve this address for the host name given in the name option.
- Provided there is sufficient support in the C libraries and support for AAAA records was not - disabled, the argument string may also be an IPv6 address, in which case an AAAA record - will be defined.
- This option be may used multiple times within an rr section, causing - multiple addresses to be defined for the name. However, if you put the different addresses - in different rr sections for the same name, the definition in the last - rr section will cancel the definitions in the previous ones. -
- ptr=string;
- Defines a PTR (domain name pointer) record. The argument is a host name in - dotted notation (see name). The ptr record is for resolving adresses into names. For example, if - you want the adress 127.0.0.1 to resolve into localhost, and localhost into 127.0.0.1, you need something - like the following sections:
-
-    rr {
-	name = localhost;
-	a = 127.0.0.1;
-	owner = localhost;
-	soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400;
-    }
-    rr {
-	name = 1.0.0.127.in-addr.arpa;
-	ptr = localhost;
-	owner = localhost;
-	soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400;
-    }
- The second section is for reverse resolving and uses the ptr option. - Note that you can get the same effect by specifying only the first rr section - with reverse=on.
- There is something special about the name in the second section: - when a resolver wants to get a host name from an internet address, - it composes an address that is built of the IP address in reverse byte order - (1.0.0.127 instead of 127.0.0.1) where each byte of the adress written - as number constitutes a sub-domain under the domain in-addr.arpa.
- So, if you want to compose an adress for reverse resolving, take your ip in dotted notation (e.g. 1.2.3.4), - reverse the byte order (4.3.2.1) and append in-addr.arpa. (4.3.2.1.in-addr.arpa.) - Then, define an rr section giving this address as name and the domain name corresponding to - that ip in the ptr option. -
- cname=string;
- Defines a CNAME (canonical name) record. - The argument should be a fully-qualified host name in dotted notation (see name). - A CNAME is the DNS equivalent of an alias or symbolic link.
- A useful application for CNAMEs is giving short, easy to remember nicknames to hosts with complicated names. - For example, you might want the name "news" to refer to your ISP's news server "nntp2.myisp.com". - Instead of adding an A record for "news" with the same address as "nntp2.myisp.com", you could - put in a CNAME pointing to "nntp2.myisp.com", so that if the IP address of the news server changes, - there is no need to update the record for "news".
- To implement this with pdnsd, you could add the following section to your configuration file:
-
-    rr {
-	name = news;
-	cname = nntp2.myisp.com;
-	owner = localhost;
-    }
-
- mx=string,number;
- Defines an MX (mail exchange) record. The string is the host name of the mail server in dotted notation (see name). - The number specifies the preference level.
- When you send mail to someone, your mail typically goes from your E-mail client to an SMTP server. - The SMTP server then checks for the MX record of the domain in the E-mail address. - For example, with joe@example.com, it would look for the MX record for example.com and find - that the name of mail server for that domain is, say, mail.example.com. - The SMTP server then gets the A record for mail.example.com, and connects to the mail server.
- If there are multiple MX records, the SMTP server will pick one based on the preference level - (starting with the lowest preference number, working its way up).
- Don't define MX records with pdnsd unless you know what you're doing. -
- owner=string;
- or
- ns=string;
- Defines an NS (name server) record. Specifies the name of the host which should be authoritative for the records - you defined in the rr section. This is typically the host pdnsd runs on.
- Note: In previous versions of pdnsd this option had to be specified before - any a, ptr, cname, mx or soa entries. - In version 1.2, the restrictions on this option are same as the options just mentioned, - and it must listed after the name= option. - This can be a pain if you want to use an old config file which specifies owner= - before name= (sorry about that). - Apart from greater consistency, the advantage is that you can now specify as many NS records as you like (including zero). -
- soa=string,string,number,timespec,timespec,timespec,timespec;
- This defines a soa (start of authority) record. The first string is the - domain name of the server and should be equal to the name you specified as - owner.
- The second string specifies the email address of the maintainer of the name - server. It is also specified as a domain name, so you will have to replace the - @ sign in the name with a dot (.) to get the name you have to specify here. - The next parameter (the first number) is the serial number of the record. You - should increment this number if you change the record.
- The 4th parameter is the refresh timeout. It specifies after what amount - of time a caching server should attempt to refresh the cached record.
- The 5th parameter specifies a time after which a caching server should attempt - to refresh the record after a refresh failure.
- The 6th parameter defines the timeout after which a cached record expires if it - has not been refreshed.
- The 7th parameter is the ttl that is specified in every rr and should be the - same as given with the ttl option (if you do not specify a ttl, use the default 86400). -
- txt=string,...,string;
- New in version 1.2.9: - Defines an TXT record. You can specify one or more strings here. -
-
-

2.1.4 neg Section

- Every neg section specifies a dns resource record or a dns domain that should be - cached negatively locally. Queries for negatively cached records are always answered - immediatley with an error or an empty answer without querying other hosts as long - as the record is valid. The records defined with neg sections remain - valid until they are explicitely invalidated or deleted by the user using - pdnsd-ctl.
- This is useful if a certain application asks periodically for nonexisting hosts or - RR types and you do not want a query to go out every time the cached record has - timed out. Example: Netscape Communicator will ask for the servers news and mail - on startup if unconfigured. If you do not have a dns search list for your network, - you can inhibit outgoing queries for these by specifying
-
-    neg {
-	name = news;
-	types = domain;
-    }
-    neg {
-	name = mail;
-	types = domain;
-    }
- in your config file. If you have a search list, you have to repeat that for any - entry in your search list in addition to the entries given above!
- In versions 1.1.11 and later, if you negate whole domains this way, all subdomains - will be negated as well. Thus if you specify
- neg {name=example.com; types=domain;} in the - config file, this will also negate www.example.com, xxx.adserver.example.com, etc. -

- - - - - - - - - - -
- name=string;
- Specifies the name of the domain for which negative cache entries are created. - This option must be specified before the types option. - Names are interpreted as absolute domain names (i.e. pdnsd - assumes they end in the root domain). - You need to specify domain names in dotted notation (example venera.isi.edu.).
- Previous versions of pdnsd - required that domain names given in the configuration file ended in a - dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a - dot at the end if it is missing. -
- ttl=timespec;
- Specifies the ttl (time to live) for all resource records in this section after this entry. - This may be redefined. The default is 86400 seconds (=1 day). -
- types=(domain|rr_type[,rr_type[,rr_type[,...]]]);
- Specifies what is to be cached negatively: domain will cache the whole - domain negatively; alternatively, you can specify a comma-separated list of RR types - which are to be cached negatively. You may specify multiple types options, but - domain and the RR types are mutually exclusive.
- The RR types are specified using their official names from the RFC's in capitals, - e.g. A, CNAME, NS, PTR, MX, - AAAA, ...
- The command pdnsd-ctl list-rrtypes will give you a complete list - of those types. pdnsd-ctl is built along with pdnsd - and will be installed in the same directory as the pdnsd binary during make install. -
-
-

2.1.5 source Section

- Every source section allows you to let pdnsd read the records from a file in an - /etc/hosts-like format. pdnsd will generate records to resolve the entries - address from its host name and vice versa for every entry in the file. This is - normally easier than defining an rr for every of your addresses, since localhost - and your other FQDNs are normally given in /etc/hosts.
- The accepted format is as follows: The #-sign initiates a comment, the rest of - the line from the first occurence of this character on is ignored. Empty lines - are tolerated.
- The first entry on a line (predeceded by an arbitrary number of tabs and spaces) - is the IP in dotted notation, the second entry on one line (separated by the - first by an arbitrary number of tabs and spaces) is the FQDN (fully qualified - domain name) for that ip. The rest of the line is ignored by default (in the original - /etc/hosts, it may contain information not needed by pdnsd). -

- - - - - - - - - - - - - - - - -
- owner=string;
- Specifies the name of the host pdnsd runs on and that are specified in dns - answers (specifically, nameserver records). - Must be specified before any file entries.
- Names are interpreted as absolute domain names (i.e. pdnsd - assumes they end in the root domain). - You need to specify domain names in dotted notation (example venera.isi.edu.).
- Previous versions of pdnsd - required that domain names given in the configuration file ended in a - dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a - dot at the end if it is missing. -
- ttl=timespec;
- Specifies the ttl (time to live) for all resource records in this section after - this entry. This may be redefined. The default is 86400 seconds (=1 day). -
- file=string;
- The string specifies a file name. For every file entry in a source section, - pdnsd will try to load the given file as described above. Failure is indicated - only when the file cannot be opened, malformed entries will be ignored. -
- serve_aliases=(on|off);
- If this is turned on pdnsd will serve the aliases given in a hosts-style file. - These are the third entry in a line of a hosts-style file, which usually give a "short name" for the host. - This may be used to support broken clients without a proper domain-search option. - If no aliases are given in a line of the file, pdnsd behaves as without this option for this line.
- This feature was suggested by Bert Frederiks.
- It is off by default. -
- authrec=(on|off);
- If this is turned on, pdnsd will create authoritative local records with the data from the hosts file. - Please see the description of the option of the same name in the rr section for a closer description of - what this means. Please note that this only has an effect for files sourced with file options - subsequent to this option.
- This is on by default. -
-
-

2.1.6 include Section

- A configuration file may include other configuration files. - However, only the top-level configuration file may contain global - and server sections, - thus include files are effectively limited to sections that add local definitions to the cache.
- Include sections currently only have one type of option, which may be given multiple times within a single section. -

- - - - -
- file=string;
- The string specifies a file name. For every file option in an include section, - pdnsd will parse the given file as described above. The file may contain include sections itself, - but as a precaution pdnsd checks that a certain maximum depth is not exceeded to guard against - the possibility of infinite recursion. -
-
-

3 pdnsd-ctl

-

- pdnsd-ctl allows you to configure pdnsd at run time. To make this work, you have to start pdnsd with the -s - option (or use the status_ctl option in the config file). You also should make sure that you - have appropriate permissions on the control socket (use the ctl_perms option to make this sure) and of your pdnsd - cache directory (pdnsd keeps its socket there). Please make sure the pdnsd cache directory is not writeable for untrusted users!

-

- pdnsd-ctl accepts two command-line options starting with a dash.
- -c may be used to specify the cache directory (and takes this as argument). - The default for this setting is the pdnsd default cache directory (specified at compile time). - The cache directory for pdnsd-ctl must be the same pdnsd uses!
- -q can be used to make the output of pdnsd-ctl less verbose.

-

- The following table lists the commands that pdnsd-ctl supports. The command must always be - the first command-line option (not starting with a dash), the arguments to the command must follow in the given order.
- In the following table, keywords are in a normal font, while placeholders are in italics.
- Alternatives are specified like (alt1|alt2|alt3). - Optional arguments are placed between square brackets [].

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CommandArgumentsDescription
helpPrint a command summary.
versionPrint version and license info.
status - Print a description of pdnsd's cache status, thread status and configuration. - Also shows which remote name servers are assumed to be available. -
server(index|label)  (up|down|retest)  [dns1[,dns2[,...]]] - Set the status of the server with the given index or label (where the given label - matches the one given with the label option in the respective server section in the config file) - to up or down, or force a retest. The index is assigned in the order of definition in - pdnsd.conf starting with 0. Use the status command to view the indices and labels. - You can specify all instead of an index or label to perform the action for all - servers registered with pdnsd. Example:
- pdnsd-ctl server 0 retest
- An optional third argument consisting of a list of IP addresses (separated by commas or - white-space characters) can be given. - This list will replace the previous list of addresses of name servers used by pdnsd in the - specified section of the config file. - For example in the /etc/ppp/ip-up script called by pppd you could - place the following line:
- pdnsd-ctl server isplabel up $DNS1,$DNS2
- If white space is used to separate addresses the list will have to be quoted. - Spurious commas and white-space characters are ignored. - The last argument may also be an empty string, in which case the existing IP addresses are - removed and the corresponding server section becomes inactive. -
recordname  (delete|invalidate) - Delete or invalidate the records of the given domain name if it is in the - cache. Invalidation means that the records are marked as timed out, and - will be reloaded if possible (if purge_cache is set to on, they will - be deleted in any case).
- For local records (i.e., records that were given in the config file - using a rr section, records read from a hosts-style file - and records added using pdnsd-ctl), invalidation has no effect. Deletion - will work, though. Example:
- pdnsd-ctl record localhost. delete -
sourcefn  owner  [ttl]  [(on|off)]  [noauth] - Load a hosts-style file. Works like using the pdnsd - source configuration section. - owner and ttl are used as in the source section. ttl has a default - of 900 (it does not need to be specified). The next to last argument corresponds - to the serve_aliases option, and is off by default (i.e. if it is not specified). - noauth is used to make the domains non-authoritative - please see - the description of the authrec config file options for a description of what - that means. - fn is the filename. The file must be readable by pdnsd! Example:
- pdnsd-ctl source /etc/hosts localhost. 900 off -
adda  addr  name  [ttl]  [noauth] - Add a record of the given type to the pdnsd cache, replacing existing - records for the same name and type. The 2nd argument corresponds - to the value of the option in the rr section that is named like - the first argument: a is a record for hostname-to-address mapping, - aaaa is the same thing for IPv6 addresses, and ptr is for address-to-hostname - mapping. See the documentation for the rr section for more details. - In case of A and AAAA records, the addr argument may be a list of IP addresses, - separated by commas or white space, causing multiple addresses to be defined - for the same name. - The ttl is optional, the default is 900 seconds. - noauth is used to make the domains non-authoritative - please see - the description of the authrec config file options for a description of what - that means. - If you want no other record than the newly added in the cache, do
- pdnsd-ctl record name delete - before adding records. This is also better when overwriting local records. Example:
- pdnsd-ctl add a 127.0.0.1 localhost. 900 -
addaaaa  addr  name  [ttl]  [noauth]
addptr  host  name  [ttl]  [noauth]
addcname  host  name  [ttl]  [noauth]
addmx  host  name  pref  [ttl]  [noauth]
addns  host  name  [ttl]  [noauth]
negname  [type]  [ttl] - Add a negatively cached record to pdnsd's cache, replacing existing - records for the same name and type. If no type is given, the whole - domain is cached negatively. For negatively cached records, errors are - immediately returned on a query, without querying other servers first. - The ttl is optional, the default is 900 seconds.
- You can get a list of all types you can pass to this command using - pdnsd-ctl list-rrtypes. The type is treated case-sensitive! - Example:
- pdnsd-ctl neg foo.bar A 900
- pdnsd-ctl neg foo.baz 900
-
config[filename] - Reload pdnsd's configuration file.
- The config file must be owned by the uid that pdnsd had when it was - started, and be readable by pdnsd's run_as uid. If no file name is - specified, the config file used at start-up is reloaded.
- Note that some configuration changes, like the port or IP address pdnsd listens on, - cannot be made this way and you will receive an error message. - In these cases, you will have to restart pdnsd instead. -
includefilename - Parse the given file as an include file, see the documentation on - include sections for a description - what this file may contain.
- This command is useful for adding definitions to the cache without reconfiguring pdnsd. -
evalstring - Parse the given string as if it were part of pdnsd's configuration file. - The string should hold one or more complete configuration sections. - However, global and - server sections are not allowed, - just as in include files. - If multiple strings are given, they will be joined using newline chars - and parsed together.
- This command is useful for adding records interactively to the cache - that cannot be defined using the "pdnsd-ctl add" command, - (e.g. soa records). -
empty-cache[[+|-]name ...] - If no arguments are provided, the cache will be completely emptied, - freeing all existing entries. - Note that this also removes local records, as defined by the config file. - To restore local records, run "pdnsd-ctl config" or - "pdnsd-ctl include filename" immediately afterwards.
- The "pdnsd-ctl empty-cache" command now accepts additional arguments; - these are interpreted as include/exclude names. If an argument starts with a '+' - the name will be included. If an argument starts with a '-' it will be - excluded. If an argument does not begin with '+' or '-', a '+' is - assumed. If the domain name of a cache entry ends in one of the names in - the list, the first match will determine what happens. If the matching - name is to be included, the cache entry is deleted, otherwise not. - If there are no matches, the default action is not to delete. - Note that if you want to delete exactly one name and no others, you should - use "pdnsd-ctl record name delete", - this is also much more efficient.
- Examples:
- pdnsd-ctl empty-cache
- This command will remove all cache entries.
-
- pdnsd-ctl empty-cache microsoft.com msft.net
- This will remove all entries ending in microsoft.com or msft.net.
-
- pdnsd-ctl empty-cache -localdomain -168.192.in-addr.arpa .
- This will remove all entries except those ending in localdomain or - 168.192.in-addr.arpa. Note that '.' is the root domain which matches any - domain name. -
dump[name] - Print information stored in the cache about name. - If name begins with a dot and is not the root domain, information about - the names in the cache ending in name (including name without - the leading dot) will be printed. - If name is not specified, information about all the names in the cache will - be printed.
- For each RR record the time and date that this record has been added to the cache - will be printed in the form mm/dd HH:MM:SS (locally defined records are printed without a time stamp). - After that the type of record is printed with the data. For the more common types - of RR records the data will be printed in human readable form, the remaining ones in a - hexadecimal representation.
- This command is mainly useful for diagnostic purposes.
- Note that if you pipe the output of this command through an application that - reads only part of the output and then blocks (such as more or less), - pdnsd will not be able to add new entries to the cache until the pipe is closed. - It is preferable to capture the output in a file in such a case. -
list-rrtypes - List available rr types for the neg command. - Note that those are only used for the neg command, not for add! -
-
-
-

4 contrib/

- The contrib directory in the pdnsd distribution contains useful user-contributed scripts.
- So far, there are scripts contributed by Marko Stolle and Paul Rombouts that make pdnsd - usable in a DHCP setup. - Please take a look into the README file in the contrib directory for further information. -
-
-

5 Problems...

- If you have problems with configuring or running pdnsd, be sure to read the FAQ. - If this does not help you, pdnsd crashes or you find bugs, please mail one of the authors.
- Note added by Paul A. Rombouts: - Thomas Moestl no longer maintains the code. I have revised the code and added new features. - See README.par and the - ChangeLog in the source directory - (or /usr/share/doc/pdnsd-<version> if you have installed a binary package) - for more details. - If you have questions about my modifications, you can find my email address at the end of - README.par. -
-
-

6 Hacking

- Here comes some information you might find useful for hacking pdnsd. -
-

6.1 Source files

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Makefile.am, configure.in, acconfig.h - autoconf/automake/autoheader scripts. Makefile.am's are in most subdirectories. -
pdnsd.spec.in - A template from which configure generates a spec file for building rpm's for various - distributions. -
version - Contains only the program version string. Needed for several templates. -
src/rc/* - rc (start-up) scripts for various linux distributions. -
src/cache.c - The pdnsd cache subsystem(s) as defined in src/cache.h. - This is the "traditional" pdnsd system which keeps the cache in memory and uses hash tables for accesses. - Sourav K. Mandal is working on a system using gdbm. -
src/pdnsd-ctl/* - Contains the code for pdnsd-ctl, a program that allows you to control pdnsd at run time. -
src/conf-lex.l.in - The lex/flex source file for the config file lexer. This is a template because there might be - inserted "%option yylineno" for proper flex support. - (obsolete, superseded by src/conf-parser.c) -
src/conf-lex.l - This is automatically generated by configure from conf-lex.l.in. It may be overwritten - in any make, so never modify this, but conf-lex.l.in instead! - (obsolete, superseded by src/conf-parser.c) -
src/conf-parse.y - The yacc/bison source of the config file parser. - (obsolete, superseded by src/conf-parser.c) -
src/conf-parser.c, src/conf-parser.h, src/conf-keywords.h - The config file parser written purely in C (versions 1.1.10-par and later). -
src/conff.c, src/conff.h - The configuration handler functions and their prototypes. The parser is called from here. -
src/consts.h - Some constants used by the parser, config file handler functions and in the server status thread, - among others. -
src/dns.c, src/dns.h - Define dns message structures, constants, and some common dns data handlers. dns.h contains gcc-specific - code (in praticular, "__attribute__((packed))"). -
src/dns_answer.c, src/dns_answer.h - Define functions that answer incoming dns queries. -
src/dns_query.c, src/dns_query.h - Define functions to manage outgoing dns queries. -
src/error.c, src/error.h - Functions for error output to stderr or the syslog, and debug output to stderr or pdnsd.debug. -
src/hash.c, src/hash.h - Contains the code for storing and looking up cache entries in the hash table. -
src/helpers.c, src/helpers.h - Define miscellaneous helper functions. -
src/icmp.c, src/icmp.h - Define a function for performing a ping test. This contains OS-specific code. -
src/main.c - Contains main(), which holds the command line parser, performs initialisations and signal handling. -
src/make_hashconvtable.c - Contains the code for the executable make_hashconvtable, which is only run once, during build time, to generate the file hashconvtable.h, used by src/hash.c (versions 1.1.10-par and later). - (obsolete since version 1.2) -
src/make_rr_types_h.pl - A perl script for generating src/rr_types.h, - a C header file containing macro definitions and tables needed for handling the - RR types known to pdnsd, from the text file src/rr_types.in. -
src/rr_types.c, src/rr_types.h, src/rr_types.in - These define tables and macros needed for handling the RR types known to pdnsd. - Since version 1.2.9, rr_types.h is an automatically generated file, - see make_rr_types_h.pl. -
src/netdev.c, src/netdev.h - Define functions for network device handling. OS-specific. -
src/servers.c, src/servers.h - Define functions for the server status thread that performs the periodical uptests. -
src/status.c, src/status.h - Define functions for the status control thread. This is pdnsd's interface to pdnsd-ctl. -
- -
-
-
- Copyright (C) 2000, 2001 Thomas Moestl
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2012 Paul A. Rombouts -
-

- Last revised: 19 April 2012 by Paul A. Rombouts -

- - diff --git a/jni/pdnsd/doc/html/doc_makefile b/jni/pdnsd/doc/html/doc_makefile deleted file mode 100644 index 28fb7d50..00000000 --- a/jni/pdnsd/doc/html/doc_makefile +++ /dev/null @@ -1,23 +0,0 @@ - -versionfile = ../../version -arch = i686 -arch2 = x86_64 -extver = _sl6 -system = Scientific Linux 6.2 system - -doc: dl.html -.PHONY: doc clean - -# If the existing dl.html contains '???', then certain packages were missing -# during the previous build and dl.html needs to be built again. -ifneq ($(shell grep -F -l -e '???' dl.html),) -.PHONY: dl.html -endif - -dl.html: %.html: %.html.in htmlsubst.pl $(versionfile) - perl htmlsubst.pl version=`cat $(versionfile)` \ - baseurl='http://members.home.nl/p.a.rombouts/pdnsd/' \ - arch=$(arch) arch2=$(arch2) extver=$(extver) system="$(system)" $< > $@ - -clean: - @rm -fv dl.html diff --git a/jni/pdnsd/doc/html/faq.html b/jni/pdnsd/doc/html/faq.html deleted file mode 100644 index eec65993..00000000 --- a/jni/pdnsd/doc/html/faq.html +++ /dev/null @@ -1,412 +0,0 @@ - - - - The pdnsd FAQ - - - - - - - - - - - - - - -
- pdnsd Homepage - - pdnsd FAQ - - Documentation - - GNU GPL (pdnsd's License) - - Download Section -
- -

The pdnsd FAQ

- - - - - - - - - - -
Q: - There are complete and well-tested name servers around, such as the BIND. - These do also perform caching. Why should I use pdnsd? -
A: - pdnsd does not aim to be a complete name server implementation, such as the - BIND. It is optimized for caching, and you can only specify a small subset of all - dns record types pdnsd knows in your local "zone" definitions. - This of course reduces the code size drastically, and such the memory footprint. - There are some features especially interesting for dialin networks, ordinary - (non-server) internet hosts and computers that are often not connected to - to their network, e.g. notebooks (I originally wrote this program for use - with my notebook). - These features are: -
    -
  • permanent disk cache (useful for frequent power-offs/reboots) -
  • usually smaller memory footprint (depends on cache size) (see next question) -
  • offline-detection prevents hangs (e.g. the typical hang on startup of some - Netscape Navigator versions if not dialled in) -
  • better control about timeouts (also to prevent hangs) -
  • better control over the cache -
  • better run-time control -
-
-
- - - - - - - - - - -
Q: - When I look at the process size with ps, top, gtop, or a similar tool, I see - some processes with a total size well above 3.5 MB. This is much more than - e.g. BIND named (about 1.4 MB). Why? -
A: - Really, it is not. - pdnsd uses multithreading, not multiprocessing. That means that the processes - share most of their process space. In the LinuxThreads library - or NPTL (Native Posix Thread Libary), - which are used by pdnsd on Linux, in fact the total process address space is shared - (although the processes have different stacks, these are in one process - address space). You may check this by looking at the at the process sizes of - the pdnsd threads: all should be the same. The effective size that pdnsd - occupies is thus the size of any of the processes, not the sum of those. - So, pdnsd with empty cache occupies about 800 kB, and the maximum size - should be about the cache size plus this size (in fact, ca 5-10% more). -
-
- - - - - - - - - - -
Q: - What do I need the status control (option -s) for? -
A: - It enables you to do some things you might or might not need. With it, you can: -
    -
  • query pdnsd's settings at runtime to debug configuration files and - see which servers are regarded to be available -
  • mark servers as available or unavailable, or force a status retest - very - handy if you want to control which servers pdnsd queries, e.g for muliple - dial-up accounts -
  • delete, invalidate or add DNS records - useful e.g. when you want to build - records for dynamically assigned IP addresses or domain names -
  • reload pdnsd's configuration file without restarting pdnsd -
  • print information about the contents of pdnsd's cache. -
-
-
- - - - - - - - - - -
Q: - What do I need local records (rr- and source-sections in the config file) for? -
A: - Some resolver programs, e.g. nslookup, want to look up the name of the - server they are using before doing anything else. This option is for defining - a PTR record for your IP such that those programs get an answer even if the - name server you are caching is not available or does not offer these records. - By extension, you may also define A and SOA records. This allows you to build - very small zones without having to use a "big" name server. It is NOT - intended to replace such a complete server in anything but VERY small - networks. Alternatively, you may start a named on another host or on the - same host on another port and cache it with pdnsd in addition to other (more - distant) name servers. -
- The source section allows you to let pdnsd read in your - /etc/hosts file on startup and serve its contents. This file is used by your local - resolver before it even tries the name servers and usually contains - fully-qualified domain names (FQDNs) for all of the internet addresses your host has. - If you source this file, you usually won't need any additional rr sections. Sourcing it also allows - other hosts (eg. in your local network) to access the names defined in your - hosts file. You can of course just add other hosts in your local network to the - servers hosts file, thus making them known to your server's resolver - and pdnsd (if you sourced that file). -
- If you don't know what this answer was all about, you should just take the - source section in the sample config file that comes with pdnsd, copy it - into your config file and forget about it. -
-
- - - - - - - - - - -
Q: - When compiling, I get an error message like
Please define __BYTE_ORDER to - be __LITTLE_ENDIAN or __BIG_ENDIAN
What's up? -
A: - Normally, this macros should be defined in your C library's header files. - There are two different methods, most C libraries support both (and pdnsd - honors both): either __BYTE_ORDER is set to __LITTLE_ENDIAN - or __BIG_ENDIAN, or __LITTLE_ENDIAN or __BIG_ENDIAN - are directly defined as macros. -
- Linux glibc, for example, does set those macros correctly. Never mind. You just have to know - whether your machine is little-endian or big-endian, this means wheter your - machine saves the least significant byte of a word or double-word first in memory (little-endian) or - the most significant first (big-endian). - All intel x86 and Alpha machines are little-endian, for example, while SPARC - and PowerPC architectures are big-endian. - If your machine is little-endian, add the following line to your config.h: -
- #define __BYTE_ORDER __LITTLE_ENDIAN -
- Likewise, if your machines byte order is big-endian: -
- #define __BYTE_ORDER __BIG_ENDIAN -
- Pathological byte orders like pdp-endian are not yet supported really; - However, for the place the endianess is needed, __LITTLE_ENDIAN should do - (it deals only with 16 bits; for all other occurances, ntoh[sl]/hton[sl] is used). -
-
- - - - - - - - - - -
Q: - At startup, I get a warning saying:
- - Uptest command [...] will implicitly be executed as root -
- What does that mean? -
A: - This warning only occurs if you use the uptest=exec option in your - configuration. It means that the uptest command is run as root - because pdnsd is running as root, and this was not explicitely specified. - The idea is that it may introduce security holes (in the programs being run) - when they run as root, and so they shouldn't do that if possible. - You can specify the user that shall run the command by appending its name - comma-separated as string to the uptest_cmd line:
- - uptest_cmd="<your command>","<user>"; -
- If it is correctly running as root, just append the user string "root" to - the command and the warning will not occur again. -
-
- - - - - - - - - - -
Q: - I cannot run my uptest_cmd command as root (it says permission denied), - although the pdnsd executable is setuid root. Why? -
A: - pdnsd will drop privileges gained through setuid/setgid before executing the - uptest commands (you shouldn't set the pdnsd executable setuid/setgid anyway). - The reason is clear: if you install the pdnsd - executable as setuid root and this wouln't be done, any user could execute - shellcode with root privileges using that option! -
-
- - - - - - - - - - -
Q: - At startup, I get an error saying:
- - Bad config file permissions: the file must be only writeable by the user -
- Why is that? -
A: - pdnsd has an option (uptest=exec) that allows the execution of arbitrary - shell code (for testing whether an interface is up). This must be - of course secured against unauthorized use. One of these - protection is the one that produces the error message: if you routinely run - pdnsd, e.g. at system startup, and your config file is editable for others, - someone could change it and insert shell code that is executed in the next - pdnsd run -- with your user privileges! To prevent this, pdnsd will exit if the config file is writeable - by others than the owner. - To get rid of this message, just do
- - chmod go-w <filename> -
- on your config - file (for the default file: chmod go-w /etc/pdnsd.conf). - You should also check that the ownership is set correct. -
-
- - - - - - - - - - -
Q: - serve_aliases does not seem to work. -
A: - Some resolvers (e.g. of the glibc 2.1) seem sometimes not to look up unmodified names, but the names with - an entry of the search path already appended. Since pdnsd will serve short names with this - option anyway, you can delete the search an domain options from your /etc/resolv.conf. This is reported to - work in some cases. -
-
- - - - - - - - - - -
Q: - Some queries for domains that have many records (e.g. www.gmx.de) fail mysteriously. -
A: - pdnsd versions prior to 1.1.0 had the tcp server thread disabled by default. Most resolvers - repeat their query using tcp when they receive a truncated answer (the answer is truncated - when it exceeds a length of 512 bytes). You need to recompile pdnsd with the option - --enable-tcp-server to fix this. -
-
- - - - - - - - - - -
Q: - I am behind some kind of firewall. In the configuration file - I have only listed addresses of name servers on the local (ISP's) network, - but pdnsd is slow and DNS queries frequently time out. -
A: - In some cases pdnsd will not consider the answer of the local name server - authoritative enough, and will try to get answers from the name servers listed in the - authority section of the reply message. If pdnsd is behind a firewall that blocks the - UDP reply packets from remote name servers, pdnsd will wait in vain for a reply. - One solution is to set proxy_only=on - in the servers sections of the configuration file. - This will prevent pdnsd from querying name servers that are not listed in the configuration - file. - Another solution that can be tried is specifying - query_method=tcp_only - in the global section of the configuration file, because a firewall that blocks - UDP packets from outside might still allow outgoing TCP connections to port 53. -
-
- - - - - - - - - - -
Q: - Is pdnsd vulnerable to DNS cache poisoning as described in - CERT vulnerability note VU#800113? -
A: - Short answer: Yes.
- Somewhat longer answer: The problem is not so much that pdnsd's implementation is flawed - but rather that the DNS protocol currently being used is fundamentally flawed from - a security viewpoint. As long as a more secure protocol is not in place, - all that the developers of pdnsd can do is to try to tweak the current implementation - to make it as difficult as possible for an attacker to succeed.
- From version 1.2.7 onwards, the default for the query_port_start option - is 1024, which means that the pdnsd resolver will randomly select source ports - in the range 1024-65535. (In previous versions the default was to let the kernel select - the source ports, which will often result in a more or less predictable sequence of ports.) - It also helps to use a good quality source of random numbers. On platforms where this is - supported, it is preferable to configure with --with-random-device=/dev/urandom. - There is still more that can be done to make pdnsd less vulnerable, but this remains - (as of this writing) a work in progress. -
- Please note that pdnsd was designed for small (private) networks, and that it is generally - not recommended to let untrusted users access pdnsd. -
- -
-
Thomas Moestl - and Paul Rombouts -
-
-

- Last revised: 18 August 2008 by Paul Rombouts -

- - - diff --git a/jni/pdnsd/doc/html/htmlsubst.pl b/jni/pdnsd/doc/html/htmlsubst.pl deleted file mode 100644 index a9e3e9ff..00000000 --- a/jni/pdnsd/doc/html/htmlsubst.pl +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/perl -w - -# Primitive ad-hoc script for updating pdnsd html doc files. -# Written by Paul Rombouts. - -use strict; -use integer; -use POSIX qw(strftime); - -my %paramvals=(); - -while(@ARGV && $ARGV[0]=~/^([^=]*)=(.*)$/) { - my $param=$1; my $val=$2; - if($param =~ /^[[:alpha:]]\w*$/) { - $paramvals{$param}=$val; - } - else {warn "Warning: invalid parameter '$param' ignored.\n"} - shift @ARGV; -} - -sub sizeof { - my($arg)=@_; - (my $str= $arg) =~ s/\$(?:([[:alpha:]]\w*)\b|\{([[:alpha:]]\w*)\})/ - defined($paramvals{$+})?$paramvals{$+}:defined($ENV{$+})?$ENV{$+}:''/eg; - my $filename=eval($str); - (-f $filename) or return '???'; - (((-s $filename)+1023)/1024).'kB'; -} - -while(<>) { - s/\$(?:date\b|\{date\})/strftime("%d %b %Y",localtime)/eg; - s/\$sizeof\(([^()]*)\)/sizeof($1)/eg; - s/\$(?:([[:alpha:]]\w*)\b|\{([[:alpha:]]\w*)\})/ - defined($paramvals{$+})?$paramvals{$+}:defined($ENV{$+})?$ENV{$+}:''/eg; - print; -} diff --git a/jni/pdnsd/doc/html/index.html b/jni/pdnsd/doc/html/index.html deleted file mode 100644 index d2e426aa..00000000 --- a/jni/pdnsd/doc/html/index.html +++ /dev/null @@ -1,686 +0,0 @@ - - - - pdnsd homepage - - - - - - - - - - - - - - - -
- About pdnsd - - pdnsd FAQ - - Documentation - - GNU GPL (pdnsd's License) - - Download Section -
-

The pdnsd Homepage

-

News

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2012-03-17Version 1.2.9a-par has been released. - Version 1.2.9a fixes a bug in the 1.2.9 release that causes a build failure when pdnsd is - configured with --enable-strict-rfc2181. - If you do not use this option to compile pdnsd, there is no need to upgrade from 1.2.9 to 1.2.9a. -
2012-02-27Version 1.2.9-par has been released. - Version 1.2.9 supports many more RR types (including those necessary for DNSSEC) and - EDNS (Extension mechanisms for DNS) to enable UDP messages larger than 512 bytes. - It also has support for defining local TXT records and has several new options and bugfixes - (including file descriptor leaks that effect FreeBSD users). -
2011-05-03The latest source code is available from a - git repository.
- In response to frequent requests I have uploaded a git tree including the latest code - and a fairly extensive history of pdnsd development to - gitorious.org. - Anyone who wants to participate in pdnsd development is free to create a - clone repo on gitorious.org - and push his modifications there. -
2010-02-22Version 1.2.8-par has been released. - The main new feature of version 1.2.8 is automatic discovery of root servers. - Furthermore, there are some additional improvements in the resolver. -
2008-09-04Version 1.2.7-par has been released. - Foremost, this release fixes some security problems. - It contains a fix for a "dangling pointer" bug that could cause pdnsd to - crash when it received a long reply. It also addresses some of the issues - raised in the CERT - vulnerability note VU#800113 by making the default of - query_port_start equal to 1024, thereby ensuring that source - ports are randomly selected by the pdnsd resolver in the range 1024-65535. - This release also fixes problems with compiling pdnsd for the ARM architecture - and for the Darwin platform (Max OS X). -
- There are a number of (minor) new features. - pdnsd now supports "include" files, essentially configuration files that - only contain definitions for local records. - It is now possible to define interactively, using pdnsd-ctl, - any local record that can be defined in a configuration file. -
2007-09-04Version 1.2.6-par has been released. - pdnsd's license has been upgraded to GPL version 3. - A bug has been fixed which which caused pdnsd to handle NXDOMAIN replies - inefficiently when configured with neg_domain_pol=on. The - code that implements the ping test has been fixed, which was broken for - 64-bit systems. A new option randomize_servers can be used - to give each server in a section of the configuration file an equal - chance of being queried. The new options reject, - reject_policy and reject_recursively make it - possible to check for the presence of certain IP addresses in the - replies of name servers and to avoid some types of unwanted replies. - The pdnsd-ctl 'add a' and 'add aaaa' commands - now allow multiple IP addresses to be specified for the same name. - pdnsd's ability to resolve from root servers has been improved. -
2006-09-02Version 1.2.5-par has been released. - This release introduces a new query method: udp_tcp. - With this method a UDP query is tried first and, if the UDP answer is - truncated, the query is repeated using TCP, which is the behaviour that - seems to be recommended by the DNS standards. There is a new - configuration option use_nss, which can be turned off to - prevent lengthy timeouts and stalls in certain situations. A bug has - been fixed which could cause pdnsd to crash if debug output was - generated before the debug output stream was properly initialized. -
2006-01-09Version 1.2.4-par has been released. - A memory leak and a minor buffer-overflow problem have been fixed. - There is now a fix for some situations that would previously cause pdnsd to - exit prematurely (such as ACPI S3 sleep or trying to attach strace to pdnsd). - Time intervals specified in the configuration file can now be expressed in - minutes, hours, days and weeks as well as seconds. - Support for Apple Mac OS X v10.4 Tiger has been improved. - The "pdnsd-ctl status" command now also provides some - information about the status of the running threads. - There are some further improvements in the debugging information provided by pdnsd.
- TCP-query support is now compiled in by default (but can still be disabled using - the configure option --disable-tcp-queries). -
2005-07-11Version 1.2.3-par has been released. - New feature in this release: the "pdnsd-ctl empty-cache" command can - be provided with an include/exclude list, allowing the user to specify a - selection of names to be removed, instead of emptying the cache completely.
- Additional improvements: pdnsd should now remain responsive while executing the - "pdnsd-ctl empty-cache" command. - With the query_method=tcp_udp option pdnsd will now also - try a UDP query after a TCP connection times out, which should allow - pdnsd to resolve the same names with query_method=tcp_udp - as with query_method=udp_only, although perhaps with an - occasional delay. - "pdnsd-ctl config" or "pdnsd-ctl server" - commands should now run without delays, even if pdnsd is performing - ping or query uptests at the time. - Some problems with resolving certain names using root servers have been fixed. -
2005-04-03Version 1.2.2-par has been released. - The main emphasis of this release is improved portability. - A bug has been fixed that prevented pdnsd from compiling successfully on some - 64 bit architectures. - This release has (experimental) support for the Darwin (Apple Mac OS X) platform. - On Linux systems, the configure script will now try to detect automatically whether - the system implements the Native POSIX Thread Library, but the method used may not - necessarily be foolproof. - In addition, the debug features have been improved and should make it easier to find out - why pdnsd considers some queries or replies malformed. -
2004-11-07Version 1.2.1-par has been released. - The main new feature of this release is improved support for non-Linux platforms.
- This release has (experimental) support for the Cygwin platform, and should also fix - some compilation glitches that have been reported by FreeBSD users. -
2004-10-10Version 1.2-par has been released. - pdnsd is new and improved! Most of the changes effect the internal workings - of pdnsd, but there also a number of interesting new features (well, I think they are interesting).
- Among the bugs fixed are two rather nasty ones which involve the handling of NXT and NAPTR records - and which can cause pdnsd to crash or abort.
- The new features include a new server availability test which can be specified with uptest=query, - support for reading the DNS configuration from resolv.conf files, - a new option for optimizing the use of root servers, - a new option that makes defining local records for reverse resolving easier, - support for defining wildcard records, - a new pdnsd-ctl command for reloading the config file without restarting pdnsd, and - a new pdnsd-ctl command for dumping information about the names stored in the cache. - The documentation has also been updated: there is now a pdnsd.conf man page.
- For a more complete list of the changes I'll have to refer you to README.par and the ChangeLog. -
2004-05-22Version 1.1.11a-par has been released. - This release contains a fix for FreeBSD users that bypasses a problem - with the macro ENONET, which can cause a compilation failure when it is undefined. - Linux users will notice no difference between 1.1.11a-par and 1.1.11-par. -
2004-05-10Version 1.1.11-par has been released. - This version has a rather large number of small changes, which are rather difficult to summarize. - Among the bugs fixed are a race condition in the cache lookup code, a - flaw in the code that caused a busy spin when a remote server answered - with "Not Implemented", and problems with the -4 and -6 command-line - options. Among the improvements are an alternative sorting algorithm - which should allow pdnsd to start up faster when reading a large cache - file from disk, automatic mapping of IPv4 to IPv6 addresses when running - in IPv6 mode, somewhat more efficient memory use, better compression of - the replies and changes in the parallel querying algorithm that should - improve the chances of catching a reply from a remote server.
- - For a more complete list of the changes I'll have to refer you to README.par and the ChangeLog. -
2004-02-10Version 1.1.10-par has been released. - - The main new feature of this release is a new parser for configuration - files, completely rewritten from scratch in C. The main advantages are: - (f)lex and yacc/bison are no longer needed to build pdnsd, more - informative error messages instead of merely "parse error", - and string literals no longer need to be enclosed in quotes in most - cases.
Furthermore, a bug has been fixed that caused incorrect - IPV6-type PTR records to be generated when sourcing - /etc/hosts like files.
- - There have been other small changes, more details can be found in the ChangeLog. -
2004-01-08Version 1.1.9-par has been released. - "maintenance" release by Paul Rombouts.
- - The change of version number is not very significant; the - difference between 1.1.9-par and the previous 1.1.8b1-par8 is marginal. - However, I felt the need to simplify the numbering, because it was - becoming rather baroque.
- - I've added some missing pieces to the documentation (the pdnsd manual and the man page for pdnsd-ctl). BTW, did you - know that it's possible to define aliases for domain names with pdnsd? I - had plans to implement such a feature when I discovered that pdnsd - already supports it. It was just poorly documented. (If want to try this - for your self, look for the new information about CNAME records under - the rr Section in the manual.)
The - changes to the code consist mostly of optimizations, removal of some - size limits due to fixed-size buffers, and some cleaning up. I've also - tried to make the error responses of pdnsd-ctl more helpful.
- - More details can be found in the ChangeLog. -
2003-10-10Version 1.1.8b1-par8 has been released. - "maintenance" release by Paul Rombouts.
- This version introduces a "delegation-only" feature that may be useful - for blocking Verisign's Sitefinder.
- The parser for the configuration file now tolerates domain names missing - a dot at the end.
- I have provided alternative implementations for some GNU extensions that I - used in an effort to make the code more portable. In particular, the - code should build on FreeBSD again.
- More details can be found in the README.par file. -
2003-09-19Version 1.1.8b1-par7 has been released. - "maintenance" release by Paul Rombouts. Besides fixing a number of bugs I have - reworked some of the code for adding and removing entries in the cache in an - effort to improve efficiency and stability.
- More details can be found in the ChangeLog. -
2003-07-28Version 1.1.8b1-par6 has been released. - "maintenance" release by Paul Rombouts. In addition to some further code cleanup, - the documentation has been revised. -
2003-07-10Version 1.1.8b1-par5 has been released. - A troublesome allocation size error has been discovered in Thomas Moestl's code. - In practice this bug only wastes memory but it could - also potentially lead to memory corruption. Upgrading is recommended. - More details can be found in the ChangeLog. -
2003-06-30Version 1.1.8b1-par4 has been released. - Due to incompatibilities between various implementations of - the pthread library on Linux systems, problems can occur with signal handling in - pdnsd. The usual symptom is failure by pdnsd to save the cache to disk, and - /var/cache/pdnsd/pdnsd.cache remaining empty. If you experience - this kind of trouble, try reconfiguring with different values for the new - --with-thread-lib option. The allowable values are - described in the documentation. -
2003-04-07pdnsd is no longer maintained by Thomas Moestl: - I have not had time to maintain pdnsd for quite a while now, and have been very slow to - respond to issues, or did not respond at all. It is time that I officially announce that - pdnsd is no longer actively maintained; I apologize to all those who reported bugs or - asked questions without receiving any reply. However, Paul A. Rombouts has published - a patch set against the last released version at - http://members.home.nl/p.a.rombouts/pdnsd.html, - which cleans up a lot of code fixes many bugs. -
2002-07-19Documentation update. - Please note that pdnsd should never be installed with setuid or setgid attributes, - as it is not always possible to give up all privileges due to operating system restrictions. - While this was never intended and I don't think that anybody would actually do this, the - documentation was updated to explicitely mention this to avoid misunderstandings. -
2002-01-15Version 1.1.7a has been released. - This fixes a reversed test in an assertion that would cause pdnsd to termintate when the ping uptest - was used. No other changes were made. -
2002-01-15Version 1.1.7 has been released. - This fixes some problems that might be remotely exploitable to gain access as the user pdnsd runs as - (an unprivileged user by default). To do this, an attacker needs to control a name server that is - queried by pdnsd, and send a malicious reply to such a query.
- Upgrading is strongly recommended!
- There are also minor bug fixes and stability improvements. -
- -
-

About pdnsd

- pdnsd is a proxy DNS server with permanent caching (the cache contents - are written to hard disk on exit) that is designed to cope with unreachable - or down DNS servers (for example in dial-in networking).
- Since version 1.1.0, pdnsd supports negative caching.
-
- It is licensed under the GNU General Public License (GPL, - also available in html and - translated into various languages.). - This, in short, means that the sources are distributed togehter with the program, and - that you are free to modify the sources and redistribute them as long as you - also license them under the GPL. You do not need to pay anything for pdnsd. - It also means that there is ABSOLUTELY NO WARRANTY for pdnsd or any part - of it. For details, please read the GPL. -

- pdnsd can be used with applications that do DNS lookups, e.g. on startup, and - can't be configured to change that behaviour, to prevent the often minute-long - hangs (or even crashes) that result from stalled DNS queries. Some Netscape Navigator - versions for Unix, for example, expose this behaviour. -

- pdnsd is configurable via a file and supports run-time configuration using the program pdnsd-ctl that comes - with pdnsd. This allows you to set the status flags of servers that pdnsd knows (to influence which servers - pdnsd will query), and the addition, deletion and invalidation of DNS records in pdnsd's cache. -
- Parallel name server queries are supported. This is a technique that allows - querying several servers at the same time so that very slow or unavailable - servers will not block the answer for one timeout interval. -
- Since version 1.0.0, pdnsd has full IPv6 support. -

- There is also a limited support for local zone records, intended for defining - 1.0.0.127.in-addr.arpa. and localhost. , since some clients request that - information and it must be served even if the cached servers are not available - or do not serve these records. pdnsd may also read your /etc/hosts file - (this file is normally used by your local resolver and usually contains - information for localhost as well as for your machines FQDN) and serve its - contents. -

- pdnsd was started on Linux, and has since been ported to FreeBSD (and Cygwin and Darwin). - 90% of the source code should be easily portable to POSIX- - and BSD-compatible systems, provided that those systems support the POSIX threads (pthreads). - The rest might need OS-specific rewrites. -

- Currently, pdnsd is only compileable by gcc. This should be easy to fix, but I just - do not have documentation for other compilers. If you are not able or do not want - to use gcc, I would recommend you just try to do the minor changes. -

-

- pdnsd must be started as root in some cases (raw sockets are needed for icmp - echoes for the option uptest=ping, and the default port is 53, this must be - >1024 to allow non-root execution). However, pdnsd can be configured to change it's user - and group id to those of a non-privileged user after opening the sockets needed for this. -

- The server should support the full standard DNS queries following the rfcs 1034 - and 1035. As of version 1.0.0, the rfc compliance has been improved again, and pdnsd is now - believed (or hoped?) to be fully rfc-compatible. It completely follows rfc 2181 (except - for one minor issue in the FreeBSD port, see the documentation). - It does not support the - following features, of which most are marked optional, experimental or obsolete - in these rfcs: -

-
    -
  • Inverse queries -
  • Status queries -
  • Completion queries -
  • Namespaces other than IN (Internet) -
  • AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain zones, that should not violate the standard -
- The following record types, that are extensions to the original DNS standard, are supported for caching since version 1.2.9 - (if you do not need most of them, you can disable runtime support for the unneeded ones before compiling pdnsd and save a little cache and executable space, see the source file src/rr_types.in): -
    -
  • RP (responsible person, RFC 1183) -
  • AFSDB (AFS database location, RFC 1183) -
  • X25 (X25 address, RFC 1183) -
  • ISDN (ISDN number/address, RFC 1183) -
  • RT (route through, RFC 1183) -
  • NSAP (Network Service Access Protocol address , RFC 1348) -
  • PX (X.400/RFC822 mapping information, RFC 1995) -
  • GPOS (geographic position, deprecated) -
  • AAAA (IPv6 address, RFC 1886) -
  • LOC (location, RFC 1876) -
  • EID (Nimrod EID) -
  • NIMLOC (Nimrod locator) -
  • SRV (service record, RFC 2782) -
  • ATMA (ATM address) -
  • NAPTR (URI mapping, RFC 2168) -
  • KX (key exchange, RFC 2230) -
  • CERT (Certificate record, RFC 4398) -
  • DS (Delegation Signer, RFC 4034) -
  • RRSIG (Resource Record Signature, RFC 4034) -
  • NSEC (Next Secure, RFC 4034) -
  • DNSKEY (record containing the public key for a zone, RFC 4034) -
  • NSEC3 (Next Secure version 3, RFC 5155) -
  • NSEC3PARAM (NSEC3 parameters, RFC 5155) -
-

- Note: This list is incomplete. For the complete list see the source file src/rr_types.in. -

- There are FreeBSD and OpenBSD ports available for pdnsd (ports/net/pdnsd for both). - Thanks go to Roman Shterenzon for the FreeBSD port Sebastian Stark for the OpenBSD one! - Thanks to Kiyo Kelvin Lee now also runs on the Cygwin platform! - Thanks goes to Rodney Brown for extending portability to the Darwin (Apple Mac OS X) platform! -

- If you have questions left, you should take a look into the FAQ. -
- Bugfixes, patches and compatability fixes for other OSs are very welcome! -

-

Features in detail

-

- This section describes some of pdnsds features in detail. Most of the options are set - in the config file. For more information on the configuration file, see - the documenation page. -


- -

Uptests

- pdnsd provides several methods to test whether a remote DNS server should be regarded as available - (so that pdnsd can query it), in - addition to the obvious "none" test (the server is always regarded as available, - or availability is set on or off using the pdnsd-ctl utility). - These tests are: -
    -
  • ping: a given adress is ping'ed in a given interval. If it there is no response - or the host is unreachable, the server is seen to be not available (for those who don't know: - pinging is sending a certain Internet packet type to a host to which any standard-conformant - host is required to reply). -
  • if: a given network interface is tested whether it is existent, up and running. If - it is not, the server is regarded to be not available. This is especially useful for ppp and - similar interfaces. A special case test for Linux isdn (ippp*) interfaces is integrated, so that the uptests - should also work for these. -
  • dev: this is a variant of the if uptest for use with Linux dial-on-demand ppp interfaces. In addition - to performing an if-style interface uptest, it also tests whether a specified program (e.g. pppd) owns - a lock to a given (modem-) device. -
  • exec: a given shell command line is executed and the exit status of the whole command line (which - is normally the exit status of the last command) is evaluated. If it is not zero, the server is regarded - to be not available. This is a very flexible testing method with which it should be able to perform - virtually any needed test. -
  • query: New in version 1.2: - This works like the ping test, except it sends an (empty) DNS query to the remote server. - If the server sends a well-formed response back within the timeout period (except SERVFAIL), - it will be regarded as available. - This test is useful if a remote server does not respond to ICMP_ECHO requests at all, - which unfortunately is quite common these days. - In many cases this test will be a more reliable indicator of availability - than the ones mentioned above. -
-
-

Local Records ("Zones")

- As mentioned above, there are only very basic local record types (ie the record types that you may use in record - declarations in your local configuration for records that pdnsd shall serve in addion to the cached ones). - They are organized roughly in zones but have not complete zone declarations, so I generally do not use the - term "zone" for them, but rather "local records". - These are the local record types pdnsd can understand: -
    -
  • SOA (information about the name server) -
  • A (domain-name-to-address mapping) -
  • PTR (pointer, used normally for address-to-domain-name mapping) -
  • NS (name server, generated automatically by pdnsd for any local record set) -
  • CNAME (canonical host name) -
  • MX (mail exchange for the domain) -
  • TXT (arbitrary text strings, often used for Sender Policy Framework) -
- You can specify these records in the configuration file.
- You may "source" a file in a format like that used in the /etc/hosts file, that means - that pdnsd reads this file, extracts addresses and domain names from it and automatically generates - A records for name to address mapping, PTR records for address to name mapping and NS records (name - server specifiation) for each entry in the file.
- Records can also be changed dynamically at run time.
- A script contributed by Marko Stolle makes pdnsd usable in a DHCP setup using this feature. -
-

System requirements

- As mentioned, pdnsd currently runs under Linux, FreeBSD and Cygwin. - Other BSD flavours may or may not work (feedback is very welcome!). - The system and software requirements under Linux are: -
    -
  • Kernel version >2.2.0 -
  • glibc version >2.0.1 (aka libc6) with LinuxThreads (normally included) - or NPTL (Native Posix Thread Library, recommended).
    - Due to a bug, pdnsd 0.9.8 does not run with glibc2.1.1. This behaviour was - fixed in pdnsd 0.9.9. -
  • For IPv6: glibc>=2.1 -
- The system requirements under FreeBSD are: -
    -
  • FreeBSD versions >=2.6 (prior ones may or may not work) -
  • For IPv6: FreeBSD >=4.0 is recommended (no idea if it runs on prior versions) -
- - The common software requirements for all supported systems are: -
    -
  • GCC, preferably egcs-2.* or 3.* (other compilers are currently not supported; the needed patch for another compiler - should not be difficult, however) -
  • GNU or BSD make -
  • the standard commands install, grep, sed, awk, touch and which (along with the REALLY - standard ones mv, cp, ln, rm, pwd, test, echo, cat, mkdir, chown, chmod, tar). In - any standard Unix installation, this should be no problem. -
  • for hacking and building own packages, you might also need gzip, bzip2, perl and rpmbuild -
-
-

Download

- If you want to download pdnsd, please visit the download page. -
-

Authors

-

- pdnsd was originally written by Thomas Moestl, - but is no longer maintained by him. Paul A. Rombouts - has revised large portions of the code and has added a number of new features. - See README.par and the ChangeLog - in the source directory (or /usr/share/doc/pdnsd-<version> - if you have installed a binary package) for more details. - If you have questions about the recent modifications, you can find - the email address of the current maintainer - at the end of README.par. -

-

- Daniel Smolik has contributed RedHat RPMs (the most recent RPMs are available here).
- Torben Janssen contributed start scripts for Red Hat Linux.
- Soenke J. Peters contributed patches and suggestions for Red Hat compatability.
- Wolfgang Ocker has contributed the code and documentation for the server_ip option.
- Markus Mohr contributed a Debian rc script.
- Nikita V. Youschenko contributed extensions to the "if" uptest.
- Lyonel Vincent extended the serve_aliases option to support an arbitrary number of aliases.
- Sourav K. Mandal wrote the autoconf scripts and contributed many fixes and suggestions.
- Stephan Boettcher contributed the SCHEME= option.
- Ron Yorston contributed the uptest for Linux ppp dial-on-demand devices.
- Alexandre Nunes fixed some bugs in the autoconf files.
- Sverker Wiberg contributed fixes for IPv6.
- Carsten Block contributed configure-able rc scripts.
- Olaf Kirch contributed a security fix for the run_as code.
- Paul Wagland contributed various patches for bind9-compatability and other issues.
- Roman Shterenzon contributed patches and lots of helpful hints for FreeBSD compatability.
- Bernd Leibing has contributed spec file fixes.
- Michael Wiedmann has contributed the pdnsd-ctl.8 man page.
- Marko Stolle has contributed the contrib/pdnsd_update.pl script that makes pdnsd usable in a DHCP setup.
- P.J. Bostley has contributed patches to get pdnsd working on alpha properly.
- Christian Engstler contributed patches for SuSE compatability.
- Bjoern Fischer contributed code to make pdnsd leave the case of names in the cache unchanged.
- Marko Stolle contributed the contrib/pdnsd_update.pl script that makes pdnsd usable in a DHCP setup.
- Andrew M. Bishop contributed the support for the label server option and the pdnsd-ctl interface for using it.
- Frank Elsner contributed rc script fixes.
- Andreas Steinmetz contributed the code for query_port_start and query_port_end options.
- Mahesh T. Pai contributed the pdnsd.8 man page.
- Nikola Kotur contributed the Slackware start-up script.
- Kiyo Kelvin Lee contributed a patch for Cygwin support.
- Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support.
- Jan-Marek Glogowski contributed a patch implementing the use_nss option. -

-

- Special thanks to Bert Frederiks for letting me do a late-night debugging run on his machine to - spot obscure bugs! -

-

- Thanks to the following persons for reporting bugs and being helpful:
- David G. Andersen,
- Dirk Armbrust,
- Daniel Black,
- Kevin A. Burton,
- Juliusz Chroboczek,
- Joachim Dorner,
- Stefan Erhardt,
- Stefan Förster,
- Mike Hammer,
- Jonathan Hudson,
- Dan Jacobson,
- Byrial Jensen,
- Patrick Loschmidt,
- James MacLean,
- Fraser McCrossan,
- Michael Müller,
- Erich Reitz,
- Brian Schroeder,
- Milan P. Stanic,
- Michael Steiner,
- Norbert Steinl,
- Markus Storm,
- Michael Ströder,
- Alan Swanson,
- Eelco Vriezekolk. -

- -

Links

- Well, this is the obligatory link section. -
-
- - - - - - - - -
- - http://www.gnu.org
- The GNU homepage -
-
- - http://freecode.com
- Freecode (formerly Freshmeat) - large free software index -
-
- - http://www.freebsd.org
- The FreeBSD project -
-
- -
-
-
Thomas Moestl - and Paul A. Rombouts -
-
-

- Last revised: 17 March 2012 by Paul A. Rombouts -

- - diff --git a/jni/pdnsd/doc/html2confman.pl b/jni/pdnsd/doc/html2confman.pl deleted file mode 100644 index abade119..00000000 --- a/jni/pdnsd/doc/html2confman.pl +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/perl -w -# -# A Perl script for converting pdnsd html documentation to a man page. -# -# Written by Paul A. Rombouts -# -# This file Copyright 2004 Paul A. Rombouts -# It may be distributed under the GNU Public License, version 2, or -# any higher version. See section COPYING of the GNU Public license -# for conditions under which this file may be redistributed. -# - -use strict; -use POSIX qw(strftime); - - -while(<>) { - if(/[^<]*configuration file/i) { - last; - } -} - -exit unless defined($_); - -while(<>) { - if(/[^<]*layout/i) { - last; - } -} - -exit unless defined($_); - -(my $myname=$0) =~ s{.*/}{}; - -print <) { - if(/.*\bpdnsd-ctl\b/) { - last; - } - s{^\s*((?:<[^<>]+>)*?)[\d.]*\s*(.*)((?:<[^<>]+>)*?)(?:
)?\s*$}{.SS $1$2$3\n}i; - if(s{^\s*\s*}{.TP\n}i) {$taggedparagraph=1} - if(m{^\s*}i) {$taggedparagraph=0} - s{^\s*((?:<[^<>]+>)*?)(.*)((?:<[^<>]+>)*?)(?:
)?\s*$}{.B $1$2$3\n}i if $taggedparagraph; - s{^\s*((?:<[^<>]+>)*?or(?:<[^<>]+>)*?)(?:
)?\s*$}{$1\n.PD 0\n.TP\n.PD\n}i if $taggedparagraph; - if(s{^\s*
}{.DS L\n}i) {$displayed=1}
-    s{^\t}{        } if $displayed;
-    if(s{
\s*$}{\n.DE\n\n}i) {$displayed=0} - elsif(!$displayed) {s{^\s*}{}} - s{^\s*
  • }{.IP\n\\(bu }i; - s{
  • }{\n.IP\n\\(bu }i; - s{
      }{\n}i; - s{
    }{\n}i; - s{}{\\fB}ig; - s{}{\\fP}ig; - s{<(i|em)>}{\\fI}ig; - s{}{\\fP}ig; - unless(s{^\s*(<[^<>]+>)*(
    |

    )(<[^<>]+>)*\s*$}{\n}i) { - s{]*>(.*)

    }{\n$1\n}i; - s{^\s*
    }{.br\n}i; - s{
    \s*
    \s*$}{\n\n}i; - s{
    \s*$}{\n.br\n}i; - s{
    }{\n.br\n}i; - s{^\s*(<[^<>]+>)*\s*$}{}; - } - s{<[^<>]+>}{}g; - s{<}{<}ig; - s{>}{>}ig; - s{"}{"}ig; - s{ }{\\ }ig; - s{/var/cache/pdnsd\b}{\@cachedir\@}g; - s{(? -.UE -and was extensively revised by Paul A. Rombouts -.UR - -.UE -(for versions 1.1.8b1\\-par and later). -.PP -Several others have contributed to \\fBpdnsd\\fP; see files in the source or -\\fB/usr/share/doc/pdnsd/\\fP directory. -.PP -This man page was automatically generated from the html documentation for \\fBpdnsd\\fP, -using a customized Perl script written by Paul A. Rombouts. -ENDOFTRAILER - -if(defined($_)) { - while(<>) { - if(/last\s+revised/i) { - s{^\s*}{}; - s{<[^<>]+>}{}g; - s{<}{<}ig; - s{>}{>}ig; - s{"}{"}ig; - s{ }{\\ }ig; - print ".PP\n"; - print; - last; - } - } -} -exit; diff --git a/jni/pdnsd/doc/pdnsd-ctl.8 b/jni/pdnsd/doc/pdnsd-ctl.8 deleted file mode 100644 index 73459f3b..00000000 --- a/jni/pdnsd/doc/pdnsd-ctl.8 +++ /dev/null @@ -1,198 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man-spec -.\" from a DocBook document. docbook2man-spec can be found at: -.\" -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng . -.\" This manpage has been edited manually by Paul A. Rombouts. -.TH "PDNSD\-CTL" "8" "Sep 2008" "pdnsd 1.2.9b-par" "" -.SH NAME -\fBpdnsd\-ctl\fP \- controls pdnsd -.SH SYNOPSIS -.sp -\fBpdnsd\-ctl\fP [\fB\-c\fP \fIcachedir\fP] [\fB\-q\fP] \fIcommand\fP [\fIarguments\fP] -.SH "DESCRIPTION" -.PP -\fBpdnsd\-ctl\fP controls \fBpdnsd\fP, a proxy dns server with permanent caching. -Note that the status control socket must be enabled (by specifying an option on -the pdnsd command line or in the configuration file) before you can use -\fBpdnsd\-ctl\fP. -.PP -.TP -\fB\-c\fP \fIcachedir\fP -Set the cache directory to \fIcachedir\fP (must match pdnsd setting). -This is only necessary if the directory differs from the default specified -at compile time. -.TP -\fB\-q\fP -Be quiet unless output is specified by the command or something goes wrong. -.SH "COMMANDS" -.TP -\fBhelp\fP\ \ \ [no arguments] - -Print a command summary. -.TP -\fBversion\fP\ [no arguments] - -Print version and license info. -.TP -\fBstatus\fP\ [no arguments] - -Print a description of pdnsd's cache status, thread status and configuration. -Also shows which remote name servers are assumed to be available. -.TP -\fBserver\fP\ (\fIindex\fP|\fIlabel\fP) (\fBup\fP|\fBdown\fP|\fBretest\fP) [\fIdns1\fP[,\fIdns2\fP[,...]]] - -Set the status of the servers with the given index or label to up or down, or -force a retest. The index is assigned in the order of definition in pdnsd.conf -starting with 0. Use the status command to view the indexes. You can specify all -instead of an index to perform the action for all servers registered with pdnsd. -.IP -An optional third argument can be given consisting of a list of IP addresses -separated by commas or white-space characters. This list will replace the -addresses of name servers used by pdnsd for the given server section. This -feature is useful for run-time configuration of pdnsd with dynamic DNS data in -scripts called by ppp or DHCP clients. The last argument may also be an empty -string, which causes existing IP addresses to be removed and the corresponding -server section to become inactive. -.TP -\fBrecord\fP\ \fIname\fP (\fBdelete\fP|\fBinvalidate\fP) - -Delete or invalidate the records of the given domain name if it is in the cache. -Invalidation means that the records are marked as timed out, and will be -reloaded if possible. For local records (i.e., records that were given in the -config file using a rr section, records read from a hosts-style file and records -added using pdnsd-ctl), invalidation has no effect. Deletion will work, though. -.TP -\fBsource\fP\ \fIfn\fP \fIowner\fP [\fIttl\fP] [(\fBon\fP|\fBoff\fP)] [\fBnoauth\fP] - -Load a hosts-style file. Works like using the pdnsd source configuration section. -Owner and ttl are used as in the source section. ttl has a default -of 900 (it does not need to be specified). The next to last argument corresponds -to the serve_aliases option, and is off by default. -\fBnoauth\fP is used to make the domains non-authoritative -(this is similar to setting authrec=off in the config file, -please consult the -.BR pdnsd.conf (5) -man page for what that means). -fn is the name of the file, which must be readable by pdnsd. -.TP -\fBadd\fP\ \ \ \ \fBa\fP \fIaddr\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP] -.TP -\fBadd\fP\ \ \ \ \fBaaaa\fP \fIaddr\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP] -.TP -\fBadd\fP\ \ \ \ \fBptr\fP \fIhost\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP] -.TP -\fBadd\fP\ \ \ \ \fBcname\fP \fIhost\fP \fIname\fP [\fIttl\fP] [\fBnoauth\fP] -.TP -\fBadd\fP\ \ \ \ \fBmx\fP \fIhost\fP \fIname\fP \fIpref\fP [\fIttl\fP] [\fBnoauth\fP] - -Add a record of the given type to the pdnsd cache, replacing existing -records for the same name and type. The 2nd argument corresponds -to the value of the option in the rr section that is named like -the first argument. The addr argument may be a list of IP addresses, -separated by commas or white space. -The ttl is optional, the default is 900 seconds. -\fBnoauth\fP is used to make the domains non-authoritative -(this is similar to setting authrec=off in the config file, -please consult the -.BR pdnsd.conf (5) -man page for what that means). -If you want no other record than the newly added in the cache, do -\fBpdnsd\-ctl\fP\ \fBrecord\fP\ \fIname\fP\ \fBdelete\fP -before adding records. -.TP -\fBneg\fP\ \ \ \ \fIname\fP [\fItype\fP] [\fIttl\fP] - -Add a negatively cached record to pdnsd's cache, replacing existing -records for the same name and type. If no type is given, the whole -domain is cached negatively. For negatively cached records, errors are -immediately returned on a query, without querying other servers first. -The ttl is optional, the default is 900 seconds. -.TP -\fBconfig\fP\ \fIfilename\fP - -Reload pdnsd's configuration file. -.br -The config file must be owned by the uid that pdnsd had when it was started, -and be readable by pdnsd's run_as uid. -If no file name is specified, the config file used at start-up is reloaded. -Note that some configuration changes, like the port or IP address pdnsd listens on, -cannot be made this way and you will receive an error message. -In these cases, you will have to restart pdnsd instead. -.TP -\fBinclude\fP\ \fIfilename\fP - -Parse an include file. -.br -The include file may contain the same -type of sections as a config file, expect for global and server -sections, which are not allowed. This command can be used to add data -to the cache without reconfiguring pdnsd. -.TP -\fBeval\fP\ \ \ \fIstring\fP - -Parse a string as if part of an include file. -.br -The string should hold one or more complete configuration sections, -but no global and server sections, which are not allowed. -If multiple strings are given, they will be joined using newline chars -and parsed together. -.TP -\fBempty\-cache\fP\ [[+|-]\fIname\fP ...] - -Delete all entries in the cache matching include/exclude rules. -.br -If no arguments are provided, the cache is completely emptied, -freeing all existing entries. -Note that this also removes local records, as defined by the config file. -To restore local records, run "pdnsd-ctl\ config" immediately afterwards. -.br -If one or more arguments are provided, these are interpreted as -include/exclude names. If an argument starts with a '+' the name is to -be included. If an argument starts with a '-' it is to be excluded. -If an argument does not begin with '+' or '-', a '+' is assumed. -If the domain name of a cache entry ends in one of the names in the -list, the first match will determine what happens. If the matching name -is to be included, the cache entry is deleted, otherwise it remains. -If there are no matches, the default action is not to delete. -.TP -\fBdump\fP\ \ \ [\fIname\fP] - -Print information stored in the cache about \fIname\fP. -If \fIname\fP begins with a dot and is not the root domain, information -about the names in the cache ending in \fIname\fP (including \fIname\fP without -the leading dot) will be printed. -If \fIname\fP is not specified, information about all the names in the cache -will be printed. -.TP -\fBlist\-rrtypes\fP [no arguments] - -List available rr types for the neg command. Note that those are only -used for the neg command, not for add! -.SH "BUGS" -.PP -If you pipe the output of \fBdump\fP command through an application that -reads only part of the output and then blocks (such as more or less), -pdnsd threads trying to add new entries to the cache will be suspended -until the pipe is closed. -It is preferable to capture the output in a file in such a case. -.br -Report any remaining bugs to the authors. -.SH "AUTHORS" -.PP -Thomas Moestl -.UR - -.UE -.br -Paul A. Rombouts -.UR - -.UE -(for versions 1.1.8b1\-par and later) -.PP -Last revised: 04 Sep 2008 by Paul A. Rombouts. -.SH "SEE ALSO" -.PP -.BR pdnsd (8), -.BR pdnsd.conf (5) diff --git a/jni/pdnsd/doc/pdnsd.8.in b/jni/pdnsd/doc/pdnsd.8.in deleted file mode 100644 index ba4330af..00000000 --- a/jni/pdnsd/doc/pdnsd.8.in +++ /dev/null @@ -1,326 +0,0 @@ -.TH PDNSD 8 "Jul 2007" "pdnsd @fullversion@" "System Administration Commands" - -.SH NAME -\fBpdnsd\fP \- dns proxy daemon - -.SH SYNOPSIS - -\fBpdnsd\fP [\-h] [\-V] [\-s] [\-d] [\-g] [\-t] [\-p \fIfile\fR] [\-v\fIn\fR] [\-m\fIxx\fR] [\-c \fIfile\fR] [\-4] [\-6] [\-a] -.PP -This man page is an extract of the documentation of \fBpdnsd\fP. -For complete, current documentation, refer to the HTML (or plain text) -documentation (which you can find in the \fBdoc/\fP subdirectory of the -source or in a standard documentation directory, typically -\fB/usr/share/doc/pdnsd/\fP if you are using a binary package). - -.SH DESCRIPTION -.PP -\fBpdnsd\fP is a IPv6 capable proxy domain name server (DNS) which -saves the contents of its DNS cache to the disk on exit. - -.SH OPTIONS - -.RS -.TP -.B \-4 -enables IPv4 support. IPv6 support is automatically -disabled (should it be available). On by default. -.TP -.B \-6 -enables IPv6 support. IPv4 support is automatically -disabled (should it be available). Off by default. -.TP -.B \-a -With this option, pdnsd will try to detect automatically if -the system supports IPv6, and fall back to IPv4 otherwise. -.TP -.BR \-V " or " \-\-version -Print version information and exit. -.TP -\fB\-c\fP \fIFILE\fP or \fB\-\-config\-file=\fP\fIFILE\fP -specifies that configuration is to be read from \fIFILE\fP. -Default is \fB@sysconfdir@/pdnsd.conf\fP. -.TP -.BR \-d " or " \-\-daemon -Start \fBpdnsd\fP in daemon mode (as a background process). -.TP -.BR \-g " or " \-\-debug -Print some debug messages on the console or to the file -\fBpdnsd.debug\fP in your cache directory (in daemon mode). -.TP -.BR \-h " or " \-\-help -Print an option summary and exit. -.TP -\fB\-i\fP \fIPREFIX\fP or \fB\-\-ipv4_6_prefix=\fP\fIPREFIX\fP -specifies the prefix pdnsd uses (when running in IPv6 mode) to map IPv4 -addresses in the configuration file to IPv6 addresses. Must be a valid IPv6 -address. Default is ::ffff:0.0.0.0 -.TP -.B \-p \fIFILE\fP -writes the pid the server runs as to the specified filename. Works -only in daemon mode. -.TP -.B \-\-pdnsd\-user -Print the user \fBpdnsd\fP will run as and exit. -.TP -.BR \-s " or " \-\-status -enables the status control socket. Either this option should be passed -to the command line or \fBstatus_ctl=on;\fP should be specified in the -config file if you want to use -.BR pdnsd\-ctl (8) -to control \fBpdnsd\fP at runtime. -.TP -.BR \-t " or " \-\-tcp -enables the TCP server thread. \fBpdnsd\fP will then serve TCP and UDP -queries. -.TP -.BI \-v n -sets the verbosity of \fBpdnsd\fP. \fIn\fP is a numeric argument -between 0 (normal operation) to 3 (many messages for debugging). -.TP -.BI \-m xx -sets the query method \fBpdnsd\fP -uses. Possible values for \fIxx\fP are: -.IP -.B uo -\- pdnsd will use UDP only. This is the fastest method, and should -be supported by all name servers on the Internet. - -.IP -.B to -\- pdnsd will use TCP only. TCP queries usually take more time than -UDP queries, but are more secure against certain attacks, where an -attacker tries to guess your query id and to send forged answers. TCP -queries are not supported by some name servers. - -.IP -.B tu -\- pdnsd will try to use TCP, and will fall back to UDP if its -connection is refused or times out. - -.IP -.B ut -\- pdnsd will try to use UDP, and will repeat the query using TCP -if the UDP reply was truncated (i.e. the tc bit is set). -This is the behaviour recommended by the DNS standards. - -.PP -Additionally, "no" can be prepended to the \-\-status, \-\-daemon, \-\-debug -and \-\-tcp options (e.g. \-\-notcp) to reverse their effect. -.RE - -.SH USAGE -.PP -\fBpdnsd\fP is usually run from a startup script. For \fBpdnsd\fP to -work, You need to:- - -.IP -1. Tell your system to use \fBpdnsd\fP as the primary DNS server by -modifying \fB/etc/resolv.conf\fP. - -.IP -2. Tell \fBpdnsd\fP to use an authentic source for DNS records, by -including the IP addresses of one or more DNS servers, usually your -ISP's DNS servers, in \fB@sysconfdir@/pdnsd.conf\fP. -.PP -For this, put the following line in your \fB/etc/resolv.conf\fP -.PP -.RS -nameserver 127.0.0.X -.RE -.PP -where X can be any number. (I use 3). Comment out all other -entries. You should put the same value in the server_ip= line in -\fBglobal\fP section of \fB@sysconfdir@/pdnsd.conf\fP. -.br -If you want to use \fBpdnsd\fP as the DNS server for a small local network, -you should use the IP address or name of the interface connected to -this network instead of 127.0.0.X. -.RE - -.PP -To tell \fBpdnsd\fP where to get DNS information from, add the -following lines in \fB@sysconfdir@/pdnsd.conf\fP:- - -.PP -.RS -server { -.br - label= "myisp"; - ip=123.456.789.001,123.456.789.002; - proxy_only=on; - timeout=10; -.br -} -.RE -.PP -Note the opening and closing braces. Add more such \fBserver\fP -sections for each set of DNS servers you want \fBpdnsd\fP to query. -Of course the configuration options shown here are just examples. -More examples can be found in \fB@sysconfdir@/pdnsd.conf.sample\fP -or the pdnsd.conf in the documentation directory. -See the -.BR pdnsd.conf (5) -man page for all the possible options and their exact meaning. -.PP -If you use a dial up connection, remember that ppp scripts usually -replace \fB/etc/resolv.conf\fP when connection with the ISP is -established. You need to configure ppp (or whatever you use to -establish a connection) so that \fB/etc/resolv.conf\fP is not replaced -every time a connection is established. Read the documentation for the -scripts run when your network comes up. -.PP -If you use pppconfig, specify `none' in the `nameservers' option in -the `advanced' tab. If you use multiple ISPs, you should do this for -each connection/account. -.PP -If you use multiple ISPs, you should tell \fBpdnsd\fP which DNS servers -have become available by calling \fBpdnsd\-ctl\fP, the \fBpdnsd\fP -control utility, in a script (e.g. \fB/etc/ppp/ip\-up\fP when you use pppd) -that is run when the connection is established. -If the addresses of the DNS servers are obtained through some type of -dynamic configuration protocol (e.g. pppd with the usepeerdns -option or a DHCP client), you can pass the DNS server addresses as an extra -argument to \fBpdnsd\-ctl\fP to configure \fBpdnsd\fP at run time. -See the -.BR pdnsd\-ctl (8) -man page for details. - -.SH FILES - -\fB@sysconfdir@/pdnsd.conf\fP is the pdnsd configuration file. -The file format and configuration options are described in the -.BR pdnsd.conf (5) -man page. You can find examples of almost all options in -\fB@sysconfdir@/pdnsd.conf.sample\fP. -.PP -\fB@cachedir@/pdnsd.cache\fP -.PP -\fB@cachedir@/pdnsd.status\fP is the status control socket, which must be -enabled before you can use \fBpdnsd\-ctl\fP. -.PP -\fB/etc/init.d/pdnsd\fP (the name and location of the start-up script -may be different depending on your distribution.) -.PP -\fB/etc/resolv.conf\fP -.PP -\fB/etc/defaults/pdnsd\fP contains additional parameters or options -which may be passed to pdnsd at boot time. This saves the hassle of -fiddling with initscripts (not available on all distributions). - -.SH BUGS -.PP -The verbosity option -.BI -v n -presently does not seem to have much effect on the amount of debug output. -.br -Report any remaining bugs to the authors. - -.SH CONFORMING TO -.PP -\fBpdnsd\fP should comply with RFCs 1034 and 1035. As of version -1.0.0, RFC compliance has been improved and pdnsd is now believed (or -hoped?) to be fully RFC compatible. It completely follows RFC 2181 -(except for one minor issue in the FreeBSD port, see the -documentation). -.PP -It does \fINOT\fP support the following features, of which most are -marked optional, experimental or obsolete in these RFCs: - - -.IP -\(bu Inverse queries -.IP -\(bu Status queries -.IP -\(bu Completion queries -.IP -\(bu Namespaces other than IN (Internet) -.IP -\(bu AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain zones, that should not violate the standard - -.PP -The following record types, that are extensions to the original DNS -standard, are supported if given as options at compile time. (if you -do not need them, you do not need to compile support for them into -pdnsd and save cache and executable space): - -.IP -\(bu RP (responsible person, RFC 1183) -.IP -\(bu AFSDB (AFS database location, RFC 1183) -.IP -\(bu X25 (X25 address, RFC 1183) -.IP -\(bu ISDN (ISDN number/address, RFC 1183) -.IP -\(bu RT (route through, RFC 1183) -.IP -\(bu NSAP (Network Service Access Protocol address , RFC 1348) -.IP -\(bu PX (X.400/RFC822 mapping information, RFC 1995) -.IP -\(bu GPOS (geographic position, deprecated) -.IP -\(bu AAAA (IPv6 address, RFC 1886) -.IP -\(bu LOC (location, RFC 1876) -.IP -\(bu EID (Nimrod EID) -.IP -\(bu NIMLOC (Nimrod locator) -.IP -\(bu SRV (service record, RFC 2782) -.IP -\(bu ATMA (ATM address) -.IP -\(bu NAPTR (URI mapping, RFC 2168) -.IP -\(bu KX (key exchange, RFC 2230) - -.SH SEE ALSO -.PP -.BR pdnsd\-ctl (8), -.BR pdnsd.conf (5), -.BR pppconfig (8), -.BR resolv.conf (5) -.PP -More documentation is available in the \fBdoc/\fP subdirectory of the source, -or in \fB/usr/share/doc/pdnsd/\fP if you are using a binary package. - -.SH AUTHORS - -\fBpdnsd\fP was originally written by Thomas Moestl, -.UR -, -.UE -and was extensively revised by Paul A. Rombouts -.UR - -.UE -(for versions 1.1.8b1\-par and later). -.PP -Several others have contributed to \fBpdnsd\fP; see files in the -source or \fB/usr/share/doc/pdnsd/\fP directory. -.PP -This man page was written by Mahesh T. Pai -.UR - -.UE -using the documents in \fB/usr/share/docs/pdnsd/\fP directory for Debian, -but can be used on other distributions too. -.PP -Last revised: 22 Jul 2007 by Paul A. Rombouts. - -.SH COPYRIGHT - -.PP -This man page is a part of the pdnsd package, and may be distributed -in original or modified form under terms of the GNU General Public -License, as published by the Free Software Foundation; either version -3, or (at your option) any later version. - -.PP -You can find a copy of the GNU GPL in the file \fBCOPYING\fP in the source -or the \fB/usr/share/common\-licenses/\fP directory if you are using a -Debian system. diff --git a/jni/pdnsd/doc/pdnsd.conf.5.in b/jni/pdnsd/doc/pdnsd.conf.5.in deleted file mode 100644 index 801b5350..00000000 --- a/jni/pdnsd/doc/pdnsd.conf.5.in +++ /dev/null @@ -1,1328 +0,0 @@ -.\" Generated automatically from the html documentation by html2confman.pl -.\" -.\" Manpage for pdnsd.conf (pdnsd configuration file) -.\" -.\" Copyright (C) 2000, 2001 Thomas Moestl -.\" Copyright (C) 2003, 2004, 2005, 2006, 2007 Paul A. Rombouts -.\" -.\" This manual is a part of the pdnsd package, and may be distributed in -.\" original or modified form under terms of the GNU General Public -.\" License, as published by the Free Software Foundation; either version -.\" 3, or (at your option) any later version. -.\" You can find a copy of the GNU GPL in the file COPYING in the source -.\" or documentation directory. -.\" -.TH PDNSD.CONF 5 "Apr 2012" "pdnsd @fullversion@" -.SH NAME -pdnsd.conf \- The configuration file for pdnsd -.hw config -.SH DESCRIPTION -.PP -This manual page describes the layout of the -.BR pdnsd (8) -configuration file and the available configuration options. -The default location of the file is @sysconfdir@/pdnsd.conf. This may be changed -with the \fB-c\fP command line option. -An example pdnsd.conf comes with the pdnsd distribution in the documentation directory -or in @sysconfdir@/pdnsd.conf.sample. -.SH "FILE FORMAT" -.PP -The configuration file is divided into sections. Each section is prefixed with -the section name and opening curlies ({) and closed with closing curlies (}). -In each section, configuration options can be given in the form - -\fIoption_name\fP=\fIoption_value\fP; - -Option value may be a string literal, a number, a time specification or a constant. -In previous versions of pdnsd strings had to be enclosed -in quotes ("), but since version 1.1.10 this is no longer necessary, unless -a string contains a special character such as whitespace, a token that normally starts -a comment, or one of ",;{}\". -Since version 1.2.9 a backslash (\) inside a string is interpreted as an escape character, -so it is possible to include special characters in strings (both quoted or unquoted) -by preceding them with a backslash. Some escape sequences are in interpreted as in the C -programming language, e.g. \t becomes a tab, -\n becomes a new-line control char. -.br -A time specification consists a sequence of digits followed by a one-letter suffix. -The following suffixes are recognized: -s (seconds), m (minutes), h (hours), -d (days) and w (weeks). -If the suffix is missing, seconds are assumed. -If several time specifications are concatenated, their values are added together; -e.g. 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds. -.br -Some options take more than one value; in this case, the values are separated with commas. -.br -If you may supply one of a set of possible values to an option, this is noted -in the documentation as -(option1|option2|option3|...) -.br -The constants true|false and yes|no -are accepted as synonyms for the constants on|off. -.br -Comments may be enclosed in /* and */, nested comments are possible. If the -# sign or two slashes (//) appear in the configuration file, everything from -these signs to the end of the current line is regarded as a comment and ignored. -.br -There are examples for nearly all options in the sample config file. - -.SS global Section -The global section specifies parameters that affect the overall behaviour of the -server. If you specify multiple global sections, the settings of those later in -the file will overwrite the earlier given values. -.br -These are the possible options: - -.TP -.B perm_cache=(\fInumber\fP|off); -Switch the disk cache off or supply a maximum cache size in kB. If the disk -cache is switched off, 8 bytes will still be written to disk. -The memory cache is always 10kB larger than the file cache. -This value is 2048 (2 MB) by default. -.TP -.B cache_dir=\fIstring\fP; -Set the directory you want to keep the cache in. -The default is "@cachedir@" -(unless pdnsd was compiled with a different default). -.TP -.B server_port=\fInumber\fP; -Set the server port. This is especially useful when you want to start the -server and are not root. Note that you may also not specify uptest=ping in -the server section as non-root. -.br -The default port is 53, the RFC-standard one. Note that you should only use -non-standard ports when you only need clients on your machine to communicate -with the server; others will probably fail if the try to contact the server -on the basis of an NS record, since the A record that supplies the address for -(among others) name servers does not have a port number specification. -.TP -.B server_ip=\fIstring\fP; -or -.PD 0 -.TP -.PD -.B interface=\fIstring\fP; -Set the IP address pdnsd listens on for requests. This can be useful -when the host has several interfaces and you want pdnsd not to listen on -all interfaces. For example, it is possible to bind pdnsd to listen on -127.0.0.2 to allow pdnsd to be a forwarder for BIND. -The default setting for this option is server_ip=any, which means that -pdnsd will listen on all of your local interfaces. -Presently you can only specify one address here; if you want pdnsd to listen on multiple -interfaces but not all you will have to specify server_ip=any -and use firewall rules to restrict access. -.br -The IP address used to need quotation marks around it, but since version 1.1.10 -this is no longer necessary. -.br -If pdnsd has been compiled with both IPv4 and IPv6 support, and you want to -specify an IPv6 address here, then unless pdnsd was compiled to start up in IPv6 mode -by default, you will need to use the \-6 command-line option or -set run_ipv4=off first (see below) in order to ensure that the -IPv6 address is parsed correctly. -.br -If pdnsd is running in IPv6 mode and you specify an IPv4 address here, -it will automatically be mapped to an IPv6 address. -.br -\fINew in version 1.2:\fP You may also give the name of an interface -such as "lo" or "eth0" here, instead of an IP address -(this has been tested on Linux, and may or may not work on other platforms). -pdnsd will not bind to the interface name, but will look up the address of the -interface at start-up and listen on that address. If the address of the interface -changes while pdnsd is running, pdnsd will not notice that. You will need to -restart pdnsd in that case. -.TP -.B outgoing_ip=\fIstring\fP; -or -.PD 0 -.TP -.PD -.B outside_interface=\fIstring\fP; -\fINew in version 1.2.9:\fP -Set the IP address of the interface used by pdnsd for outgoing queries. -This can be useful when the host has several interfaces and you want pdnsd -to send outgoing queries via only one of them. -For example, if pdnsd is running on a host with one interface with IP address -192.168.1.1 connected to the local network, and another with IP address 123.xxx.yyy.zzz -connected to the internet, you may specify server_ip=192.168.1.1 -and outgoing_ip=123.xxx.yyy.zzz to enforce that pdnsd only responds -to queries received from the local network, and only sends outgoing queries via -the interface connected to the internet. -.br -The default setting for this option is any, which means that -the kernel is free to decide which interface to use. -Like with the server_ip option, you may also give the name of an -interface here, instead of an IP address. -.TP -.B linkdown_kluge=(on|off); -This option enables a kluge that some people might need: when all servers are -marked down, with this option set the cache is not even used when a query is -received, and a DNS error is returned in any case. The only exception from this -is that local records (as specified in rr and source -sections are still served normally. -In general, you probably want to get cached entries even when the network is down, -so this defaults to off. -.TP -.B max_ttl=\fItimespec\fP; -This option sets the maximum time a record is held in cache. All dns -resource records have a time to live field that says for what period of time the -record may be cached before it needs to be requeried. If this is more than the -value given with max_ttl, this time to live value is set to max_ttl. -This is done to prevent records from being cached an inappropriate long period of time, because -that is almost never a good thing to do. Default is 604800s (one week). -.TP -.B min_ttl=\fItimespec\fP; -This option sets the minimum time a record is held in cache. All dns -resource records have a time to live field that says for what period of time the -record may be cached before it needs to be requeried. If this is less than the -value given with min_ttl, this time to live value is set to min_ttl. -Default is 120 seconds. -.TP -.B neg_ttl=\fItimespec\fP; -This option sets the time that negatively cached records will remain valid in the -cache if no time to live can be determined. This is always the case when whole -domains are being cached negatively, and additionally when record types are cached -negatively for a domain for which no SOA record is known to pdnsd. If a SOA is present, -the ttl of the SOA is taken. -.TP -.B neg_rrs_pol=(on|off|auth|default); -This sets the RR set policy for negative caching; this tells pdnsd under which circumstances -it should cache a record type negatively for a certain domain. off will -turn the negative caching of record types off, on will always add a negative -cache entry when a name server did not return a record type we asked it for, and auth -will only add such entries if the answer came from an authoritative name server for that -domain. -.br -\fINew in version 1.2.8:\fP The default setting will add a negatively cached record -if either the answer was authoritive or the answer indicated the name server had "recursion available" -while the query explicitly requested such recursion. -.br -The preset is "default" (used to be auth). -.TP -.B neg_domain_pol=(on|off|auth); -This is analogue to neg_rrs_pol for whole domain negative caching. It should be safe -to set this on, because I have not seen a caching server that will falsely claim that a -domain does not exist. -.br -The default is auth. -.TP -.B run_as=\fIstring\fP; -This option allows you to let pdnsd change its user and group id after operations that needed -privileges have been done. This helps minimize security risks and is therefore recommended. The -supplied string gives a user name whose user id and primary group id are taken. -.br -A little more details: after reading the config file, becoming a daemon (if specified) and starting -the server status thread, the main thread changes its gid and uid, as do all newly created threads -thereafter. By taking another uid and gid, those threads run with the privileges of the -specified user. -Under Linux and FreeBSD, the server status thread runs with the original privileges only when the strict_setuid option -is set to off (see below, on by default), because these may be needed -for exec uptests. The manager thread also retains its original privileges in this case. -You should take care that the user you specify has write permissions on your cache file and -status pipe (if you need a status pipe). You should look out for error messages like "permission denied" -and "operation not permitted" to discover permission problems. -.br -.TP -.B strict_setuid=(on|off); -When used together with the run_as option, this option lets you specify that all threads of the -program will run with the privileges of the run_as user. This provides higher security than -the normal run_as -option, but is not always possible. See the run_as option for further discussion. -.br -This option is on by default. -.br -Note that this option has no effect on Non-Linux systems. -.TP -.B paranoid=(on|off); -Normally, pdnsd queries all servers in recursive mode (i.e. instructs servers to query other servers themselves -if possible, -and to give back answers for domains that may not be in its authority), and accepts additional records with information -for servers that are not in the authority of the queried server. This opens the possibility of so-called cache poisoning: -a malicious attacker might set up a dns server that, when queried, returns forged additional records. This way, he might -replace trusted servers with his own ones by making your dns server return bad IP addresses. This option protects -you from cache poisoning by rejecting additional records -that do not describe domains in the queried servers authority space and not doing recursive queries any more. -An exception -to this rule are the servers you specify in your config file, which are trusted. -.br -The penalty is a possible performance decrease, in particular, more queries might be necessary for the same -operation. -.br -You should also notice that there may be other similar security problems, which are essentially problems of -the DNS, i.e. -any "traditional" server has them (the DNS security extensions solve these problems, but are not widely -supported). -One of this vulnerabilities is that an attacker may bombard you with forged answers in hopes that one may match a -query -you have done. If you have done such a query, one in 65536 forged packets will be succesful (i.e. an average packet -count of 32768 is needed for that attack). pdnsd can use TCP for queries, -which has a slightly higher overhead, but is much less vulnerable to such attacks on sane operating systems. Also, pdnsd -chooses random query ids, so that an attacker cannot take a shortcut. If the attacker is able to listen to your network -traffic, this attack is relatively easy, though. -.br -This vulnerability is not pdnsd's fault, and is possible using any conventional -name server (pdnsd is perhaps a little more secured against this type of attacks if you make it use TCP). -.br -The paranoid option is off by default. -.br -.TP -.B ignore_cd=(on|off); -\fINew in version 1.2.8:\fP This option lets you specify that the CD bit of a DNS query will be ignored. -Otherwise pdnsd will reply FORMERR to clients that set this bit in a query. -It is safe to enable this option, as the CD bit refers to 'Checking Disabled' -which means that the client will accept non-authenticated data. -.br -This option is on by default. Turn it off if you want the old behaviour (before version 1.2.8). -.TP -.B scheme_file=\fIstring\fP; -In addition to normal uptests, you may specify that some servers shall only be queried when a certain -pcmcia-cs scheme is active (only under linux). For that, pdnsd needs to know where the file resides that -holds the pcmcia scheme information. Normally, this is either /var/lib/pcmcia/scheme or -/var/state/pcmcia/scheme. -.TP -.B status_ctl=(on|off); -This has the same effect as the \-s command line option: the status control is enabled when -on is specified. -.br -\fIAdded by Paul Rombouts\fP: Note that pdnsd\-ctl allows run-time configuration of pdnsd, -even the IP addesses of the name servers can be changed. If you're not using pdnsd\-ctl and -you want maximum security, you should not enable this option. It is disabled by default. -.TP -.B daemon=(on|off); -This has the same effect as the \-d command line option: the daemon mode is enabled when -on is specified. -.br -Default is off. -.TP -.B tcp_server=(on|off); -tcp_server=on has the same effect as the \-t or \-\-tcp -command-line option: it enables TCP serving. -Similarly, tcp_server=off is like the \-\-notcp command-line option. -.br -Default is on. -.TP -.B pid_file=\fIstring\fP; -This has the same effect as the \-p command line option: you can specify a file that pdnsd -will write its pid into when it starts in daemon mode. -.TP -.B verbosity=\fInumber\fP; -This has the same effect as the \-v command line option: you can set the verbosity of pdnsd's -messages with it. The argument is a number between 0 (few messages) to 3 (most messages). -.TP -.B query_method=(tcp_only|udp_only|tcp_udp|udp_tcp); -This has the same effect as the \-m command line option. -Read the documentation for the command line option on this. -tcp_only corresponds to the to, udp_only to the uo, -tcp_udp to the tu and udp_tcp to the ut -argument of the command line option. -.br -If you use query_method=tcp_udp, it is recommended that you also set the global timeout option to at least twice the longest server timeout. -.TP -.B run_ipv4=(on|off); -This has the same effect as the \-4 or \-6 command line option: -if on is specified, IPv4 support is enabled, and IPv6 support is disabled (if available). -If off is specified, IPv4 will be disabled and IPv6 will be enabled. -For this option to be meaningful, pdnsd needs to be compiled with support for the protocol you choose. -If pdnsd was compiled with both IPv4 and IPv6 support, and you want to include IPv6 addresses -in the configuration file, you will probably need to specify run_ipv4=off first to -ensure that the IPv6 addresses are parsed correctly. -.TP -.B debug=(on|off); -This has the same effect as the \-g command line option: the debugging messages are enabled when -on is specified. -.TP -.B ctl_perms=\fInumber\fP; -This option allows you to set the file permissions that the pdnsd status control socket will have. These -are the same as file permissions. The owner of the file will be the run_as user, or, if none is specified, -the user who started pdnsd. If you want to specify the permissions in octal (as usual), don't forget -the leading zero (0600 instead of 600!). To use the status control, write access is needed. The default -is 0600 (only the owner may read or write). -.br -Please note that the socket is kept in the cache directory, and that the cache directory permissions -might also need to be adjusted. Please ensure that the cache directory is not writeable for untrusted -users. -.TP -.B proc_limit=\fInumber\fP; -With this option, you can set a limit on the pdnsd threads that will be active simultaneously. If -this number is exceeded, queries are queued and may be delayed some time. -See also the procq_limit option. -.br -The default for this option is 40. -.TP -.B procq_limit=\fInumber\fP; -When the query thread limit proc_limit is exceeded, connection attempts to pdnsd will be queued. -With this option, you can set the maximum queue length. -If this length is also exceeded, the incoming queries will be dropped. -That means that tcp connections will be closed and udp queries will just be dropped, which -will probably cause the querying resolver to wait for an answer until it times out. -.br -See also the proc_limit option. A maximum of proc_limit+procq_limit -query threads will exist at any one time (plus 3 to 6 threads that will always -be present depending on your configuration). -.br -The default for this option is 60. -.TP -.B tcp_qtimeout=\fItimespec\fP; -This option sets a timeout for tcp queries. If no full query has been received on a tcp connection -after that time has passed, the connection will be closed. The default is set using the -\-\-with\-tcp\-qtimeout option to configure. -.TP -.B par_queries=\fInumber\fP; -This option used to set the maximum number of remote servers that would be queried simultaneously, -for every query that pdnsd receives. -.br -Since version 1.1.11, the meaning of this option has changed slightly. -It is now the increment with which the number of parallel queries is -increased when the previous set of servers has timed out. -For example, if we have a list \fIserver1, server2, server3,\fP etc. of available servers -and par_queries=2, then pdnsd will first send queries to \fIserver1\fP and \fIserver2\fP, -and listen for responses from these servers. -.br -If these servers do not send a reply within their timeout period, pdnsd will send additional -queries to \fIserver3\fP and \fIserver4\fP, and listen for responses from -\fIserver1, server2, server3\fP and \fIserver4\fP, and so on until a useful reply is -received or the list is exhausted. -.br -In the worst case there will be pending queries to all the servers in the list of available servers. -We may be using more system resources this way (but only if the first servers in the list -are slow or unresponsive), but the advantage is that we have a greater chance of catching a reply. -After all, if we wait longer anyway, why not for more servers. -.br -See also the explanation of the global timeout option below. -.br -1 or 2 are good values for this option. -The default is set at compile time using the \-\-with\-par\-queries option to configure. -.TP -.B timeout=\fItimespec\fP; -This is the global timeout parameter for dns queries. -This specifies the minimum period of time pdnsd will wait after sending the -first query to a remote server before giving up without having -received a reply. The timeout options in the configuration file are -now only minimum timeout intervals. Setting the global timeout option -makes it possible to specify quite short timeout intervals in the -server sections (see below). This will have the effect that pdnsd will start -querying additional servers fairly quickly if the first servers are -slow to respond (but will still continue to listen for responses from -the first ones). This may allow pdnsd to get an answer more quickly in -certain situations. -.br -If you use query_method=tcp_udp it is recommended that -you make the global timeout at least twice as large as the largest -server timeout, otherwise pdnsd may not have time to try a UDP query -if a TCP connection times out. -.br -Default value is 0. -.TP -.B randomize_recs=(on|off); -If this option is turned on, pdnsd will randomly reorder the cached records of one type -when creating an answer. This supports round-robin DNS schemes and increases fail -safety for hosts with multiple IP addresses, so this is usually a good idea. -.br -On by default. -.TP -.B query_port_start=(\fInumber\fP|none); -If a number is given, this defines the start of the port range used for queries of pdnsd. The -value given must be >= 1024. The purpose of this option is to aid certain firewall -configurations that are based on the source port. Please keep in mind that another application -may bind a port in that range, so a stateful firewall using target port and/or process uid may -be more effective. In case a query start port is given pdnsd uses this port as the first port of a -specified port range (see query_port_end) used for queries. -pdnsd will try to randomly select a free port from this range as local port for the query. -.br -To ensure that there are enough ports for pdnsd to use, the range between query_port_start and -query_port_end should be adjusted to at least (par_queries * proc_limit). -A larger range is highly recommended for security reasons, and also because other applications may -allocate ports in that range. If possible, this range should be kept out of the space -that other applications usually use. -.br -The default for this option is 1024. Together with the default value of query_port_end, -this makes it the hardest for an attacker to guess the source port used by the pdnsd resolver. -If you specify none here, pdnsd will let the kernel choose the source port, but -this may leave pdnsd more vulnerable to an attack. -.TP -.B query_port_end=\fInumber\fP; -Used if query_port_start is not none. Defines the last port of the range started by query_port_start -used for querys by pdnsd. The default is 65535, which is also the maximum legal value for this option. -For details see the description of query_port_start. -.TP -.B delegation_only=\fIstring\fP; -\fIAdded by Paul Rombouts\fP: This option specifies a "delegation-only" zone. -This means that if pdnsd receives a query for a name that is in a -subdomain of a "delegation-only" zone but the remote name server -returns an answer with an authority section lacking any NS RRs for -subdomains of that zone, pdnsd will answer NXDOMAIN (unknown domain). -This feature can be used for undoing the undesired effects of DNS -"wildcards". Several "delegation-only" zones may be specified together. -If you specify root servers in a server section it is -important that you set root_server=on in such a section. -.br -Example: - -delegation_only="com","net"; - -This feature is off by default. It is recommended that you only use -this feature if you actually need it, because there is a risk that -some legitimate names will be blocked, especially if the remote -name servers queried by pdnsd return answers with empty authority -sections. -.TP -.B ipv4_6_prefix=\fIstring\fP; -This option has the same effect as the \-i command-line option. -When pdnsd runs in IPv6 mode, this option specifies the prefix pdnsd uses to convert IPv4 addresses in -the configuration file (or addresses specified with pdnsd\-ctl) -to IPv6-mapped addresses. -The string must be a valid IPv6 address. Only the first 96 bits are used. -Note that this only effects the parsing of IPv4 addresses listed after this option. -.br -The default is "::ffff.0.0.0.0". -.TP -.B use_nss=(on|off); -If this option is turned on, pdnsd will call initgroups() to set up the group access list, -whenever pdnsd changes its user and group id (see run_as option). -There is a possible snag, though, if initgroups() uses NSS (Name Service Switch) and -NSS in turn uses DNS. In such a case you may experience lengthy timeouts and stalls. -By setting use_nss=off, you can disable the initgroups() call -(only possible in versions 1.2.5 and later). -.br -This option was contributed by Jan-Marek Glogowski. -.br -On by default. -.TP -.B udpbufsize=\fInumber\fP; -\fINew in version 1.2.9:\fP -This option sets the upper limit on the size of UDP DNS messages. The default is 1024. -.br -See also the edns_query server option below. - -.SS server Section -Each server section specifies a set of name servers that pdnsd should try to get -resource records or authoritative name server information from. The servers are -queried in the order of their appearance (or parallel to a limited extend). -If one fails, the next one is taken and so on. -.br -You probably want to specify the dns server in your LAN, the caching dns servers -of your internet provider or even a list of root servers in one or more server sections. -.br -The supported options in this section are: - -.TP -.B label=\fIstring\fP; -Specify a label for the server section. This can be used to refer to this section -when using pdnsd\-ctl, the pdnsd control utility. -.br -You can give several server sections the same label, but if you want to change the addresses -of a server section (see \fBip\fP option below) during run-time with -"pdnsd\-ctl\ server\ \fIlabel\fP\ up\ \fIdns1\fP,\fIdns2\fP,...", -the label must be unique. -.TP -.B ip=\fIstring\fP; -Give the IP (the address, \fInot\fP the host name) of the server. -.br -Multiple IP addresses can be given per server section. -This can be done by entering multiple lines of the form ip=\fIstring\fP; -or a single line like this: - -ip=\fIstring\fP,\fIstring\fP,\fIstring\fP; - -IP addresses do not have to be specified in the configuration file. -A server section without IP addresses will remain inactive until it is assigned -one or more addresses with pdnsd\-ctl, -the pdnsd control utility. -.br -If pdnsd has been compiled with both IPv4 and IPv6 support, any IPv6 addresses you specify -here will be skipped with a warning message, unless pdnsd is running in IPv6 mode. -Thus, unless pdnsd was compiled to startup in IPv6 mode by default, you need to use the -command-line option \-6 or set run_ipv4=off -first (see global section) in order to ensure -that IPv6 addresses are parsed correctly. -.br -If pdnsd is running in IPv6 mode and you specify an IPv4 address here, -it will automatically be mapped to an IPv6 address. -.TP -.B file=\fIstring\fP; -\fINew in version 1.2:\fP This option allows you to give the name of a resolv.conf-style file. -Of the lines beginning with the nameserver keyword, the second field will be parsed as an -IP address, as if it were specified with the ip= option. The remaining lines will be ignored. -If the contents of the file changes while pdnsd is running, you can make pdnsd aware of the changes through the -use of pdnsd\-ctl, the pdnsd control utility. -This is usually most conveniently done by placing the command "pdnsd\-ctl\ config" in a script -that is automatically run whenever the DNS configuration changes. -.br -For example, suppose you have a ppp client that writes the DNS configuration for your ISP to the file -/etc/ppp/resolv.conf and runs the script /etc/ppp/ip-up when a new -connection is established. One way of ensuring that pdnsd is automatically reconfigured is to -add a server section in the config file with file=/etc/ppp/resolv.conf and to -add the command "pdnsd\-ctl\ config" to /etc/ppp/ip-up. -.TP -.B port=\fInumber\fP; -Give the port the remote name server listens on. Default is 53 (the official -dns port) -.TP -.B uptest=(ping|none|if|dev|diald|exec|query); -Determine the method to check whether the server is available. Currently -defined methods are: -.IP -\(bu \fBping\fP: Send an ICMP_ECHO request to the server. If it doesn't respond -within the timeout, it is regarded to be unavailable until the next probe. -.IP -\(bu \fBnone\fP: The availability status is not changed, only the time stamp is updated. -.IP -\(bu \fBif\fP: Check whether the interface (specified in the interface= option) is -existent, up and running. This currently works for all "ordinary" -network interfaces, interfaces that disappear when down (e.g. ppp?), -and additionally for Linux isdn interfaces (as of kernel 2.2). Note that -you need a /dev/isdninfo device file (major#45, minor#255), or the -isdn uptest will always fail. -.IP -\(bu \fBdev\fP and \fBdiald\fP: Perform an if uptest, and, if that -was succesful, additionally check whether a program is running that -has locked a given (modem-) device. The needed parameters are an interface (specified as for the if -uptest, e.g. "ppp0") and a device relative to /dev (e.g. -"modem" for /dev/modem specified using the device= option. -pdnsd will then look for a pid file for the given interface in /var/lock (e.g. -/var/run/ppp0.pid) and for a lockfile for the given device (e.g. /var/lock/LCK..modem), -and then test whether the locking process is the process that created the pid file and this process is still -alive. If this is the case, the normal if uptest is executed for the given interface. -.br -The dev option is for pppd dial-on-demand, diald is the same for diald users. -.IP -\(bu \fBexec\fP: Executes a given command in the /bin/sh shell -(as /bin/sh \-c ) -and evaluates the result (the return code of the last command) in the shell's way of handling return codes, -i.e. 0 indicates success, all other indicate failure. The shell's process name will be -uptest_sh. The command is given with the uptest_cmd option (see below). -For secuity issues, also see that entry. -.IP -\(bu \fBquery\fP: \fINew in version 1.2:\fP -This works like the ping test, except it sends an (empty) DNS query to the remote server. -If the server sends a well-formed response back within the timeout period (except SERVFAIL), -it will be regarded as available. -This test is useful if a remote server does not respond to ICMP_ECHO requests at all, -which unfortunately is quite common these days. -It can also happen that a remote server is online but ignores empty DNS queries. -Then you will need the set the query_test_name option (see below). -In many cases this test will be a more reliable indicator of availability -than the ones mentioned before. - -The default value is \fBnone\fP. - -\fBNOTE\fP: If you use on-demand dialing, use none, if, -dev, diald or exec, -since ping or query will send packets -in the specified interval and the interface will thus frequently dial! -.TP -.B ping_timeout=\fInumber\fP; -Sets the timeout for the ping test in tenths of seconds -(this unit is used for legacy reasons; actually the current implementation is -only accurate to a second). -.br -The default is 600 (one minute). -.TP -.B ping_ip=\fIstring\fP; -The IP address for the ping test. The default is the IP of the name server. -.TP -.B query_test_name=\fIstring\fP; -\fINew in version 1.2.9:\fP -Sets the name to be queried when using uptest=query availability test. -If the string is the unquoted constant none, -an empty query is used (this the default), otherwise a query of type A will be -sent for the domain name specified here. It is not necessary for the domain name -to exist or have a record of type A in order for the uptest to succeed. -.br -If the the remote server ignores empty queries, you will probably want to set -query_test_name="." (the root domain). -.TP -.B uptest_cmd=\fIstring\fP,\fIstring\fP; -or -.PD 0 -.TP -.PD -.B uptest_cmd=\fIstring\fP; -Sets the command for the uptest=exec function to the first string. -If the second string is given, it specifies a user with whose user -id and primary group id the command is executed. -.br -This is especially useful if you are executing the server as root, -but do not want the uptest to be performed with root privileges. -In fact, you should never execute the uptest as root if you can help -it. -.br -If the server is running setuid or setgid, the privileges thus gained -are attempted to be dropped even before changing identity to the -specified user to prevent setuid/gid security holes (otherwise, any -user might execute commands as root if you setuid the executable). -.br -\fBNote that this is not always possible, and that pdnsd should never -be installed as setuid or setgid.\fP -The command is executed using /bin/sh, so you should be able to use -shell builtin commands. -.TP -.B interval=(\fItimespec\fP|onquery|ontimeout); -Sets the interval for the server up-test. The default is 900 seconds; -however, a test is forced when a query times out and the timestamp is reset then. -.br -If you specify onquery instead of a timeout, the interface will be -tested before every query. This is to prevent automatically dialing -interfaces (diald/pppd or ippp) to dial on dns queries. It is intended to be -used in connection with an interface-testing uptest ;\-) -.br -Note that using uptest=exec, you might run into performance problems -on slow machines when you use that option. -DON'T use onquery with uptest=ping or -uptest=query, as it may cause delays if the server does not answer -(btw, it doesn't make sense anyway). -Note also that using onquery is no guarantee that the interface -will not be used. When another (reachable) dns server tells pdnsd -to query a third dns server for data, pdnsd will do that and has -no means of checking whether this will dial up the interface or not. -This however should be a rare situation. -.br -\fINew in version 1.2.3:\fP -A third possibility is to specify interval=ontimeout. -In this case the server is not tested at startup/reconfiguration, nor at regular intervals, -but only after a DNS query to a server times out. Certain types of network problems -such as a refused connection will also cause the server to be considered unavailable. -However, once a server is declared dead it is never considered again unless it is revived using a -pdnsd\-ctl config or server command. -The idea behind this option is to minimize uptests by assuming all -servers are available until there is reason to believe otherwise. -.TP -.B interface=\fIstring\fP; -The network interface (or network device, e.g. "eth0") for the uptest=if option. -Must be specified if uptest=if is given. -.TP -.B device=\fIstring\fP; -The (modem-) device that is used for the dev uptest. If you use this for a dial-on-demand -ppp uptest (together with uptest=dev), you need to enter the device you are using for your -pppd here, e.g. modem for /dev/modem. -.br -Must be specified if uptest=dev is given. -.TP -.B timeout=\fItimespec\fP; -Set the timeout for the dns query. The default is 120 seconds. You probably want to set this lower. -.br -Timeouts specified in the configuration file are only treated as the -minimum period of time to wait for a reply. A queries to a remote -server are not canceled until a useful reply has been received, or all -the other queries have timed out or failed. -.br -If you have also set the global timeout option, you may consider setting a fairly small value here. -See the explanation of the timeout option in the global -section for what that means. -.TP -.B purge_cache=(on|off); -In every fetched dns record, there is a cache timeout given, which -specifies how long the fetched data may be cached until it needs to be -reloaded. If purge_cache is set to off, the stale records are not purged -(unless the cache size would be exceeded, in this case the oldest records are purged). -Instead, they are still served if they cannot succesfully be -updated (e.g. because all servers are down). -.br -Default is off. -.TP -.B caching=(on|off); -Specifies if caching shall be performed for this server at all. Default is -on. -.TP -.B lean_query=(on|off); -Specifies whether to use the "lean" query mode. In this mode, only the -information actually queried from pdnsd is resolved and cached. This has -the advantage that usually less cache space is used and the query is -usually faster. In 90% of the cases, only address (A) records are needed -anyway. If switched off, pdnsd will always cache all data about a host -it can find and will specifically ask for all available records -(well, at least it is a good approximation for what it really does ;\-) -This will of course increase the answer packet sizes. -.br -Some buggy name servers may not deliver CNAME records when not asked for -all records. I do not know if such servers are around, but if you have -trouble resolving certain host names, try turning this option off. -.br -A last note: If you use multiple pdnsd's that access each other, turning -this option on is probably a big win. -.br -This on by default. -.TP -.B edns_query=(on|off); -\fINew in version 1.2.9:\fP -Specifies whether to use EDNS (Extension mechanisms for DNS) for outgoing queries. -Currently this is only useful for allowing UDP message sizes larger than 512 bytes. -Note that setting this option on can give problems in combination with some legacy -systems or software, including, embarrassingly enough, previous versions of pdnsd. -.br -The default is off, but if your network can handle UDP payloads -significantly larger than 512 bytes, the recommended value is on. -.br -Note that this option only effects outgoing queries. If pdnsd receives a query using -EDNS, it will reply using EDNS regardless of the value of this option. - -See also the udpbufsize option above. -.TP -.B scheme=\fIstring\fP; -You can specify a pcmcia-cs scheme that is used in addition to the uptests. If you specify -a scheme here, the server this section is for will only be queries if the given scheme -is active. Shell wildcards (* and ?) are allowed in the string under their special -meanings. You need to use the scheme_file option on the global -section to make this option work. -.TP -.B preset=(on|off); -This allows you to specify the initial state of a server before any uptest is performed. -on specifies that the server is regarded available. The default is on. -This is especially useful when you set uptest=none; and want to change -the status of a server only via pdnsd\-ctl. -.TP -.B proxy_only=(on|off); -When this option is set to on, answers given by the servers are always accepted, and no -other servers (as, for example, specified in the NS records of the query domain) are -queried. If you do not turn this option on, pdnsd will do such queries in some cases -(in particular when processing ANY queries). -.br -This option is useful when you do not want pdnsd to make connections to outside servers -for some reasons (e.g. when a firewall is blocking such queries). -.br -I recommend that you turn on lean_query when using this option. -.br -Default is off. -.TP -.B root_server=(on|off|discover); -Set this option to on if the servers specified in a section are root servers. -A root server will typically only give the name servers for the top-level domain in its reply. -Setting root_server=on will cause pdnsd to try to use cached information about -top-level domains to reduce to number of queries to root servers, making the resolving of -new names more efficient. -You can get a list of available root servers by running the command -"dig\ .\ ns". -.br -This option is also necessary if you use the delegation_only option. -.br -\fINew in version 1.2.8:\fP This option may also be set to "discover". -This will cause pdnsd to query the servers provided with the ip= option -to obtain the full list of root servers. The root-server addresses will replace the addresses -specified with the ip= option. -This will only be done once on startup, or after a "pdnsd\-ctl\ config" command. -In this case the name servers specified with the ip= option don't have to be -root servers, they just have to know the names and addresses of the root servers. -After root-server discovery pdnsd will behave just as if root_server=on -had been specified. -.br -Default is off. -.TP -.B randomize_servers=(on|off); -\fINew in version 1.2.6:\fP Set this option to on to give each name server -in this section an equal chance of being queried. If this option is off, the name servers -are always queried starting with the first one specified. Even with this option on, the -query order is not truly random. Only the first server is selected randomly; the following -ones are queried in consecutive order, wrapping around to the beginning of the list when -the end is reached. Note that this option only effects the order within a section. The -servers in the first (active) section are always queried before those in the second one, -etc. -.br - The default is off, but if you are resolving from root servers setting this -option on is highly recommended. If root_server=on this option also effects -the query order of the name servers for the top-level domains. -.TP -.B reject=\fIstring\fP; -\fINew in version 1.2.6:\fP This option can be used to make pdnsd reject replies that -contain certain IP addresses. You can specify a single IP address, which will be matched -exactly, or a range of addresses using an address/mask pair. -The mask can be specified as a simple integer, indicating the number of initial 1 bits in -the mask, or in the usual IP address notation. IP addresses may be either IPv4 or IPv6 -(provided there is sufficient support in the C libraries and support for AAAA records was -not disabled). -When addresses in the reject list are compared with those in a reply, only the bits -corresponding to those set in the netmask are significant, the rest are ignored. -.br -Multiple addresses or address/mask pairs may be specified; this can be done by entering -multiple lines of the form reject=\fIstring\fP; -or a single line like this: - -reject=\fIstring\fP,\fIstring\fP,\fIstring\fP; - -How pdnsd reacts when an address in the reply matches one in the reject list, -depends on the reject_policy option, see below. -.TP -.B reject_policy=(fail|negate); -\fINew in version 1.2.6:\fP -This option determines what pdnsd does when an address in the reply from a name server -matches the reject list (see above). If this option is set to -fail, pdnsd will try another server, or, if there no more servers to try, -return the answer SERVFAIL. If this option is set to negate, pdnsd will -immediately return the answer NXDOMAIN (unknown domain) without querying additional -servers. The fail setting is useful if you don't always trust the servers in -this section, but do trust the servers in the following section. The negate -setting can be used to completely censor certain IP addresses. In this case you should put -the same reject list in every server section, and also set the -reject_recursively option (see below) to true. -.br -The default is fail. -.TP -.B reject_recursively=(on|off); -\fINew in version 1.2.6:\fP Normally pdnsd checks for addresses in the -reject list (see above) only when the reply comes directly from a name server -listed in the configuration file. With this option set to on, pdnsd will -also do this check for name servers that where obtained from NS records in the authority -section of a previous reply (which was incomplete and non-authoritative). -.br -Default is off. -.TP -.B policy=(included|excluded|simple_only|fqdn_only); -pdnsd supports inclusion/exclusion lists for server sections: with include= -and exclude= (see below) you can specify domain names for which this server -will be used or will not be used. The first match counts (i.e., the first include or -exclude rule in a server section that matches a domain name is applied, and the -search for other rules is terminated). If no rule matched a given domain name, -the policy= option determines whether this server is used for the -lookup for that domain name; when included is given, the server will -be asked, and when excluded is given, it will not. -If simple_only is given the server will be used if the name to lookup -is a simple (single-label) domain name, on the other hand if fqdn_only -is given the server will be used only for names consisting of two or more labels -(i.e. the name has at least one dot in-between). -.br -If no server is available for a queried domain, pdnsd will return an error message -to the client that usually will stop the client's attempts to resolve a specific -domain from this server (the libc resolver will e.g. return an error to the application that -tried to resolve the domain if no other servers are available in the resolv.conf). -This may be of use sometimes. -.br -\fINote\fP: the simple_only and fqdn_only constants -were added by Paul Rombouts. -They are useful for controlling which name servers (if any) will be used by -pdnsd for resolving simple (single-label) host names. -fqdn_only used to stand for "fully qualified domain name only", but this is -actually a misnomer. The names in queries received by pdnsd are always considered to be -fully qualified. If you do not exactly understand what the options simple_only and -fqdn_only are good for, you are probably better off not using them. -.br -The default for this option is included. -.TP -.B include=\fIstring\fP; -This option adds an entry to the exclusion/inclusion list. If a domain matches -the name given as string, the server is queried if this was the first matching rule -(see also the entry for policy). -.br -If the given name starts with a dot, the whole subdomain -of the given name including the one of that name is matched, e.g. ".foo.bar." -will match the domain names a.foo.bar., a.b.c.foo.bar. and foo.bar. -.br -If it does not start in a dot, only exactly the given name (ignoring the case, of course) -will be matched (hint: if you want to include all subdomains, but not the domain of the given -name itself, place an exact-match exclude rule before the include rule, e.g: -exclude="foo.bar."; include=".foo.bar."; -.br -Previous versions of pdnsd -required that names given with this and the next option ended in a dot, but since -version 1.1.8b1-par8, pdnsd automatically adds a dot at the end if it -is missing. -.br -pdnsd now also accepts a more compact notation for adding several "include" entries in -one line, e.g.: - -include=".foo",".bar",".my.dom"; - -.TP -.B exclude=\fIstring\fP; -This option adds an entry to the exclusion/inclusion list. If a domain matches -the name given as string, the server is not queried if this was the first matching rule -(see also the entry for policy). -.br -If the given name starts with a dot, the whole subdomain -of the given name including the one of that name is matched, e.g. ".foo.bar." -will match the domain names a.foo.bar., a.b.c.foo.bar. and foo.bar. -.br -If it does not start in a dot, only exactly the given name (ignoring the case, of course) -will be matched (hint: if you want to exclude all subdomains, but not the domain of the given -name itself, place an exact-match include rule before the exclude rule, e.g: -include="foo.bar."; exclude=".foo.bar."; -.br -pdnsd now also accepts a more compact notation for adding several "exclude" entries in -one line, e.g.: - -exclude=".foo",".bar",".my.dom"; - - -.SS rr Section -Every rr section specifies a dns resource record that is stored locally. It -allows you to specify own dns records that are served by pdnsd in a limited way. -Only A, PTR, CNAME, MX, NS and SOA records are implemented. -.br -This option is intended to allow you to define RRs for 1.0.0.127.in-addr.arpa. -and localhost. (and perhaps even one or two hosts) without having to start an -extra named if your cached name servers do not serve those records. -It is \fBNOT\fP intended and not capable to work as a full-featured name server. - -.TP -.B name=\fIstring\fP; -Specifies the name of the resource records, i.e. the domain name of -the resource the record describes. This option must be specified -before any a, ptr, cname, -mx, ns or soa records. -Names are interpreted as absolute domain names -(i.e. pdnsd assumes they end in the root domain). -For this and all following arguments that take domain names, you need to -specify domain names in dotted notation (example venera.isi.edu.). -.br -Previous versions of pdnsd -required that domain names given in the configuration file ended in a -dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a -dot at the end if it is missing. -.br -\fINew in version 1.2:\fP It is also possible to specify a name starting -with the label *. Such a name is called a wildcard. The * in a wildcard -can match one or more labels in a queried name, but only whole labels. -Any other * characters in a wildcard, apart from the leading one, -will only match a literal *. -.br -For example, *.mydomain will match a.mydomain or www.a.mydomain, but not -mydomain. *.a*.mydomain will match www.a*.mydomain, but not www.ab.mydomain. -*a.mydomain will only match itself. -.br -Before you can specify an rr section with name=*.mydomain -you must define some records for mydomain, typically NS and/or SOA records. -Example: -.DS L - - rr { - name = mydomain; - ns = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - rr { - name = *.mydomain; - a = 192.168.1.10; - } -.DE - -In this example, www.mydomain and ftp.mydomain will resolve to the numeric -address 192.168.1.10 (unless you add rr sections explicitly -specifying different addresses for www.mydomain or ftp.mydomain). -If you want mydomain also to resolve to a numeric address, -add an A record to the first rr section. -.TP -.B ttl=\fItimespec\fP; -Specifies the ttl (time to live) for all resource records in this section after this entry. -This may be redefined. The default is 86400 seconds (=1 day). -.TP -.B authrec=(on|off); -If this is turned on, pdnsd will create authoritative local records for this rr section. -This means that pdnsd flags the domain record so that records of this domain that are not -present in the cache are treated as non-existent, i.e. no other servers are queried for -that record type, and an response containing none of those records is returned. This is -most time what people want: if you add an A record for a host, and it has no AAAA record -(thus no IPv6 address), you normally don't want other name servers to be queried for it. -.br -This is on by default. -.br -Please note that this only has an effect if it precedes the name option! -.TP -.B reverse=(on|off); -\fINew in version 1.2:\fP If you want a locally defined name to resolve to a numeric address -and vice versa, you can achieve this by setting reverse=on before defining the A record -(see below). The alternative is to define a separate PTR record, but you will -probably find this option much more convenient. -.br -The default is off. -.TP -.B a=\fIstring\fP; -Defines an A (host address) record. The argument is an IPv4 address in dotted notation. -pdnsd will serve this address for the host name given in the name option. -.br -Provided there is sufficient support in the C libraries and support for AAAA records was not -disabled, the argument string may also be an IPv6 address, in which case an AAAA record -will be defined. -.br -This option be may used multiple times within an rr section, causing -multiple addresses to be defined for the name. However, if you put the different addresses -in different rr sections for the same name, the definition in the last -rr section will cancel the definitions in the previous ones. -.TP -.B ptr=\fIstring\fP; -Defines a PTR (domain name pointer) record. The argument is a host name in -dotted notation (see name). The ptr record is for resolving adresses into names. For example, if -you want the adress 127.0.0.1 to resolve into localhost, and localhost into 127.0.0.1, you need something -like the following sections: -.br -.DS L - - rr { - name = localhost; - a = 127.0.0.1; - owner = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - rr { - name = 1.0.0.127.in-addr.arpa; - ptr = localhost; - owner = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } -.DE - -The second section is for reverse resolving and uses the ptr option. -Note that you can get the same effect by specifying only the first rr section -with reverse=on. -.br -There is something special about the name in the second section: -when a resolver wants to get a host name from an internet address, -it composes an address that is built of the IP address in reverse byte order -(1.0.0.127 instead of 127.0.0.1) where each byte of the adress written -as number constitutes a sub-domain under the domain in-addr.arpa. -.br -So, if you want to compose an adress for reverse resolving, take your ip in dotted notation (e.g. 1.2.3.4), -reverse the byte order (4.3.2.1) and append in-addr.arpa. (4.3.2.1.in-addr.arpa.) -Then, define an rr section giving this address as name and the domain name corresponding to -that ip in the ptr option. -.TP -.B cname=\fIstring\fP; -Defines a CNAME (canonical name) record. -The argument should be a fully-qualified host name in dotted notation (see name). -A CNAME is the DNS equivalent of an alias or symbolic link. -.br -A useful application for CNAMEs is giving short, easy to remember nicknames to hosts with complicated names. -For example, you might want the name "news" to refer to your ISP's news server "nntp2.myisp.com". -Instead of adding an A record for "news" with the same address as "nntp2.myisp.com", you could -put in a CNAME pointing to "nntp2.myisp.com", so that if the IP address of the news server changes, -there is no need to update the record for "news". -.br -To implement this with pdnsd, you could add the following section to your configuration file: -.br -.DS L - - rr { - name = news; - cname = nntp2.myisp.com; - owner = localhost; - } -.DE - -.TP -.B mx=\fIstring\fP,\fInumber\fP; -Defines an MX (mail exchange) record. The string is the host name of the mail server in dotted notation (see name). -The number specifies the preference level. -.br -When you send mail to someone, your mail typically goes from your E-mail client to an SMTP server. -The SMTP server then checks for the MX record of the domain in the E-mail address. -For example, with joe@example.com, it would look for the MX record for example.com and find -that the name of mail server for that domain is, say, mail.example.com. -The SMTP server then gets the A record for mail.example.com, and connects to the mail server. -.br -If there are multiple MX records, the SMTP server will pick one based on the preference level -(starting with the lowest preference number, working its way up). -.br -Don't define MX records with pdnsd unless you know what you're doing. -.TP -.B owner=\fIstring\fP; -or -.PD 0 -.TP -.PD -.B ns=\fIstring\fP; -Defines an NS (name server) record. Specifies the name of the host which should be authoritative for the records -you defined in the rr section. This is typically the host pdnsd runs on. -.br -\fINote:\fP In previous versions of pdnsd this option had to be specified before -any a, ptr, cname, mx or soa entries. -In version 1.2, the restrictions on this option are same as the options just mentioned, -and it must listed after the name= option. -This can be a pain if you want to use an old config file which specifies owner= -before name= (sorry about that). -Apart from greater consistency, the advantage is that you can now specify as many NS records as you like (including zero). -.TP -.B soa=\fIstring\fP,\fIstring\fP,\fInumber\fP,\fItimespec\fP,\fItimespec\fP,\fItimespec\fP,\fItimespec\fP; -This defines a soa (start of authority) record. The first string is the -domain name of the server and should be equal to the name you specified as -owner. -.br -The second string specifies the email address of the maintainer of the name -server. It is also specified as a domain name, so you will have to replace the -@ sign in the name with a dot (.) to get the name you have to specify here. -The next parameter (the first number) is the serial number of the record. You -should increment this number if you change the record. -.br -The 4th parameter is the refresh timeout. It specifies after what amount -of time a caching server should attempt to refresh the cached record. -.br -The 5th parameter specifies a time after which a caching server should attempt -to refresh the record after a refresh failure. -.br -The 6th parameter defines the timeout after which a cached record expires if it -has not been refreshed. -.br -The 7th parameter is the ttl that is specified in every rr and should be the -same as given with the ttl option (if you do not specify a ttl, use the default 86400). -.TP -.B txt=\fIstring\fP,...,\fIstring\fP; -\fINew in version 1.2.9:\fP -Defines an TXT record. You can specify one or more strings here. - -.SS neg Section -Every neg section specifies a dns resource record or a dns domain that should be -cached negatively locally. Queries for negatively cached records are always answered -immediatley with an error or an empty answer without querying other hosts as long -as the record is valid. The records defined with neg sections remain -valid until they are explicitely invalidated or deleted by the user using -pdnsd\-ctl. -.br -This is useful if a certain application asks periodically for nonexisting hosts or -RR types and you do not want a query to go out every time the cached record has -timed out. Example: Netscape Communicator will ask for the servers news and mail -on startup if unconfigured. If you do not have a dns search list for your network, -you can inhibit outgoing queries for these by specifying -.br -.DS L - - neg { - name = news; - types = domain; - } - neg { - name = mail; - types = domain; - } -.DE - -in your config file. If you have a search list, you have to repeat that for any -entry in your search list in addition to the entries given above! -.br -In versions 1.1.11 and later, if you negate whole domains this way, all subdomains -will be negated as well. Thus if you specify -.br -neg {name=example.com; types=domain;} in the -config file, this will also negate www.example.com, xxx.adserver.example.com, etc. - -.TP -.B name=\fIstring\fP; -Specifies the name of the domain for which negative cache entries are created. -This option must be specified before the types option. -Names are interpreted as absolute domain names (i.e. pdnsd -assumes they end in the root domain). -You need to specify domain names in dotted notation (example venera.isi.edu.). -.br -Previous versions of pdnsd -required that domain names given in the configuration file ended in a -dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a -dot at the end if it is missing. -.TP -.B ttl=\fItimespec\fP; -Specifies the ttl (time to live) for all resource records in this section after this entry. -This may be redefined. The default is 86400 seconds (=1 day). -.TP -.B types=(domain|\fIrr_type\fP[,\fIrr_type\fP[,\fIrr_type\fP[,...]]]); -Specifies what is to be cached negatively: domain will cache the whole -domain negatively; alternatively, you can specify a comma-separated list of RR types -which are to be cached negatively. You may specify multiple types options, but -domain and the RR types are mutually exclusive. -.br -The RR types are specified using their official names from the RFC's in capitals, -e.g. A, CNAME, NS, PTR, MX, -AAAA, ... -.br -The command pdnsd\-ctl\ list\-rrtypes will give you a complete list -of those types. pdnsd\-ctl is built along with pdnsd -and will be installed in the same directory as the pdnsd binary during make install. - -.SS source Section -Every source section allows you to let pdnsd read the records from a file in an -/etc/hosts-like format. pdnsd will generate records to resolve the entries -address from its host name and vice versa for every entry in the file. This is -normally easier than defining an rr for every of your addresses, since localhost -and your other FQDNs are normally given in /etc/hosts. -.br -The accepted format is as follows: The #\-sign initiates a comment, the rest of -the line from the first occurence of this character on is ignored. Empty lines -are tolerated. -.br -The first entry on a line (predeceded by an arbitrary number of tabs and spaces) -is the IP in dotted notation, the second entry on one line (separated by the -first by an arbitrary number of tabs and spaces) is the FQDN (fully qualified -domain name) for that ip. The rest of the line is ignored by default (in the original -/etc/hosts, it may contain information not needed by pdnsd). - -.TP -.B owner=\fIstring\fP; -Specifies the name of the host pdnsd runs on and that are specified in dns -answers (specifically, nameserver records). -Must be specified before any file entries. -.br -Names are interpreted as absolute domain names (i.e. pdnsd -assumes they end in the root domain). -You need to specify domain names in dotted notation (example venera.isi.edu.). -.br -Previous versions of pdnsd -required that domain names given in the configuration file ended in a -dot, but since version 1.1.8b1-par8, pdnsd automatically assumes a -dot at the end if it is missing. -.TP -.B ttl=\fItimespec\fP; -Specifies the ttl (time to live) for all resource records in this section after -this entry. This may be redefined. The default is 86400 seconds (=1 day). -.TP -.B file=\fIstring\fP; -The string specifies a file name. For every file entry in a source section, -pdnsd will try to load the given file as described above. Failure is indicated -only when the file cannot be opened, malformed entries will be ignored. -.TP -.B serve_aliases=(on|off); -If this is turned on pdnsd will serve the aliases given in a hosts-style file. -These are the third entry in a line of a hosts-style file, which usually give a "short name" for the host. -This may be used to support broken clients without a proper domain-search option. -If no aliases are given in a line of the file, pdnsd behaves as without this option for this line. -.br -This feature was suggested by Bert Frederiks. -.br -It is off by default. -.TP -.B authrec=(on|off); -If this is turned on, pdnsd will create authoritative local records with the data from the hosts file. -Please see the description of the option of the same name in the rr section for a closer description of -what this means. Please note that this only has an effect for files sourced with file options -subsequent to this option. -.br -This is on by default. - -.SS include Section -A configuration file may include other configuration files. -However, only the top-level configuration file may contain global -and server sections, -thus include files are effectively limited to sections that add local definitions to the cache. -.br -Include sections currently only have one type of option, which may be given multiple times within a single section. - -.TP -.B file=\fIstring\fP; -The string specifies a file name. For every file option in an include section, -pdnsd will parse the given file as described above. The file may contain include sections itself, -but as a precaution pdnsd checks that a certain maximum depth is not exceeded to guard against -the possibility of infinite recursion. - -.SH "VERSION" -.PP -This man page is correct for version @fullversion@ of pdnsd. -.SH "SEE ALSO" -.PP -.BR pdnsd (8), -.BR pdnsd\-ctl (8) -.PP -More documentation is available in the \fBdoc/\fP subdirectory of the source, -or in \fB/usr/share/doc/pdnsd/\fP if you are using a binary package. - -.SH AUTHORS - -\fBpdnsd\fP was originally written by Thomas Moestl -.UR - -.UE -and was extensively revised by Paul A. Rombouts -.UR - -.UE -(for versions 1.1.8b1\-par and later). -.PP -Several others have contributed to \fBpdnsd\fP; see files in the source or -\fB/usr/share/doc/pdnsd/\fP directory. -.PP -This man page was automatically generated from the html documentation for \fBpdnsd\fP, -using a customized Perl script written by Paul A. Rombouts. -.PP -Last revised: 19 April 2012 by Paul A. Rombouts diff --git a/jni/pdnsd/doc/pdnsd.conf.in b/jni/pdnsd/doc/pdnsd.conf.in deleted file mode 100644 index e348eb02..00000000 --- a/jni/pdnsd/doc/pdnsd.conf.in +++ /dev/null @@ -1,143 +0,0 @@ -// Sample pdnsd configuration file. Must be customized to obtain a working pdnsd setup! -// Read the pdnsd.conf(5) manpage for an explanation of the options. -// Add or remove '#' in front of options you want to disable or enable, respectively. -// Remove '/*' and '*/' to enable complete sections. - -global { - perm_cache=1024; - cache_dir="@cachedir@"; -# pid_file = /var/run/pdnsd.pid; - run_as="@def_id@"; - server_ip = 127.0.0.1; # Use eth0 here if you want to allow other - # machines on your network to query pdnsd. - status_ctl = on; -# paranoid=on; # This option reduces the chance of cache poisoning - # but may make pdnsd less efficient, unfortunately. - query_method=udp_tcp; - min_ttl=15m; # Retain cached entries at least 15 minutes. - max_ttl=1w; # One week. - timeout=10; # Global timeout option (10 seconds). - neg_domain_pol=on; - udpbufsize=1024; # Upper limit on the size of UDP messages. -} - -# The following section is most appropriate if you have a fixed connection to -# the Internet and an ISP which provides good DNS servers. -server { - label= "myisp"; - ip = 192.168.0.1; # Put your ISP's DNS-server address(es) here. -# proxy_only=on; # Do not query any name servers beside your ISP's. - # This may be necessary if you are behind some - # kind of firewall and cannot receive replies - # from outside name servers. - timeout=4; # Server timeout; this may be much shorter - # that the global timeout option. - uptest=if; # Test if the network interface is active. - interface=eth0; # The name of the interface to check. - interval=10m; # Check every 10 minutes. - purge_cache=off; # Keep stale cache entries in case the ISP's - # DNS servers go offline. - edns_query=yes; # Use EDNS for outgoing queries to allow UDP messages - # larger than 512 bytes. May cause trouble with some - # legacy systems. -# exclude=.thepiratebay.org, # If your ISP censors certain names, you may -# .thepiratebay.se, # want to exclude them here, and provide an -# .piratebay.org, # alternative server section below that will -# .piratebay.se; # successfully resolve the names. -} - -/* -# The following section is more appropriate for dial-up connections. -# Read about how to use pdnsd-ctl for dynamic configuration in the documentation. -server { - label= "dialup"; - file = "/etc/ppp/resolv.conf"; # Preferably do not use /etc/resolv.conf - proxy_only=on; - timeout=4; - uptest=if; - interface = ppp0; - interval=10; # Check the interface every 10 seconds. - purge_cache=off; - preset=off; -} -*/ - -/* -# The servers provided by OpenDNS are fast, but they do not reply with -# NXDOMAIN for non-existant domains, instead they supply you with an -# address of one of their search engines. They also lie about the addresses of -# of the search engines of google, microsoft and yahoo. -# If you do not like this behaviour the "reject" option may be useful. -server { - label = "opendns"; - ip = 208.67.222.222, 208.67.220.220; - reject = 208.69.32.0/24, # You may need to add additional address ranges - 208.69.34.0/24, # here if the addresses of their search engines - 208.67.219.0/24; # change. - reject_policy = fail; # If you do not provide any alternative server - # sections, like the following root-server - # example, "negate" may be more appropriate here. - timeout = 4; - uptest = ping; # Test availability using ICMP echo requests. - ping_timeout = 100; # ping test will time out after 10 seconds. - interval = 15m; # Test every 15 minutes. - preset = off; -} -*/ - -/* -# This section is meant for resolving from root servers. -server { - label = "root-servers"; - root_server = discover; # Query the name servers listed below - # to obtain a full list of root servers. - randomize_servers = on; # Give every root server an equal chance - # of being queried. - ip = 198.41.0.4, # This list will be expanded to the full - 192.228.79.201; # list on start up. - timeout = 5; - uptest = query; # Test availability using empty DNS queries. -# query_test_name = .; # To be used if remote servers ignore empty queries. - interval = 30m; # Test every half hour. - ping_timeout = 300; # Test should time out after 30 seconds. - purge_cache = off; -# edns_query = yes; # Use EDNS for outgoing queries to allow UDP messages - # larger than 512 bytes. May cause trouble with some - # legacy systems. - exclude = .localdomain; - policy = included; - preset = off; -} -*/ - -source { - owner=localhost; -# serve_aliases=on; - file="/etc/hosts"; -} - -/* -include {file="/etc/pdnsd.include";} # Read additional definitions from /etc/pdnsd.include. -*/ - -rr { - name=localhost; - reverse=on; - a=127.0.0.1; - owner=localhost; - soa=localhost,root.localhost,42,86400,900,86400,86400; -} - -/* -neg { - name=doubleclick.net; - types=domain; # This will also block xxx.doubleclick.net, etc. -} -*/ - -/* -neg { - name=bad.server.com; # Badly behaved server you don't want to connect to. - types=A,AAAA; -} -*/ diff --git a/jni/pdnsd/doc/txt/doc_makefile b/jni/pdnsd/doc/txt/doc_makefile deleted file mode 100644 index 57aa7c11..00000000 --- a/jni/pdnsd/doc/txt/doc_makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Makefile for converting pdnsd html documentation to text files. -# This file was based on a Makefile originally written by Thomas Moestl -# and adapted by Paul Rombouts. - - -HTML2TXT=w3m -dump -cols 80 -T text/html - -doc: intro.txt manual.txt faq.txt -.PHONY: doc clean - -intro.txt: ../html/index.html - sed -e 's///-->/g' ../html/index.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > intro.txt - -manual.txt: ../html/doc.html - sed -e 's///-->/g' ../html/doc.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > manual.txt - -faq.txt: ../html/faq.html - sed -e 's///-->/g' ../html/faq.html | $(HTML2TXT) | sed -e 's/[[:blank:]]\+$$//' > faq.txt - -clean: - @rm -fv intro.txt manual.txt faq.txt diff --git a/jni/pdnsd/doc/txt/faq.txt b/jni/pdnsd/doc/txt/faq.txt deleted file mode 100644 index 02631610..00000000 --- a/jni/pdnsd/doc/txt/faq.txt +++ /dev/null @@ -1,227 +0,0 @@ -The pdnsd FAQ - -Q: There are complete and well-tested name servers around, such as the BIND. - These do also perform caching. Why should I use pdnsd? - - pdnsd does not aim to be a complete name server implementation, such as the - BIND. It is optimized for caching, and you can only specify a small subset - of all dns record types pdnsd knows in your local "zone" definitions. This - of course reduces the code size drastically, and such the memory footprint. - There are some features especially interesting for dialin networks, - ordinary (non-server) internet hosts and computers that are often not - connected to to their network, e.g. notebooks (I originally wrote this - program for use with my notebook). These features are: -A: - * permanent disk cache (useful for frequent power-offs/reboots) - * usually smaller memory footprint (depends on cache size) (see next - question) - * offline-detection prevents hangs (e.g. the typical hang on startup of - some Netscape Navigator versions if not dialled in) - * better control about timeouts (also to prevent hangs) - * better control over the cache - * better run-time control - -------------------------------------------------------------------------------- - - When I look at the process size with ps, top, gtop, or a similar tool, I -Q: see some processes with a total size well above 3.5 MB. This is much more - than e.g. BIND named (about 1.4 MB). Why? - - Really, it is not. pdnsd uses multithreading, not multiprocessing. That - means that the processes share most of their process space. In the - LinuxThreads library or NPTL (Native Posix Thread Libary), which are used - by pdnsd on Linux, in fact the total process address space is shared -A: (although the processes have different stacks, these are in one process - address space). You may check this by looking at the at the process sizes - of the pdnsd threads: all should be the same. The effective size that pdnsd - occupies is thus the size of any of the processes, not the sum of those. - So, pdnsd with empty cache occupies about 800 kB, and the maximum size - should be about the cache size plus this size (in fact, ca 5-10% more). - -------------------------------------------------------------------------------- - -Q: What do I need the status control (option -s) for? - - It enables you to do some things you might or might not need. With it, you - can: - - * query pdnsd's settings at runtime to debug configuration files and see - which servers are regarded to be available -A: * mark servers as available or unavailable, or force a status retest - - very handy if you want to control which servers pdnsd queries, e.g for - muliple dial-up accounts - * delete, invalidate or add DNS records - useful e.g. when you want to - build records for dynamically assigned IP addresses or domain names - * reload pdnsd's configuration file without restarting pdnsd - * print information about the contents of pdnsd's cache. - -------------------------------------------------------------------------------- - -Q: What do I need local records (rr- and source-sections in the config file) - for? - - Some resolver programs, e.g. nslookup, want to look up the name of the - server they are using before doing anything else. This option is for - defining a PTR record for your IP such that those programs get an answer - even if the name server you are caching is not available or does not offer - these records. By extension, you may also define A and SOA records. This - allows you to build very small zones without having to use a "big" name - server. It is NOT intended to replace such a complete server in anything - but VERY small networks. Alternatively, you may start a named on another - host or on the same host on another port and cache it with pdnsd in - addition to other (more distant) name servers. -A: The source section allows you to let pdnsd read in your /etc/hosts file on - startup and serve its contents. This file is used by your local resolver - before it even tries the name servers and usually contains fully-qualified - domain names (FQDNs) for all of the internet addresses your host has. If - you source this file, you usually won't need any additional rr sections. - Sourcing it also allows other hosts (eg. in your local network) to access - the names defined in your hosts file. You can of course just add other - hosts in your local network to the servers hosts file, thus making them - known to your server's resolver and pdnsd (if you sourced that file). - If you don't know what this answer was all about, you should just take the - source section in the sample config file that comes with pdnsd, copy it - into your config file and forget about it. - -------------------------------------------------------------------------------- - - When compiling, I get an error message like -Q: Please define __BYTE_ORDER to be __LITTLE_ENDIAN or __BIG_ENDIAN - What's up? - - Normally, this macros should be defined in your C library's header files. - There are two different methods, most C libraries support both (and pdnsd - honors both): either __BYTE_ORDER is set to __LITTLE_ENDIAN or - __BIG_ENDIAN, or __LITTLE_ENDIAN or __BIG_ENDIAN are directly defined as - macros. - Linux glibc, for example, does set those macros correctly. Never mind. You - just have to know whether your machine is little-endian or big-endian, this - means wheter your machine saves the least significant byte of a word or - double-word first in memory (little-endian) or the most significant first -A: (big-endian). All intel x86 and Alpha machines are little-endian, for - example, while SPARC and PowerPC architectures are big-endian. If your - machine is little-endian, add the following line to your config.h: - #define __BYTE_ORDER __LITTLE_ENDIAN - Likewise, if your machines byte order is big-endian: - #define __BYTE_ORDER __BIG_ENDIAN - Pathological byte orders like pdp-endian are not yet supported really; - However, for the place the endianess is needed, __LITTLE_ENDIAN should do - (it deals only with 16 bits; for all other occurances, ntoh[sl]/hton[sl] is - used). - -------------------------------------------------------------------------------- - - At startup, I get a warning saying: -Q: Uptest command [...] will implicitly be executed as root - What does that mean? - - This warning only occurs if you use the uptest=exec option in your - configuration. It means that the uptest command is run as root because - pdnsd is running as root, and this was not explicitely specified. The idea - is that it may introduce security holes (in the programs being run) when -A: they run as root, and so they shouldn't do that if possible. You can - specify the user that shall run the command by appending its name - comma-separated as string to the uptest_cmd line: - uptest_cmd="",""; - If it is correctly running as root, just append the user string "root" to - the command and the warning will not occur again. - -------------------------------------------------------------------------------- - -Q: I cannot run my uptest_cmd command as root (it says permission denied), - although the pdnsd executable is setuid root. Why? - - pdnsd will drop privileges gained through setuid/setgid before executing - the uptest commands (you shouldn't set the pdnsd executable setuid/setgid -A: anyway). The reason is clear: if you install the pdnsd executable as setuid - root and this wouln't be done, any user could execute shellcode with root - privileges using that option! - -------------------------------------------------------------------------------- - - At startup, I get an error saying: -Q: Bad config file permissions: the file must be only writeable by the user - Why is that? - - pdnsd has an option (uptest=exec) that allows the execution of arbitrary - shell code (for testing whether an interface is up). This must be of course - secured against unauthorized use. One of these protection is the one that - produces the error message: if you routinely run pdnsd, e.g. at system - startup, and your config file is editable for others, someone could change -A: it and insert shell code that is executed in the next pdnsd run -- with - your user privileges! To prevent this, pdnsd will exit if the config file - is writeable by others than the owner. To get rid of this message, just do - chmod go-w - on your config file (for the default file: chmod go-w /etc/pdnsd.conf). You - should also check that the ownership is set correct. - -------------------------------------------------------------------------------- - -Q: serve_aliases does not seem to work. - - Some resolvers (e.g. of the glibc 2.1) seem sometimes not to look up - unmodified names, but the names with an entry of the search path already -A: appended. Since pdnsd will serve short names with this option anyway, you - can delete the search an domain options from your /etc/resolv.conf. This is - reported to work in some cases. - -------------------------------------------------------------------------------- - -Q: Some queries for domains that have many records (e.g. www.gmx.de) fail - mysteriously. - - pdnsd versions prior to 1.1.0 had the tcp server thread disabled by - default. Most resolvers repeat their query using tcp when they receive a -A: truncated answer (the answer is truncated when it exceeds a length of 512 - bytes). You need to recompile pdnsd with the option --enable-tcp-server to - fix this. - -------------------------------------------------------------------------------- - - I am behind some kind of firewall. In the configuration file I have only -Q: listed addresses of name servers on the local (ISP's) network, but pdnsd is - slow and DNS queries frequently time out. - - In some cases pdnsd will not consider the answer of the local name server - authoritative enough, and will try to get answers from the name servers - listed in the authority section of the reply message. If pdnsd is behind a - firewall that blocks the UDP reply packets from remote name servers, pdnsd - will wait in vain for a reply. One solution is to set proxy_only=on in the -A: servers sections of the configuration file. This will prevent pdnsd from - querying name servers that are not listed in the configuration file. - Another solution that can be tried is specifying query_method=tcp_only in - the global section of the configuration file, because a firewall that - blocks UDP packets from outside might still allow outgoing TCP connections - to port 53. - -------------------------------------------------------------------------------- - -Q: Is pdnsd vulnerable to DNS cache poisoning as described in CERT - vulnerability note VU#800113? - - Short answer: Yes. - Somewhat longer answer: The problem is not so much that pdnsd's - implementation is flawed but rather that the DNS protocol currently being - used is fundamentally flawed from a security viewpoint. As long as a more - secure protocol is not in place, all that the developers of pdnsd can do is - to try to tweak the current implementation to make it as difficult as - possible for an attacker to succeed. - From version 1.2.7 onwards, the default for the query_port_start option is -A: 1024, which means that the pdnsd resolver will randomly select source ports - in the range 1024-65535. (In previous versions the default was to let the - kernel select the source ports, which will often result in a more or less - predictable sequence of ports.) It also helps to use a good quality source - of random numbers. On platforms where this is supported, it is preferable - to configure with --with-random-device=/dev/urandom. There is still more - that can be done to make pdnsd less vulnerable, but this remains (as of - this writing) a work in progress. - Please note that pdnsd was designed for small (private) networks, and that - it is generally not recommended to let untrusted users access pdnsd. - -------------------------------------------------------------------------------- - -Thomas Moestl and Paul Rombouts - - -Last revised: 18 August 2008 by Paul Rombouts - diff --git a/jni/pdnsd/doc/txt/intro.txt b/jni/pdnsd/doc/txt/intro.txt deleted file mode 100644 index db1c89e3..00000000 --- a/jni/pdnsd/doc/txt/intro.txt +++ /dev/null @@ -1,305 +0,0 @@ -------------------------------------------------------------------------------- - -About pdnsd - -pdnsd is a proxy DNS server with permanent caching (the cache contents are -written to hard disk on exit) that is designed to cope with unreachable or down -DNS servers (for example in dial-in networking). -Since version 1.1.0, pdnsd supports negative caching. - -It is licensed under the GNU General Public License (GPL). This, in short, -means that the sources are distributed togehter with the program, and that you -are free to modify the sources and redistribute them as long as you also -license them under the GPL. You do not need to pay anything for pdnsd. It also -means that there is ABSOLUTELY NO WARRANTY for pdnsd or any part of it. For -details, please read the GPL. - -pdnsd can be used with applications that do DNS lookups, e.g. on startup, and -can't be configured to change that behaviour, to prevent the often minute-long -hangs (or even crashes) that result from stalled DNS queries. Some Netscape -Navigator versions for Unix, for example, expose this behaviour. - -pdnsd is configurable via a file and supports run-time configuration using the -program pdnsd-ctl that comes with pdnsd. This allows you to set the status -flags of servers that pdnsd knows (to influence which servers pdnsd will -query), and the addition, deletion and invalidation of DNS records in pdnsd's -cache. -Parallel name server queries are supported. This is a technique that allows -querying several servers at the same time so that very slow or unavailable -servers will not block the answer for one timeout interval. -Since version 1.0.0, pdnsd has full IPv6 support. - -There is also a limited support for local zone records, intended for defining -1.0.0.127.in-addr.arpa. and localhost. , since some clients request that -information and it must be served even if the cached servers are not available -or do not serve these records. pdnsd may also read your /etc/hosts file (this -file is normally used by your local resolver and usually contains information -for localhost as well as for your machines FQDN) and serve its contents. - -pdnsd was started on Linux, and has since been ported to FreeBSD (and Cygwin -and Darwin). 90% of the source code should be easily portable to POSIX- and -BSD-compatible systems, provided that those systems support the POSIX threads -(pthreads). The rest might need OS-specific rewrites. - -Currently, pdnsd is only compileable by gcc. This should be easy to fix, but I -just do not have documentation for other compilers. If you are not able or do -not want to use gcc, I would recommend you just try to do the minor changes. - -pdnsd must be started as root in some cases (raw sockets are needed for icmp -echoes for the option uptest=ping, and the default port is 53, this must be > -1024 to allow non-root execution). However, pdnsd can be configured to change -it's user and group id to those of a non-privileged user after opening the -sockets needed for this. - -The server should support the full standard DNS queries following the rfcs 1034 -and 1035. As of version 1.0.0, the rfc compliance has been improved again, and -pdnsd is now believed (or hoped?) to be fully rfc-compatible. It completely -follows rfc 2181 (except for one minor issue in the FreeBSD port, see the -documentation). It does not support the following features, of which most are -marked optional, experimental or obsolete in these rfcs: - - * Inverse queries - * Status queries - * Completion queries - * Namespaces other than IN (Internet) - * AXFR and IXFR queries (whole zone transfers); since pdnsd does not maintain - zones, that should not violate the standard - -The following record types, that are extensions to the original DNS standard, -are supported for caching since version 1.2.9 (if you do not need most of them, -you can disable runtime support for the unneeded ones before compiling pdnsd -and save a little cache and executable space, see the source file src/ -rr_types.in): - - * RP (responsible person, RFC 1183) - * AFSDB (AFS database location, RFC 1183) - * X25 (X25 address, RFC 1183) - * ISDN (ISDN number/address, RFC 1183) - * RT (route through, RFC 1183) - * NSAP (Network Service Access Protocol address , RFC 1348) - * PX (X.400/RFC822 mapping information, RFC 1995) - * GPOS (geographic position, deprecated) - * AAAA (IPv6 address, RFC 1886) - * LOC (location, RFC 1876) - * EID (Nimrod EID) - * NIMLOC (Nimrod locator) - * SRV (service record, RFC 2782) - * ATMA (ATM address) - * NAPTR (URI mapping, RFC 2168) - * KX (key exchange, RFC 2230) - * CERT (Certificate record, RFC 4398) - * DS (Delegation Signer, RFC 4034) - * RRSIG (Resource Record Signature, RFC 4034) - * NSEC (Next Secure, RFC 4034) - * DNSKEY (record containing the public key for a zone, RFC 4034) - * NSEC3 (Next Secure version 3, RFC 5155) - * NSEC3PARAM (NSEC3 parameters, RFC 5155) - -Note: This list is incomplete. For the complete list see the source file src/ -rr_types.in. - -There are FreeBSD and OpenBSD ports available for pdnsd (ports/net/pdnsd for -both). Thanks go to Roman Shterenzon for the FreeBSD port Sebastian Stark for -the OpenBSD one! Thanks to Kiyo Kelvin Lee now also runs on the Cygwin -platform! Thanks goes to Rodney Brown for extending portability to the Darwin -(Apple Mac OS X) platform! - -If you have questions left, you should take a look into the FAQ. -Bugfixes, patches and compatability fixes for other OSs are very welcome! - -Features in detail - -This section describes some of pdnsds features in detail. Most of the options -are set in the config file. For more information on the configuration file, see -the documenation page. - - -Uptests - -pdnsd provides several methods to test whether a remote DNS server should be -regarded as available (so that pdnsd can query it), in addition to the obvious -"none" test (the server is always regarded as available, or availability is set -on or off using the pdnsd-ctl utility). These tests are: - - * ping: a given adress is ping'ed in a given interval. If it there is no - response or the host is unreachable, the server is seen to be not available - (for those who don't know: pinging is sending a certain Internet packet - type to a host to which any standard-conformant host is required to reply). - * if: a given network interface is tested whether it is existent, up and - running. If it is not, the server is regarded to be not available. This is - especially useful for ppp and similar interfaces. A special case test for - Linux isdn (ippp*) interfaces is integrated, so that the uptests should - also work for these. - * dev: this is a variant of the if uptest for use with Linux dial-on-demand - ppp interfaces. In addition to performing an if-style interface uptest, it - also tests whether a specified program (e.g. pppd) owns a lock to a given - (modem-) device. - * exec: a given shell command line is executed and the exit status of the - whole command line (which is normally the exit status of the last command) - is evaluated. If it is not zero, the server is regarded to be not - available. This is a very flexible testing method with which it should be - able to perform virtually any needed test. - * query: New in version 1.2: This works like the ping test, except it sends - an (empty) DNS query to the remote server. If the server sends a - well-formed response back within the timeout period (except SERVFAIL), it - will be regarded as available. This test is useful if a remote server does - not respond to ICMP_ECHO requests at all, which unfortunately is quite - common these days. In many cases this test will be a more reliable - indicator of availability than the ones mentioned above. - - -Local Records ("Zones") - -As mentioned above, there are only very basic local record types (ie the record -types that you may use in record declarations in your local configuration for -records that pdnsd shall serve in addion to the cached ones). They are -organized roughly in zones but have not complete zone declarations, so I -generally do not use the term "zone" for them, but rather "local records". -These are the local record types pdnsd can understand: - - * SOA (information about the name server) - * A (domain-name-to-address mapping) - * PTR (pointer, used normally for address-to-domain-name mapping) - * NS (name server, generated automatically by pdnsd for any local record set) - * CNAME (canonical host name) - * MX (mail exchange for the domain) - * TXT (arbitrary text strings, often used for Sender Policy Framework) - -You can specify these records in the configuration file. -You may "source" a file in a format like that used in the /etc/hosts file, that -means that pdnsd reads this file, extracts addresses and domain names from it -and automatically generates A records for name to address mapping, PTR records -for address to name mapping and NS records (name server specifiation) for each -entry in the file. -Records can also be changed dynamically at run time. -A script contributed by Marko Stolle makes pdnsd usable in a DHCP setup using -this feature. - -System requirements - -As mentioned, pdnsd currently runs under Linux, FreeBSD and Cygwin. Other BSD -flavours may or may not work (feedback is very welcome!). The system and -software requirements under Linux are: - - * Kernel version >2.2.0 - * glibc version >2.0.1 (aka libc6) with LinuxThreads (normally included) or - NPTL (Native Posix Thread Library, recommended). - Due to a bug, pdnsd 0.9.8 does not run with glibc2.1.1. This behaviour was - fixed in pdnsd 0.9.9. - * For IPv6: glibc>=2.1 - -The system requirements under FreeBSD are: - - * FreeBSD versions >=2.6 (prior ones may or may not work) - * For IPv6: FreeBSD >=4.0 is recommended (no idea if it runs on prior - versions) - -The common software requirements for all supported systems are: - - * GCC, preferably egcs-2.* or 3.* (other compilers are currently not - supported; the needed patch for another compiler should not be difficult, - however) - * GNU or BSD make - * the standard commands install, grep, sed, awk, touch and which (along with - the REALLY standard ones mv, cp, ln, rm, pwd, test, echo, cat, mkdir, - chown, chmod, tar). In any standard Unix installation, this should be no - problem. - * for hacking and building own packages, you might also need gzip, bzip2, - perl and rpmbuild - - -Download - -If you want to download pdnsd, please visit the download page. - -Authors - -pdnsd was originally written by Thomas Moestl, but is no longer maintained by -him. Paul A. Rombouts has revised large portions of the code and has added a -number of new features. See README.par and the ChangeLog in the source -directory (or /usr/share/doc/pdnsd- if you have installed a binary -package) for more details. If you have questions about the recent -modifications, you can find the email address of the current maintainer at the -end of README.par. - -Daniel Smolik has contributed RedHat RPMs (the most recent RPMs are available -here). -Torben Janssen contributed start scripts for Red Hat Linux. -Soenke J. Peters contributed patches and suggestions for Red Hat compatability. -Wolfgang Ocker has contributed the code and documentation for the server_ip -option. -Markus Mohr contributed a Debian rc script. -Nikita V. Youschenko contributed extensions to the "if" uptest. -Lyonel Vincent extended the serve_aliases option to support an arbitrary number -of aliases. -Sourav K. Mandal wrote the autoconf scripts and contributed many fixes and -suggestions. -Stephan Boettcher contributed the SCHEME= option. -Ron Yorston contributed the uptest for Linux ppp dial-on-demand devices. -Alexandre Nunes fixed some bugs in the autoconf files. -Sverker Wiberg contributed fixes for IPv6. -Carsten Block contributed configure-able rc scripts. -Olaf Kirch contributed a security fix for the run_as code. -Paul Wagland contributed various patches for bind9-compatability and other -issues. -Roman Shterenzon contributed patches and lots of helpful hints for FreeBSD -compatability. -Bernd Leibing has contributed spec file fixes. -Michael Wiedmann has contributed the pdnsd-ctl.8 man page. -Marko Stolle has contributed the contrib/pdnsd_update.pl script that makes -pdnsd usable in a DHCP setup. -P.J. Bostley has contributed patches to get pdnsd working on alpha properly. -Christian Engstler contributed patches for SuSE compatability. -Bjoern Fischer contributed code to make pdnsd leave the case of names in the -cache unchanged. -Marko Stolle contributed the contrib/pdnsd_update.pl script that makes pdnsd -usable in a DHCP setup. -Andrew M. Bishop contributed the support for the label server option and the -pdnsd-ctl interface for using it. -Frank Elsner contributed rc script fixes. -Andreas Steinmetz contributed the code for query_port_start and query_port_end -options. -Mahesh T. Pai contributed the pdnsd.8 man page. -Nikola Kotur contributed the Slackware start-up script. -Kiyo Kelvin Lee contributed a patch for Cygwin support. -Rodney Brown contributed a patch for Darwin (Apple Mac OS X) support. -Jan-Marek Glogowski contributed a patch implementing the use_nss option. - -Special thanks to Bert Frederiks for letting me do a late-night debugging run -on his machine to spot obscure bugs! - -Thanks to the following persons for reporting bugs and being helpful: -David G. Andersen, -Dirk Armbrust, -Daniel Black, -Kevin A. Burton, -Juliusz Chroboczek, -Joachim Dorner, -Stefan Erhardt, -Stefan F?rster, -Mike Hammer, -Jonathan Hudson, -Dan Jacobson, -Byrial Jensen, -Patrick Loschmidt, -James MacLean, -Fraser McCrossan, -Michael M?ller, -Erich Reitz, -Brian Schroeder, -Milan P. Stanic, -Michael Steiner, -Norbert Steinl, -Markus Storm, -Michael Str?der, -Alan Swanson, -Eelco Vriezekolk. - - -------------------------------------------------------------------------------- - -Thomas Moestl and Paul A. Rombouts - - -Last revised: 17 March 2012 by Paul A. Rombouts - diff --git a/jni/pdnsd/doc/txt/manual.txt b/jni/pdnsd/doc/txt/manual.txt deleted file mode 100644 index c7e3e9d2..00000000 --- a/jni/pdnsd/doc/txt/manual.txt +++ /dev/null @@ -1,2017 +0,0 @@ - pdnsd Documentation - -This is the "official" pdnsd documentation and reference written by Thomas -Moestl with revisions by Paul A. Rombouts. -This manual is a part of the pdnsd package, and may be distributed in original -or modified form under terms of the GNU General Public License, as published by -the Free Software Foundation; either version 3, or (at your option) any later -version. -You can find a copy of the GNU GPL in the file COPYING in the source or -documentation directory. -This manual is up-to-date for version 1.2.9b. For older documentation, please -refer to the doc directory of the respective pdnsd package. -If you want a quicker introduction to pdnsd, you can try some of the HOWTOs -available on the web. For Apple Mac users, Brian Wells has published a good -HOWTO at http://web.mac.com/brianwells/main/pdnsd.html. - -0. Installation - -0.1 Installing binary RPM's - -To install a binary RPM, just do - -rpm -i pdnsd-.rpm - -This should install pretty much everything automatically. The only thing left -for you to do is adapt your configuration file (stored in /etc/pdnsd.conf) -according to your needs (see below). In the Red Hat and SuSE RPMs, a start -script is also installed; read the section 0.4, Start at Boot Time about that. - -0.2 Building RPM's - -It is possible to build a binary RPM from a source package using the command - -rpmbuild --rebuild pdnsd-.src.rpm - -or alternatively from a tarball using the command - -rpmbuild -tb pdnsd-.tar.gz - -You can do this as root, but it is safer to build a binary package first as a -normal user, and then, when all has gone well, install the resulting binary -package as root as in the previous section. How to build an RPM package without -being root is described at http://www.ibm.com/developerworks/linux/library/ -l-rpm1/. - -Several pdnsd-specific options are available when building RPM packages: - ---with isdn Has the same effect as --enable-isdn (see below). - ---without poll Has the same effect as --disable-poll (see below). - ---without nptl Has the same effect as --with-thread-lib=linuxthreads ( - see below). - ---with ipv6 Has the same effect as --enable-ipv6 (see below). - ---without tcpqueries Has the same effect as --disable-tcp-queries (see below - ). - ---without debug Has the same effect as --with-debug=0 (see below). - ---define "distro < Has the same effect as --with-distribution= ( -distro>" see below). - ---define "run_as_user Has the same effect as --with-default-id= (see -" below). - For RPMs the default is "pdnsd". - - If the user defined by the previous option does not ---define "run_as_uid < exist when the RPM is installed, the pre-install script -uid>" will try to create a new user with numerical id . - The default is to let the system choose the numerical - id at install time. - ---define "cachedir < Has the same effect as --with-cachedir= (see below -dir>" ). - -You can also configure which compiler flags will be used by setting the -environment variable CFLAGS. Using a bash shell, you can do that on the command -line like this: CFLAGS="-O1 -Wall" rpmbuild ... -This is useful if you prefer a different level of optimization, for instance. - -0.3 Installing from pure sources (tar archives or git repositories) - -0.3.1 Setting up the source code tree - -Source code is available in the form of snapshots (tarballs) or a git -repository with the very latest development code and a (nearly) complete -history of all the revisions. Cloning a git repository is useful if you need a -recent fix or feature that is not yet contained in a main release or you want -to participate in pdnsd development. Otherwise you will probably find the -tarballs more convenient because they are much more compact. - -0.3.1.1 Unpacking a tar archive - -The pdsnsd snapshot releases come in the form of a gzip'ed tar archive. To -decompress it (using a modern tar) do - -tar -xzf pdnsd-.tar.gz - -If your tar doesn't do this, use: - -gzip -dc pdnsd-.tar.gz | tar -xf - - -0.3.1.2 Cloning a git repository - -To clone a git repository you need to install, if not already installed, the -git version control system, which is available as a package in most modern -Linux distributions. Then run the command: - -git clone git://gitorious.org/pdnsd/pdnsd.git pdnsd - -In rare cases, if you are behind some kind of firewall, the special git -protocol can't be used and you will need to fall back to the http protocol. See -the gitorious.org website or git documentation for more information. - -0.3.2 Configuring the source - -Change into the pdnsd source directory and run configure. It takes the -following command line options (if you do not specify an option, defaults will -be used): - - Specify the prefix directory. The pdnsd files are - installed in subdirectories of the prefix, the ---prefix=dir pdnsd and pdnsd-ctl executables are for example - installed in the sbin subdirectory of the prefix. - The default for this is /usr/local; you might want - to set this to /usr (using --prefix=/usr). - - Specify the config directory. pdnsd expects its - pdnsd.conf file to reside there if the -c option is ---sysconfdir=dir not given at startup. The default for this is the - etc subdirectory of your prefix, e.g. /usr/local/ - etc if you did not specify a prefix. To set this - e.g. to /etc, use --sysconfdir=/etc. - ---with-distribution= Specify target distribution (default=Generic; -distro others: RedHat, SuSE, Debian) - See below for the effect of these settings. - - Change compilation target platform (default: - autodetect; others: Linux, BSD, Cygwin). - autodetect will attempt to detect whether you are ---with-target=platform using Linux, *BSD or Cygwin and should normally be - sufficient. If this does not work, try specifying - your system manually (for the Darwin platform - (Apple Mac OS X) specify BSD here). - - Default directory for pdnsd cache (default=/var/ ---with-cachedir=dir cache/pdnsd) - This setting can be changed via config file - settings when pdnsd has been built. - - Number of hash buckets to use (default=1024). The - default should be sufficient for most purposes, but - if you want to store a large number of names in the ---with-hash-buckets=num cache, cache lookups may be faster if the number of - hash buckets is comparable to the number of names - stored in the cache. The number actually used is - the smallest power of two greater or equal to the - number specified here. - - Enable ISDN support - This option will work only on Linux and may cause ---enable-isdn problems with 2.0.x or old 2.2.x kernels. You will - need it for a proper if uptest under Linux for ISDN - ppp devices. - ---disable-ipv4 Disable IPv4 networking support (default=enabled) - - Enable IPv6 networking support. ---enable-ipv6 If your OS does support IPv6 properly, you should - be able to serve also IPv4 queries using this. - Normally, this is disabled and you won't need it. - ---disable-ipv4-startup Disable IPv4 on pdnsd startup by default (default= - enabled) - - Enable IPV6 on pdnsd startup by default (default= - IPv4). These options are only defaults, you can ---enable-ipv6-startup specify on the command line or in the config files - which IP version will really be used. Normally, you - won't need to change these. - ---disable-udp-queries Disable UDP as query method. You shouldn't need to - change this. - - Disable TCP as query method. This only effects the - querying of name servers by pdnsd, not the ability - of pdnsd to answer TCP queries from clients. TCP - queries are slower than UDP queries, but can be ---disable-tcp-queries more secure against certain types of attacks and - are able to handle large answers. For normal use - this can be disabled. (Note that the default has - changed: TCP-query support is now compiled in by - default, but it still depends on the run-time - options whether it is actually used.) - - Specify the query method (default=udponly, others: - tcponly, tcpudp, udptcp). If you have enabled both - UDP and TCP queries, this lets you control which - query method pdnsd will use by default. tcpudp will - try TCP first and fall back to UDP if TCP is not ---with-query-method=qm supported by the server; udptcp will try UDP first - and, if the answer was truncated, will repeat the - query using TCP. udponly and tcponly should be - clear. Note that this only effects the compiled-in - default; the query method can still be changed - using command-line options or options in the - configuration file. - - Disable the TCP server. In this case pdnsd will not ---disable-tcp-server be able to respond to TCP queries from clients. - This may cause problems with very large answers. - - Disable the UDP source address discovery. - You need this only if you have trouble with ---disable-src-addr-disc messages saying "could not discover udp source - address". - For the Cygwin target, this option is disabled by - default. - ---disable-poll Disable poll(2) and use select(2) (default=enabled) - You will normally not need this. - - Since version 1.2.9 this option is obsolete and - ignored. It is now possible to configure for each ---disable-new-rrs RR type separately whether it is cacheable by pdnsd - by editing the file src/rr_types.in. The comments - in this file explain how to do this. - - Enforce strict RFC 2181 compliance. - This will cause pdnsd to reject DNS answers with ---enable-strict-rfc2181 incorrect timestamp settings (multiple RRs of the - same type and for the same domain with different - TTLs). Normally not needed. - - This option is obsolete. Since version 1.2, pdnsd ---enable-underscores places no restrictions on the types of characters - in domain names (there are still a few restrictions - for locally defined names, though). - - Specify random device; default: C Library random() - PRNG - pdnsd uses (pseudo-) random numbers as query IDs - for security reasons (this makes forging DNS - answers more difficult). This option controls where - pdnsd gets these from. The default is the C library - random() function, which is relatively weak. You - can specify a device like /dev/urandom here if you ---with-random-device= like; pdnsd will read random numbers from it -device 16-bit-wise. /dev/urandom is present under Linux - and most BSD derivates. You should not use /dev/ - random - it is more secure, but may block and delay - pdnsd's answers for a long time. - You can specify arc4random to use the BSD - arc4random() library function (default for FreeBSD - target), which is considered safe. - You can also specify random as device to use the C - Library random() function (described above). - - Specify default user for pdnsd (default=nobody). - This is the user that will be entered for the ---with-default-id=user run_as option in the config file (see below) that - will be installed during make install. You can - change this any time in your config file. - - Specify debugging level. Normally you can safely - switch debugging off by setting the level to 0. - This will increase speed (although only marginally) - and save space in the executable (only about 12kB). - However, more significant may be the savings in - stack space, especially if pdnsd is put under heavy - load and there are many simultaneous running - threads. - Presently the only defined debug levels are in the - range 0 - 9. Setting the level to 9 enables hex ---with-debug=level dumps of the queries and replies pdnsd receives and - should normally not be needed. Debug output will - only be generated if you turn on special switches; - it might be useful for debugging your config files, - so I recommend using the default (1). However, if - you use pdnsd under heavy load, a better strategy - may be to compile one version of pdnsd without - debug support (configured with --with-debug=0) for - production use, and one version with with debug - support (e.g. --with-debug=9) for diagnostic - purposes. - ---with-verbosity=level Specify default message verbosity. The default - should be ok. - - Enable RCS IDs in executables (default=disabled). ---enable-rcsids For personal use, there is no need to do this. If - you build rpm's, it might have advantages. - - Enable subsequent tcp queries. The DNS protocol - standard requires that servers must be capable of - answering multiple subsequent queries that are sent - over the same tcp connection, and that the server - may only close the connection by himself after a - certain timeout. This feature is rarely used, but ---enable-tcp-subseq may make denial-of-service attacks easier, as it - allows for an attacker to hold a connection open a - long time (although the attacker's IP is most - likely revealed then). For full standard - compliance, you should use this option. If you do - not use --enable-tcp-server, is option is not - honored. - - Specify default tcp query timeout after which the - connection is closed if no full query has been ---with-tcp-qtimeout=secs received. The default is 30s. You can also change - this option at run time using the tcp_qtimeout - config file option. If you do not use - --enable-tcp-server, is option is not honored. - - Specify the default number of queries that can be - executed in parallel. You can also change this ---with-par-queries=num option at run time using the par_queries config - file option. See the description of that option for - an explanation of what it really does. - The default for this option is 2. - - New in version 1.2.9b: Specify the maximum number - of IP addresses that can be used per nameserver - obtained from NS records (when resolving names - recursively). Just one IP address per nameserver is - sufficient in the vast majority of cases (and this ---with-max-nameserver-ips was the strategy used by pdnsd in previous -=num versions), but in rare cases this will cause - unnecessary resolve failures if the address chosen - for each nameserver happens to be unreachable while - the other addresses would lead to successful - resolution. - The default for this option is 3. - - Added by Paul Rombouts: Use this option if you - experience problems with signal handling under - Linux. The usual symptom is that pdnsd fails to - save the cache to disk, and /var/cache/pdnsd/ - pdnsd.cache remains empty. If you experience this - kind of trouble, try reconfiguring with different - values for the --with-thread-lib option. The - allowable values are linuxthreads (or lt for - short), linuxthreads2 (or lt2 for short), and nptl. - By default the configure script tries to detect ---with-thread-lib=lib automatically whether linuxthreads or nptl is more - appropriate for your system, but the method used is - not foolproof. Look for the line: checking if this - is an NPTL-based system... - If the automatic test mistakenly indentifies the - thread library on your system as NPTL based, you - should reconfigure with --with-thread-lib=lt and - recompile. If the result of the automatic test is - "no" or if --with-thread-lib=lt does not have the - desired effect, try again using --with-thread-lib= - lt2 . - -Normally, you will need only --prefix, --sysconfdir and --with-distribution. If -you specify your distribution using --with-distribution, this has the following -effects: - - * An rc script is copied in the appropriate localtion, which enables pdnsd to - start at machine boot time (see 0.4) - * Distribution-specific portions might be included in the generated - pdnsd.spec file (only important if you want to build rpm archives - yourself). - -If you choose Generic, no rc script is installed, and a generic spec file is -generated. -Further instructions are in the INSTALL document in the pdnsd source directory. -./configure --help will give you a list of all supported command line options. - -Note added by Paul Rombouts: Some people may want change the compiler -optimization flag. I use the -O2 flag, but it might be safer to use a lower -level of optimization or no optimization at all. In that case prefix the -configure command with the desired compiler flags like this (assuming you're -using a bash shell): - -CFLAGS="-O1 -Wall" ./configure ... - - -0.3.3 Building & installing - -Type make in the source directory. Should work by now. -To install, type make install or do the installation by hand (see 0.3.4). -make install will do the following ($prefix is the prefix directory; see -above): - - 1. copies pdnsd to $(prefix)/sbin/ - 2. copies pdnsd-ctl to $(prefix)/sbin/ - 3. copies docs/pdnsd.conf.sample (a sample configuration) to the pdnsd config - directory. - 4. creates your cache directory if it is not there. After installation, you - should check the file permissions and create or edit /etc/pdnsd.conf to fit - your needs (see below). If you use the run_as option, please make sure that - your cache directory is owned by the user you specified with this option! - -You must be root for this installation! -Security notes: never make the pdnsd cache directory writeable for untrusted -users, or you will get several security holes: the users might modify the cache -contents, or plant dangerous links. -If you use a pidfile, you should be aware that you introduce security problems -if you place the pidfile in a directory in a NFS filesystem that is writeable -for untrusted users. Generally, the pidfile directory (typically /var/run) -should not be writeable for untrusted users. - -0.3.4 Manual installation - -For a manual installation, you need to do the following steps: - - 1. Copy pdnsd and pdnsd-ctl from your build directory to an appropriate - location (e.g. /usr/sbin). - 2. Copy docs/pdnsd.conf into the directory you want it to reside (/etc by - default, and change it according to your needs (see below). - 3. Create your caching directory; default is /var/cache/pdnsd (you may change - this in your pdnsd.conf); Permissions should be at max rwxr-xr-x (if you - want to protect your cache and status socket, make it rwx------). - -Thats it! - -0.4 Start at boot time - -In the src/rc folder of the pdnsd distribution are start scripts for pdnsd -designed for different Linux distros. There are scripts for SuSE, Redhat, -Debian, Arch Linux and Slackware now. -The start scripts are automatically installed during RPM install, and also -during make install if you specified your distro. -For Slackware Linux there is a start-up script contributed by Nikola Kotur, but -presently it must be installed manually. See src/rc/README and src/rc/Slackware -/rc.pdnsd for details. - -0.4.1 SuSE Linux startup - -rc/SuSE/pdnsd is a start script for SuSE Linux. It was tested for 6.? but -should run on some versions below. You can do make install as root in the rc/ -SuSE directory to install it, or you can install manually: - -manual installation - -For manual installation, copy rc/SuSE/pdnsd into /sbin/init.d/, go to /sbin/ -init.d/rc2.d/ and create there the following two symlinks: -S11pdnsd to ../pdnsd (do ln -s ../pdnsd S11pdnsd in that dir) -K34pdnsd to ../pdnsd (do ln -s ../pdnsd K34pdnsd in that dir) -The numbers dictate the order different services are started and might need to -be modified. Then edit your /etc/rc.config file and add the line START_PDNSD= -yes to start pdnsd at boot time. - -If you used the make install command, START_PDNSD=yes has been appended to your -/etc/rc.config file, causing pdnsd to be started at boot time. If you don't -want that, change the yes into no. - -This start script was created from /sbin/init.d/skeleton by me, so the most is -copyrighted by SuSE. They put it under the GPL, however, so the license stated -in COPYING also applies to this script. There is NO WARRANTY OF ANY KIND on -these scripts. This is no official SuSE script, and SuSE naturally does NO -support for it. - -0.4.2 Red Hat Linux startup - -rc/Redhat/pdnsd is a start script for Red Hat Linux. It was contibuted by -Torben Janssen. -This was tested for 6.1 but should run on 5.0+. You can do make install as root -in the rc/Redhat directory to install it, or you can install manually: - -manual installation - -For manual installation, copy rc/Redhat/pdnsd into /etc/rc.d/init.d/ -Then go to /etc/rc.d/rc3.d and create there the following symlink: -S78pdnsd -> ../init.d/pdnsd (do ln -f -s ../init.d/pdnsd S78pdnsd in that dir) -Then go to /etc/rc.d/rc0.d and create there the following symlink: -K78pdnsd -> ../init.d/pdnsd (do ln -f -s ../init.d/pdnsd K78pdnsd in that dir) -Then go to /etc/rc.d/rc6.d and create there the following symlink: -K78pdnsd -> ../init.d/pdnsd (do ln -f -s ../init.d/pdnsd K78pdnsd in that dir) - -This script is also covered by license stated in COPYING. Again, there is NO -WARRANTY OF ANY KIND on these scripts. This is no offical Redhat script, and -Redhat naturally does NO support for it - -0.5 Notes for FreeBSD users - -The special handling of ISDN ppp devices is only supported on Linux. It is not -needed in FreeBSD, the normal device handling also works fine with isdn4bsd -devices. -When compiled for FreeBSD, pdnsd as a small RFC compatability issue: RFC2181 -demands answers on dns querys to be sent with the same source address the query -packet went to. In seldom cases, this will not be the case, because the kernel -selects the source address depending on the interface that was used for sending -the answer. -Setting the source address currently does not work for IPv4. I have written a -kernel patch that will provide an easy way to program this. We'll see if or -when it gets commited. - - - -1 Invocation - -When invoking pdnsd, you can specify various options at the command line. -Command line options always override config file options. The various --noX -options are present to override config file options. - -pdnsd --help (or -h) gives you an overview of the pdnsd command line options. - -pdnsd --version (or -V for short) prints licence and version information. - -To start pdnsd as background daemon, specifiy --daemon (or -d for short) on the -command line. Diagnostic and error messages after the actual daemon start will -be printed to the syslog instead of the console. --nodaemon will disable this. - -When starting pdnsd as a daemon, the -p option may be helpful: It writes the -pid of the server process to the file of the name given as argument to this -option. -Example: pdnsd -d -p /var/run/pdnsd.pid - -If you want to specify a configuration file other than /etc/pdnsd.conf, specify --c or --config-file on the command line, followed by a filename. - -If pdnsd was compiled with debugging support, you may specify -g or --debug on -the command line. This will cause extra diagnostic messages to be printed. When -pdnsd runs in daemon mode, the messages will be written to the pdnsd.debug file -in your cache directory. --nodebug disables debugging. - -pdnsd -vn sets the verbosity level of pdnsd. n is normally a digit from 0 to 3, -where 0 means normal operation, while 3 will most verbose. Level 9 can be used -in combination with the --debug option for very extensive debug information. -Note: The current implementation mostly ignores the verbosity level, so you may -not notice much difference between the various levels. - -The option -s or --status enables the status control socket. This is a named -socket in the cache directory called pdnsd.status. This socket allows run-time -configuration of pdnsd using the utility pdnsd-ctl. See below for more details -about pdnsd-ctl. --nostatus disables status control. See also the configuration -option status_ctl in the global section. - -The option --notcp disables the seldom needed TCP server thread, which may save -you some resources. -t or --tcp will enable it. See also the tcp_server -configuration option. - -Using the -m option, you can select the method pdnsd uses to query other name -servers. Following methods are supported (see also the query_method -configuration option): --muo: pdnsd will use UDP only. This is the fastest method, and should be -supported by all name servers on the Internet. --mto: pdnsd will use TCP only. TCP queries usually take longer time than UDP -queries, but are more secure against certain attacks, where an attacker tries -to guess your query id and to send forged answers. TCP queries are not -supported by some name servers. --mtu: pdnsd will try to use TCP, and will fall back to UDP if its connection is -refused or times out. --mut: New in version 1.2.5: pdnsd will try to use UDP, and will repeat the -query using TCP if the UDP reply was truncated (i.e. the tc bit is set). This -is the behaviour recommended by the DNS standards. - -The -4 option switches to IPv4 mode, providing pdnsd was compiled with IPv4 -support. -The -6 option switches to IPv6 mode, providing pdnsd was compiled with IPv6 -support. -The -a option is only available when pdnsd was compiled with both IPv4 and IPv6 -support. With this option, pdnsd will try to detect automatically if a system -supports IPv6, and fall back to IPv4 otherwise. - -With -i prefix or --ipv4_6_prefix=prefix you can set the prefix pdnsd uses -(when running in IPv6 mode) to map IPv4 addresses in the configuration file to -IPv6 addresses. There is also a corresponding option for the config file, see -below. Must be a valid IPv6 address. The default is ::ffff:0.0.0.0 - -2 The configuration file - -This section describes the layout of the configuration file and the available -configuration options. The default location of the file is /etc/pdnsd.conf. -This may be changed with the -c command line option. An example pdnsd.conf -comes with the pdnsd distribution in the docs directory and will be installed -to /etc/ by make install. - -2.1 Layout - -The configuration file is divided into sections. Each section is prefixed with -the section name and opening curlies ({) and closed with closing curlies (}). -In each section, configuration options can be given in the form -option_name=option_value; -Option value may be a string literal, a number, a time specification or a -constant. In previous versions of pdnsd strings had to be enclosed in quotes -("), but since version 1.1.10 this is no longer necessary, unless a string -contains a special character such as whitespace, a token that normally starts a -comment, or one of ",;{}\". Since version 1.2.9 a backslash (\) inside a string -is interpreted as an escape character, so it is possible to include special -characters in strings (both quoted or unquoted) by preceding them with a -backslash. Some escape sequences are in interpreted as in the C programming -language, e.g. \t becomes a tab, \n becomes a new-line control char. -A time specification consists a sequence of digits followed by a one-letter -suffix. The following suffixes are recognized: s (seconds), m (minutes), h -(hours), d (days) and w (weeks). If the suffix is missing, seconds are assumed. -If several time specifications are concatenated, their values are added -together; e.g. 2h30m is interpreted as 2*60*60 + 30*60 = 9000 seconds. -Some options take more than one value; in this case, the values are separated -with commas. -If you may supply one of a set of possible values to an option, this is noted -in the documentation as (option1|option2|option3|...) -The constants true|false and yes|no are accepted as synonyms for the constants -on|off. -Comments may be enclosed in /* and */, nested comments are possible. If the # -sign or two slashes (//) appear in the configuration file, everything from -these signs to the end of the current line is regarded as a comment and -ignored. -There are examples for nearly all options in the sample config file. - -2.1.1 global Section - -The global section specifies parameters that affect the overall behaviour of -the server. If you specify multiple global sections, the settings of those -later in the file will overwrite the earlier given values. -These are the possible options: - - -perm_cache=(number|off); -Switch the disk cache off or supply a maximum cache size in kB. If the disk -cache is switched off, 8 bytes will still be written to disk. The memory cache -is always 10kB larger than the file cache. This value is 2048 (2 MB) by -default. - -cache_dir=string; -Set the directory you want to keep the cache in. The default is "/var/cache/ -pdnsd" (unless pdnsd was compiled with a different default). - -server_port=number; -Set the server port. This is especially useful when you want to start the -server and are not root. Note that you may also not specify uptest=ping in the -server section as non-root. -The default port is 53, the RFC-standard one. Note that you should only use -non-standard ports when you only need clients on your machine to communicate -with the server; others will probably fail if the try to contact the server on -the basis of an NS record, since the A record that supplies the address for -(among others) name servers does not have a port number specification. - -server_ip=string; -or -interface=string; -Set the IP address pdnsd listens on for requests. This can be useful when the -host has several interfaces and you want pdnsd not to listen on all interfaces. -For example, it is possible to bind pdnsd to listen on 127.0.0.2 to allow pdnsd -to be a forwarder for BIND. The default setting for this option is server_ip= -any, which means that pdnsd will listen on all of your local interfaces. -Presently you can only specify one address here; if you want pdnsd to listen on -multiple interfaces but not all you will have to specify server_ip=any and use -firewall rules to restrict access. -The IP address used to need quotation marks around it, but since version 1.1.10 -this is no longer necessary. -If pdnsd has been compiled with both IPv4 and IPv6 support, and you want to -specify an IPv6 address here, then unless pdnsd was compiled to start up in -IPv6 mode by default, you will need to use the -6 command-line option or set -run_ipv4=off first (see below) in order to ensure that the IPv6 address is -parsed correctly. -If pdnsd is running in IPv6 mode and you specify an IPv4 address here, it will -automatically be mapped to an IPv6 address. -New in version 1.2: You may also give the name of an interface such as "lo" or -"eth0" here, instead of an IP address (this has been tested on Linux, and may -or may not work on other platforms). pdnsd will not bind to the interface name, -but will look up the address of the interface at start-up and listen on that -address. If the address of the interface changes while pdnsd is running, pdnsd -will not notice that. You will need to restart pdnsd in that case. - -outgoing_ip=string; -or -outside_interface=string; -New in version 1.2.9: Set the IP address of the interface used by pdnsd for -outgoing queries. This can be useful when the host has several interfaces and -you want pdnsd to send outgoing queries via only one of them. For example, if -pdnsd is running on a host with one interface with IP address 192.168.1.1 -connected to the local network, and another with IP address 123.xxx.yyy.zzz -connected to the internet, you may specify server_ip=192.168.1.1 and -outgoing_ip=123.xxx.yyy.zzz to enforce that pdnsd only responds to queries -received from the local network, and only sends outgoing queries via the -interface connected to the internet. -The default setting for this option is any, which means that the kernel is free -to decide which interface to use. Like with the server_ip option, you may also -give the name of an interface here, instead of an IP address. - -linkdown_kluge=(on|off); -This option enables a kluge that some people might need: when all servers are -marked down, with this option set the cache is not even used when a query is -received, and a DNS error is returned in any case. The only exception from this -is that local records (as specified in rr and source sections are still served -normally. In general, you probably want to get cached entries even when the -network is down, so this defaults to off. - -max_ttl=timespec; -This option sets the maximum time a record is held in cache. All dns resource -records have a time to live field that says for what period of time the record -may be cached before it needs to be requeried. If this is more than the value -given with max_ttl, this time to live value is set to max_ttl. This is done to -prevent records from being cached an inappropriate long period of time, because -that is almost never a good thing to do. Default is 604800s (one week). - -min_ttl=timespec; -This option sets the minimum time a record is held in cache. All dns resource -records have a time to live field that says for what period of time the record -may be cached before it needs to be requeried. If this is less than the value -given with min_ttl, this time to live value is set to min_ttl. Default is 120 -seconds. - -neg_ttl=timespec; -This option sets the time that negatively cached records will remain valid in -the cache if no time to live can be determined. This is always the case when -whole domains are being cached negatively, and additionally when record types -are cached negatively for a domain for which no SOA record is known to pdnsd. -If a SOA is present, the ttl of the SOA is taken. - -neg_rrs_pol=(on|off|auth|default); -This sets the RR set policy for negative caching; this tells pdnsd under which -circumstances it should cache a record type negatively for a certain domain. -off will turn the negative caching of record types off, on will always add a -negative cache entry when a name server did not return a record type we asked -it for, and auth will only add such entries if the answer came from an -authoritative name server for that domain. -New in version 1.2.8: The default setting will add a negatively cached record -if either the answer was authoritive or the answer indicated the name server -had "recursion available" while the query explicitly requested such recursion. -The preset is "default" (used to be auth). - -neg_domain_pol=(on|off|auth); -This is analogue to neg_rrs_pol for whole domain negative caching. It should be -safe to set this on, because I have not seen a caching server that will falsely -claim that a domain does not exist. -The default is auth. - -run_as=string; -This option allows you to let pdnsd change its user and group id after -operations that needed privileges have been done. This helps minimize security -risks and is therefore recommended. The supplied string gives a user name whose -user id and primary group id are taken. -A little more details: after reading the config file, becoming a daemon (if -specified) and starting the server status thread, the main thread changes its -gid and uid, as do all newly created threads thereafter. By taking another uid -and gid, those threads run with the privileges of the specified user. Under -Linux and FreeBSD, the server status thread runs with the original privileges -only when the strict_setuid option is set to off (see below, on by default), -because these may be needed for exec uptests. The manager thread also retains -its original privileges in this case. You should take care that the user you -specify has write permissions on your cache file and status pipe (if you need a -status pipe). You should look out for error messages like "permission denied" -and "operation not permitted" to discover permission problems. - -strict_setuid=(on|off); -When used together with the run_as option, this option lets you specify that -all threads of the program will run with the privileges of the run_as user. -This provides higher security than the normal run_as option, but is not always -possible. See the run_as option for further discussion. -This option is on by default. -Note that this option has no effect on Non-Linux systems. - -paranoid=(on|off); -Normally, pdnsd queries all servers in recursive mode (i.e. instructs servers -to query other servers themselves if possible, and to give back answers for -domains that may not be in its authority), and accepts additional records with -information for servers that are not in the authority of the queried server. -This opens the possibility of so-called cache poisoning: a malicious attacker -might set up a dns server that, when queried, returns forged additional -records. This way, he might replace trusted servers with his own ones by making -your dns server return bad IP addresses. This option protects you from cache -poisoning by rejecting additional records that do not describe domains in the -queried servers authority space and not doing recursive queries any more. An -exception to this rule are the servers you specify in your config file, which -are trusted. -The penalty is a possible performance decrease, in particular, more queries -might be necessary for the same operation. -You should also notice that there may be other similar security problems, which -are essentially problems of the DNS, i.e. any "traditional" server has them -(the DNS security extensions solve these problems, but are not widely -supported). One of this vulnerabilities is that an attacker may bombard you -with forged answers in hopes that one may match a query you have done. If you -have done such a query, one in 65536 forged packets will be succesful (i.e. an -average packet count of 32768 is needed for that attack). pdnsd can use TCP for -queries, which has a slightly higher overhead, but is much less vulnerable to -such attacks on sane operating systems. Also, pdnsd chooses random query ids, -so that an attacker cannot take a shortcut. If the attacker is able to listen -to your network traffic, this attack is relatively easy, though. -This vulnerability is not pdnsd's fault, and is possible using any conventional -name server (pdnsd is perhaps a little more secured against this type of -attacks if you make it use TCP). -The paranoid option is off by default. - -ignore_cd=(on|off); -New in version 1.2.8: This option lets you specify that the CD bit of a DNS -query will be ignored. Otherwise pdnsd will reply FORMERR to clients that set -this bit in a query. It is safe to enable this option, as the CD bit refers to -'Checking Disabled' which means that the client will accept non-authenticated -data. -This option is on by default. Turn it off if you want the old behaviour (before -version 1.2.8). - -scheme_file=string; -In addition to normal uptests, you may specify that some servers shall only be -queried when a certain pcmcia-cs scheme is active (only under linux). For that, -pdnsd needs to know where the file resides that holds the pcmcia scheme -information. Normally, this is either /var/lib/pcmcia/scheme or /var/state/ -pcmcia/scheme. - -status_ctl=(on|off); -This has the same effect as the -s command line option: the status control is -enabled when on is specified. -Added by Paul Rombouts: Note that pdnsd-ctl allows run-time configuration of -pdnsd, even the IP addesses of the name servers can be changed. If you're not -using pdnsd-ctl and you want maximum security, you should not enable this -option. It is disabled by default. - -daemon=(on|off); -This has the same effect as the -d command line option: the daemon mode is -enabled when on is specified. -Default is off. - -tcp_server=(on|off); -tcp_server=on has the same effect as the -t or --tcp command-line option: it -enables TCP serving. Similarly, tcp_server=off is like the --notcp command-line -option. -Default is on. - -pid_file=string; -This has the same effect as the -p command line option: you can specify a file -that pdnsd will write its pid into when it starts in daemon mode. - -verbosity=number; -This has the same effect as the -v command line option: you can set the -verbosity of pdnsd's messages with it. The argument is a number between 0 (few -messages) to 3 (most messages). - -query_method=(tcp_only|udp_only|tcp_udp|udp_tcp); -This has the same effect as the -m command line option. Read the documentation -for the command line option on this. tcp_only corresponds to the to, udp_only -to the uo, tcp_udp to the tu and udp_tcp to the ut argument of the command line -option. -If you use query_method=tcp_udp, it is recommended that you also set the global -timeout option to at least twice the longest server timeout. - -run_ipv4=(on|off); -This has the same effect as the -4 or -6 command line option: if on is -specified, IPv4 support is enabled, and IPv6 support is disabled (if -available). If off is specified, IPv4 will be disabled and IPv6 will be -enabled. For this option to be meaningful, pdnsd needs to be compiled with -support for the protocol you choose. If pdnsd was compiled with both IPv4 and -IPv6 support, and you want to include IPv6 addresses in the configuration file, -you will probably need to specify run_ipv4=off first to ensure that the IPv6 -addresses are parsed correctly. - -debug=(on|off); -This has the same effect as the -g command line option: the debugging messages -are enabled when on is specified. - -ctl_perms=number; -This option allows you to set the file permissions that the pdnsd status -control socket will have. These are the same as file permissions. The owner of -the file will be the run_as user, or, if none is specified, the user who -started pdnsd. If you want to specify the permissions in octal (as usual), -don't forget the leading zero (0600 instead of 600!). To use the status -control, write access is needed. The default is 0600 (only the owner may read -or write). -Please note that the socket is kept in the cache directory, and that the cache -directory permissions might also need to be adjusted. Please ensure that the -cache directory is not writeable for untrusted users. - -proc_limit=number; -With this option, you can set a limit on the pdnsd threads that will be active -simultaneously. If this number is exceeded, queries are queued and may be -delayed some time. See also the procq_limit option. -The default for this option is 40. - -procq_limit=number; -When the query thread limit proc_limit is exceeded, connection attempts to -pdnsd will be queued. With this option, you can set the maximum queue length. -If this length is also exceeded, the incoming queries will be dropped. That -means that tcp connections will be closed and udp queries will just be dropped, -which will probably cause the querying resolver to wait for an answer until it -times out. -See also the proc_limit option. A maximum of proc_limit+procq_limit query -threads will exist at any one time (plus 3 to 6 threads that will always be -present depending on your configuration). -The default for this option is 60. - -tcp_qtimeout=timespec; -This option sets a timeout for tcp queries. If no full query has been received -on a tcp connection after that time has passed, the connection will be closed. -The default is set using the --with-tcp-qtimeout option to configure. - -par_queries=number; -This option used to set the maximum number of remote servers that would be -queried simultaneously, for every query that pdnsd receives. -Since version 1.1.11, the meaning of this option has changed slightly. It is -now the increment with which the number of parallel queries is increased when -the previous set of servers has timed out. For example, if we have a list -server1, server2, server3, etc. of available servers and par_queries=2, then -pdnsd will first send queries to server1 and server2, and listen for responses -from these servers. -If these servers do not send a reply within their timeout period, pdnsd will -send additional queries to server3 and server4, and listen for responses from -server1, server2, server3 and server4, and so on until a useful reply is -received or the list is exhausted. -In the worst case there will be pending queries to all the servers in the list -of available servers. We may be using more system resources this way (but only -if the first servers in the list are slow or unresponsive), but the advantage -is that we have a greater chance of catching a reply. After all, if we wait -longer anyway, why not for more servers. -See also the explanation of the global timeout option below. -1 or 2 are good values for this option. The default is set at compile time -using the --with-par-queries option to configure. - -timeout=timespec; -This is the global timeout parameter for dns queries. This specifies the -minimum period of time pdnsd will wait after sending the first query to a -remote server before giving up without having received a reply. The timeout -options in the configuration file are now only minimum timeout intervals. -Setting the global timeout option makes it possible to specify quite short -timeout intervals in the server sections (see below). This will have the effect -that pdnsd will start querying additional servers fairly quickly if the first -servers are slow to respond (but will still continue to listen for responses -from the first ones). This may allow pdnsd to get an answer more quickly in -certain situations. -If you use query_method=tcp_udp it is recommended that you make the global -timeout at least twice as large as the largest server timeout, otherwise pdnsd -may not have time to try a UDP query if a TCP connection times out. -Default value is 0. - -randomize_recs=(on|off); -If this option is turned on, pdnsd will randomly reorder the cached records of -one type when creating an answer. This supports round-robin DNS schemes and -increases fail safety for hosts with multiple IP addresses, so this is usually -a good idea. -On by default. - -query_port_start=(number|none); -If a number is given, this defines the start of the port range used for queries -of pdnsd. The value given must be >= 1024. The purpose of this option is to aid -certain firewall configurations that are based on the source port. Please keep -in mind that another application may bind a port in that range, so a stateful -firewall using target port and/or process uid may be more effective. In case a -query start port is given pdnsd uses this port as the first port of a specified -port range (see query_port_end) used for queries. pdnsd will try to randomly -select a free port from this range as local port for the query. -To ensure that there are enough ports for pdnsd to use, the range between -query_port_start and query_port_end should be adjusted to at least (par_queries -* proc_limit). A larger range is highly recommended for security reasons, and -also because other applications may allocate ports in that range. If possible, -this range should be kept out of the space that other applications usually use. -The default for this option is 1024. Together with the default value of -query_port_end, this makes it the hardest for an attacker to guess the source -port used by the pdnsd resolver. If you specify none here, pdnsd will let the -kernel choose the source port, but this may leave pdnsd more vulnerable to an -attack. - -query_port_end=number; -Used if query_port_start is not none. Defines the last port of the range -started by query_port_start used for querys by pdnsd. The default is 65535, -which is also the maximum legal value for this option. For details see the -description of query_port_start. - -delegation_only=string; -Added by Paul Rombouts: This option specifies a "delegation-only" zone. This -means that if pdnsd receives a query for a name that is in a subdomain of a -"delegation-only" zone but the remote name server returns an answer with an -authority section lacking any NS RRs for subdomains of that zone, pdnsd will -answer NXDOMAIN (unknown domain). This feature can be used for undoing the -undesired effects of DNS "wildcards". Several "delegation-only" zones may be -specified together. If you specify root servers in a server section it is -important that you set root_server=on in such a section. -Example: - -delegation_only="com","net"; - -This feature is off by default. It is recommended that you only use this -feature if you actually need it, because there is a risk that some legitimate -names will be blocked, especially if the remote name servers queried by pdnsd -return answers with empty authority sections. - -ipv4_6_prefix=string; -This option has the same effect as the -i command-line option. When pdnsd runs -in IPv6 mode, this option specifies the prefix pdnsd uses to convert IPv4 -addresses in the configuration file (or addresses specified with pdnsd-ctl) to -IPv6-mapped addresses. The string must be a valid IPv6 address. Only the first -96 bits are used. Note that this only effects the parsing of IPv4 addresses -listed after this option. -The default is "::ffff.0.0.0.0". - -use_nss=(on|off); -If this option is turned on, pdnsd will call initgroups() to set up the group -access list, whenever pdnsd changes its user and group id (see run_as option). -There is a possible snag, though, if initgroups() uses NSS (Name Service -Switch) and NSS in turn uses DNS. In such a case you may experience lengthy -timeouts and stalls. By setting use_nss=off, you can disable the initgroups() -call (only possible in versions 1.2.5 and later). -This option was contributed by Jan-Marek Glogowski. -On by default. - -udpbufsize=number; -New in version 1.2.9: This option sets the upper limit on the size of UDP DNS -messages. The default is 1024. -See also the edns_query server option below. - - -2.1.2 server Section - -Each server section specifies a set of name servers that pdnsd should try to -get resource records or authoritative name server information from. The servers -are queried in the order of their appearance (or parallel to a limited extend). -If one fails, the next one is taken and so on. -You probably want to specify the dns server in your LAN, the caching dns -servers of your internet provider or even a list of root servers in one or more -server sections. -The supported options in this section are: - - -label=string; -Specify a label for the server section. This can be used to refer to this -section when using pdnsd-ctl, the pdnsd control utility. -You can give several server sections the same label, but if you want to change -the addresses of a server section (see ip option below) during run-time with -"pdnsd-ctl server label up dns1,dns2,...", the label must be unique. - -ip=string; -Give the IP (the address, not the host name) of the server. -Multiple IP addresses can be given per server section. This can be done by -entering multiple lines of the form ip=string; or a single line like this: - -ip=string,string,string; - -IP addresses do not have to be specified in the configuration file. A server -section without IP addresses will remain inactive until it is assigned one or -more addresses with pdnsd-ctl, the pdnsd control utility. -If pdnsd has been compiled with both IPv4 and IPv6 support, any IPv6 addresses -you specify here will be skipped with a warning message, unless pdnsd is -running in IPv6 mode. Thus, unless pdnsd was compiled to startup in IPv6 mode -by default, you need to use the command-line option -6 or set run_ipv4=off -first (see global section) in order to ensure that IPv6 addresses are parsed -correctly. -If pdnsd is running in IPv6 mode and you specify an IPv4 address here, it will -automatically be mapped to an IPv6 address. - -file=string; -New in version 1.2: This option allows you to give the name of a -resolv.conf-style file. Of the lines beginning with the nameserver keyword, the -second field will be parsed as an IP address, as if it were specified with the -ip= option. The remaining lines will be ignored. If the contents of the file -changes while pdnsd is running, you can make pdnsd aware of the changes through -the use of pdnsd-ctl, the pdnsd control utility. This is usually most -conveniently done by placing the command "pdnsd-ctl config" in a script that is -automatically run whenever the DNS configuration changes. -For example, suppose you have a ppp client that writes the DNS configuration -for your ISP to the file /etc/ppp/resolv.conf and runs the script /etc/ppp/ -ip-up when a new connection is established. One way of ensuring that pdnsd is -automatically reconfigured is to add a server section in the config file with -file=/etc/ppp/resolv.conf and to add the command "pdnsd-ctl config" to /etc/ppp -/ip-up. - -port=number; -Give the port the remote name server listens on. Default is 53 (the official -dns port) - -uptest=(ping|none|if|dev|diald|exec|query); -Determine the method to check whether the server is available. Currently -defined methods are: - - * ping: Send an ICMP_ECHO request to the server. If it doesn't respond within - the timeout, it is regarded to be unavailable until the next probe. - * none: The availability status is not changed, only the time stamp is - updated. - * if: Check whether the interface (specified in the interface= option) is - existent, up and running. This currently works for all "ordinary" network - interfaces, interfaces that disappear when down (e.g. ppp?), and - additionally for Linux isdn interfaces (as of kernel 2.2). Note that you - need a /dev/isdninfo device file (major#45, minor#255), or the isdn uptest - will always fail. - * dev and diald: Perform an if uptest, and, if that was succesful, - additionally check whether a program is running that has locked a given - (modem-) device. The needed parameters are an interface (specified as for - the if uptest, e.g. "ppp0") and a device relative to /dev (e.g. "modem" for - /dev/modem specified using the device= option. pdnsd will then look for a - pid file for the given interface in /var/lock (e.g. /var/run/ppp0.pid) and - for a lockfile for the given device (e.g. /var/lock/LCK..modem), and then - test whether the locking process is the process that created the pid file - and this process is still alive. If this is the case, the normal if uptest - is executed for the given interface. - The dev option is for pppd dial-on-demand, diald is the same for diald - users. - * exec: Executes a given command in the /bin/sh shell (as /bin/sh -c - ) and evaluates the result (the return code of the last command) - in the shell's way of handling return codes, i.e. 0 indicates success, all - other indicate failure. The shell's process name will be uptest_sh. The - command is given with the uptest_cmd option (see below). For secuity - issues, also see that entry. - * query: New in version 1.2: This works like the ping test, except it sends - an (empty) DNS query to the remote server. If the server sends a - well-formed response back within the timeout period (except SERVFAIL), it - will be regarded as available. This test is useful if a remote server does - not respond to ICMP_ECHO requests at all, which unfortunately is quite - common these days. It can also happen that a remote server is online but - ignores empty DNS queries. Then you will need the set the query_test_name - option (see below). In many cases this test will be a more reliable - indicator of availability than the ones mentioned before. - -The default value is none. - -NOTE: If you use on-demand dialing, use none, if, dev, diald or exec, since -ping or query will send packets in the specified interval and the interface -will thus frequently dial! - -ping_timeout=number; -Sets the timeout for the ping test in tenths of seconds (this unit is used for -legacy reasons; actually the current implementation is only accurate to a -second). -The default is 600 (one minute). - -ping_ip=string; -The IP address for the ping test. The default is the IP of the name server. - -query_test_name=string; -New in version 1.2.9: Sets the name to be queried when using uptest=query -availability test. If the string is the unquoted constant none, an empty query -is used (this the default), otherwise a query of type A will be sent for the -domain name specified here. It is not necessary for the domain name to exist or -have a record of type A in order for the uptest to succeed. -If the the remote server ignores empty queries, you will probably want to set -query_test_name="." (the root domain). - -uptest_cmd=string,string; -or -uptest_cmd=string; -Sets the command for the uptest=exec function to the first string. If the -second string is given, it specifies a user with whose user id and primary -group id the command is executed. -This is especially useful if you are executing the server as root, but do not -want the uptest to be performed with root privileges. In fact, you should never -execute the uptest as root if you can help it. -If the server is running setuid or setgid, the privileges thus gained are -attempted to be dropped even before changing identity to the specified user to -prevent setuid/gid security holes (otherwise, any user might execute commands -as root if you setuid the executable). -Note that this is not always possible, and that pdnsd should never be installed -as setuid or setgid. The command is executed using /bin/sh, so you should be -able to use shell builtin commands. - -interval=(timespec|onquery|ontimeout); -Sets the interval for the server up-test. The default is 900 seconds; however, -a test is forced when a query times out and the timestamp is reset then. -If you specify onquery instead of a timeout, the interface will be tested -before every query. This is to prevent automatically dialing interfaces (diald/ -pppd or ippp) to dial on dns queries. It is intended to be used in connection -with an interface-testing uptest ;-) -Note that using uptest=exec, you might run into performance problems on slow -machines when you use that option. DON'T use onquery with uptest=ping or uptest -=query, as it may cause delays if the server does not answer (btw, it doesn't -make sense anyway). Note also that using onquery is no guarantee that the -interface will not be used. When another (reachable) dns server tells pdnsd to -query a third dns server for data, pdnsd will do that and has no means of -checking whether this will dial up the interface or not. This however should be -a rare situation. -New in version 1.2.3: A third possibility is to specify interval=ontimeout. In -this case the server is not tested at startup/reconfiguration, nor at regular -intervals, but only after a DNS query to a server times out. Certain types of -network problems such as a refused connection will also cause the server to be -considered unavailable. However, once a server is declared dead it is never -considered again unless it is revived using a pdnsd-ctl config or server -command. The idea behind this option is to minimize uptests by assuming all -servers are available until there is reason to believe otherwise. - -interface=string; -The network interface (or network device, e.g. "eth0") for the uptest=if -option. Must be specified if uptest=if is given. - -device=string; -The (modem-) device that is used for the dev uptest. If you use this for a -dial-on-demand ppp uptest (together with uptest=dev), you need to enter the -device you are using for your pppd here, e.g. modem for /dev/modem. -Must be specified if uptest=dev is given. - -timeout=timespec; -Set the timeout for the dns query. The default is 120 seconds. You probably -want to set this lower. -Timeouts specified in the configuration file are only treated as the minimum -period of time to wait for a reply. A queries to a remote server are not -canceled until a useful reply has been received, or all the other queries have -timed out or failed. -If you have also set the global timeout option, you may consider setting a -fairly small value here. See the explanation of the timeout option in the -global section for what that means. - -purge_cache=(on|off); -In every fetched dns record, there is a cache timeout given, which specifies -how long the fetched data may be cached until it needs to be reloaded. If -purge_cache is set to off, the stale records are not purged (unless the cache -size would be exceeded, in this case the oldest records are purged). Instead, -they are still served if they cannot succesfully be updated (e.g. because all -servers are down). -Default is off. - -caching=(on|off); -Specifies if caching shall be performed for this server at all. Default is on. - -lean_query=(on|off); -Specifies whether to use the "lean" query mode. In this mode, only the -information actually queried from pdnsd is resolved and cached. This has the -advantage that usually less cache space is used and the query is usually -faster. In 90% of the cases, only address (A) records are needed anyway. If -switched off, pdnsd will always cache all data about a host it can find and -will specifically ask for all available records (well, at least it is a good -approximation for what it really does ;-) This will of course increase the -answer packet sizes. -Some buggy name servers may not deliver CNAME records when not asked for all -records. I do not know if such servers are around, but if you have trouble -resolving certain host names, try turning this option off. -A last note: If you use multiple pdnsd's that access each other, turning this -option on is probably a big win. -This on by default. - -edns_query=(on|off); -New in version 1.2.9: Specifies whether to use EDNS (Extension mechanisms for -DNS) for outgoing queries. Currently this is only useful for allowing UDP -message sizes larger than 512 bytes. Note that setting this option on can give -problems in combination with some legacy systems or software, including, -embarrassingly enough, previous versions of pdnsd. -The default is off, but if your network can handle UDP payloads significantly -larger than 512 bytes, the recommended value is on. -Note that this option only effects outgoing queries. If pdnsd receives a query -using EDNS, it will reply using EDNS regardless of the value of this option. -See also the udpbufsize option above. - -scheme=string; -You can specify a pcmcia-cs scheme that is used in addition to the uptests. If -you specify a scheme here, the server this section is for will only be queries -if the given scheme is active. Shell wildcards (* and ?) are allowed in the -string under their special meanings. You need to use the scheme_file option on -the global section to make this option work. - -preset=(on|off); -This allows you to specify the initial state of a server before any uptest is -performed. on specifies that the server is regarded available. The default is -on. This is especially useful when you set uptest=none; and want to change the -status of a server only via pdnsd-ctl. - -proxy_only=(on|off); -When this option is set to on, answers given by the servers are always -accepted, and no other servers (as, for example, specified in the NS records of -the query domain) are queried. If you do not turn this option on, pdnsd will do -such queries in some cases (in particular when processing ANY queries). -This option is useful when you do not want pdnsd to make connections to outside -servers for some reasons (e.g. when a firewall is blocking such queries). -I recommend that you turn on lean_query when using this option. -Default is off. - -root_server=(on|off|discover); -Set this option to on if the servers specified in a section are root servers. A -root server will typically only give the name servers for the top-level domain -in its reply. Setting root_server=on will cause pdnsd to try to use cached -information about top-level domains to reduce to number of queries to root -servers, making the resolving of new names more efficient. You can get a list -of available root servers by running the command "dig . ns". -This option is also necessary if you use the delegation_only option. -New in version 1.2.8: This option may also be set to "discover". This will -cause pdnsd to query the servers provided with the ip= option to obtain the -full list of root servers. The root-server addresses will replace the addresses -specified with the ip= option. This will only be done once on startup, or after -a "pdnsd-ctl config" command. In this case the name servers specified with the -ip= option don't have to be root servers, they just have to know the names and -addresses of the root servers. After root-server discovery pdnsd will behave -just as if root_server=on had been specified. -Default is off. - -randomize_servers=(on|off); -New in version 1.2.6: Set this option to on to give each name server in this -section an equal chance of being queried. If this option is off, the name -servers are always queried starting with the first one specified. Even with -this option on, the query order is not truly random. Only the first server is -selected randomly; the following ones are queried in consecutive order, -wrapping around to the beginning of the list when the end is reached. Note that -this option only effects the order within a section. The servers in the first -(active) section are always queried before those in the second one, etc. -The default is off, but if you are resolving from root servers setting this -option on is highly recommended. If root_server=on this option also effects the -query order of the name servers for the top-level domains. - -reject=string; -New in version 1.2.6: This option can be used to make pdnsd reject replies that -contain certain IP addresses. You can specify a single IP address, which will -be matched exactly, or a range of addresses using an address/mask pair. The -mask can be specified as a simple integer, indicating the number of initial 1 -bits in the mask, or in the usual IP address notation. IP addresses may be -either IPv4 or IPv6 (provided there is sufficient support in the C libraries -and support for AAAA records was not disabled). When addresses in the reject -list are compared with those in a reply, only the bits corresponding to those -set in the netmask are significant, the rest are ignored. -Multiple addresses or address/mask pairs may be specified; this can be done by -entering multiple lines of the form reject=string; or a single line like this: - -reject=string,string,string; - -How pdnsd reacts when an address in the reply matches one in the reject list, -depends on the reject_policy option, see below. - -reject_policy=(fail|negate); -New in version 1.2.6: This option determines what pdnsd does when an address in -the reply from a name server matches the reject list (see above). If this -option is set to fail, pdnsd will try another server, or, if there no more -servers to try, return the answer SERVFAIL. If this option is set to negate, -pdnsd will immediately return the answer NXDOMAIN (unknown domain) without -querying additional servers. The fail setting is useful if you don't always -trust the servers in this section, but do trust the servers in the following -section. The negate setting can be used to completely censor certain IP -addresses. In this case you should put the same reject list in every server -section, and also set the reject_recursively option (see below) to true. -The default is fail. - -reject_recursively=(on|off); -New in version 1.2.6: Normally pdnsd checks for addresses in the reject list -(see above) only when the reply comes directly from a name server listed in the -configuration file. With this option set to on, pdnsd will also do this check -for name servers that where obtained from NS records in the authority section -of a previous reply (which was incomplete and non-authoritative). -Default is off. - -policy=(included|excluded|simple_only|fqdn_only); -pdnsd supports inclusion/exclusion lists for server sections: with include= and -exclude= (see below) you can specify domain names for which this server will be -used or will not be used. The first match counts (i.e., the first include or -exclude rule in a server section that matches a domain name is applied, and the -search for other rules is terminated). If no rule matched a given domain name, -the policy= option determines whether this server is used for the lookup for -that domain name; when included is given, the server will be asked, and when -excluded is given, it will not. If simple_only is given the server will be used -if the name to lookup is a simple (single-label) domain name, on the other hand -if fqdn_only is given the server will be used only for names consisting of two -or more labels (i.e. the name has at least one dot in-between). -If no server is available for a queried domain, pdnsd will return an error -message to the client that usually will stop the client's attempts to resolve a -specific domain from this server (the libc resolver will e.g. return an error -to the application that tried to resolve the domain if no other servers are -available in the resolv.conf). This may be of use sometimes. -Note: the simple_only and fqdn_only constants were added by Paul Rombouts. They -are useful for controlling which name servers (if any) will be used by pdnsd -for resolving simple (single-label) host names. fqdn_only used to stand for -"fully qualified domain name only", but this is actually a misnomer. The names -in queries received by pdnsd are always considered to be fully qualified. If -you do not exactly understand what the options simple_only and fqdn_only are -good for, you are probably better off not using them. -The default for this option is included. - -include=string; -This option adds an entry to the exclusion/inclusion list. If a domain matches -the name given as string, the server is queried if this was the first matching -rule (see also the entry for policy). -If the given name starts with a dot, the whole subdomain of the given name -including the one of that name is matched, e.g. ".foo.bar." will match the -domain names a.foo.bar., a.b.c.foo.bar. and foo.bar. -If it does not start in a dot, only exactly the given name (ignoring the case, -of course) will be matched (hint: if you want to include all subdomains, but -not the domain of the given name itself, place an exact-match exclude rule -before the include rule, e.g: exclude="foo.bar."; include=".foo.bar."; -Previous versions of pdnsd required that names given with this and the next -option ended in a dot, but since version 1.1.8b1-par8, pdnsd automatically adds -a dot at the end if it is missing. -pdnsd now also accepts a more compact notation for adding several "include" -entries in one line, e.g.: - -include=".foo",".bar",".my.dom"; - -exclude=string; -This option adds an entry to the exclusion/inclusion list. If a domain matches -the name given as string, the server is not queried if this was the first -matching rule (see also the entry for policy). -If the given name starts with a dot, the whole subdomain of the given name -including the one of that name is matched, e.g. ".foo.bar." will match the -domain names a.foo.bar., a.b.c.foo.bar. and foo.bar. -If it does not start in a dot, only exactly the given name (ignoring the case, -of course) will be matched (hint: if you want to exclude all subdomains, but -not the domain of the given name itself, place an exact-match include rule -before the exclude rule, e.g: include="foo.bar."; exclude=".foo.bar."; -pdnsd now also accepts a more compact notation for adding several "exclude" -entries in one line, e.g.: - -exclude=".foo",".bar",".my.dom"; - - -2.1.3 rr Section - -Every rr section specifies a dns resource record that is stored locally. It -allows you to specify own dns records that are served by pdnsd in a limited -way. Only A, PTR, CNAME, MX, NS and SOA records are implemented. -This option is intended to allow you to define RRs for 1.0.0.127.in-addr.arpa. -and localhost. (and perhaps even one or two hosts) without having to start an -extra named if your cached name servers do not serve those records. It is NOT -intended and not capable to work as a full-featured name server. - - -name=string; -Specifies the name of the resource records, i.e. the domain name of the -resource the record describes. This option must be specified before any a, ptr, -cname, mx, ns or soa records. Names are interpreted as absolute domain names -(i.e. pdnsd assumes they end in the root domain). For this and all following -arguments that take domain names, you need to specify domain names in dotted -notation (example venera.isi.edu.). -Previous versions of pdnsd required that domain names given in the -configuration file ended in a dot, but since version 1.1.8b1-par8, pdnsd -automatically assumes a dot at the end if it is missing. -New in version 1.2: It is also possible to specify a name starting with the -label *. Such a name is called a wildcard. The * in a wildcard can match one or -more labels in a queried name, but only whole labels. Any other * characters in -a wildcard, apart from the leading one, will only match a literal *. -For example, *.mydomain will match a.mydomain or www.a.mydomain, but not -mydomain. *.a*.mydomain will match www.a*.mydomain, but not www.ab.mydomain. -*a.mydomain will only match itself. -Before you can specify an rr section with name=*.mydomain you must define some -records for mydomain, typically NS and/or SOA records. Example: - - rr { - name = mydomain; - ns = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - rr { - name = *.mydomain; - a = 192.168.1.10; - } - -In this example, www.mydomain and ftp.mydomain will resolve to the numeric -address 192.168.1.10 (unless you add rr sections explicitly specifying -different addresses for www.mydomain or ftp.mydomain). If you want mydomain -also to resolve to a numeric address, add an A record to the first rr section. - -ttl=timespec; -Specifies the ttl (time to live) for all resource records in this section after -this entry. This may be redefined. The default is 86400 seconds (=1 day). - -authrec=(on|off); -If this is turned on, pdnsd will create authoritative local records for this rr -section. This means that pdnsd flags the domain record so that records of this -domain that are not present in the cache are treated as non-existent, i.e. no -other servers are queried for that record type, and an response containing none -of those records is returned. This is most time what people want: if you add an -A record for a host, and it has no AAAA record (thus no IPv6 address), you -normally don't want other name servers to be queried for it. -This is on by default. -Please note that this only has an effect if it precedes the name option! - -reverse=(on|off); -New in version 1.2: If you want a locally defined name to resolve to a numeric -address and vice versa, you can achieve this by setting reverse=on before -defining the A record (see below). The alternative is to define a separate PTR -record, but you will probably find this option much more convenient. -The default is off. - -a=string; -Defines an A (host address) record. The argument is an IPv4 address in dotted -notation. pdnsd will serve this address for the host name given in the name -option. -Provided there is sufficient support in the C libraries and support for AAAA -records was not disabled, the argument string may also be an IPv6 address, in -which case an AAAA record will be defined. -This option be may used multiple times within an rr section, causing multiple -addresses to be defined for the name. However, if you put the different -addresses in different rr sections for the same name, the definition in the -last rr section will cancel the definitions in the previous ones. - -ptr=string; -Defines a PTR (domain name pointer) record. The argument is a host name in -dotted notation (see name). The ptr record is for resolving adresses into -names. For example, if you want the adress 127.0.0.1 to resolve into localhost, -and localhost into 127.0.0.1, you need something like the following sections: - - rr { - name = localhost; - a = 127.0.0.1; - owner = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - rr { - name = 1.0.0.127.in-addr.arpa; - ptr = localhost; - owner = localhost; - soa = localhost, root.localhost, 42, 86400, 900, 86400, 86400; - } - -The second section is for reverse resolving and uses the ptr option. Note that -you can get the same effect by specifying only the first rr section with -reverse=on. -There is something special about the name in the second section: when a -resolver wants to get a host name from an internet address, it composes an -address that is built of the IP address in reverse byte order (1.0.0.127 -instead of 127.0.0.1) where each byte of the adress written as number -constitutes a sub-domain under the domain in-addr.arpa. -So, if you want to compose an adress for reverse resolving, take your ip in -dotted notation (e.g. 1.2.3.4), reverse the byte order (4.3.2.1) and append -in-addr.arpa. (4.3.2.1.in-addr.arpa.) Then, define an rr section giving this -address as name and the domain name corresponding to that ip in the ptr option. - -cname=string; -Defines a CNAME (canonical name) record. The argument should be a -fully-qualified host name in dotted notation (see name). A CNAME is the DNS -equivalent of an alias or symbolic link. -A useful application for CNAMEs is giving short, easy to remember nicknames to -hosts with complicated names. For example, you might want the name "news" to -refer to your ISP's news server "nntp2.myisp.com". Instead of adding an A -record for "news" with the same address as "nntp2.myisp.com", you could put in -a CNAME pointing to "nntp2.myisp.com", so that if the IP address of the news -server changes, there is no need to update the record for "news". -To implement this with pdnsd, you could add the following section to your -configuration file: - - rr { - name = news; - cname = nntp2.myisp.com; - owner = localhost; - } - -mx=string,number; -Defines an MX (mail exchange) record. The string is the host name of the mail -server in dotted notation (see name). The number specifies the preference -level. -When you send mail to someone, your mail typically goes from your E-mail client -to an SMTP server. The SMTP server then checks for the MX record of the domain -in the E-mail address. For example, with joe@example.com, it would look for the -MX record for example.com and find that the name of mail server for that domain -is, say, mail.example.com. The SMTP server then gets the A record for -mail.example.com, and connects to the mail server. -If there are multiple MX records, the SMTP server will pick one based on the -preference level (starting with the lowest preference number, working its way -up). -Don't define MX records with pdnsd unless you know what you're doing. - -owner=string; -or -ns=string; -Defines an NS (name server) record. Specifies the name of the host which should -be authoritative for the records you defined in the rr section. This is -typically the host pdnsd runs on. -Note: In previous versions of pdnsd this option had to be specified before any -a, ptr, cname, mx or soa entries. In version 1.2, the restrictions on this -option are same as the options just mentioned, and it must listed after the -name= option. This can be a pain if you want to use an old config file which -specifies owner= before name= (sorry about that). Apart from greater -consistency, the advantage is that you can now specify as many NS records as -you like (including zero). - -soa=string,string,number,timespec,timespec,timespec,timespec; -This defines a soa (start of authority) record. The first string is the domain -name of the server and should be equal to the name you specified as owner. -The second string specifies the email address of the maintainer of the name -server. It is also specified as a domain name, so you will have to replace the -@ sign in the name with a dot (.) to get the name you have to specify here. The -next parameter (the first number) is the serial number of the record. You -should increment this number if you change the record. -The 4th parameter is the refresh timeout. It specifies after what amount of -time a caching server should attempt to refresh the cached record. -The 5th parameter specifies a time after which a caching server should attempt -to refresh the record after a refresh failure. -The 6th parameter defines the timeout after which a cached record expires if it -has not been refreshed. -The 7th parameter is the ttl that is specified in every rr and should be the -same as given with the ttl option (if you do not specify a ttl, use the default -86400). - -txt=string,...,string; -New in version 1.2.9: Defines an TXT record. You can specify one or more -strings here. - - -2.1.4 neg Section - -Every neg section specifies a dns resource record or a dns domain that should -be cached negatively locally. Queries for negatively cached records are always -answered immediatley with an error or an empty answer without querying other -hosts as long as the record is valid. The records defined with neg sections -remain valid until they are explicitely invalidated or deleted by the user -using pdnsd-ctl. -This is useful if a certain application asks periodically for nonexisting hosts -or RR types and you do not want a query to go out every time the cached record -has timed out. Example: Netscape Communicator will ask for the servers news and -mail on startup if unconfigured. If you do not have a dns search list for your -network, you can inhibit outgoing queries for these by specifying - - neg { - name = news; - types = domain; - } - neg { - name = mail; - types = domain; - } - -in your config file. If you have a search list, you have to repeat that for any -entry in your search list in addition to the entries given above! -In versions 1.1.11 and later, if you negate whole domains this way, all -subdomains will be negated as well. Thus if you specify -neg {name=example.com; types=domain;} in the config file, this will also negate -www.example.com, xxx.adserver.example.com, etc. - - -name=string; -Specifies the name of the domain for which negative cache entries are created. -This option must be specified before the types option. Names are interpreted as -absolute domain names (i.e. pdnsd assumes they end in the root domain). You -need to specify domain names in dotted notation (example venera.isi.edu.). -Previous versions of pdnsd required that domain names given in the -configuration file ended in a dot, but since version 1.1.8b1-par8, pdnsd -automatically assumes a dot at the end if it is missing. - -ttl=timespec; -Specifies the ttl (time to live) for all resource records in this section after -this entry. This may be redefined. The default is 86400 seconds (=1 day). - -types=(domain|rr_type[,rr_type[,rr_type[,...]]]); -Specifies what is to be cached negatively: domain will cache the whole domain -negatively; alternatively, you can specify a comma-separated list of RR types -which are to be cached negatively. You may specify multiple types options, but -domain and the RR types are mutually exclusive. -The RR types are specified using their official names from the RFC's in -capitals, e.g. A, CNAME, NS, PTR, MX, AAAA, ... -The command pdnsd-ctl list-rrtypes will give you a complete list of those -types. pdnsd-ctl is built along with pdnsd and will be installed in the same -directory as the pdnsd binary during make install. - - -2.1.5 source Section - -Every source section allows you to let pdnsd read the records from a file in an -/etc/hosts-like format. pdnsd will generate records to resolve the entries -address from its host name and vice versa for every entry in the file. This is -normally easier than defining an rr for every of your addresses, since -localhost and your other FQDNs are normally given in /etc/hosts. -The accepted format is as follows: The #-sign initiates a comment, the rest of -the line from the first occurence of this character on is ignored. Empty lines -are tolerated. -The first entry on a line (predeceded by an arbitrary number of tabs and -spaces) is the IP in dotted notation, the second entry on one line (separated -by the first by an arbitrary number of tabs and spaces) is the FQDN (fully -qualified domain name) for that ip. The rest of the line is ignored by default -(in the original /etc/hosts, it may contain information not needed by pdnsd). - - -owner=string; -Specifies the name of the host pdnsd runs on and that are specified in dns -answers (specifically, nameserver records). Must be specified before any file -entries. -Names are interpreted as absolute domain names (i.e. pdnsd assumes they end in -the root domain). You need to specify domain names in dotted notation (example -venera.isi.edu.). -Previous versions of pdnsd required that domain names given in the -configuration file ended in a dot, but since version 1.1.8b1-par8, pdnsd -automatically assumes a dot at the end if it is missing. - -ttl=timespec; -Specifies the ttl (time to live) for all resource records in this section after -this entry. This may be redefined. The default is 86400 seconds (=1 day). - -file=string; -The string specifies a file name. For every file entry in a source section, -pdnsd will try to load the given file as described above. Failure is indicated -only when the file cannot be opened, malformed entries will be ignored. - -serve_aliases=(on|off); -If this is turned on pdnsd will serve the aliases given in a hosts-style file. -These are the third entry in a line of a hosts-style file, which usually give a -"short name" for the host. This may be used to support broken clients without a -proper domain-search option. If no aliases are given in a line of the file, -pdnsd behaves as without this option for this line. -This feature was suggested by Bert Frederiks. -It is off by default. - -authrec=(on|off); -If this is turned on, pdnsd will create authoritative local records with the -data from the hosts file. Please see the description of the option of the same -name in the rr section for a closer description of what this means. Please note -that this only has an effect for files sourced with file options subsequent to -this option. -This is on by default. - - -2.1.6 include Section - -A configuration file may include other configuration files. However, only the -top-level configuration file may contain global and server sections, thus -include files are effectively limited to sections that add local definitions to -the cache. -Include sections currently only have one type of option, which may be given -multiple times within a single section. - - -file=string; -The string specifies a file name. For every file option in an include section, -pdnsd will parse the given file as described above. The file may contain -include sections itself, but as a precaution pdnsd checks that a certain -maximum depth is not exceeded to guard against the possibility of infinite -recursion. - - -3 pdnsd-ctl - -pdnsd-ctl allows you to configure pdnsd at run time. To make this work, you -have to start pdnsd with the -s option (or use the status_ctl option in the -config file). You also should make sure that you have appropriate permissions -on the control socket (use the ctl_perms option to make this sure) and of your -pdnsd cache directory (pdnsd keeps its socket there). Please make sure the -pdnsd cache directory is not writeable for untrusted users! - -pdnsd-ctl accepts two command-line options starting with a dash. --c may be used to specify the cache directory (and takes this as argument). The -default for this setting is the pdnsd default cache directory (specified at -compile time). The cache directory for pdnsd-ctl must be the same pdnsd uses! --q can be used to make the output of pdnsd-ctl less verbose. - -The following table lists the commands that pdnsd-ctl supports. The command -must always be the first command-line option (not starting with a dash), the -arguments to the command must follow in the given order. -In the following table, keywords are in a normal font, while placeholders are -in italics. -Alternatives are specified like (alt1|alt2|alt3). Optional arguments are placed -between square brackets []. - -Command Arguments Description - -help Print a command summary. - -version Print version and license info. - -status Print a description of pdnsd's cache status, thread status - and configuration. Also shows which remote name servers - are assumed to be available. - -server (index|label) (up| Set the status of the server with the given index or label - down|retest) [dns1[, (where the given label matches the one given with the - dns2[,...]]] label option in the respective server section in the - config file) to up or down, or force a retest. The index - is assigned in the order of definition in pdnsd.conf - starting with 0. Use the status command to view the - indices and labels. You can specify all instead of an - index or label to perform the action for all servers - registered with pdnsd. Example: - pdnsd-ctl server 0 retest - An optional third argument consisting of a list of IP - addresses (separated by commas or white-space characters) - can be given. This list will replace the previous list of - addresses of name servers used by pdnsd in the specified - section of the config file. For example in the /etc/ppp/ - ip-up script called by pppd you could place the following - line: - pdnsd-ctl server isplabel up $DNS1,$DNS2 - If white space is used to separate addresses the list will - have to be quoted. Spurious commas and white-space - characters are ignored. The last argument may also be an - empty string, in which case the existing IP addresses are - removed and the corresponding server section becomes - inactive. - -record name (delete| Delete or invalidate the records of the given domain name - invalidate) if it is in the cache. Invalidation means that the records - are marked as timed out, and will be reloaded if possible - (if purge_cache is set to on, they will be deleted in any - case). - For local records (i.e., records that were given in the - config file using a rr section, records read from a - hosts-style file and records added using pdnsd-ctl), - invalidation has no effect. Deletion will work, though. - Example: - pdnsd-ctl record localhost. delete - -source fn owner [ttl] [(on Load a hosts-style file. Works like using the pdnsd source - |off)] [noauth] configuration section. owner and ttl are used as in the - source section. ttl has a default of 900 (it does not need - to be specified). The next to last argument corresponds to - the serve_aliases option, and is off by default (i.e. if - it is not specified). noauth is used to make the domains - non-authoritative - please see the description of the - authrec config file options for a description of what that - means. fn is the filename. The file must be readable by - pdnsd! Example: - pdnsd-ctl source /etc/hosts localhost. 900 off - -add a addr name [ttl] - [noauth] - Add a record of the given type to the pdnsd cache, - replacing existing records for the same name and type. The -add aaaa addr name [ttl 2nd argument corresponds to the value of the option in the - ] [noauth] rr section that is named like the first argument: a is a - record for hostname-to-address mapping, aaaa is the same - thing for IPv6 addresses, and ptr is for -add ptr host name [ttl] address-to-hostname mapping. See the documentation for the - [noauth] rr section for more details. In case of A and AAAA - records, the addr argument may be a list of IP addresses, - separated by commas or white space, causing multiple -add cname host name [ addresses to be defined for the same name. The ttl is - ttl] [noauth] optional, the default is 900 seconds. noauth is used to - make the domains non-authoritative - please see the - description of the authrec config file options for a -add mx host name pref description of what that means. If you want no other - [ttl] [noauth] record than the newly added in the cache, do - pdnsd-ctl record name delete before adding records. This - is also better when overwriting local records. Example: -add ns host name [ttl] pdnsd-ctl add a 127.0.0.1 localhost. 900 - [noauth] - - -neg name [type] [ttl] Add a negatively cached record to pdnsd's cache, replacing - existing records for the same name and type. If no type is - given, the whole domain is cached negatively. For - negatively cached records, errors are immediately returned - on a query, without querying other servers first. The ttl - is optional, the default is 900 seconds. - You can get a list of all types you can pass to this - command using pdnsd-ctl list-rrtypes. The type is treated - case-sensitive! Example: - pdnsd-ctl neg foo.bar A 900 - pdnsd-ctl neg foo.baz 900 - -config [filename] Reload pdnsd's configuration file. - The config file must be owned by the uid that pdnsd had - when it was started, and be readable by pdnsd's run_as - uid. If no file name is specified, the config file used at - start-up is reloaded. - Note that some configuration changes, like the port or IP - address pdnsd listens on, cannot be made this way and you - will receive an error message. In these cases, you will - have to restart pdnsd instead. - -include filename Parse the given file as an include file, see the - documentation on include sections for a description what - this file may contain. - This command is useful for adding definitions to the cache - without reconfiguring pdnsd. - -eval string Parse the given string as if it were part of pdnsd's - configuration file. The string should hold one or more - complete configuration sections. However, global and - server sections are not allowed, just as in include files. - If multiple strings are given, they will be joined using - newline chars and parsed together. - This command is useful for adding records interactively to - the cache that cannot be defined using the "pdnsd-ctl add" - command, (e.g. soa records). - -empty-cache [[+|-]name ...] If no arguments are provided, the cache will be completely - emptied, freeing all existing entries. Note that this also - removes local records, as defined by the config file. To - restore local records, run "pdnsd-ctl config" or - "pdnsd-ctl include filename" immediately afterwards. - The "pdnsd-ctl empty-cache" command now accepts additional - arguments; these are interpreted as include/exclude names. - If an argument starts with a '+' the name will be - included. If an argument starts with a '-' it will be - excluded. If an argument does not begin with '+' or '-', a - '+' is assumed. If the domain name of a cache entry ends - in one of the names in the list, the first match will - determine what happens. If the matching name is to be - included, the cache entry is deleted, otherwise not. If - there are no matches, the default action is not to delete. - Note that if you want to delete exactly one name and no - others, you should use "pdnsd-ctl record name delete", - this is also much more efficient. - Examples: - pdnsd-ctl empty-cache - This command will remove all cache entries. - - pdnsd-ctl empty-cache microsoft.com msft.net - This will remove all entries ending in microsoft.com or - msft.net. - - pdnsd-ctl empty-cache -localdomain -168.192.in-addr.arpa . - This will remove all entries except those ending in - localdomain or 168.192.in-addr.arpa. Note that '.' is the - root domain which matches any domain name. - -dump [name] Print information stored in the cache about name. If name - begins with a dot and is not the root domain, information - about the names in the cache ending in name (including - name without the leading dot) will be printed. If name is - not specified, information about all the names in the - cache will be printed. - For each RR record the time and date that this record has - been added to the cache will be printed in the form mm/dd - HH:MM:SS (locally defined records are printed without a - time stamp). After that the type of record is printed with - the data. For the more common types of RR records the data - will be printed in human readable form, the remaining ones - in a hexadecimal representation. - This command is mainly useful for diagnostic purposes. - Note that if you pipe the output of this command through - an application that reads only part of the output and then - blocks (such as more or less), pdnsd will not be able to - add new entries to the cache until the pipe is closed. It - is preferable to capture the output in a file in such a - case. - -list-rrtypes List available rr types for the neg command. Note that - those are only used for the neg command, not for add! - - - -4 contrib/ - -The contrib directory in the pdnsd distribution contains useful -user-contributed scripts. -So far, there are scripts contributed by Marko Stolle and Paul Rombouts that -make pdnsd usable in a DHCP setup. Please take a look into the README file in -the contrib directory for further information. - - -5 Problems... - -If you have problems with configuring or running pdnsd, be sure to read the FAQ -. If this does not help you, pdnsd crashes or you find bugs, please mail one of -the authors. -Note added by Paul A. Rombouts: Thomas Moestl no longer maintains the code. I -have revised the code and added new features. See README.par and the ChangeLog -in the source directory (or /usr/share/doc/pdnsd- if you have -installed a binary package) for more details. If you have questions about my -modifications, you can find my email address at the end of README.par. - - -6 Hacking - -Here comes some information you might find useful for hacking pdnsd. - -6.1 Source files - -Makefile.am, autoconf/automake/autoheader scripts. Makefile.am's are in -configure.in, most subdirectories. -acconfig.h - -pdnsd.spec.in A template from which configure generates a spec file for - building rpm's for various distributions. - -version Contains only the program version string. Needed for - several templates. - -src/rc/* rc (start-up) scripts for various linux distributions. - - The pdnsd cache subsystem(s) as defined in src/cache.h. -src/cache.c This is the "traditional" pdnsd system which keeps the - cache in memory and uses hash tables for accesses. Sourav - K. Mandal is working on a system using gdbm. - -src/pdnsd-ctl/* Contains the code for pdnsd-ctl, a program that allows you - to control pdnsd at run time. - - The lex/flex source file for the config file lexer. This is -src/conf-lex.l.in a template because there might be inserted "%option - yylineno" for proper flex support. (obsolete, superseded by - src/conf-parser.c) - - This is automatically generated by configure from -src/conf-lex.l conf-lex.l.in. It may be overwritten in any make, so never - modify this, but conf-lex.l.in instead! (obsolete, - superseded by src/conf-parser.c) - -src/conf-parse.y The yacc/bison source of the config file parser. (obsolete, - superseded by src/conf-parser.c) - -src/conf-parser.c, The config file parser written purely in C (versions -src/conf-parser.h, 1.1.10-par and later). -src/conf-keywords.h - -src/conff.c, src/ The configuration handler functions and their prototypes. -conff.h The parser is called from here. - -src/consts.h Some constants used by the parser, config file handler - functions and in the server status thread, among others. - - Define dns message structures, constants, and some common -src/dns.c, src/dns.h dns data handlers. dns.h contains gcc-specific code (in - praticular, "__attribute__((packed))"). - -src/dns_answer.c, Define functions that answer incoming dns queries. -src/dns_answer.h - -src/dns_query.c, src Define functions to manage outgoing dns queries. -/dns_query.h - -src/error.c, src/ Functions for error output to stderr or the syslog, and -error.h debug output to stderr or pdnsd.debug. - -src/hash.c, src/ Contains the code for storing and looking up cache entries -hash.h in the hash table. - -src/helpers.c, src/ Define miscellaneous helper functions. -helpers.h - -src/icmp.c, src/ Define a function for performing a ping test. This contains -icmp.h OS-specific code. - -src/main.c Contains main(), which holds the command line parser, - performs initialisations and signal handling. - - Contains the code for the executable make_hashconvtable, -src/ which is only run once, during build time, to generate the -make_hashconvtable.c file hashconvtable.h, used by src/hash.c (versions - 1.1.10-par and later). (obsolete since version 1.2) - - A perl script for generating src/rr_types.h, a C header -src/ file containing macro definitions and tables needed for -make_rr_types_h.pl handling the RR types known to pdnsd, from the text file - src/rr_types.in. - -src/rr_types.c, src/ These define tables and macros needed for handling the RR -rr_types.h, src/ types known to pdnsd. Since version 1.2.9, rr_types.h is an -rr_types.in automatically generated file, see make_rr_types_h.pl. - -src/netdev.c, src/ Define functions for network device handling. OS-specific. -netdev.h - -src/servers.c, src/ Define functions for the server status thread that performs -servers.h the periodical uptests. - -src/status.c, src/ Define functions for the status control thread. This is -status.h pdnsd's interface to pdnsd-ctl. - - -------------------------------------------------------------------------------- - -Copyright (C) 2000, 2001 Thomas Moestl -Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2012 Paul A. Rombouts - -Last revised: 19 April 2012 by Paul A. Rombouts - diff --git a/jni/pdnsd/file-list.base.in b/jni/pdnsd/file-list.base.in deleted file mode 100644 index 409ba338..00000000 --- a/jni/pdnsd/file-list.base.in +++ /dev/null @@ -1,5 +0,0 @@ -%defattr(-,root,root) -%doc AUTHORS THANKS COPYING COPYING.BSD ChangeLog ChangeLog.old INSTALL NEWS README README.par README.par.old TODO -%config /etc/pdnsd.conf.sample -%attr(750, @def_id@, @def_id@) %dir @cachedir@ -%attr(640, @def_id@, @def_id@) %config @cachedir@/pdnsd.cache diff --git a/jni/pdnsd/install-sh b/jni/pdnsd/install-sh deleted file mode 100644 index 4d4a9519..00000000 --- a/jni/pdnsd/install-sh +++ /dev/null @@ -1,323 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2005-05-14.22 - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -chmodcmd="$chmodprog 0755" -chowncmd= -chgrpcmd= -stripcmd= -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src= -dst= -dir_arg= -dstarg= -no_target_directory= - -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: --c (ignored) --d create directories instead of installing files. --g GROUP $chgrpprog installed files to GROUP. --m MODE $chmodprog installed files to MODE. --o USER $chownprog installed files to USER. --s $stripprog installed files. --t DIRECTORY install into DIRECTORY. --T report an error if DSTFILE is a directory. ---help display this help and exit. ---version display version info and exit. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" - -while test -n "$1"; do - case $1 in - -c) shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - --help) echo "$usage"; exit $?;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -s) stripcmd=$stripprog - shift - continue;; - - -t) dstarg=$2 - shift - shift - continue;; - - -T) no_target_directory=true - shift - continue;; - - --version) echo "$0 $scriptversion"; exit $?;; - - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done - break;; - esac -done - -if test -z "$1"; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src ;; - esac - - if test -n "$dir_arg"; then - dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi - else - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dstarg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dstarg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst ;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dstarg: Is a directory" >&2 - exit 1 - fi - dst=$dst/`basename "$src"` - fi - fi - - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` - - # Make sure that the destination directory exists. - - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" - - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS - - pathcomp= - - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 - shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit - fi - pathcomp=$pathcomp/ - done - fi - - if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - - else - dstfile=`basename "$dst"` - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 - - # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && - - # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ - || { - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ - || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 - (exit 1); exit 1 - } - else - : - fi - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" - } - } - fi || { (exit 1); exit 1; } -done - -# The final little trick to "correctly" pass the exit status to the exit trap. -{ - (exit 0); exit 0 -} - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/jni/pdnsd/missing b/jni/pdnsd/missing deleted file mode 100644 index 894e786e..00000000 --- a/jni/pdnsd/missing +++ /dev/null @@ -1,360 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2005-06-08.21 - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case "$1" in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). -case "$1" in - lex|yacc) - # Not GNU programs, they don't have --version. - ;; - - tar) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case "$1" in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case "$f" in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case "$firstarg" in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case "$firstarg" in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/jni/pdnsd/pdnsd.spec.in b/jni/pdnsd/pdnsd.spec.in deleted file mode 100644 index 6af6cdef..00000000 --- a/jni/pdnsd/pdnsd.spec.in +++ /dev/null @@ -1,244 +0,0 @@ -# rpmbuild spec file for pdnsd. -# with modifications by Paul Rombouts. - -# Supported rpmbuild --define and --with options include: -# -# --with isdn Configure with --enable-isdn. -# -# --without poll Configure with --disable-poll -# -# --without nptl Configure with --with-thread-lib=linuxthreads. -# -# --with ipv6 Configure with --enable-ipv6. -# -# --without tcpqueries Configure with --disable-tcp-queries. -# -# --without debug Configure with --with-debug=0. -# -# --define "distro " Configure with --with-distribution=. -# -# --define "run_as_user " Configure with --with-default-id=. -# For RPMs the default is "@def_id@". -# -# --define "run_as_uid " If the user defined by the previous option does not exist -# when the RPM is installed, the pre-install script will try -# to create a new user with numerical id . -# -# --define "cachedir " Configure with --with-cachedir=. -# - -%{!?distro: %define distro @distribution@} - -# The default run_as ID to use -%{!?run_as_user: %define run_as_user @def_id@} -# By default, if a new run_as_user is to be created, we let -# useradd choose the numerical uid, unless run_as_uid is defined. -#define run_as_uid 96 -%{!?cachedir: %define cachedir @cachedir@} -%define conffile %{_sysconfdir}/pdnsd.conf - -Summary: A caching dns proxy for small networks or dialin accounts -Name: @PACKAGE@ -Version: @VERSION@ -Release: @packagerelease@ -License: GPLv3 -Group: Daemons -Source: http://members.home.nl/p.a.rombouts/pdnsd/releases/%{name}-%{version}-%{release}.tar.gz -URL: http://members.home.nl/p.a.rombouts/pdnsd.html -Vendor: Paul A. Rombouts -Packager: Paul A. Rombouts -Prefix: %{_prefix} -BuildRoot: %{_tmppath}/%{name}-%{version}-root - -%description -pdnsd is a proxy DNS daemon with permanent (disk-)cache and the ability -to serve local records. It is designed to detect network outages or hangups -and to prevent DNS-dependent applications like Netscape Navigator from hanging. - -The original author of pdnsd is Thomas Moestl, but pdnsd is no longer maintained -by him. This is an extensively revised version by Paul A. Rombouts. -For a description of the changes see http://members.home.nl/p.a.rombouts/pdnsd.html -and the file README.par in %{_docdir}/%{name}-%{version} - -%{!?distro:You can specify the target distribution when you build the source RPM. For instance, if you're building for a Red Hat system call rpmbuild with:} -%{!?distro: --define "distro RedHat"} -%{?distro:This package was built for a %{distro} distribution.} -%{!?_with_isdn:It's possible to rebuild the source RPM with isdn support using the rpmbuild option:} -%{!?_with_isdn: --with isdn} -%{?_with_isdn:This package was built with isdn support enabled.} -%{!?_with_ipv6:It's possible to rebuild the source RPM with ipv6 support using the rpmbuild option:} -%{!?_with_ipv6: --with ipv6} -%{?_with_ipv6:This package was built with ipv6 support.} -%{?_without_poll:This package was built with the select(2) function instead of poll(2).} - -%prep -%setup - -%build -CFLAGS="${CFLAGS:-$RPM_OPT_FLAGS -Wall}" ./configure \ - --prefix=%{_prefix} --sysconfdir=%{_sysconfdir} --mandir=%{_mandir} \ - --with-cachedir="%{cachedir}" \ - %{?distro:--with-distribution=%{distro}} --enable-specbuild \ - --with-default-id=%{run_as_user} \ - %{?_with_isdn:--enable-isdn} \ - %{?_without_poll:--disable-poll} \ - %{?_without_nptl:--with-thread-lib=linuxthreads} \ - %{?_with_ipv6:--enable-ipv6} \ - %{?_without_tcpqueries:--disable-tcp-queries} \ - %{?_without_debug:--with-debug=0} - -make - -%install -%if "%{run_as_user}" != "nobody" -[ "$(id -un)" != root ] || -id -u %{run_as_user} > /dev/null 2>&1 || -/usr/sbin/useradd -c "Proxy DNS daemon" %{?run_as_uid:-u %{run_as_uid}} \ - -s /sbin/nologin -r -d "%{cachedir}" %{run_as_user} || { - set +x - echo "Cannot create user \"%{run_as_user}\"%{?run_as_uid: with uid=%{run_as_uid}}" - echo "Please select another numerical uid and rebuild with --define \"run_as_uid uid\"" - echo "or create a user named \"%{run_as_user}\" by hand and try again." - exit 1 -} -%endif - -rm -rf "$RPM_BUILD_ROOT" -make DESTDIR="$RPM_BUILD_ROOT" install -cp -f file-list.base file-list -find doc contrib -not -type d -not -iname '*makefile' -not -name '*.am' \ - -not -name '*.in' -not -path 'doc/*.pl' | -sed -e 's/^/%doc --parents /' >> file-list -CURDIR=$PWD; cd "$RPM_BUILD_ROOT" -find . -not -type d '(' -not -name 'pdnsd.conf*' -or -name 'pdnsd.conf.[1-9]*' ')' \ - -not -path '.%{_docdir}/*' -not -path './var/*' | -sed -e 's/^\.// - \:/man:{ - /\.gz$/!s/$/.gz/ - }' >> "$CURDIR/file-list" - -%clean -rm -rf "$RPM_BUILD_ROOT" -#rm -rf %{_builddir}/%{name}-%{srcver} - -%files -f file-list - -%pre -# First stop any running pdnsd daemons -%if "%{distro}" == "SuSE" -/sbin/init.d/pdnsd stop >/dev/null 2>&1 -%endif -%if "%{distro}" == "RedHat" -if [ -f /var/lock/subsys/pdnsd ]; then - if /sbin/pidof pdnsd > /dev/null; then - /sbin/service pdnsd stop >/dev/null 2>&1 - if [ "$1" -ge 2 ]; then touch /var/lock/subsys/pdnsd; fi - else - rm -f /var/lock/subsys/pdnsd - fi -fi -%endif - -%if "%{run_as_user}" != "nobody" -# Add the "pdnsd" user -id -u %{run_as_user} > /dev/null 2>&1 || -/usr/sbin/useradd -c "Proxy DNS daemon" %{?run_as_uid:-u %{run_as_uid}} \ - -s /sbin/nologin -r -d "%{cachedir}" %{run_as_user} || { - echo "Cannot create user \"%{run_as_user}\"%{?run_as_uid: with uid=%{run_as_uid}}" - echo "Please create a user named \"%{run_as_user}\" by hand and try again." - exit 1 -} -[ "$(id -gn %{run_as_user})" = %{run_as_user} ] || { - echo "user \"%{run_as_user}\" does not have an corresponding group called \"%{run_as_user}\"" - echo "Please change the initial group of user \"%{run_as_user}\" to \"%{run_as_user}\" and try again." - exit 1 -} - -if [ -f "%{conffile}" ] && - grep -v -e '^[[:blank:]]*\(#\|\/\/\)' "%{conffile}" | - grep -q -e '\ "%{conffile}" && - echo "In %{conffile} runs_as=\"nobody\" has been replaced by run_as=\"%{run_as_user}\"" -fi -%endif - -if [ -f "%{cachedir}/pdnsd.cache" ]; then - chown -c %{run_as_user}:%{run_as_user} "%{cachedir}/pdnsd.cache" -fi - -%post -%if "%{distro}" == "SuSE" -if [ -w /etc/rc.config ]; then - grep "START_PDNSD" /etc/rc.config > /dev/null - if [ $? -ne 0 ] ; then - echo -e \ -"\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" \ ->> /etc/rc.config - fi -fi -%endif -%if "%{distro}" == "RedHat" -if [ "$1" = 1 ]; then - /sbin/chkconfig --add pdnsd -fi -%endif - -%preun -%if "%{distro}" == "RedHat" -if [ "$1" = 0 ]; then - /sbin/service pdnsd stop >/dev/null 2>&1 - /sbin/chkconfig --del pdnsd -fi -%endif - -%postun -%if "%{distro}" == "RedHat" -if [ "$1" -ge 1 ]; then - /sbin/service pdnsd condrestart >/dev/null 2>&1 -fi -%endif - -%changelog -* Tue Jan 31 2012 Paul A. Rombouts -- Prevent makefiles and perl scripts from being installed - in the documentation directory. -* Sat Jan 28 2012 Paul A. Rombouts -- Update the (Source) URLs. -* Sat Aug 4 2007 Paul Rombouts -- License is now GPL version 3 -* Fri Mar 24 2006 Paul Rombouts -- Instead of using a fixed default value for run_as_uid, - I let useradd choose the uid if run_as_uid is undefined. -* Thu Dec 29 2005 Paul Rombouts -- TCP-query support is now compiled in by default, - but can be disabled using "--without tcpqueries". -* Sun Jul 20 2003 Paul Rombouts -- Changed default run_as ID from "nobody" to "pdnsd" -* Fri Jun 20 2003 Paul Rombouts -- Added configuration option for NPTL. -* Sat Jun 07 2003 Paul Rombouts -- Added automatic definition of distro using _vendor macro. -* Thu May 22 2003 Paul Rombouts -- Ensured that modification times of acconfig.h and configure.in - are not changed by patching to avoid unwanted reconfigure during make phase. -* Tue May 20 2003 Paul Rombouts -- Applied my customized patch file. See READ.par for details. -* Sun May 16 2001 Thomas Moestl -- Make use of chkconfig for Red Hat (patch by Christian Engstler) -* Sun Mar 25 2001 Thomas Moestl -- Merged SuSE fixes by Christian Engstler -* Fri Feb 09 2001 Thomas Moestl -- Merged in a spec fix for mapage inclusion contributed by Sourav K. - Mandal -* Sun Nov 26 2000 Thomas Moestl -- Added some patches contributed by Bernd Leibing -* Tue Aug 15 2000 Thomas Moestl -- Added the distro for configure -* Tue Jul 11 2000 Sourav K. Mandal -- autoconf/automake modifications diff --git a/jni/pdnsd/src/Makefile.am b/jni/pdnsd/src/Makefile.am deleted file mode 100644 index 959e669e..00000000 --- a/jni/pdnsd/src/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ - -sbin_PROGRAMS = pdnsd - -pdnsd_CFLAGS = -DCONFDIR='"$(sysconfdir)"' $(thread_CFLAGS) - -pdnsd_SOURCES = conf-parser.c conff.c consts.c debug.c dns.c dns_answer.c \ - dns_query.c error.c helpers.c icmp.c list.c main.c netdev.c rr_types.c \ - status.c servers.c thread.c cache.c hash.c conf-parser.h \ - conf-keywords.h conff.h consts.h debug.h dns.h dns_answer.h \ - dns_query.h error.h helpers.h icmp.h ipvers.h list.h netdev.h \ - rr_types.h servers.h status.h thread.h cache.h hash.h pdnsd_assert.h \ - freebsd_netinet_ip_icmp.h - -EXTRA_DIST = make_rr_types_h.pl rr_types.in - -## Try to do this last - -SUBDIRS = . pdnsd-ctl rc test - -$(pdnsd_OBJECTS): rr_types.h - -rr_types.h: make_rr_types_h.pl rr_types.in - perl make_rr_types_h.pl rr_types.in > rr_types.h - diff --git a/jni/pdnsd/src/Makefile.in b/jni/pdnsd/src/Makefile.in deleted file mode 100644 index 75569a40..00000000 --- a/jni/pdnsd/src/Makefile.in +++ /dev/null @@ -1,921 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -sbin_PROGRAMS = pdnsd$(EXEEXT) -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(sbindir)" -PROGRAMS = $(sbin_PROGRAMS) -am_pdnsd_OBJECTS = pdnsd-conf-parser.$(OBJEXT) pdnsd-conff.$(OBJEXT) \ - pdnsd-consts.$(OBJEXT) pdnsd-debug.$(OBJEXT) \ - pdnsd-dns.$(OBJEXT) pdnsd-dns_answer.$(OBJEXT) \ - pdnsd-dns_query.$(OBJEXT) pdnsd-error.$(OBJEXT) \ - pdnsd-helpers.$(OBJEXT) pdnsd-icmp.$(OBJEXT) \ - pdnsd-list.$(OBJEXT) pdnsd-main.$(OBJEXT) \ - pdnsd-netdev.$(OBJEXT) pdnsd-rr_types.$(OBJEXT) \ - pdnsd-status.$(OBJEXT) pdnsd-servers.$(OBJEXT) \ - pdnsd-thread.$(OBJEXT) pdnsd-cache.$(OBJEXT) \ - pdnsd-hash.$(OBJEXT) -pdnsd_OBJECTS = $(am_pdnsd_OBJECTS) -pdnsd_LDADD = $(LDADD) -pdnsd_LINK = $(CCLD) $(pdnsd_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(pdnsd_SOURCES) -DIST_SOURCES = $(pdnsd_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -pdnsd_CFLAGS = -DCONFDIR='"$(sysconfdir)"' $(thread_CFLAGS) -pdnsd_SOURCES = conf-parser.c conff.c consts.c debug.c dns.c dns_answer.c \ - dns_query.c error.c helpers.c icmp.c list.c main.c netdev.c rr_types.c \ - status.c servers.c thread.c cache.c hash.c conf-parser.h \ - conf-keywords.h conff.h consts.h debug.h dns.h dns_answer.h \ - dns_query.h error.h helpers.h icmp.h ipvers.h list.h netdev.h \ - rr_types.h servers.h status.h thread.h cache.h hash.h pdnsd_assert.h \ - freebsd_netinet_ip_icmp.h - -EXTRA_DIST = make_rr_types_h.pl rr_types.in -SUBDIRS = . pdnsd-ctl rc test -all: all-recursive - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files - -clean-sbinPROGRAMS: - -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) -pdnsd$(EXEEXT): $(pdnsd_OBJECTS) $(pdnsd_DEPENDENCIES) - @rm -f pdnsd$(EXEEXT) - $(pdnsd_LINK) $(pdnsd_OBJECTS) $(pdnsd_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-conf-parser.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-conff.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-consts.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-debug.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns_answer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-dns_query.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-error.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-hash.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-helpers.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-icmp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-list.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-netdev.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-rr_types.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-servers.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-status.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-thread.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -pdnsd-conf-parser.o: conf-parser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conf-parser.o -MD -MP -MF $(DEPDIR)/pdnsd-conf-parser.Tpo -c -o pdnsd-conf-parser.o `test -f 'conf-parser.c' || echo '$(srcdir)/'`conf-parser.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conf-parser.Tpo $(DEPDIR)/pdnsd-conf-parser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf-parser.c' object='pdnsd-conf-parser.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conf-parser.o `test -f 'conf-parser.c' || echo '$(srcdir)/'`conf-parser.c - -pdnsd-conf-parser.obj: conf-parser.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conf-parser.obj -MD -MP -MF $(DEPDIR)/pdnsd-conf-parser.Tpo -c -o pdnsd-conf-parser.obj `if test -f 'conf-parser.c'; then $(CYGPATH_W) 'conf-parser.c'; else $(CYGPATH_W) '$(srcdir)/conf-parser.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conf-parser.Tpo $(DEPDIR)/pdnsd-conf-parser.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf-parser.c' object='pdnsd-conf-parser.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conf-parser.obj `if test -f 'conf-parser.c'; then $(CYGPATH_W) 'conf-parser.c'; else $(CYGPATH_W) '$(srcdir)/conf-parser.c'; fi` - -pdnsd-conff.o: conff.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conff.o -MD -MP -MF $(DEPDIR)/pdnsd-conff.Tpo -c -o pdnsd-conff.o `test -f 'conff.c' || echo '$(srcdir)/'`conff.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conff.Tpo $(DEPDIR)/pdnsd-conff.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conff.c' object='pdnsd-conff.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conff.o `test -f 'conff.c' || echo '$(srcdir)/'`conff.c - -pdnsd-conff.obj: conff.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-conff.obj -MD -MP -MF $(DEPDIR)/pdnsd-conff.Tpo -c -o pdnsd-conff.obj `if test -f 'conff.c'; then $(CYGPATH_W) 'conff.c'; else $(CYGPATH_W) '$(srcdir)/conff.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-conff.Tpo $(DEPDIR)/pdnsd-conff.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conff.c' object='pdnsd-conff.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-conff.obj `if test -f 'conff.c'; then $(CYGPATH_W) 'conff.c'; else $(CYGPATH_W) '$(srcdir)/conff.c'; fi` - -pdnsd-consts.o: consts.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-consts.o -MD -MP -MF $(DEPDIR)/pdnsd-consts.Tpo -c -o pdnsd-consts.o `test -f 'consts.c' || echo '$(srcdir)/'`consts.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-consts.Tpo $(DEPDIR)/pdnsd-consts.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='consts.c' object='pdnsd-consts.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-consts.o `test -f 'consts.c' || echo '$(srcdir)/'`consts.c - -pdnsd-consts.obj: consts.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-consts.obj -MD -MP -MF $(DEPDIR)/pdnsd-consts.Tpo -c -o pdnsd-consts.obj `if test -f 'consts.c'; then $(CYGPATH_W) 'consts.c'; else $(CYGPATH_W) '$(srcdir)/consts.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-consts.Tpo $(DEPDIR)/pdnsd-consts.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='consts.c' object='pdnsd-consts.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-consts.obj `if test -f 'consts.c'; then $(CYGPATH_W) 'consts.c'; else $(CYGPATH_W) '$(srcdir)/consts.c'; fi` - -pdnsd-debug.o: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-debug.o -MD -MP -MF $(DEPDIR)/pdnsd-debug.Tpo -c -o pdnsd-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-debug.Tpo $(DEPDIR)/pdnsd-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='pdnsd-debug.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c - -pdnsd-debug.obj: debug.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-debug.obj -MD -MP -MF $(DEPDIR)/pdnsd-debug.Tpo -c -o pdnsd-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-debug.Tpo $(DEPDIR)/pdnsd-debug.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='pdnsd-debug.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` - -pdnsd-dns.o: dns.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns.o -MD -MP -MF $(DEPDIR)/pdnsd-dns.Tpo -c -o pdnsd-dns.o `test -f 'dns.c' || echo '$(srcdir)/'`dns.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns.Tpo $(DEPDIR)/pdnsd-dns.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns.c' object='pdnsd-dns.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns.o `test -f 'dns.c' || echo '$(srcdir)/'`dns.c - -pdnsd-dns.obj: dns.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns.Tpo -c -o pdnsd-dns.obj `if test -f 'dns.c'; then $(CYGPATH_W) 'dns.c'; else $(CYGPATH_W) '$(srcdir)/dns.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns.Tpo $(DEPDIR)/pdnsd-dns.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns.c' object='pdnsd-dns.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns.obj `if test -f 'dns.c'; then $(CYGPATH_W) 'dns.c'; else $(CYGPATH_W) '$(srcdir)/dns.c'; fi` - -pdnsd-dns_answer.o: dns_answer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_answer.o -MD -MP -MF $(DEPDIR)/pdnsd-dns_answer.Tpo -c -o pdnsd-dns_answer.o `test -f 'dns_answer.c' || echo '$(srcdir)/'`dns_answer.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_answer.Tpo $(DEPDIR)/pdnsd-dns_answer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_answer.c' object='pdnsd-dns_answer.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_answer.o `test -f 'dns_answer.c' || echo '$(srcdir)/'`dns_answer.c - -pdnsd-dns_answer.obj: dns_answer.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_answer.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns_answer.Tpo -c -o pdnsd-dns_answer.obj `if test -f 'dns_answer.c'; then $(CYGPATH_W) 'dns_answer.c'; else $(CYGPATH_W) '$(srcdir)/dns_answer.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_answer.Tpo $(DEPDIR)/pdnsd-dns_answer.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_answer.c' object='pdnsd-dns_answer.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_answer.obj `if test -f 'dns_answer.c'; then $(CYGPATH_W) 'dns_answer.c'; else $(CYGPATH_W) '$(srcdir)/dns_answer.c'; fi` - -pdnsd-dns_query.o: dns_query.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_query.o -MD -MP -MF $(DEPDIR)/pdnsd-dns_query.Tpo -c -o pdnsd-dns_query.o `test -f 'dns_query.c' || echo '$(srcdir)/'`dns_query.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_query.Tpo $(DEPDIR)/pdnsd-dns_query.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_query.c' object='pdnsd-dns_query.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_query.o `test -f 'dns_query.c' || echo '$(srcdir)/'`dns_query.c - -pdnsd-dns_query.obj: dns_query.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-dns_query.obj -MD -MP -MF $(DEPDIR)/pdnsd-dns_query.Tpo -c -o pdnsd-dns_query.obj `if test -f 'dns_query.c'; then $(CYGPATH_W) 'dns_query.c'; else $(CYGPATH_W) '$(srcdir)/dns_query.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-dns_query.Tpo $(DEPDIR)/pdnsd-dns_query.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dns_query.c' object='pdnsd-dns_query.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-dns_query.obj `if test -f 'dns_query.c'; then $(CYGPATH_W) 'dns_query.c'; else $(CYGPATH_W) '$(srcdir)/dns_query.c'; fi` - -pdnsd-error.o: error.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-error.o -MD -MP -MF $(DEPDIR)/pdnsd-error.Tpo -c -o pdnsd-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-error.Tpo $(DEPDIR)/pdnsd-error.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='pdnsd-error.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c - -pdnsd-error.obj: error.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-error.obj -MD -MP -MF $(DEPDIR)/pdnsd-error.Tpo -c -o pdnsd-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-error.Tpo $(DEPDIR)/pdnsd-error.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='pdnsd-error.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi` - -pdnsd-helpers.o: helpers.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-helpers.o -MD -MP -MF $(DEPDIR)/pdnsd-helpers.Tpo -c -o pdnsd-helpers.o `test -f 'helpers.c' || echo '$(srcdir)/'`helpers.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-helpers.Tpo $(DEPDIR)/pdnsd-helpers.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helpers.c' object='pdnsd-helpers.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-helpers.o `test -f 'helpers.c' || echo '$(srcdir)/'`helpers.c - -pdnsd-helpers.obj: helpers.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-helpers.obj -MD -MP -MF $(DEPDIR)/pdnsd-helpers.Tpo -c -o pdnsd-helpers.obj `if test -f 'helpers.c'; then $(CYGPATH_W) 'helpers.c'; else $(CYGPATH_W) '$(srcdir)/helpers.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-helpers.Tpo $(DEPDIR)/pdnsd-helpers.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helpers.c' object='pdnsd-helpers.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-helpers.obj `if test -f 'helpers.c'; then $(CYGPATH_W) 'helpers.c'; else $(CYGPATH_W) '$(srcdir)/helpers.c'; fi` - -pdnsd-icmp.o: icmp.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-icmp.o -MD -MP -MF $(DEPDIR)/pdnsd-icmp.Tpo -c -o pdnsd-icmp.o `test -f 'icmp.c' || echo '$(srcdir)/'`icmp.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-icmp.Tpo $(DEPDIR)/pdnsd-icmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='icmp.c' object='pdnsd-icmp.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-icmp.o `test -f 'icmp.c' || echo '$(srcdir)/'`icmp.c - -pdnsd-icmp.obj: icmp.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-icmp.obj -MD -MP -MF $(DEPDIR)/pdnsd-icmp.Tpo -c -o pdnsd-icmp.obj `if test -f 'icmp.c'; then $(CYGPATH_W) 'icmp.c'; else $(CYGPATH_W) '$(srcdir)/icmp.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-icmp.Tpo $(DEPDIR)/pdnsd-icmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='icmp.c' object='pdnsd-icmp.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-icmp.obj `if test -f 'icmp.c'; then $(CYGPATH_W) 'icmp.c'; else $(CYGPATH_W) '$(srcdir)/icmp.c'; fi` - -pdnsd-list.o: list.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-list.o -MD -MP -MF $(DEPDIR)/pdnsd-list.Tpo -c -o pdnsd-list.o `test -f 'list.c' || echo '$(srcdir)/'`list.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-list.Tpo $(DEPDIR)/pdnsd-list.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='list.c' object='pdnsd-list.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-list.o `test -f 'list.c' || echo '$(srcdir)/'`list.c - -pdnsd-list.obj: list.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-list.obj -MD -MP -MF $(DEPDIR)/pdnsd-list.Tpo -c -o pdnsd-list.obj `if test -f 'list.c'; then $(CYGPATH_W) 'list.c'; else $(CYGPATH_W) '$(srcdir)/list.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-list.Tpo $(DEPDIR)/pdnsd-list.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='list.c' object='pdnsd-list.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-list.obj `if test -f 'list.c'; then $(CYGPATH_W) 'list.c'; else $(CYGPATH_W) '$(srcdir)/list.c'; fi` - -pdnsd-main.o: main.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-main.o -MD -MP -MF $(DEPDIR)/pdnsd-main.Tpo -c -o pdnsd-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-main.Tpo $(DEPDIR)/pdnsd-main.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='pdnsd-main.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c - -pdnsd-main.obj: main.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-main.obj -MD -MP -MF $(DEPDIR)/pdnsd-main.Tpo -c -o pdnsd-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-main.Tpo $(DEPDIR)/pdnsd-main.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='pdnsd-main.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` - -pdnsd-netdev.o: netdev.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-netdev.o -MD -MP -MF $(DEPDIR)/pdnsd-netdev.Tpo -c -o pdnsd-netdev.o `test -f 'netdev.c' || echo '$(srcdir)/'`netdev.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-netdev.Tpo $(DEPDIR)/pdnsd-netdev.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netdev.c' object='pdnsd-netdev.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-netdev.o `test -f 'netdev.c' || echo '$(srcdir)/'`netdev.c - -pdnsd-netdev.obj: netdev.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-netdev.obj -MD -MP -MF $(DEPDIR)/pdnsd-netdev.Tpo -c -o pdnsd-netdev.obj `if test -f 'netdev.c'; then $(CYGPATH_W) 'netdev.c'; else $(CYGPATH_W) '$(srcdir)/netdev.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-netdev.Tpo $(DEPDIR)/pdnsd-netdev.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netdev.c' object='pdnsd-netdev.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-netdev.obj `if test -f 'netdev.c'; then $(CYGPATH_W) 'netdev.c'; else $(CYGPATH_W) '$(srcdir)/netdev.c'; fi` - -pdnsd-rr_types.o: rr_types.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-rr_types.o -MD -MP -MF $(DEPDIR)/pdnsd-rr_types.Tpo -c -o pdnsd-rr_types.o `test -f 'rr_types.c' || echo '$(srcdir)/'`rr_types.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-rr_types.Tpo $(DEPDIR)/pdnsd-rr_types.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rr_types.c' object='pdnsd-rr_types.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-rr_types.o `test -f 'rr_types.c' || echo '$(srcdir)/'`rr_types.c - -pdnsd-rr_types.obj: rr_types.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-rr_types.obj -MD -MP -MF $(DEPDIR)/pdnsd-rr_types.Tpo -c -o pdnsd-rr_types.obj `if test -f 'rr_types.c'; then $(CYGPATH_W) 'rr_types.c'; else $(CYGPATH_W) '$(srcdir)/rr_types.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-rr_types.Tpo $(DEPDIR)/pdnsd-rr_types.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rr_types.c' object='pdnsd-rr_types.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-rr_types.obj `if test -f 'rr_types.c'; then $(CYGPATH_W) 'rr_types.c'; else $(CYGPATH_W) '$(srcdir)/rr_types.c'; fi` - -pdnsd-status.o: status.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-status.o -MD -MP -MF $(DEPDIR)/pdnsd-status.Tpo -c -o pdnsd-status.o `test -f 'status.c' || echo '$(srcdir)/'`status.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-status.Tpo $(DEPDIR)/pdnsd-status.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='status.c' object='pdnsd-status.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-status.o `test -f 'status.c' || echo '$(srcdir)/'`status.c - -pdnsd-status.obj: status.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-status.obj -MD -MP -MF $(DEPDIR)/pdnsd-status.Tpo -c -o pdnsd-status.obj `if test -f 'status.c'; then $(CYGPATH_W) 'status.c'; else $(CYGPATH_W) '$(srcdir)/status.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-status.Tpo $(DEPDIR)/pdnsd-status.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='status.c' object='pdnsd-status.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-status.obj `if test -f 'status.c'; then $(CYGPATH_W) 'status.c'; else $(CYGPATH_W) '$(srcdir)/status.c'; fi` - -pdnsd-servers.o: servers.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-servers.o -MD -MP -MF $(DEPDIR)/pdnsd-servers.Tpo -c -o pdnsd-servers.o `test -f 'servers.c' || echo '$(srcdir)/'`servers.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-servers.Tpo $(DEPDIR)/pdnsd-servers.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='servers.c' object='pdnsd-servers.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-servers.o `test -f 'servers.c' || echo '$(srcdir)/'`servers.c - -pdnsd-servers.obj: servers.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-servers.obj -MD -MP -MF $(DEPDIR)/pdnsd-servers.Tpo -c -o pdnsd-servers.obj `if test -f 'servers.c'; then $(CYGPATH_W) 'servers.c'; else $(CYGPATH_W) '$(srcdir)/servers.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-servers.Tpo $(DEPDIR)/pdnsd-servers.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='servers.c' object='pdnsd-servers.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-servers.obj `if test -f 'servers.c'; then $(CYGPATH_W) 'servers.c'; else $(CYGPATH_W) '$(srcdir)/servers.c'; fi` - -pdnsd-thread.o: thread.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-thread.o -MD -MP -MF $(DEPDIR)/pdnsd-thread.Tpo -c -o pdnsd-thread.o `test -f 'thread.c' || echo '$(srcdir)/'`thread.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-thread.Tpo $(DEPDIR)/pdnsd-thread.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='thread.c' object='pdnsd-thread.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-thread.o `test -f 'thread.c' || echo '$(srcdir)/'`thread.c - -pdnsd-thread.obj: thread.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-thread.obj -MD -MP -MF $(DEPDIR)/pdnsd-thread.Tpo -c -o pdnsd-thread.obj `if test -f 'thread.c'; then $(CYGPATH_W) 'thread.c'; else $(CYGPATH_W) '$(srcdir)/thread.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-thread.Tpo $(DEPDIR)/pdnsd-thread.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='thread.c' object='pdnsd-thread.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-thread.obj `if test -f 'thread.c'; then $(CYGPATH_W) 'thread.c'; else $(CYGPATH_W) '$(srcdir)/thread.c'; fi` - -pdnsd-cache.o: cache.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-cache.o -MD -MP -MF $(DEPDIR)/pdnsd-cache.Tpo -c -o pdnsd-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-cache.Tpo $(DEPDIR)/pdnsd-cache.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cache.c' object='pdnsd-cache.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c - -pdnsd-cache.obj: cache.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-cache.obj -MD -MP -MF $(DEPDIR)/pdnsd-cache.Tpo -c -o pdnsd-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-cache.Tpo $(DEPDIR)/pdnsd-cache.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cache.c' object='pdnsd-cache.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi` - -pdnsd-hash.o: hash.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-hash.o -MD -MP -MF $(DEPDIR)/pdnsd-hash.Tpo -c -o pdnsd-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-hash.Tpo $(DEPDIR)/pdnsd-hash.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='pdnsd-hash.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c - -pdnsd-hash.obj: hash.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -MT pdnsd-hash.obj -MD -MP -MF $(DEPDIR)/pdnsd-hash.Tpo -c -o pdnsd-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pdnsd-hash.Tpo $(DEPDIR)/pdnsd-hash.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hash.c' object='pdnsd-hash.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdnsd_CFLAGS) $(CFLAGS) -c -o pdnsd-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi` - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile $(PROGRAMS) -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(sbindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am - -distclean: distclean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: install-sbinPROGRAMS - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-sbinPROGRAMS - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic \ - clean-sbinPROGRAMS ctags ctags-recursive distclean \ - distclean-compile distclean-generic distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ - ps ps-am tags tags-recursive uninstall uninstall-am \ - uninstall-sbinPROGRAMS - - -$(pdnsd_OBJECTS): rr_types.h - -rr_types.h: make_rr_types_h.pl rr_types.in - perl make_rr_types_h.pl rr_types.in > rr_types.h - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/cache.c b/jni/pdnsd/src/cache.c deleted file mode 100644 index 32d28ccd..00000000 --- a/jni/pdnsd/src/cache.c +++ /dev/null @@ -1,2731 +0,0 @@ -/* cache.c - Keep the dns caches. - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2004, 2005, 2007, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "cache.h" -#include "hash.h" -#include "conff.h" -#include "helpers.h" -#include "dns.h" -#include "error.h" -#include "debug.h" -#include "thread.h" -#include "ipvers.h" - - -/* A version identifier to prevent reading incompatible cache files */ -static const char cachverid[] = {'p','d','1','3'}; - -/* CACHE STRUCTURE CHANGES IN PDNSD 1.0.0 - * Prior to version 1.0.0, the cache was managed at domain granularity (all records of a domain were handled as a unit), - * which was suboptimal after the lean query feature and the additional record management were included. - * From 1.0.0 on, the cache management was switched to act with RR set granularity. The API of the cache handlers was - * slightly modified, in particular the rr_bucket_t was modified and some parameter list were changed. The cache - * file format had to be changed and is incompatible now. This means that post-1.0.0p1 versions will not read the cache - * files of older versions and vice versa. In addition, cache files from 1.0.0p5 on are incompatible to those of 1.0.0p1 - * to 1.0.0p4. Better delete them before upgrading. - * The "cent" lists common to old versions have vanished; the only access point to the cent's is the hash. - * However, there are now double linked rrset lists. Thus, rrs can be acces through the hash or through the rrset lists. - * The rrset list entries need some additional entries to manage the deletion from rrs lists as well as from the cents. - * - * Nearly all cache functions had to be changed significantly or even to be rewritten for that. Expect some beta time - * because of that. - * There are bonuses visible to the users resulting from this changes however: more consistent cache handling (under - * some circumstances, rrs could be in the cache more than once) and reduced memory requirements, as no rr needs - * to have stored its oname any more. There are more pointers however, and in some cases (CNAMES) the memory require- - * ments for some records may increase. The total should be lower, however. - * - * RRSET_L LIST STRUCTURE: - * The rrset_l rrset list is a simple double-linked list. The oldest entries are at the first positions, the list is sorted - * by age in descending order. Search is done only on insert. - * The rationale for this form is: - * - the purging operation needs to be fast (this way, the first records are the oldest and can easily be purged) - * - the append operation is common and needs to be fast (in normal operation, an appended record was just retrieved - * and therefore is the newest, so it can be appended at the end of the list without search. Only in the case of - * reading a disk cache file, searches are necessary) - * The rrset list is excusively used for purging purposes. - * - * THE DISK CACHE FILES: - * The disk cache file consists of cent's, i.e. structures for every known hostnames with a header and rrs attached to it. - * Therefore, the rr's are not ordered by their age and a search must be performed to insert the into the rr_l in the - * right positions. This operations has some costs (although not all too much), but the other way (rrs stored in order - * of their age and the cent headers separated from them), the rrs would need to be attached to the cent headers, which - * would be even more costly, also in means of disk space. - * - * CHANGES AFTER 1.0.0p1 - * In 1.0.0p5, the cache granularity was changed from rr level to rr set level. This was done because rfc2181 demands - * rr set consistency constraints on rr set level and if we are doing so we can as well save space (and eliminate some - * error-prone algorithms). - * - * CHANGES FOR 1.1.0p1 - * In this version, negative caching support was introduced. Following things were changed for that: - * - new members ts, ttl and flags in dns_cent_t and dns_file_t - * - new caching flag CF_NEGATIVE - * - all functions must accept and deal correctly with empty cents with DF_NEGATIVE set. - * - all functions must accept and deal correctly with empty rrsets with CF_NEGATIVE set. - */ - - -/* - * This is the size the memory cache may exceed the size of the permanent cache. - */ -#define MCSZ 10240 - -/* Some structs used for storing cache entries in a file. */ -typedef struct { - unsigned short rdlen; -/* data (with length rdlen) follows here;*/ -} rr_fbucket_t; - -typedef struct { - unsigned char tp; /* RR type */ - unsigned char num_rr; /* Number of records in RR set. */ - unsigned short flags; /* Flags for RR set. */ - time_t ttl; - time_t ts; -} __attribute__((packed)) -rr_fset_t; - -#if NRRTOT>255 -#warning "Number of cache-able RR types is greater than 255. This can give problems when saving the cache to file." -#endif - -typedef struct { - unsigned char qlen; /* Length of the domain name which follows after the struct. */ - unsigned char num_rrs; /* Number of RR-sets. */ - unsigned short flags; /* Flags for the whole cent. */ - unsigned char c_ns,c_soa; /* Number of trailing name elements in qname to use to find NS or SOA - records to add to the authority section of a response. */ - /* ttl and ts follow but only for negatively cached domains. */ - /* qname (with length qlen) follows here. */ -} __attribute__((packed)) -dns_file_t; - - -/* TTL and timestamp for negatively cached domains. */ -typedef struct { - time_t ttl; - time_t ts; -} __attribute__((packed)) -dom_fttlts_t; - -/* - * This has two modes: Normally, we have rrset, cent and idx filled in; - * for negatively cached cents, we have rrset set to NULL and idx set to -1. - */ -typedef struct rr_lent_s { - struct rr_lent_s *next; - struct rr_lent_s *prev; - rr_set_t *rrset; - dns_cent_t *cent; - int idx; /* This is the array index, not the type of the RR-set. */ -} rr_lent_t; - - -static rr_lent_t *rrset_l=NULL; -static rr_lent_t *rrset_l_tail=NULL; - -/* - * We do not count the hash table sizes here. Those are very small compared - * to the cache entries. - */ -static volatile long cache_size=0; -static volatile long ent_num=0; - -static volatile int cache_w_lock=0; -static volatile int cache_r_lock=0; - -pthread_mutex_t lock_mutex = PTHREAD_MUTEX_INITIALIZER; -/* - * These are condition variables for lock coordination, so that normal lock - * routines do not need to loop. Basically, a process wanting to acquire a lock - * tries first to lock, and if the lock is busy, sleeps on one of the conds. - * If the r lock count has gone to zero one process sleeping on the rw cond - * will be awankened. - * If the rw lock is lifted, either all threads waiting on the r lock or one - * thread waiting on the rw lock is/are awakened. This is determined by policy. - */ -pthread_cond_t rw_cond = PTHREAD_COND_INITIALIZER; -pthread_cond_t r_cond = PTHREAD_COND_INITIALIZER; - -/* This is to suspend the r lock to avoid lock contention by reading threads */ -static volatile int r_pend=0; -static volatile int rw_pend=0; -static volatile int r_susp=0; - -/* This threshold is used to temporarily suspend r locking to give rw locking - * a chance. */ -#define SUSP_THRESH(r_pend) (r_pend/2+2) - -/* - * This is set to 1 once the lock is intialized. This must happen before we get - * multiple threads. - */ -volatile short int use_cache_lock=0; - -/* - This is set to 0 while cache is read from disk. - This must be set to 1 before we start adding new entries. -*/ -static short int insert_sort=1; - - -#ifdef ALLOC_DEBUG -#define cache_free(ptr) { if (dbg) pdnsd_free(ptr); else free(ptr); } -#define cache_malloc(sz) ((dbg)?(pdnsd_malloc(sz)):(malloc(sz))) -#define cache_calloc(n,sz) ((dbg)?(pdnsd_calloc(n,sz)):(calloc(n,sz))) -#define cache_realloc(ptr,sz) ((dbg)?(pdnsd_realloc(ptr,sz)):(realloc(ptr,sz))) -#else -#define cache_free(ptr) {free(ptr);} -#define cache_malloc(sz) (malloc(sz)) -#define cache_calloc(n,sz) (calloc(n,sz)) -#define cache_realloc(ptr,sz) (realloc(ptr,sz)) -#endif - - -/* - * Prototypes for internal use - */ -static void purge_cache(long sz, int lazy); -static void del_cache_ent(dns_cent_t *cent,dns_hash_loc_t *loc); -static void remove_rrl(rr_lent_t *le DBGPARAM); - -/* - * Locking functions. - */ - -/* - * Lock/unlock cache for reading. Concurrent reads are allowed, while writes are forbidden. - * DO NOT MIX THE LOCK TYPES UP WHEN LOCKING/UNLOCKING! - * - * We use a mutex to lock the access to the locks ;-). - * This is because we do not allow read and write to interfere (for which a normal mutex would be - * fine), but we also want to allow concurrent reads. - * We use condition variables, and readlock contention protection. - */ -static void lock_cache_r(void) -{ - if (!use_cache_lock) - return; - pthread_mutex_lock(&lock_mutex); - r_pend++; - while(((rw_pend>SUSP_THRESH(r_pend))?(r_susp=1):r_susp) || cache_w_lock) { - /* This will unlock the mutex while sleeping and relock it before exit */ - pthread_cond_wait(&r_cond, &lock_mutex); - } - cache_r_lock++; - r_pend--; - pthread_mutex_unlock(&lock_mutex); -} - -static void unlock_cache_r(void) -{ - if (!use_cache_lock) - return; - pthread_mutex_lock(&lock_mutex); - if (cache_r_lock>0) - cache_r_lock--; - /* wakeup threads waiting to write */ - if (!cache_r_lock) - pthread_cond_signal(&rw_cond); - pthread_mutex_unlock(&lock_mutex); -} - -/* - * Lock/unlock cache for reading and writing. Concurrent reads and writes are forbidden. - * Do this only if you actually modify the cache. - * DO NOT MIX THE LOCK TYPES UP WHEN LOCKING/UNLOCKING! - * (cant say it often enough) - */ -static void lock_cache_rw(void) -{ - if (!use_cache_lock) - return; - pthread_mutex_lock(&lock_mutex); - rw_pend++; - while(cache_w_lock || cache_r_lock) { - /* This will unlock the mutex while sleeping and relock it before exit */ - pthread_cond_wait(&rw_cond, &lock_mutex); - } - cache_w_lock=1; - rw_pend--; - pthread_mutex_unlock(&lock_mutex); -} - -/* Lock cache for reading and writing, or time out after tm seconds. */ -static int timedlock_cache_rw(int tm) -{ - int retval=0; - struct timeval now; - struct timespec timeout; - - if (!use_cache_lock) - return 0; - pthread_mutex_lock(&lock_mutex); - gettimeofday(&now,NULL); - timeout.tv_sec = now.tv_sec + tm; - timeout.tv_nsec = now.tv_usec * 1000; - rw_pend++; - while(cache_w_lock || cache_r_lock) { - /* This will unlock the mutex while sleeping and relock it before exit */ - if(pthread_cond_timedwait(&rw_cond, &lock_mutex, &timeout) == ETIMEDOUT) - goto cleanup_return; - } - cache_w_lock=1; - retval=1; - cleanup_return: - rw_pend--; - pthread_mutex_unlock(&lock_mutex); - return retval; -} - -static void unlock_cache_rw(void) -{ - if (!use_cache_lock) - return; - pthread_mutex_lock(&lock_mutex); - cache_w_lock=0; - /* always reset r suspension (r locking code will set it again) */ - r_susp=0; - /* wakeup threads waiting to read or write */ - if (r_pend==0 || rw_pend>SUSP_THRESH(r_pend)) - pthread_cond_signal(&rw_cond); /* schedule another rw proc */ - else - pthread_cond_broadcast(&r_cond); /* let 'em all read */ - pthread_mutex_unlock(&lock_mutex); -} - - -/* - If there are other threads waiting to read from or write to - the cache, give up the read/write lock on the cache to give another - thread a chance; then try to get the lock back again. - This can be called regularly during a process that takes - a lot of processor time but has low priority, in order to improve - overall responsiveness. -*/ -static void yield_lock_cache_rw() -{ - if (!use_cache_lock || (!r_pend && !rw_pend)) - return; - - /* Give up the lock */ - pthread_mutex_lock(&lock_mutex); - cache_w_lock=0; - /* always reset r suspension (r locking code will set it again) */ - r_susp=0; - /* wakeup threads waiting to read or write */ - if (r_pend==0 || rw_pend>SUSP_THRESH(r_pend)) - pthread_cond_signal(&rw_cond); /* schedule another rw proc */ - else - pthread_cond_broadcast(&r_cond); /* let 'em all read */ - pthread_mutex_unlock(&lock_mutex); - - usleep_r(1000); - - /* Now try to get the lock back again */ - pthread_mutex_lock(&lock_mutex); - rw_pend++; - while(cache_w_lock || cache_r_lock) { - /* This will unlock the mutex while sleeping and relock it before exit */ - pthread_cond_wait(&rw_cond, &lock_mutex); - } - cache_w_lock=1; - rw_pend--; - pthread_mutex_unlock(&lock_mutex); -} - -/* These are a special version of the ordinary read lock functions. The lock "soft" to avoid deadlocks: they will give up - * after a certain number of bad trials. You have to check the exit status though. - * To avoid blocking mutexes, we cannot use condition variables here. Never mind, these are only used on - * exit. */ -static int softlock_cache_r(void) -{ - if (!use_cache_lock) - return 0; - { - int lk=0,tr=0; - - for(;;) { - if (!softlock_mutex(&lock_mutex)) - return 0; - if(!cache_w_lock) { - lk=1; - cache_r_lock++; - } - pthread_mutex_unlock(&lock_mutex); - if (lk) break; - if (++tr>=SOFTLOCK_MAXTRIES) - return 0; - usleep_r(1000); /*give contol back to the scheduler instead of hammering the lock close*/ - } - } - return 1; -} - -/* On unlocking, we do not wake others. We are about to exit! */ -static int softunlock_cache_r(void) -{ - if (!use_cache_lock) - return 0; - if (!softlock_mutex(&lock_mutex)) - return 0; - if (cache_r_lock>0) - cache_r_lock--; - pthread_mutex_unlock(&lock_mutex); - return 1; -} - -static int softlock_cache_rw(void) -{ - if (!use_cache_lock) - return 0; - { - int lk=0,tr=0; - - for(;;) { - if (!softlock_mutex(&lock_mutex)) - return 0; - if (!(cache_w_lock || cache_r_lock)) { - lk=1; - cache_w_lock=1; - } - pthread_mutex_unlock(&lock_mutex); - if(lk) break; - if (++tr>=SOFTLOCK_MAXTRIES) - return 0; - usleep_r(1000); /*give contol back to the scheduler instead of hammering the lock close*/ - } - } - return 1; -} - -static int softunlock_cache_rw(void) -{ - if (!use_cache_lock) - return 0; - if (!softlock_mutex(&lock_mutex)) - return 0; - cache_w_lock=0; - pthread_mutex_unlock(&lock_mutex); - return 1; -} - -/* - * Serial numbers: Serial numbers are used when additional records are added to the cache: serial numbers are unique to each - * query, so we can determine whether data was added by the query just executed (records can coexist) or not (records must - * be replaced). A serial of 0 is special and will not be used by any query. All records added added authoritatively (as - * chunk) or read from a file can have no query in process and therefore have serial 0, which is != any other serial. - */ -#if 0 -unsigned long l_serial=1; - -unsigned long get_serial() -{ - unsigned long rv; - lock_cache_rw(); - rv=l_serial++; - unlock_cache_rw(); - return rv; -} -#endif - -/* - * Cache/cent handlers - */ - -/* Initialize the cache. Call only once. */ -#if 0 -void init_cache() -{ - mk_hash_ctable(); - mk_dns_hash(); -} -#endif - -/* Initialize the cache lock. Call only once. */ -/* This is now defined as an inline function in cache.h */ -#if 0 -void init_cache_lock() -{ - - use_cache_lock=1; -} -#endif - -/* Empty the cache, freeing all entries that match the include/exclude list. */ -int empty_cache(slist_array sla) -{ - int i; - - /* Wait at most 60 seconds to obtain a lock. */ - if(!timedlock_cache_rw(60)) - return 0; - - for(i=0; ; ) { - if(sla) - free_dns_hash_selected(i,sla); - else - free_dns_hash_bucket(i); - if(++i>=HASH_NUM_BUCKETS) - break; - /* Give another thread a chance */ - yield_lock_cache_rw(); - } - - unlock_cache_rw(); - return 1; -} - -/* Delete the cache. Call only once */ -void destroy_cache() -{ - /* lock the cache, in case that any thread is still accessing. */ - if(!softlock_cache_rw()) { - log_error("Lock failed; could not destroy cache on exit."); - return; - } - free_dns_hash(); -#if DEBUG>0 - if(ent_num || cache_size) { - DEBUG_MSG("After destroying cache, %ld entries (%ld bytes) remaining.\n",ent_num,cache_size); - } -#endif - -#if 0 -#if (TARGET!=TARGET_LINUX) - /* under Linux, this frees no resources but may hang on a crash */ - pthread_mutex_destroy(&lock_mutex); - pthread_cond_destroy(&rw_cond); - pthread_cond_destroy(&r_cond); -#endif -#endif -} - -/* Make a flag value for a dns_cent_t (dns cache entry) from a server record */ -/* Now defined as inline function in cache.h */ -#if 0 -unsigned int mk_flag_val(servparm_t *server) -{ - unsigned int fl=0; - if (!server->purge_cache) - fl|=CF_NOPURGE; - if (server->nocache) - fl|=CF_NOCACHE; - if (server->rootserver) - fl|=CF_ROOTSERV; - return fl; -} -#endif - -/* Initialize a dns cache record (dns_cent_t) with the query name (in - * transport format), a flag value, a timestamp indicating - * the time the query was done, and a TTL. The timestamp and TTL - * are only used if DF_NEGATIVE is set in the flags. Otherwise, - * the timestamps of the individual records are used. DF_NEGATIVE - * is used for whole-domain negative caching. - * By convention, ttl and ts should be set to 0, unless the - * DF_NEGATIVE bit is set. */ -int init_cent(dns_cent_t *cent, const unsigned char *qname, time_t ttl, time_t ts, unsigned flags DBGPARAM) -{ - int i; - size_t namesz=rhnlen(qname); - - cent->qname=cache_malloc(namesz); - if (cent->qname == NULL) - return 0; - memcpy(cent->qname,qname,namesz); - cent->cs=sizeof(dns_cent_t)+namesz; - cent->num_rrs=0; - cent->flags=flags; - if(flags&DF_NEGATIVE) { - cent->neg.lent=NULL; - cent->neg.ttl=ttl; - cent->neg.ts=ts; - } - else { - for(i=0; irr.rrmu[i]=NULL; - cent->rr.rrext=NULL; - } - cent->c_ns=cundef; - cent->c_soa=cundef; - return 1; -} - -/* - * Create a rr record holder using the given values. - */ -static rr_bucket_t *create_rr(unsigned dlen, void *data DBGPARAM) -{ - rr_bucket_t *rrb; - rrb=(rr_bucket_t *)cache_malloc(sizeof(rr_bucket_t)+dlen); - if (rrb == NULL) - return NULL; - rrb->next=NULL; - - rrb->rdlen=dlen; - memcpy(rrb->data,data,dlen); - return rrb; -} - -/* - * Adds an empty rrset_t with the requested data to a cent. This is exactly what you need to - * do to create a negatively cached cent. - */ -static int add_cent_rrset_by_index(dns_cent_t *cent, unsigned int idx, time_t ttl, time_t ts, unsigned flags DBGPARAM) -{ - rr_set_t **rrext, **rrsetpa, *rrset; - - /* If we add a rrset, even a negative one, the domain is not negative any more. */ - if (cent->flags&DF_NEGATIVE) { - int i; - /* need to remove the cent from the lent list. */ - if (cent->neg.lent) - remove_rrl(cent->neg.lent DBGARG); - cent->flags &= ~DF_NEGATIVE; - for(i=0; irr.rrmu[i]=NULL; - cent->rr.rrext=NULL; - } - - if(idx < NRRMU) - rrsetpa = ¢->rr.rrmu[idx]; - else { - idx -= NRRMU; - PDNSD_ASSERT(idx < NRREXT, "add_cent_rrset_by_index: rr-set index out of range"); - rrext = cent->rr.rrext; - if(!rrext) { - int i; - cent->rr.rrext = rrext = cache_malloc(sizeof(rr_set_t*)*NRREXT); - if(!rrext) - return 0; - for(i=0; ics += sizeof(rr_set_t*)*NRREXT; - } - rrsetpa = &rrext[idx]; - } - -#if 0 - if(*rrsetpa) del_rrset(*rrsetpa); -#endif - *rrsetpa = rrset = cache_malloc(sizeof(rr_set_t)); - if (!rrset) - return 0; - rrset->lent=NULL; - rrset->ttl=ttl; - rrset->ts=ts; - rrset->flags=flags; - rrset->rrs=NULL; - cent->cs += sizeof(rr_set_t); - ++cent->num_rrs; - return 1; -} - -int add_cent_rrset_by_type(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags DBGPARAM) -{ - int tpi = type - T_MIN; - - PDNSD_ASSERT(tpi>=0 && tpinext=rrset->rrs; - rrset->rrs=rr; - } - else { - /* append at the end */ - rr->next=(*rtail)->next; - (*rtail)->next=rr; - } - if(rtail) *rtail=rr; - cent->cs += sizeof(rr_bucket_t)+rr->rdlen; -#if DEBUG>0 - if(debug_p) { - rrset = RRARR_INDEX(cent,idx); - if (rrset->flags&CF_NEGATIVE) { - char cflagstr[CFLAGSTRLEN]; - DEBUG_MSG("Tried to add rr to a rrset with CF_NEGATIVE set! flags=%s\n",cflags2str(rrset->flags,cflagstr)); - } - } -#endif - return 1; - - cleanup_return: - free_rr(*rr); - free(rr); - return 0; -} - - -/* Add an rr to a cache entry, giving the ttl, the data length, the rr type - * and a pointer to the data. A record is allocated, and the data is copied into - * it. Do this for all rrs in a cache entry. - * The return value will be 1 in case of success, or 0 in case of a memory allocation - * problem. - */ -int add_cent_rr(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags, - unsigned dlen, void *data DBGPARAM) -{ - int tpi; - unsigned int idx; - rr_set_t *rrset; - rr_bucket_t *rtail, *rrb; - - if ((cent->flags&DF_LOCAL) && !(flags&CF_LOCAL)) - return 1; /* ignore. Local has precedence. */ - - tpi = type - T_MIN; - PDNSD_ASSERT(tpi>=0 && tpittl) - /* The ttl timestamps should be identical. - In case they are not, we will use the smallest one. */ - rrset->ttl= ttl; - - /* OK, some stupid nameservers feel inclined to return the same address twice. Grmbl... */ - rrb=rrset->rrs; - while (rrb) { - if (rrb->rdlen==dlen && memcmp(rrb->data,data,dlen)==0) - return 1; - rtail=rrb; - rrb=rrb->next; - } - } - return add_cent_rr_int(cent,idx,ttl,ts,flags,dlen,data,&rtail DBGARG); -} - -/* Free a complete rrset including all memory. Returns the size of the memory freed */ -int del_rrset(rr_set_t *rrs DBGPARAM) -{ - int rv=sizeof(rr_set_t); - rr_bucket_t *rrb,*rrn; - - if(rrs->lent) remove_rrl(rrs->lent DBGARG); - rrb=rrs->rrs; - while (rrb) { - rv+=sizeof(rr_bucket_t)+rrb->rdlen; - rrn=rrb->next; - free_rr(*rrb); - cache_free(rrb); - rrb=rrn; - } - cache_free(rrs); - return rv; -} - -/* Remove a complete rrset from a cent, freeing the memory. - The second argument should be an RR-set array index, not an RR type! - Returns the size of the memory freed */ -static int del_cent_rrset_by_index(dns_cent_t *cent, int i DBGPARAM) -{ - int rv=0; - rr_set_t **rrspa = RRARR_INDEX_PA_TESTEXT(cent,i); - - if(rrspa) { - rr_set_t *rrs = *rrspa; - if(rrs) { - rv= del_rrset(rrs DBGARG); - *rrspa=NULL; - --cent->num_rrs; - cent->cs -= rv; - cent->flags &= ~DF_AUTH; - } - } - return rv; -} - -#if 0 -static int del_cent_rrset_by_type(dns_cent_t *cent, int type DBGPARAM) -{ - return del_cent_rrset_by_index(cent, rrlkuptab[type-T_MIN] DBGARG); -} -#endif - -#if 0 -/* Free the pointers contained in an rr record. If the rr record is on the heap, - * don't forget to delete itself. This is done extra mainly for extensibility - * -- This is not here any more. The definition is actually an empty macro in - * cache.h. - */ -void free_rr(rr_bucket_t rr) -{ -} -#endif - -/* Free all data referred by a cache entry. */ -void free_cent(dns_cent_t *cent DBGPARAM) -{ - cache_free(cent->qname); - if(cent->flags&DF_NEGATIVE) { - if(cent->neg.lent) - remove_rrl(cent->neg.lent DBGARG); - } - else { - int i; - for (i=0; irr.rrmu[i]; - if (rrs) del_rrset(rrs DBG0); - } - { - rr_set_t **rrext = cent->rr.rrext; - if(rrext) { - for(i=0; iflags&DF_NEGATIVE)) { - for (i=0; irr.rrmu[i]; - if (rrs) { - cent->cs -= del_rrset(rrs DBG0); - /* cent->rr.rrmu[i]=NULL; */ - } - } - { - rr_set_t **rrext = cent->rr.rrext; - if(rrext) { - for(i=0; ics -= del_rrset(rrs DBG0); - } - cache_free(rrext); - /* cent->rr.rrext=NULL; */ - cent->cs -= sizeof(rr_set_t*)*NRREXT; - } - } - cent->num_rrs=0; - cent->flags |= DF_NEGATIVE; - cent->neg.lent=NULL; - } - - cent->neg.ttl=ttl; - cent->neg.ts=ts; -} - -inline static time_t get_rrlent_ts(rr_lent_t *le) -{ - return (le->rrset)?(le->rrset->ts):(le->cent->neg.ts); -} - -/* insert a rrset into the rr_l list. This modifies the rr_set_t if rrs is not NULL! - * The rrset address needs to be constant afterwards. - * idx is the internally used RR-set index, not the RR type! - * Call with locks applied. */ -static int insert_rrl(rr_set_t *rrs, dns_cent_t *cent, int idx) -{ - time_t ts; - rr_lent_t *le,*ne; - - /* No need to add local records to the rr_l list, because purge_cache() ignores them anyway. */ - if((rrs && (rrs->flags&CF_LOCAL)) || (cent->flags&DF_LOCAL)) - return 1; - - if (!(ne=malloc(sizeof(rr_lent_t)))) - return 0; - ne->rrset=rrs; - ne->cent=cent; - ne->idx=idx; - ne->next=NULL; - ne->prev=NULL; - - if(insert_sort) { - /* Since the append at the and is a very common case (and we want this case to be fast), we search back-to-forth. - * Since rr_l is a list and we don't really have fast access to all elements, we do not perform an advanced algorithm - * like binary search.*/ - ts=get_rrlent_ts(ne); - le=rrset_l_tail; - while (le) { - if (ts>=get_rrlent_ts(le)) goto found; - le=le->prev; - } - /* not found, so it needs to be inserted at the start of the list. */ - ne->next=rrset_l; - if (rrset_l) - rrset_l->prev=ne; - else - rrset_l_tail=ne; - rrset_l=ne; - goto finish; - found: - ne->next=le->next; - ne->prev=le; - if (le->next) - le->next->prev=ne; - else - rrset_l_tail=ne; - le->next=ne; - finish:; - } - else { - /* simply append at the end, sorting will be done later with a more efficient algorithm. */ - ne->prev=rrset_l_tail; - if(rrset_l_tail) - rrset_l_tail->next=ne; - else - rrset_l=ne; - rrset_l_tail=ne; - } - - if (rrs) - rrs->lent=ne; - else - cent->neg.lent=ne; - - return 1; -} - -/* Remove a rr from the rr_l list. Call with locks applied. */ -static void remove_rrl(rr_lent_t *le DBGPARAM) -{ - rr_lent_t *next=le->next,*prev=le->prev; - if (next) - next->prev=prev; - else - rrset_l_tail=prev; - if (prev) - prev->next=next; - else - rrset_l=next; - cache_free(le); -} - - -/* Merge two sorted rr_l lists to make a larger sorted list. - The lists are sorted according to increasing time-stamp. - The back links are ignored, these must be fixed using a separate pass. -*/ -static rr_lent_t *listmerge(rr_lent_t *p, rr_lent_t *q) -{ - - if(!p) - return q; - else if(!q) - return p; - else { - rr_lent_t *l=NULL, **s= &l; - - for(;;) { - if(get_rrlent_ts(p) <= get_rrlent_ts(q)) { - *s= p; - s= &p->next; - p= *s; - if(!p) { - *s= q; - break; - } - } - else { /* get_rrlent_ts(p) > get_rrlent_ts(q) */ - *s= q; - s= &q->next; - q= *s; - if(!q) { - *s= p; - break; - } - } - } - - return l; - } -} - -/* Sort the rr_l list using merge sort, which can be more efficient than insertion sort used by rr_insert(). - This algorithm is adapted from the GNU C++ STL implementation for list containers. - Call with locks applied. - Written by Paul Rombouts. -*/ -static void sort_rrl() -{ - /* Do nothing unless the list has length >= 2. */ - if(rrset_l && rrset_l->next) { - /* First sort the list ignoring the back links, these will be fixed later. */ -# define NTMPSORT 32 - /* Because we use an array of fixed length, the length of the list we can sort - is bounded by pow(2,NTMPSORT)-1. */ - rr_lent_t *tmp[NTMPSORT]; /* tmp[i] will either be NULL or point to a sorted list of length pow(2,i). */ - rr_lent_t **fill= tmp, **end=tmp+NTMPSORT, **counter; - rr_lent_t *rem= rrset_l, *carry; - - do { - carry=rem; rem=rem->next; - carry->next=NULL; - for(counter = tmp; counter!=fill && *counter!=NULL; ++counter) { - carry=listmerge(*counter,carry); - *counter=NULL; - } - - PDNSD_ASSERT(counter!=end, "sort_rrl: tmp array overflowed"); - - *counter=carry; - - if(counter==fill) ++fill; - } - while(rem); - - /* Merge together all the remaining list fragments contained in array tmp. */ - carry= tmp[0]; - counter= tmp; - while(++counter!=fill) - carry=listmerge(*counter,carry); - - rrset_l= carry; - - { - /* Restore the backward links. */ - rr_lent_t *p,*q=NULL; - for(p=rrset_l; p; p=p->next) {p->prev=q; q=p;} - rrset_l_tail=q; - } - } -} - - -/* Copy a rr_bucket_t into newly allocated memory */ -inline static rr_bucket_t *copy_rr(rr_bucket_t *rr DBGPARAM) -{ - rr_bucket_t *rrn; - rrn=cache_malloc(sizeof(rr_bucket_t)+rr->rdlen); - if (rrn == NULL) - return NULL; - memcpy(rrn,rr,sizeof(rr_bucket_t)+rr->rdlen); - rrn->next=NULL; - return rrn; -} - - -/* Copy an RR set into newly allocated memory */ -static rr_set_t *copy_rrset(rr_set_t *rrset DBGPARAM) -{ - rr_set_t *rrsc=cache_malloc(sizeof(rr_set_t)); - rr_bucket_t *rr,**rrp; - if (rrsc) { - *rrsc=*rrset; - rrsc->lent=NULL; - rrp=&rrsc->rrs; - rr=rrset->rrs; - while(rr) { - rr_bucket_t *rrc=copy_rr(rr DBGARG); - *rrp=rrc; - if (!rrc) goto cleanup_return; - rrp=&rrc->next; - rr=rr->next; - } - } - return rrsc; - -cleanup_return: - del_rrset(rrsc DBG0); - return NULL; -} - - -/* Copy a cache entry into newly allocated memory */ -dns_cent_t *copy_cent(dns_cent_t *cent DBGPARAM) -{ - dns_cent_t *copy; - - /* - * We do not debug cache internals with it, as mallocs seem to be - * "lost" when they enter the cache for a longer time. - */ - if (!(copy=cache_malloc(sizeof(dns_cent_t)))) - return NULL; - - { - /* copy the name */ - size_t namesz=rhnlen(cent->qname); - if (!(copy->qname=cache_malloc(namesz))) - goto free_return_null; - - memcpy(copy->qname,cent->qname,namesz); - } - copy->cs= cent->cs; - copy->num_rrs= cent->num_rrs; - copy->flags= cent->flags; - copy->c_ns = cent->c_ns; - copy->c_soa= cent->c_soa; - if(cent->flags&DF_NEGATIVE) { - copy->neg.lent=NULL; - copy->neg.ttl= cent->neg.ttl; - copy->neg.ts = cent->neg.ts; - } - else { - int i, ilim; - for (i=0; irr.rrmu[i]=NULL; - copy->rr.rrext=NULL; - - ilim = NRRMU; - if(cent->rr.rrext) { - rr_set_t **rrextc; - ilim = NRRTOT; - copy->rr.rrext = rrextc = cache_malloc(sizeof(rr_set_t*)*NRREXT); - if(!rrextc) goto free_cent_return_null; - - for (i=0; ilent=NULL; - rrp=&rrsc->rrs; - rr=rrset->rrs; - while(rr) { - rr_bucket_t *rrc=copy_rr(rr DBGARG); - *rrp=rrc; - if (!rrc) goto free_cent_return_null; - rrp=&rrc->next; - rr=rr->next; - } - } - } - } - return copy; - - free_cent_return_null: - free_cent(copy DBGARG); - free_return_null: - cache_free(copy); - return NULL; -} - -/* - * Remove all timed out entries of the RR set with the given index. - * idx is the internally used RR-set index, not the RR type! - * Follow some rules based on flags etc. - * This will either delete the whole rrset, or will leave it as a whole (RFC2181 seems to - * go in that direction) - * This was pretty large once upon a time ;-), but now, since we operate in rrsets, was - * shrunk drastically. - * If test is zero and the record is in the cache, we need rw-locks applied. - * If test is nonzero, nothing will actually be deleted. - * Substracts the size of the freed memory from cache_size (if test is zero). - * Returns 1 if the rrset has been (or would have been) deleted. - */ -static int purge_rrset(dns_cent_t *cent, int idx, int test) -{ - rr_set_t *rrs= RRARR_INDEX_TESTEXT(cent,idx); - if (rrs && !(rrs->flags&CF_NOPURGE || rrs->flags&CF_LOCAL) && timedout(rrs)) { - /* well, it must go. */ - if(!test) - cache_size -= del_cent_rrset_by_index(cent,idx DBG0); - return 1; - } - return 0; -} - -/* - Remove all timed out entries of alls RR sets of a cache entry. - The test flag works the same as in purge_rrset(). - Substracts the size of the freed memory from cache_size, just as purge_rrset(). - *numrrsrem is set to the number of remaining RR sets (or the number that would have remained). - Returns the number of items (RR sets or RR set arrays) that have been (or would have been) deleted. -*/ -static int purge_all_rrsets(dns_cent_t *cent, int test, int *numrrsrem) -{ - int rv=0, numrrs=0, numrrext=0; - - if(!(cent->flags&DF_NEGATIVE)) { - int i, ilim= RRARR_LEN(cent); - for(i=0; iflags&CF_NOPURGE || rrs->flags&CF_LOCAL) && timedout(rrs)) { - /* well, it must go. */ - if(!test) - cache_size -= del_cent_rrset_by_index(cent, i DBG0); - ++rv; - } - else { - ++numrrs; - if(i>=NRRMU) ++numrrext; - } - } - } - - /* If the array of less frequently used RRs has become empty, free it. */ - if(cent->rr.rrext && numrrext==0) { - if(!test) { - cache_free(cent->rr.rrext); - cent->rr.rrext=NULL; - cent->cs -= sizeof(rr_set_t*)*NRREXT; - cache_size -= sizeof(rr_set_t*)*NRREXT; - } - ++rv; - } - } - - if(numrrsrem) *numrrsrem=numrrs; - return rv; -} - - -/* - * Purge a cent, deleting timed-out rrs (following the constraints noted in "purge_rrset"). - * Since the cent may actually become empty and be deleted, you may not use it after this call until - * you refetch its address from the hash (if it is still there). - * If test is zero and the record is in the cache, we need rw-locks applied. - * If test is nonzero, nothing will actually be deleted. - * Substracts the size of the freed memory from cache_size (if test is zero). - * If delete is nonzero and the cent was purged empty and no longer needed, it is removed from the cache. - * Returns -1 if the cent was (or would have been) completely removed, - * otherwise returns the number of items that were (or would have been) deleted. - */ -static int purge_cent(dns_cent_t *cent, int delete, int test) -{ - int npurge, numrrs; - - npurge = purge_all_rrsets(cent,test, &numrrs); - - /* If the cache entry was purged empty, delete it from the cache. */ - if (delete && numrrs==0 - && (!(cent->flags&DF_NEGATIVE) || - (!(cent->flags&DF_LOCAL) && timedout_nxdom(cent)))) - { - if(!test) - del_cache_ent(cent,NULL); /* this will subtract the cent's left size from cache_size */ - return -1; - } - - if(!(cent->flags&DF_LOCAL)) { - /* Set stale references to NS or SOA records back to undefined. */ - unsigned scnt=rhnsegcnt(cent->qname); - if(cent->c_ns!=cundef) { - rr_set_t *rrset=NULL; - if(cent->c_ns==scnt) - rrset=getrrset_NS(cent); - else if(cent->c_nsqname,scnt-cent->c_ns),NULL); - if(ce) rrset=getrrset_NS(ce); - } - if(!rrset || !rrset->rrs || (!(rrset->flags&CF_LOCAL) && timedout(rrset))) { - if(!test) - cent->c_ns=cundef; - ++npurge; - } - } - if(cent->c_soa!=cundef) { - rr_set_t *rrset=NULL; - if(cent->c_soa==scnt) - rrset=getrrset_SOA(cent); - else if(cent->c_soaqname,scnt-cent->c_soa),NULL); - if(ce) rrset=getrrset_SOA(ce); - } - if(!rrset || !rrset->rrs || (!(rrset->flags&CF_LOCAL) && timedout(rrset))) { - if(!test) - cent->c_soa=cundef; - ++npurge; - } - } - } - - return npurge; -} - -/* - * Bring cache to a size below or equal the cache size limit (sz). There are two strategies: - * - for cached sets with CF_NOPURGE not set: delete if timed out - * - additional: delete oldest sets. - */ -static void purge_cache(long sz, int lazy) -{ - rr_lent_t *le; - - /* Walk the cache list from the oldest entries to the newest, deleting timed-out - * records. - * XXX: We walk the list a second time if this did not free up enough space - this - * should be done better. */ - le=rrset_l; - while (le && (!lazy || cache_size>sz)) { - /* Note by Paul Rombouts: - * If data integrity is ensured, at most one node is removed from the rrset_l - * per iteration, and this node is the one referenced by le. */ - rr_lent_t *next=le->next; - if (!((le->rrset && (le->rrset->flags&CF_LOCAL)) || - (le->cent->flags&DF_LOCAL))) { - dns_cent_t *ce = le->cent; - if (le->rrset) - purge_rrset(ce, le->idx,0); - /* Side effect: if purge_rrset called del_cent_rrset then le has been freed. - * ce, however, is still guaranteed to be valid. */ - if (ce->num_rrs==0 && (!(ce->flags&DF_NEGATIVE) || - (!(ce->flags&DF_LOCAL) && timedout_nxdom(ce)))) - del_cache_ent(ce,NULL); - } - le=next; - } - if (cache_size<=sz) - return; - - /* we are still above the desired cache size. Well, delete records from the oldest to - * the newest. This is the case where nopurge records are deleted anyway. Only local - * records are kept in any case.*/ - if(!insert_sort) { - sort_rrl(); - insert_sort=1; /* use insertion sort from now on */ - } - - le=rrset_l; - while (le && cache_size>sz) { - rr_lent_t *next=le->next; - if (!((le->rrset && (le->rrset->flags&CF_LOCAL)) || - (le->cent->flags&DF_LOCAL))) { - dns_cent_t *ce = le->cent; - if (le->rrset) - cache_size -= del_cent_rrset_by_index(ce, le->idx DBG0); - /* this will also delete negative cache entries */ - if (ce->num_rrs==0) - del_cache_ent(ce,NULL); - } - le=next; - } -} - -#define log_warn_read_error(f,item) \ - log_warn("%s encountered while reading %s from disk cache file.", \ - ferror(f)?"Error":feof(f)?"EOF":"Incomplete item",item) - -/* - * Load cache from disk and rebuild the hash tables. - */ -void read_disk_cache() -{ - /* The locks are done when we add items. */ - dns_cent_t ce; - int dtsz=512; - unsigned char *data; - unsigned long cnt; - FILE *f; - - char path[strlen(global.cache_dir)+sizeof("/pdnsd.cache")]; - - stpcpy(stpcpy(path,global.cache_dir),"/pdnsd.cache"); - - if (!(f=fopen(path,"r"))) { - log_warn("Could not open disk cache file %s: %s",path,strerror(errno)); - return; - } - - if (!(data = malloc(dtsz))) { - goto fclose_exit; - } - - /* Don't use insertion sort while reading caches entries from disk, because this can be - noticeably inefficient with large cache files. - Entries are simply appended at the end of the rr_l list. - The rr_l list is sorted using a more efficient merge sort after we are done reading. - */ - insert_sort=0; - - { - unsigned nb; - char buf[sizeof(cachverid)]; - - /* check cache version identifier */ - nb=fread(buf,1,sizeof(cachverid),f); - if (nb!=sizeof(cachverid)) { - /* Don't complain about empty files */ - if(nb!=0 || !feof(f)) { - log_warn_read_error(f,"cache version identifier"); - } - goto free_data_fclose; - } - if(memcmp(buf,cachverid,sizeof(cachverid))) { - log_warn("Cache file %s ignored because of incompatible version identifier",path); - goto free_data_fclose; - } - } - - if (fread(&cnt,sizeof(cnt),1,f)!=1) { - log_warn_read_error(f,"entry count"); - goto free_data_fclose; - } - - for(;cnt>0;--cnt) { - dns_file_t fe; - dom_fttlts_t fttlts = {0,0}; - unsigned char nb[256]; - unsigned num_rrs; - unsigned char prevtp; - if (fread(&fe,sizeof(fe),1,f)!=1) { - log_warn_read_error(f,"cache entry header"); - goto free_data_fclose; - } - if(fe.flags&DF_NEGATIVE) { - if (fread(&fttlts,sizeof(fttlts),1,f)!=1) { - log_warn_read_error(f,"cache TTL and timestamp"); - goto free_data_fclose; - } - } - if (fe.qlen) { - int i; - /* Because of its type qlen should be <=255. */ - if (fread(nb,fe.qlen,1,f)!=1) { - log_warn_read_error(f,"domain name"); - goto free_data_fclose; - } - for(i=0;i63 || (i += lb+1)>fe.qlen) { - log_warn("Invalid domain name encountered while reading disk cache file."); - goto free_data_fclose; - } - } - } - nb[fe.qlen]='\0'; - if (!init_cent(&ce, nb, fttlts.ttl, fttlts.ts, fe.flags DBG0)) { - goto free_data_fclose_exit; - } - ce.c_ns=fe.c_ns; ce.c_soa=fe.c_soa; - - /* now, read the rr's */ - prevtp=0; - for (num_rrs=fe.num_rrs;num_rrs;--num_rrs) { - rr_fset_t sh; - unsigned num_rr; - if (fread(&sh,sizeof(sh),1,f)!=1) { - log_warn_read_error(f,"rr header"); - goto free_cent_data_fclose; - } - if(PDNSD_NOT_CACHED_TYPE(sh.tp)) { - log_warn("Invalid rr type encountered while reading disk cache file."); - goto free_data_fclose; - } - if(sh.tp<=prevtp) { - log_warn("Unexpected rr type encountered (not in strict ascending order) while reading disk cache file."); - goto free_data_fclose; - } - prevtp=sh.tp; - /* Add the rrset header in any case (needed for negative caching) */ - if(!add_cent_rrset_by_type(&ce, sh.tp, sh.ttl, sh.ts, sh.flags DBG0)) { - goto free_cent_data_fclose_exit; - } - for (num_rr=sh.num_rr;num_rr;--num_rr) { - rr_fbucket_t rr; - if (fread(&rr,sizeof(rr),1,f)!=1) { - log_warn_read_error(f,"rr data length"); - goto free_cent_data_fclose; - } - if (rr.rdlen>dtsz) { - unsigned char *tmp; - dtsz=rr.rdlen; - tmp=realloc(data,dtsz); - if (!tmp) { - goto free_cent_data_fclose_exit; - } - data=tmp; - } - if (rr.rdlen && fread(data,rr.rdlen,1,f)!=1) { - log_warn_read_error(f,"rr data"); - goto free_cent_data_fclose; - } - if (!add_cent_rr(&ce,sh.tp,sh.ttl,sh.ts,sh.flags,rr.rdlen,data DBG0)) { - goto free_cent_data_fclose_exit; - } - } - } - add_cache(&ce); - free_cent(&ce DBG0); - } -#ifdef DEBUG_HASH - free(data); - fclose(f); - dumphash(); - goto sort_return; -#else - goto free_data_fclose; -#endif - - free_cent_data_fclose: - free_cent(&ce DBG0); - free_data_fclose: - free(data); - fclose(f); -#ifdef DEBUG_HASH - sort_return: -#endif - /* Do we need read/write locks to sort the rr_l list? - As long as at most one thread is sorting, it is OK for the other threads - to read the cache, providing they do not add or delete anything. - */ - lock_cache_r(); - if(!insert_sort) { - sort_rrl(); - insert_sort=1; - } - unlock_cache_r(); - return; - - free_cent_data_fclose_exit: - free_cent(&ce DBG0); - free_data_fclose_exit: - free(data); - fclose_exit: - fclose(f); - log_error("Out of memory in reading cache file. Exiting."); - pdnsd_exit(); -} - -/* write an rr to the file f */ -static int write_rrset(int tp, rr_set_t *rrs, FILE *f) -{ - rr_bucket_t *rr; - rr_fset_t sh; - rr_fbucket_t rf; - unsigned num_rr; - - sh.tp=tp; - - num_rr=0; - for(rr=rrs->rrs; rr && num_rr<255; rr=rr->next) ++num_rr; - sh.num_rr=num_rr; - sh.flags=rrs->flags; - sh.ttl=rrs->ttl; - sh.ts=rrs->ts; - - if (fwrite(&sh,sizeof(sh),1,f)!=1) { - log_error("Error while writing rr header to disk cache: %s", strerror(errno)); - return 0; - } - - rr=rrs->rrs; - for(; num_rr; --num_rr) { - rf.rdlen=rr->rdlen; - if (fwrite(&rf,sizeof(rf),1,f)!=1 || (rf.rdlen && fwrite((rr->data),rf.rdlen,1,f)!=1)) { - log_error("Error while writing rr data to disk cache: %s", strerror(errno)); - return 0; - } - rr=rr->next; - } - - return 1; -} - - -/* - * Write cache to disk on termination. The hash table is lost and needs to be regenerated - * on reload. - * - * The locks are not very fine grained here, but I don't think this needs fixing as this routine - * is only called on exit. - * - */ -void write_disk_cache() -{ - int j, jlim; - dns_cent_t *le; - unsigned long en=0; - dns_hash_pos_t pos; - FILE *f; - unsigned long num_rrs_errs=0; -# define MAX_NUM_RRS_ERRS 10 - - char path[strlen(global.cache_dir)+sizeof("/pdnsd.cache")]; - - stpcpy(stpcpy(path,global.cache_dir),"/pdnsd.cache"); - - DEBUG_MSG("Writing cache to %s\n",path); - - if (!softlock_cache_rw()) { - goto lock_failed; - } - /* purge cache down to allowed size*/ - purge_cache((long)global.perm_cache*1024, 0); - if (!softunlock_cache_rw()) { - goto lock_failed; - } - - if (!softlock_cache_r()) { - goto lock_failed; - } - - if (!(f=fopen(path,"w"))) { - log_warn("Could not open disk cache file %s: %s",path,strerror(errno)); - goto softunlock_return; - } - - /* Write the cache version identifier */ - if (fwrite(cachverid,sizeof(cachverid),1,f)!=1) { - log_error("Error while writing cache version identifier to disk cache: %s", strerror(errno)); - goto fclose_unlock; - } - - for (le=fetch_first(&pos); le; le=fetch_next(&pos)) { - /* count the rr's */ - if(le->flags&DF_NEGATIVE) { - if(!(le->flags&DF_LOCAL)) - ++en; - } - else { - jlim= RRARR_LEN(le); - for (j=0; jflags&CF_LOCAL)) { - ++en; - break; - } - } - } - } - if (fwrite(&en,sizeof(en),1,f)!=1) { - log_error("Error while writing entry count to disk cache: %s", strerror(errno)); - goto fclose_unlock; - } - - for (le=fetch_first(&pos); le; le=fetch_next(&pos)) { - /* now, write the rr's */ - if(le->flags&DF_NEGATIVE) { - if(!(le->flags&DF_LOCAL)) - goto write_rrs; - } - else { - jlim= RRARR_LEN(le); - for (j=0; jflags&CF_LOCAL)) { - goto write_rrs; - } - } - } - continue; - write_rrs: - { - dns_file_t df; - int num_rrs; - const unsigned short *iterlist; - df.qlen=rhnlen(le->qname)-1; /* Don't include the null byte at the end */ - df.num_rrs=0; - df.flags=le->flags; - df.c_ns=le->c_ns; df.c_soa=le->c_soa; - num_rrs=0; - jlim=RRARR_LEN(le); - for (j=0; jflags&CF_LOCAL)) - ++df.num_rrs; - } - } - if(num_rrs!=le->num_rrs && ++num_rrs_errs<=MAX_NUM_RRS_ERRS) { - unsigned char buf[DNSNAMEBUFSIZE]; - log_warn("Counted %d rr record types for %s but cached counter=%d", - num_rrs,rhn2str(le->qname,buf,sizeof(buf)),le->num_rrs); - } - if (fwrite(&df,sizeof(df),1,f)!=1) { - log_error("Error while writing cache entry header to disk cache: %s", strerror(errno)); - goto fclose_unlock; - } - if(le->flags&DF_NEGATIVE) { - dom_fttlts_t fttlts= {le->neg.ttl,le->neg.ts}; - if (fwrite(&fttlts,sizeof(fttlts),1,f)!=1) { - log_error("Error while writing cache TTL and timestamp to disk cache: %s", strerror(errno)); - goto fclose_unlock; - } - } - if (df.qlen && fwrite(le->qname,df.qlen,1,f)!=1) { - log_error("Error while writing domain name to disk cache: %s", strerror(errno)); - goto fclose_unlock; - } - - jlim= NRRITERLIST(le); - iterlist= RRITERLIST(le); - for (j=0; jflags&CF_LOCAL)) { - if(!write_rrset(tp,rrset,f)) - goto fclose_unlock; - } - } - } - } - if(fclose(f)) { - log_error("Could not close cache file %s after writing cache: %s", path,strerror(errno)); - } - softunlock_cache_r(); - DEBUG_MSG("Finished writing cache to disk.\n"); - return; - - fclose_unlock: - fclose(f); - softunlock_return: - softunlock_cache_r(); - return; - - lock_failed: - crash_msg("Lock failed; could not write disk cache."); -} - -/* - * Conflict Resolution. - * The first function is the actual checker; the latter two are wrappers for the respective - * function for convenience only. - * - * We check for conflicts by checking the new data rrset by rrset against the cent. - * This is not bad when considering that new records are hopefully consistent; if they are not, - * we might end up deleteing too much of the old data, which is probably added back through the - * new query, though. - * Having checked additions rrset by rrset, we are at least sure that the resulting record is OK. - * cr_check_add returns 1 if the addition is OK, 0 otherwise. - * This is for records that are already in the cache! - * - * idx is the internally used RR-set index, not the RR type! - */ -static int cr_check_add(dns_cent_t *cent, int idx, time_t ttl, time_t ts, unsigned flags) -{ - time_t nttl; - const struct rr_infos *rri; - - if (flags & CF_NEGATIVE) - return 1; /* no constraints here. */ - - nttl = 0; - rri = &rr_info[idx]; - - if (!(flags & CF_LOCAL)) { - int i, ilim, ncf; - - if(cent->flags & DF_LOCAL) - return 0; /* Local has precedence. */ - - ncf = 0; ilim = RRARR_LEN(cent); - for (i = 0; i < ilim; ++i) { - rr_set_t *rrs= RRARR_INDEX(cent,i); - /* Should be symmetric; check both ways anyway. */ - if (rrs && !(rrs->flags & CF_NEGATIVE) && - ((rri->class & rr_info[i].excludes) || - (rri->excludes & rr_info[i].class))) - { - time_t rttl; - if (rrs->flags & CF_LOCAL) - return 0; /* old was authoritative. */ - ++ncf; - rttl = rrs->ttl + rrs->ts - time(NULL); - if(rttl > 0) nttl += rttl; - } - } - if (ncf == 0) /* no conflicts */ - return 1; - /* Medium ttl of conflicting records */ - nttl /= ncf; - } - if ((flags & CF_LOCAL) || ttl > nttl) { - int i, ilim= RRARR_LEN(cent); - - /* Remove the old records, so that the new one can be added. */ - for (i = 0; i < ilim; ++i) { - rr_set_t *rrs= RRARR_INDEX(cent,i); - /* Should be symmetric; check both ways anyway. */ - if (rrs && !(rrs->flags & CF_NEGATIVE) && - ((rri->class & rr_info[i].excludes) || - (rri->excludes & rr_info[i].class))) { - del_cent_rrset_by_index(cent, i DBG0); - } - } - return 1; - } - /* old records precede */ - return 0; -} - - -inline static void adjust_ttl(rr_set_t *rrset) -{ - if (rrset->flags&CF_NOCACHE) { - rrset->flags &= ~CF_NOCACHE; - rrset->ttl=0; - } - else { - time_t min_ttl= global.min_ttl, neg_ttl=global.neg_ttl; - if((rrset->flags&CF_NEGATIVE) && neg_ttlttlttl=min_ttl; - else { - time_t max_ttl= global.max_ttl; - if(rrset->ttl>max_ttl) - rrset->ttl=max_ttl; - } - } -} - - -/* Only use for negatively cached domains, thus only - if the DF_NEGATIVE bit is set! */ -inline static void adjust_dom_ttl(dns_cent_t *cent) -{ - if (cent->flags&DF_NOCACHE) { - cent->flags &= ~DF_NOCACHE; - cent->neg.ttl=0; - } - else { - time_t min_ttl= global.min_ttl, neg_ttl=global.neg_ttl; - if(/* (cent->flags&DF_NEGATIVE) && */ neg_ttlneg.ttlneg.ttl=min_ttl; - else { - time_t max_ttl= global.max_ttl; - if(cent->neg.ttl>max_ttl) - cent->neg.ttl=max_ttl; - } - } -} - -/* - * Add a ready built dns_cent_t to the hashes, purge if necessary to not exceed cache size - * limits, and add the entries to the hashes. - * As memory is already reserved for the rrs, we only need to wrap up the dns_cent_t and - * alloc memory for it. - * New entries are appended, so we easiliy know the oldest for purging. For fast acces, - * we use hashes instead of ordered storage. - * - * This does not free the argument, and it uses a copy of it, so the caller must do free_cent() - * on it. - * - * The new entries rr sets replace the old ones, i.e. old rr sets with the same key are deleted - * before the new ones are added. - */ -void add_cache(dns_cent_t *cent) -{ - dns_cent_t *ce; - dns_hash_loc_t loc; - int i,ilim; - - lock_cache_rw(); - retry: - if (!(ce=dns_lookup(cent->qname,&loc))) { - /* if the new entry doesn't contain any information, - don't try to add it to the cache because purge_cache() will not - be able to get rid of it. - */ - if(cent->num_rrs==0 && !(cent->flags&DF_NEGATIVE)) - goto purge_cache_return; - - if(!(ce=copy_cent(cent DBG0))) - goto warn_unlock_cache_return; - - if(!(ce->flags&DF_NEGATIVE)) { - ilim= RRARR_LEN(ce); - /* Add the rrs to the rr list */ - for (i=0; iflags&DF_NEGATIVE) { - /* the new entry is negative. So, we need to delete the whole cent, - * and then generate a new one. */ - ilim= RRARR_LEN(ce); - for (i=0; iflags&CF_LOCAL) { - goto unlock_cache_return; /* Do not clobber local records */ - } - } - del_cache_ent(ce,&loc); - goto retry; - } - purge_cent(ce, 0,0); - /* We have a record; add the rrsets replacing old ones */ - cache_size-=ce->cs; - - ilim= RRARR_LEN(cent); - for (i=0; iflags&CF_LOCAL) && (cerrs->flags&CF_LOCAL)) || - ((centrrs->flags&CF_ADDITIONAL) && (!(cerrs->flags&CF_ADDITIONAL) || - (!(centrrs->flags&CF_ROOTSERV) && - (cerrs->flags&CF_ROOTSERV))) && - !timedout(cerrs))))) - { - rr_bucket_t *rr,*rtail; - - del_cent_rrset_by_index(ce,i DBG0); - - if (!cr_check_add(ce, i, centrrs->ttl, centrrs->ts, centrrs->flags)) - continue; /* the new record has been deleted as a conflict resolution measure. */ - - /* pre-initialize a rrset_t for the case we have a negative cached - * rrset, in which case no further rrs will be added. */ - if (!add_cent_rrset_by_index(ce, i, centrrs->ttl, centrrs->ts, centrrs->flags DBG0)) { - goto addsize_unlock_cache_return; - } - rtail=NULL; - for (rr=centrrs->rrs; rr; rr=rr->next) { - if (!add_cent_rr_int(ce,i,centrrs->ttl, centrrs->ts, centrrs->flags, - rr->rdlen, rr->data, &rtail DBG0)) - { - /* cleanup this entry */ - goto cleanup_cent_unlock_cache_return; - } - } - cerrs= RRARR_INDEX(ce,i); - adjust_ttl(cerrs); - if (!insert_rrl(cerrs,ce,i)) { - goto cleanup_cent_unlock_cache_return; - } - } - } - } - ce->flags |= (cent->flags&(DF_AUTH|DF_WILD)); - if(cent->c_ns!=cundef && (ce->c_ns==cundef || ce->c_nsc_ns)) - ce->c_ns=cent->c_ns; - if(cent->c_soa!=cundef && (ce->c_soa==cundef || ce->c_soac_soa)) - ce->c_soa=cent->c_soa; - } - - cache_size += ce->cs; - purge_cache_return: - purge_cache((long)global.perm_cache*1024+MCSZ, 1); - goto unlock_cache_return; - - cleanup_cent_unlock_cache_return: - del_cent_rrset_by_index(ce, i DBG0); - addsize_unlock_cache_return: - cache_size += ce->cs; - goto warn_unlock_cache_return; - - free_cent_unlock_cache_return: - free_cent(ce DBG0); - pdnsd_free(ce); - warn_unlock_cache_return: - log_warn("Out of cache memory."); - unlock_cache_return: - unlock_cache_rw(); -} - -/* - Convert A (and AAAA) records in a ready built cache entry to PTR records suitable for reverse resolving - of numeric addresses and add them to the cache. -*/ -int add_reverse_cache(dns_cent_t * cent) -{ - int tp=T_A; - rr_set_t *rrset= getrrset_A(cent); - - for(;;) { - if(rrset) { - rr_bucket_t *rr; - for(rr=rrset->rrs; rr; rr=rr->next) { - dns_cent_t ce; - unsigned char buf[DNSNAMEBUFSIZE],rhn[DNSNAMEBUFSIZE]; - if(!a2ptrstr((pdnsd_ca *)(rr->data),tp,buf) || !str2rhn(buf,rhn)) - return 0; - if(!init_cent(&ce, rhn, 0, 0, cent->flags DBG0)) - return 0; - if(!add_cent_rr(&ce,T_PTR,rrset->ttl,rrset->ts,rrset->flags,rhnlen(cent->qname),cent->qname DBG0)) { - free_cent(&ce DBG0); - return 0; - } -#ifdef RRMUINDEX_NS - ce.rr.rrmu[RRMUINDEX_NS]=cent->rr.rrmu[RRMUINDEX_NS]; -#endif -#ifdef RRMUINDEX_SOA - ce.rr.rrmu[RRMUINDEX_SOA]=cent->rr.rrmu[RRMUINDEX_SOA]; -#endif - add_cache(&ce); -#ifdef RRMUINDEX_NS - ce.rr.rrmu[RRMUINDEX_NS]=NULL; -#endif -#ifdef RRMUINDEX_SOA - ce.rr.rrmu[RRMUINDEX_SOA]=NULL; -#endif - free_cent(&ce DBG0); - } - } -#if ALLOW_LOCAL_AAAA - if(tp==T_AAAA) - break; - tp=T_AAAA; - rrset= getrrset_AAAA(cent); -#else - break; -#endif - } - return 1; -} - - -/* - Delete a cent from the cache. Call with write locks applied. - Does not delete corresponding entry in hash table, call del_cache_ent() - or del_cache() for that. -*/ -void del_cent(dns_cent_t *cent) -{ - cache_size -= cent->cs; - - /* free the data referred by the cent and the cent itself */ - free_cent(cent DBG0); - free(cent); - - --ent_num; -} - -/* - * Delete a cent from the cache. Call with write locks applied. - */ -static void del_cache_ent(dns_cent_t *cent,dns_hash_loc_t *loc) -{ - dns_cent_t *data; - - /* Delete from the hash */ - if(loc) - data=del_dns_hash_ent(loc); - else - data=del_dns_hash(cent->qname); - if(!data) { - log_warn("Cache entry not found by del_dns_hash() in %s, line %d",__FILE__,__LINE__); - } - else if(data!=cent) { - log_warn("pointer returned by del_dns_hash() does not match cache entry in %s, line %d",__FILE__,__LINE__); - } - del_cent(cent); -} - -/* Delete a cached record. Performs locking. Call this from the outside, NOT del_cache_ent */ -void del_cache(const unsigned char *name) -{ - dns_cent_t *cent; - - lock_cache_rw(); - if ((cent=del_dns_hash(name))) { - del_cent(cent); - } - unlock_cache_rw(); -} - - -/* Invalidate a record by resetting the fetch time to 0. This means that it will be refreshed - * if possible (and will only be served when purge_cache=off;) */ -void invalidate_record(const unsigned char *name) -{ - dns_cent_t *ce; - int i, ilim; - - lock_cache_rw(); - if ((ce=dns_lookup(name,NULL))) { - if(!(ce->flags&DF_NEGATIVE)) { - ilim= RRARR_LEN(ce); - for (i=0; its=0; - rrs->flags &= ~CF_AUTH; - } - } - } - else { - /* set the cent time to 0 (for the case that this was negative) */ - ce->neg.ts=0; - } - ce->flags &= ~DF_AUTH; - } - unlock_cache_rw(); -} - - -/* - Set flags of the cache entry with the specified name. - Don't use this to set the DF_NEGATIVE flag, or you will - risk leaving the cache in an inconsistent state. - Returns 0 if the cache entry cannot be found, otherwise 1. - */ -int set_cent_flags(const unsigned char *name, unsigned flags) -{ - dns_cent_t *ret; - lock_cache_rw(); - ret=dns_lookup(name,NULL); - if (ret) { - ret->flags |= flags; - } - unlock_cache_rw(); - return ret!=NULL; -} - -unsigned char *getlocalowner(unsigned char *name,int tp) -{ - unsigned char *ret=NULL; - dns_cent_t *ce; - unsigned lb; - - lock_cache_r(); - if((lb = *name)) { - while(name += lb+1, lb = *name) { - if((ce=dns_lookup(name,NULL))) { - if(!(ce->flags&DF_LOCAL)) - break; - if(have_rr(ce,tp)) { - ret=name; - break; - } - } - } - } - unlock_cache_r(); - - return ret; -} - - -/* Lookup an entry in the cache using name (in length byte - string notation). - * For thread safety, a copy must be returned, so delete it after use, by first doing - * free_cent to remove the rrs and then by freeing the returned pointer. - * If wild is nonzero, and name can't be found in the cache, lookup_cache() - * will search up the name hierarchy for a record with the DF_NEGATIVE or DF_WILD flag set. - */ -dns_cent_t *lookup_cache(const unsigned char *name, int *wild) -{ - int purge=0; - dns_cent_t *ret; - - /* First try with only read access to the cache. */ - lock_cache_r(); - ret=dns_lookup(name,NULL); - if(wild) { - *wild=0; - if(!ret) { - const unsigned char *nm=name; - unsigned lb=*nm; - if(lb) { - while(nm += lb+1, lb = *nm) { - if ((ret=dns_lookup(nm,NULL))) { - if(ret->flags&DF_NEGATIVE) - /* use this entry */ - *wild=w_neg; - else if(ret->flags&DF_WILD) { - unsigned char buf[DNSNAMEBUFSIZE]; - buf[0]=1; buf[1]='*'; - /* When we get here, at least one element of name - has been removed, so assuming name is not longer - than DNSNAMEBUFSIZE bytes, the remainder is guaranteed to - fit into DNSNAMEBUFSIZE-2 bytes */ - rhncpy(&buf[2],nm); - ret=dns_lookup(buf,NULL); - if(ret) - *wild=w_wild; - } - else if(ret->flags&DF_LOCAL) - *wild=w_locnerr; - else - ret=NULL; - break; - } - } - } - } - } - if (ret) { - if(!(purge=purge_cent(ret, 1,1))) /* test only, don't remove anything yet! */ - ret=copy_cent(ret DBG1); - } - unlock_cache_r(); - - if(purge) { - /* we need exclusive read and write access before we delete anything. */ - lock_cache_rw(); - ret=dns_lookup(name,NULL); - if(wild) { - *wild=0; - if(!ret) { - const unsigned char *nm=name; - unsigned lb=*nm; - if(lb) { - while(nm += lb+1, lb = *nm) { - if ((ret=dns_lookup(nm,NULL))) { - if(ret->flags&DF_NEGATIVE) - /* use this entry */ - *wild=w_neg; - else if(ret->flags&DF_WILD) { - unsigned char buf[DNSNAMEBUFSIZE]; - buf[0]=1; buf[1]='*'; - rhncpy(&buf[2],nm); - ret=dns_lookup(buf,NULL); - if(ret) - *wild=w_wild; - } - else if(ret->flags&DF_LOCAL) - *wild=w_locnerr; - else - ret=NULL; - break; - } - } - } - } - } - if (ret) { - if(purge_cent(ret, 1,0)<0) - ret=NULL; - else - ret=copy_cent(ret DBG1); - } - unlock_cache_rw(); - } - - return ret; -} - -/* lookup_cache_local_rrset() check if there is locally defined RR set of a specific RR type - for name, and if so, returns a copy of the RR set. After use, the copy should be cleaned - up using del_rrset(). - This is potentially much more efficient than using lookup_cache(), if the name is likely - to have a cache entry, but unlikely to have locally defined RR sets. -*/ -rr_set_t *lookup_cache_local_rrset(const unsigned char *name, int type) -{ - rr_set_t *ret=NULL; - dns_cent_t *cent; - - lock_cache_r(); - cent= dns_lookup(name,NULL); - if(cent) { - rr_set_t *rrset=getrrset(cent,type); - if(rrset && (rrset->flags&CF_LOCAL)) { - ret= copy_rrset(rrset); - } - } - unlock_cache_r(); - - return ret; -} - - -#if 0 -/* Add an rr to an existing cache entry or create a new entry if necessary. - * The rr is treated with the precedence of an additional or off-topic record, ie. regularly retrieved - * have precedence. - * You cannot add a negative additional record. Makes no sense anyway. */ -int add_cache_rr_add(const unsigned char *name, int tp, time_t ttl, time_t ts, unsigned flags, unsigned dlen, void *data, unsigned long serial) -{ - dns_hash_loc_t loc; - dns_cent_t *ret; - rr_set_t *rrs; - int rv=0; - - lock_cache_rw(); - if (!(ret=dns_lookup(name,&loc))) { - if (!(ret=cache_malloc(sizeof(dns_cent_t)))) - goto unlock_return; - if(!init_cent(ret, name, 0, 0, 0 DBG0)) { - pdnsd_free(ret); - goto unlock_return; - } - if(!add_dns_hash(ret,&loc)) { - free_cent(ret DBG0); - pdnsd_free(ret); - goto unlock_return; - } - ++ent_num; - } - else { - /* purge the record. */ - purge_cent(ret,0,0); - cache_size-=ret->cs; - } - rrs=getrrset(ret,tp); - if (rrs && - ((rrs->flags&CF_NEGATIVE && !(rrs->flags&CF_LOCAL)) || - (rrs->flags&CF_NOPURGE && timedout(rrs)) || - (rrs->flags&CF_ADDITIONAL && rrs->serial!=serial) || - (rrs->serial==serial && rrs->ttl!=(ttlglobal.max_ttl?global.max_ttl:ttl))))) { - del_cent_rrset_by_type(ret,tp DBG0); - rrs=NULL; - } - if (rrs==NULL || rrs->serial==serial) { - if (cr_check_add(ret,rrlkuptab[tp-T_MIN],ttl,ts,flags)) { - if (add_cent_rr(ret,tp,ttl,ts,flags,dlen,data,serial DBG0)) { - rr_set_t *rrsnew; - if (!rrs && (rrsnew=getrrset(ret,tp)) && !insert_rrl(rrsnew,ret,rrlkuptab[tp-T_MIN])) { - del_cent_rrset_by_type(ret,tp DBG0); - } - else { - cache_size+=ret->cs; - purge_cent(ret,1,0); - rv=1; - goto unlock_return; - } - } - } - } else { - rv=1; - } - cache_size+=ret->cs; - - unlock_return: - unlock_cache_rw(); - return rv; -} -#endif - -/* Report the cache status to the file descriptor f, for the status fifo (see status.c) */ -int report_cache_stat(int f) -{ - /* Cache size and entry counters are volatile (and even the entries - in the global struct can change), so make copies to get consistent data. - Even better would be to use locks, but that could be rather costly. */ - long csz= cache_size, en= ent_num; - long pc= global.perm_cache; - long mc= pc*1024+MCSZ; - - fsprintf_or_return(f,"\nCache status:\n=============\n"); - fsprintf_or_return(f,"%ld kB maximum disk cache size.\n",pc); - fsprintf_or_return(f,"%ld of %ld bytes (%.3g%%) memory cache used in %ld entries" - " (avg %.5g bytes/entry).\n", - csz, mc, (((double)csz)/mc)*100, en, - ((double)csz)/en); - return 0; -} - - -#define timestamp2str(ts,now,buf) \ -{ \ - struct tm tstm; \ - if(!((ts) && localtime_r(&(ts), &tstm) && \ - strftime(buf, sizeof(buf), \ - ((ts)<=(now) && (now)-(ts)<365*24*60*60/2)?" %m/%d %T":"%Y/%m/%d %T", \ - &tstm)>0)) \ - strcpy(buf," "); \ -} - -/* Dump contents of a cache entry to file descriptor fd. - Returns 1 on success, -1 if there is an IO error. -*/ -static int dump_cent(int fd, dns_cent_t *cent) -{ - time_t now; - char tstr[sizeof "2000/12/31 23:59:59"],dbuf[1024]; - - fsprintf_or_return(fd,"%s\n",rhn2str(cent->qname,ucharp dbuf,sizeof(dbuf))); - now=time(NULL); - - if(cent->flags&DF_NEGATIVE) { - timestamp2str(cent->neg.ts,now,tstr); - fsprintf_or_return(fd,"%s (domain negated)\n",tstr); - } - else { - int i, n= NRRITERLIST(cent); - const unsigned short *iterlist= RRITERLIST(cent); - for(i=0; its,now,tstr); - if(rrset->flags&CF_NEGATIVE) { - fsprintf_or_return(fd,"%s %-7s (negated)\n",tstr,rrnames[tp-T_MIN]); - } - else { - rr_bucket_t *rr; - for(rr=rrset->rrs; rr; rr=rr->next) { - switch (tp) { - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - rhn2str((unsigned char *)(rr->data),ucharp dbuf,sizeof(dbuf)); - break; -#if IS_CACHED_MINFO || IS_CACHED_RP -#if IS_CACHED_MINFO - case T_MINFO: -#endif -#if IS_CACHED_RP - case T_RP: -#endif - { - unsigned char *p=(unsigned char *)(rr->data); - int n; - rhn2str(p,ucharp dbuf,sizeof(dbuf)); - n=strlen(dbuf); - dbuf[n++] = ' '; - if(n>=sizeof(dbuf)) - goto hex_dump; - rhn2str(skiprhn(p),ucharp dbuf+n,sizeof(dbuf)-n); - } - break; -#endif - case T_MX: -#if IS_CACHED_AFSDB - case T_AFSDB: -#endif -#if IS_CACHED_RT - case T_RT: -#endif -#if IS_CACHED_KX - case T_KX: -#endif - { - unsigned char *p=(unsigned char *)(rr->data); - unsigned pref; - int n; - GETINT16(pref,p); - n=sprintf(dbuf,"%u ",pref); - if(n<0) goto hex_dump; - rhn2str(p,ucharp dbuf+n,sizeof(dbuf)-n); - } - break; - case T_SOA: - { - unsigned char *p=(unsigned char *)(rr->data); - char *q; - int n,rem; - uint32_t serial,refresh,retry,expire,minimum; - rhn2str(p,ucharp dbuf,sizeof(dbuf)); - n=strlen(dbuf); - dbuf[n++] = ' '; - if(n>=sizeof(dbuf)) - goto hex_dump; - q=dbuf+n; - rem=sizeof(dbuf)-n; - p=skiprhn(p); - rhn2str(p,ucharp q,rem); - n=strlen(q); - q[n++] = ' '; - if(n>=rem) - goto hex_dump; - q += n; - rem -= n; - p=skiprhn(p); - GETINT32(serial,p); - GETINT32(refresh,p); - GETINT32(retry,p); - GETINT32(expire,p); - GETINT32(minimum,p); - n=snprintf(q,rem,"%lu %lu %lu %lu %lu", - (unsigned long)serial,(unsigned long)refresh, - (unsigned long)retry,(unsigned long)expire, - (unsigned long)minimum); - if(n<0 || n>=rem) - goto hex_dump; - } - break; -#if IS_CACHED_HINFO || IS_CACHED_TXT || IS_CACHED_SPF -#if IS_CACHED_HINFO - case T_HINFO: -#endif -#if IS_CACHED_TXT - case T_TXT: -#endif -#if IS_CACHED_SPF - case T_SPF: -#endif - { - /* TXT records are not necessarily validated - before they are stored in the cache, so - we need to be careful. */ - unsigned char *p=(unsigned char *)(rr->data); - char *q=dbuf; - int j=0,n,rem=sizeof(dbuf); - while(jrdlen) { - unsigned lb; - if(rem<3) - goto hex_dump; - if(j) { - *q++ = ' '; - --rem; - } - *q++ = '"'; - --rem; - lb=*p++; - if((j += lb+1)>rr->rdlen) - goto hex_dump; - n=escapestr(charp p,lb,q,rem); - if(n<0 || n+1>=rem) - goto hex_dump; - q += n; - *q++ = '"'; - rem -= n+1; - p += lb; - } - *q=0; - } - break; -#endif -#if IS_CACHED_PX - case T_PX: - { - unsigned char *p=(unsigned char *)(rr->data); - char *q; - unsigned pref; - int n,rem; - GETINT16(pref,p); - n=sprintf(dbuf,"%u ",pref); - if(n<0) goto hex_dump; - q=dbuf+n; - rem=sizeof(dbuf)-n; - rhn2str(p,ucharp q,rem); - n=strlen(q); - q[n++] = ' '; - if(n>=rem) - goto hex_dump; - rhn2str(skiprhn(p),ucharp q+n,rem-n); - } - break; -#endif -#if IS_CACHED_SRV - case T_SRV: - { - unsigned char *p=(unsigned char *)(rr->data); - unsigned priority,weight,port; - int n; - GETINT16(priority,p); - GETINT16(weight,p); - GETINT16(port,p); - n=sprintf(dbuf,"%u %u %u ",priority,weight,port); - if(n<0) goto hex_dump; - rhn2str(p,ucharp dbuf+n,sizeof(dbuf)-n); - } - break; -#endif -#if IS_CACHED_NXT - case T_NXT: - { - unsigned char *p=(unsigned char *)(rr->data); - int n,rlen; - rhn2str(p,ucharp dbuf,sizeof(dbuf)); - n=strlen(dbuf); - dbuf[n++] = ' '; - if(n>=sizeof(dbuf)) - goto hex_dump; - rlen=rhnlen(p); - hexdump(p+rlen,rr->rdlen-rlen,dbuf+n,sizeof(dbuf)-n); - } - break; -#endif -#if IS_CACHED_NAPTR - case T_NAPTR: - { - unsigned char *p=(unsigned char *)(rr->data); - char *q; - unsigned order,pref; - int n,rem,j; - GETINT16(order,p); - GETINT16(pref,p); - n=sprintf(dbuf,"%u %u ",order,pref); - if(n<0) goto hex_dump; - q=dbuf+n; - rem=sizeof(dbuf)-n; - for (j=0;j<3;++j) { - unsigned lb; - if(rem<2) - goto hex_dump; - *q++ = '"'; - --rem; - lb=*p++; - n=escapestr(charp p,lb,q,rem); - if(n<0 || n+2>=rem) - goto hex_dump; - q += n; - *q++ = '"'; - *q++ = ' '; - rem -= n+2; - p += lb; - } - rhn2str(p,ucharp q,rem); - } - break; -#endif -#if IS_CACHED_LOC - case T_LOC: - /* Binary data length has not necessarily been validated */ - if(rr->rdlen!=16) - goto hex_dump; - if(!loc2str(rr->data,dbuf,sizeof(dbuf))) - goto hex_dump; - break; -#endif - case T_A: - if (!inet_ntop(AF_INET,rr->data,dbuf,sizeof(dbuf))) - goto hex_dump; - break; -#if IS_CACHED_AAAA && defined(AF_INET6) - case T_AAAA: - if (!inet_ntop(AF_INET6,rr->data,dbuf,sizeof(dbuf))) - goto hex_dump; - break; -#endif - default: - hex_dump: - hexdump(rr->data,rr->rdlen,dbuf,sizeof(dbuf)); - } - fsprintf_or_return(fd,"%s %-7s %s\n",tstr,rrnames[tp-T_MIN],dbuf); - } - } - } - } - } - fsprintf_or_return(fd,"\n"); - return 1; -} - -/* Dump cache contents to file descriptor fd. - If name is not null, restricts information to that name, - otherwise dumps information about all names found in the cache. - Returns 1 on success, 0 if the name is not found, -1 is there is an IO error. - Mainly for debugging purposes. -*/ -int dump_cache(int fd, const unsigned char *name, int exact) -{ - int rv=0; - lock_cache_r(); - if(name && exact) { - dns_cent_t *cent=dns_lookup(name,NULL); - if(cent) - rv=dump_cent(fd,cent); - } - else { - dns_cent_t *cent; - dns_hash_pos_t pos; - for (cent=fetch_first(&pos); cent; cent=fetch_next(&pos)) { - unsigned int nrem; - if(!name || (domain_match(name,cent->qname,&nrem,NULL),nrem==0)) - if((rv=dump_cent(fd,cent))<0) - break; - } - } - unlock_cache_r(); - return rv; -} - -char *stpcpy(char *dest, char const *src) -{ - size_t src_len = strlen(src); - return memcpy(dest, src, src_len) + src_len; - // strcpy(dest, src); - // return dest + strlen(dest); -} - - -#if DEBUG>0 - -/* Added by Paul Rombouts: This is only used in debug messages. */ -const char cflgnames[NCFLAGS*3]={'N','E','G','L','O','C','A','U','T','N','O','C','A','D','D','N','O','P','R','T','S'}; -const char dflgnames[NDFLAGS*3]={'N','E','G','L','O','C','A','U','T','N','O','C','W','L','D'}; - -char *flags2str(unsigned flags,char *buf,int nflags,const char *flgnames) -{ - char *p=buf; - int i,nflgchars=3*nflags; - for(i=0;ibuf) *p++='|'; - p=mempcpy(p,&flgnames[i],3); - } - flags >>= 1; - } - if(p==buf) - *p++='0'; - *p=0; - return buf; -} -#endif diff --git a/jni/pdnsd/src/cache.h b/jni/pdnsd/src/cache.h deleted file mode 100644 index 5056dec7..00000000 --- a/jni/pdnsd/src/cache.h +++ /dev/null @@ -1,306 +0,0 @@ -/* cache.h - Definitions for the dns cache - - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2003, 2004, 2005, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _CACHE_H_ -#define _CACHE_H_ - -#include -#include "ipvers.h" -#include -#include "list.h" -#include "dns.h" -#include "conff.h" - -struct rr_lent_s; - -/* - * These values are converted to host byte order. the data is _not_. - */ -typedef struct rr_b_s { - struct rr_b_s *next; /* this is the next pointer in the dns_cent_t list. */ - unsigned rdlen; -#if ALLOW_LOCAL_AAAA || defined(ENABLE_IPV6) - struct in6_addr data[0]; /* dummy for alignment */ -#else - struct in_addr data[0]; -#endif -} rr_bucket_t; - -typedef struct { - struct rr_lent_s *lent; /* this points to the list entry */ - time_t ttl; - time_t ts; - unsigned short flags; - rr_bucket_t *rrs; -} rr_set_t; - - -typedef struct { - unsigned char *qname; /* Name of the domain in length byte - string notation. */ - size_t cs; /* Size of the cache entry, including RR sets. */ - unsigned short num_rrs; /* The number of RR sets. When this decreases to 0, the cent is deleted. */ - unsigned short flags; /* Flags for the whole domain. */ - union { - struct { /* Fields used only for negatively cached domains. */ - struct rr_lent_s *lent; /* list entry for the whole cent. */ - time_t ttl; /* TTL for negative caching. */ - time_t ts; /* Timestamp. */ - } neg; - struct { /* Fields used only for domains that actually exist. */ - rr_set_t *(rrmu[NRRMU]); /* The most used records. - Use the the value obtained from rrlkuptab[] as index. */ - rr_set_t **rrext; /* Pointer (may be NULL) to an array of size NNRREXT storing the - less frequently used records. */ - } rr; - }; - unsigned char c_ns,c_soa; /* Number of trailing name elements in qname to use to find NS or SOA - records to add to the authority section of a response. */ -} dns_cent_t; - -/* This value is used to represent an undefined c_ns or c_soa field. */ -#define cundef 0xff - -/* - * the flag values for RR sets in the cache - */ -#define CF_NEGATIVE 1 /* this one is for per-RRset negative caching*/ -#define CF_LOCAL 2 /* Local zone entry */ -#define CF_AUTH 4 /* authoritative record */ -#define CF_NOCACHE 8 /* Only hold for the cache latency time period, then purge. - * Not really written to cache, but used by add_cache. */ -#define CF_ADDITIONAL 16 /* This was fetched as an additional or "off-topic" record. */ -#define CF_NOPURGE 32 /* Do not purge this record */ -#define CF_ROOTSERV 64 /* This record was directly obtained from a root server */ - -#define CFF_NOINHERIT (CF_LOCAL|CF_AUTH|CF_ADDITIONAL|CF_ROOTSERV) /* not to be inherited on requery */ - -/* - * the flag values for whole domains in the cache - */ -#define DF_NEGATIVE 1 /* this one is for whole-domain negative caching (created on NXDOMAIN)*/ -#define DF_LOCAL 2 /* local record (in conj. with DF_NEGATIVE) */ -#define DF_AUTH 4 /* authoritative record */ -#define DF_NOCACHE 8 /* Only hold for the cache latency time period, then purge. - * Only used for negatively cached domains. - * Not really written to cache, but used by add_cache. */ -#define DF_WILD 16 /* subdomains of this domain have wildcard records */ - -/* #define DFF_NOINHERIT (DF_NEGATIVE) */ /* not to be inherited on requery */ - -enum {w_wild=1, w_neg, w_locnerr}; /* Used to distinguish different types of wildcard records. */ - -#if DEBUG>0 -#define NCFLAGS 7 -#define NDFLAGS 5 -#define CFLAGSTRLEN (NCFLAGS*4) -#define DFLAGSTRLEN (NDFLAGS*4) -extern const char cflgnames[]; -extern const char dflgnames[]; -char *flags2str(unsigned flags,char *buf,int nflags,const char *flgnames); -#define cflags2str(flags,buf) flags2str(flags,buf,NCFLAGS,cflgnames) -#define dflags2str(flags,buf) flags2str(flags,buf,NDFLAGS,dflgnames) -#endif - -/* - * This is the time in secs any record remains at least in the cache before it is purged. - * (exception is that the cache is full) - */ -#define CACHE_LAT 120 -#define CLAT_ADJ(ttl) ((ttl)ts+CLAT_ADJ((rrset)->ttl)neg.ts+CLAT_ADJ((cent)->neg.ttl)purge_cache) - fl|=CF_NOPURGE; - if (server->nocache) - fl|=CF_NOCACHE; - if (server->rootserver) - fl|=CF_ROOTSERV; - return fl; -} - -int init_cent(dns_cent_t *cent, const unsigned char *qname, time_t ttl, time_t ts, unsigned flags DBGPARAM); -int add_cent_rrset_by_type(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags DBGPARAM); -int add_cent_rr(dns_cent_t *cent, int type, time_t ttl, time_t ts, unsigned flags,unsigned dlen, void *data DBGPARAM); -int del_rrset(rr_set_t *rrs DBGPARAM); -void free_cent(dns_cent_t *cent DBGPARAM); -void free_cent0(void *ptr); -void negate_cent(dns_cent_t *cent, time_t ttl, time_t ts); -void del_cent(dns_cent_t *cent); - -/* Because this is empty by now, it is defined as an empty macro to save overhead.*/ -/*void free_rr(rr_bucket_t cent);*/ -#define free_rr(x) - -dns_cent_t *copy_cent(dns_cent_t *cent DBGPARAM); - -#if 0 -unsigned long get_serial(void); -#endif - -/* Get pointer to rrset given cache entry and rr type value. */ -inline static rr_set_t *getrrset(dns_cent_t *cent, int type) - __attribute__((always_inline)); -inline static rr_set_t *getrrset(dns_cent_t *cent, int type) -{ - if(!(cent->flags&DF_NEGATIVE)) { - int tpi= type - T_MIN; - - if(tpi>=0 && tpirr.rrmu[idx]; - else { - idx -= NRRMU; - if(idx < NRREXT) { - rr_set_t **rrext= cent->rr.rrext; - if(rrext) - return rrext[idx]; - } - } - } - } - - return NULL; -} - -/* This version of getrrset is slightly more efficient, - but also more dangerous, because it performs less checks. - It is safe to use if T_MIN <= type <= T_MAX and cent - is not negative. -*/ -inline static rr_set_t *getrrset_eff(dns_cent_t *cent, int type) - __attribute__((always_inline)); -inline static rr_set_t *getrrset_eff(dns_cent_t *cent, int type) -{ - unsigned int idx = rrlkuptab[type-T_MIN]; - if(idx < NRRMU) - return cent->rr.rrmu[idx]; - else { - idx -= NRRMU; - if(idx < NRREXT) { - rr_set_t **rrext= cent->rr.rrext; - if(rrext) - return rrext[idx]; - } - } - - return NULL; -} - - -/* have_rr() tests whether a cache entry has at least one record of a given type. - Only use if T_MIN <= type <=T_MAX -*/ -inline static int have_rr(dns_cent_t *cent, int type) - __attribute__((always_inline)); -inline static int have_rr(dns_cent_t *cent, int type) -{ - rr_set_t *rrset; - return !(cent->flags&DF_NEGATIVE) && (rrset=getrrset_eff(cent, type)) && rrset->rrs; -} - -/* Some quick and dirty and hopefully fast macros. */ -#define PDNSD_NOT_CACHED_TYPE(type) ((type)T_MAX || rrlkuptab[(type)-T_MIN]>=NRRTOT) - -/* This is useful for iterating over all the RR types in a cache entry in strict ascending order. */ -#define NRRITERLIST(cent) ((cent)->flags&DF_NEGATIVE?0:(cent)->rr.rrext?NRRTOT:NRRMU) -#define RRITERLIST(cent) ((cent)->flags&DF_NEGATIVE?NULL:(cent)->rr.rrext?rrcachiterlist:rrmuiterlist) - -/* The following macros use array indices as arguments, not RR type values! */ -#define GET_RRSMU(cent,i) (!((cent)->flags&DF_NEGATIVE)?(cent)->rr.rrmu[i]:NULL) -#define GET_RRSEXT(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrext?(cent)->rr.rrext[i]:NULL) -#define HAVE_RRMU(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrmu[i] && (cent)->rr.rrmu[i]->rrs) -#define HAVE_RREXT(cent,i) (!((cent)->flags&DF_NEGATIVE) && (cent)->rr.rrext && (cent)->rr.rrext[i] && (cent)->rr.rrext[i]->rrs) - -#define RRARR_LEN(cent) ((cent)->flags&DF_NEGATIVE?0:(cent)->rr.rrext?NRRTOT:NRRMU) - -/* This allows us to index the RR-set arrays in a cache entry as if they formed one contiguous array. */ -#define RRARR_INDEX_TESTEXT(cent,i) ((cent)->flags&DF_NEGATIVE?NULL:(i)rr.rrmu[i]:(cent)->rr.rrext?(cent)->rr.rrext[(i)-NRRMU]:NULL) -/* This gets the address where the pointer to an RR-set is stored in a cache entry, - given the cache entry and an RR-set index. - Address may be NULL if no storage space for the type has been allocated. */ -#define RRARR_INDEX_PA_TESTEXT(cent,i) ((cent)->flags&DF_NEGATIVE?NULL:(i)rr.rrmu[i]:(cent)->rr.rrext?&(cent)->rr.rrext[(i)-NRRMU]:NULL) - -/* The following macros should only be used if 0 <= i < RRARR_LEN(cent) ! */ -#define RRARR_INDEX(cent,i) ((i)rr.rrmu[i]:(cent)->rr.rrext[(i)-NRRMU]) -#define RRARR_INDEX_PA(cent,i) ((i)rr.rrmu[i]:&(cent)->rr.rrext[(i)-NRRMU]) - -#endif diff --git a/jni/pdnsd/src/conf-keywords.h b/jni/pdnsd/src/conf-keywords.h deleted file mode 100644 index 2bcdacfe..00000000 --- a/jni/pdnsd/src/conf-keywords.h +++ /dev/null @@ -1,238 +0,0 @@ -/* conf-keywords.h - Tables used by parser of configuration file. - Based on information previously contained in conf-lex.y and conf-parse.y - - Copyright (C) 2004,2005,2006,2007,2008,2009,2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -enum { - ERROR, - - GLOBAL, - SERVER, - RR, - NEG, - SOURCE, - INCLUDE_F, - - PERM_CACHE, - CACHE_DIR, - SERVER_PORT, - SERVER_IP, - OUTGOING_IP, - SCHEME_FILE, - LINKDOWN_KLUGE, - MAX_TTL, - MIN_TTL, - RUN_AS, - STRICT_SETUID, - USE_NSS, - PARANOID, - IGNORE_CD, - STATUS_CTL, - DAEMON, - C_TCP_SERVER, - PID_FILE, - C_VERBOSITY, - C_QUERY_METHOD, - RUN_IPV4, - IPV4_6_PREFIX, - C_DEBUG, - C_CTL_PERMS, - C_PROC_LIMIT, - C_PROCQ_LIMIT, - TCP_QTIMEOUT, - C_PAR_QUERIES, - C_RAND_RECS, - NEG_TTL, - NEG_RRS_POL, - NEG_DOMAIN_POL, - QUERY_PORT_START, - QUERY_PORT_END, - UDP_BUFSIZE, - DELEGATION_ONLY, - - IP, - PORT, - SCHEME, - UPTEST, - TIMEOUT, - PING_TIMEOUT, - PING_IP, - UPTEST_CMD, - QUERY_TEST_NAME, - INTERVAL, - INTERFACE, - DEVICE, - PURGE_CACHE, - CACHING, - LEAN_QUERY, - EDNS_QUERY, - PRESET, - PROXY_ONLY, - ROOT_SERVER, - RANDOMIZE_SERVERS, - INCLUDE, - EXCLUDE, - POLICY, - REJECTLIST, - REJECTPOLICY, - REJECTRECURSIVELY, - LABEL, - - A, - PTR, - MX, - SOA, - CNAME, - TXT, - SPF, - NAME, - OWNER, - TTL, - TYPES, - FILET, - SERVE_ALIASES, - AUTHREC, - REVERSE -}; - - -/* Table for looking up section headers. Order alphabetically! */ -static const namevalue_t section_headers[]= { - {"global", GLOBAL}, - {"include", INCLUDE_F}, - {"neg", NEG}, - {"rr", RR}, - {"server", SERVER}, - {"source", SOURCE} -}; - -/* Table for looking up global options. Order alphabetically! */ -static const namevalue_t global_options[]= { - {"cache_dir", CACHE_DIR}, - {"ctl_perms", C_CTL_PERMS}, - {"daemon", DAEMON}, - {"debug", C_DEBUG}, - {"delegation_only", DELEGATION_ONLY}, - {"ignore_cd", IGNORE_CD}, - {"interface", SERVER_IP}, - {"ipv4_6_prefix", IPV4_6_PREFIX}, - {"linkdown_kluge", LINKDOWN_KLUGE}, - {"max_ttl", MAX_TTL}, - {"min_ttl", MIN_TTL}, - {"neg_domain_pol", NEG_DOMAIN_POL}, - {"neg_rrs_pol", NEG_RRS_POL}, - {"neg_ttl", NEG_TTL}, - {"outgoing_ip", OUTGOING_IP}, - {"outside_interface", OUTGOING_IP}, - {"par_queries", C_PAR_QUERIES}, - {"paranoid", PARANOID}, - {"perm_cache", PERM_CACHE}, - {"pid_file", PID_FILE}, - {"proc_limit", C_PROC_LIMIT}, - {"procq_limit", C_PROCQ_LIMIT}, - {"query_method", C_QUERY_METHOD}, - {"query_port_end", QUERY_PORT_END}, - {"query_port_start", QUERY_PORT_START}, - {"randomize_recs", C_RAND_RECS}, - {"run_as", RUN_AS}, - {"run_ipv4", RUN_IPV4}, - {"scheme_file", SCHEME_FILE}, - {"server_ip", SERVER_IP}, - {"server_port", SERVER_PORT}, - {"status_ctl", STATUS_CTL}, - {"strict_setuid", STRICT_SETUID}, - {"tcp_qtimeout", TCP_QTIMEOUT}, - {"tcp_server", C_TCP_SERVER}, - {"timeout", TIMEOUT}, - {"udpbufsize", UDP_BUFSIZE}, - {"use_nss", USE_NSS}, - {"verbosity", C_VERBOSITY} -}; - -/* Table for looking up server options. Order alphabetically! */ -static const namevalue_t server_options[]= { - {"caching", CACHING}, - {"device", DEVICE}, - {"edns_query", EDNS_QUERY}, - {"exclude", EXCLUDE}, - {"file", FILET}, - {"include", INCLUDE}, - {"interface", INTERFACE}, - {"interval", INTERVAL}, - {"ip", IP}, - {"label", LABEL}, - {"lean_query", LEAN_QUERY}, - {"ping_ip", PING_IP}, - {"ping_timeout", PING_TIMEOUT}, - {"policy", POLICY}, - {"port", PORT}, - {"preset", PRESET}, - {"proxy_only", PROXY_ONLY}, - {"purge_cache", PURGE_CACHE}, - {"query_test_name", QUERY_TEST_NAME}, - {"randomize_servers", RANDOMIZE_SERVERS}, - {"reject", REJECTLIST}, - {"reject_policy", REJECTPOLICY}, - {"reject_recursively", REJECTRECURSIVELY}, - {"root_server", ROOT_SERVER}, - {"scheme", SCHEME}, - {"timeout", TIMEOUT}, - {"uptest", UPTEST}, - {"uptest_cmd", UPTEST_CMD} -}; - -/* Table for looking up rr options. Order alphabetically! */ -static const namevalue_t rr_options[]= { - {"a", A}, - {"authrec", AUTHREC}, - {"cname", CNAME}, - {"mx", MX}, - {"name", NAME}, - {"ns", OWNER}, - {"owner", OWNER}, - {"ptr", PTR}, - {"reverse", REVERSE}, - {"soa", SOA}, - {"spf", SPF}, - {"ttl", TTL}, - {"txt", TXT} -}; - -/* Table for looking up source options. Order alphabetically! */ -static const namevalue_t source_options[]= { - {"authrec", AUTHREC}, - {"file", FILET}, - {"ns", OWNER}, - {"owner", OWNER}, - {"serve_aliases", SERVE_ALIASES}, - {"ttl", TTL} -}; - -/* Table for looking up include options. Order alphabetically! */ -static const namevalue_t include_options[]= { - {"file", FILET} -}; - -/* Table for looking up neg options. Order alphabetically! */ -static const namevalue_t neg_options[]= { - {"name", NAME}, - {"ttl", TTL}, - {"types", TYPES} -}; diff --git a/jni/pdnsd/src/conf-parser.c b/jni/pdnsd/src/conf-parser.c deleted file mode 100644 index 9cf9180e..00000000 --- a/jni/pdnsd/src/conf-parser.c +++ /dev/null @@ -1,2118 +0,0 @@ -/* conf-parser.c - Parser for pdnsd config files. - Based on the files conf-lex.l and conf-parse.y written by - Thomas Moestl. - This version was rewritten in C from scratch by Paul A. Rombouts - and doesn't require (f)lex or yacc/bison. - - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011 Paul A. Rombouts. - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include "ipvers.h" -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(HAVE_STRUCT_IFREQ) -#include -#endif -#include "conff.h" -#include "consts.h" -#include "cache.h" -#include "dns.h" -#include "helpers.h" -#include "rr_types.h" -#include "netdev.h" -#include "conf-keywords.h" -#include "conf-parser.h" - - -/* Check that include files are not nested deeper than MAXINCLUDEDEPTH, - as a precaution against infinite recursion. */ -#define MAXINCLUDEDEPTH 100 - -static char *report_error (const char *conftype, unsigned linenr, const char *msg) -{ - char *retval; - if(linenr) { - if(asprintf(&retval, "Error in %s (line %u): %s",conftype,linenr,msg)<0) - retval=NULL; - } - else { - if(asprintf(&retval, "Error in %s: %s",conftype,msg)<0) - retval=NULL; - } - - return retval; -} - -static char *report_errorf (const char *conftype, unsigned linenr, const char *frm,...) printfunc(3, 4); -static char *report_errorf (const char *conftype, unsigned linenr, const char *frm,...) -{ - char *msg,*retval; int mlen; - va_list va; - va_start(va,frm); - mlen=vasprintf(&msg,frm,va); - va_end(va); - if(mlen<0) return NULL; - retval=report_error(conftype,linenr,msg); - free(msg); - return retval; -} - -/* return pointer to next character in linebuffer after skipping blanks and comments */ -static char* getnextp(char **buf, size_t *n, FILE* in, char *p, unsigned *linenr, char **errstr) -{ - if(!p) goto nextline; - tryagain: - if(!*p) { - nextline: - do { - if(!in || getline(buf,n,in)<0) { - *errstr=NULL; - return NULL; - } - ++*linenr; - p=*buf; - } while(!*p); - } - if(isspace(*p)) { - ++p; goto tryagain; - } - if(*p=='#') { - skip_rest_of_line: - if(*linenr) - goto nextline; - else { - p=strchr(p,'\n'); - if(p) { - ++p; - goto tryagain; - } - else - goto nextline; - } - } - if(*p=='/') { - if(*(p+1)=='/') - goto skip_rest_of_line; - if(*(p+1)=='*') { - int lev=1; - p +=2; - for(;;) { - while(*p) { - if(*p=='/' && *(p+1)=='*') { - ++lev; - p +=2; - continue; - } - else if(*p=='*' && *(p+1)=='/') { - p +=2; - if(--lev==0) goto tryagain; - continue; - } - ++p; - } - if(!in || getline(buf,n,in)<0) { - *errstr="comment without closing */"; - return NULL; - } - ++*linenr; - p=*buf; - } - } - } - - return p; -} - -static char translescapedchar(char c) -{ - switch(c) { - case 'f': return '\f'; - case 'n': return '\n'; - case 'r': return '\r'; - case 't': return '\t'; - case 'v': return '\v'; - } - return c; -} - -/* Scan a buffer for a string and copy the decoded (i.e. unescaped) version into - another buffer. - - A string either begins after and ends before a double-quote ("), - or simply consists of a sequence of "non-special" characters, - starting at the current position. - A back-slash (\) acts as an escape character, preventing any character - following it from terminating the string. Thus, for example, - back-slash double-quote (\") may be used to include double-quotes - in a string. - A number of escape sequences are interpreted as in C, e.g. - \t, \n, \r yield control-chars as in C. - - char **curp should point to the position in the buffer where - the scanning should begin. It will be updated to point - to the first character past the scanned string. - - char *outbuf is used to store the decoded string. - size_t outbufsz should be the size of outbuf. - - The return value is the length of the decoded string, unless an error occurs, - in which case -1 is returned and *errstr is assigned an error message. - The returned length may be larger than outbufsz, in which case the buffer - is filled with only the first outbufsz chars of the string. -*/ -static int scan_string(char **curp,char *outbuf, unsigned outbufsz, char **errstr) -{ - char *cur=*curp; - unsigned i=0; - - if(*cur=='"') { - /* Double-quoted string. */ - ++cur; /* Skip opening quote. */ - for(;; ++i,++cur) { - if(!*cur) goto noclosingquote; - if(*cur=='"') break; - if(*cur=='\\') { - if(!*++cur) goto nofollowingchar; - if(i=sizeof(buf)) \ - {CLEANUP_HANDLERS; goto string_too_long;} \ - } -# define REPORT_ERROR(msg) (*errstr=report_error(conftype,linenr,msg)) -# if !defined(CPP_C99_VARIADIC_MACROS) - /* GNU C Macro Varargs style. */ -# define REPORT_ERRORF(args...) (*errstr=report_errorf(conftype,linenr,args)) -#else - /* ANSI C99 style. */ -# define REPORT_ERRORF(...) (*errstr=report_errorf(conftype,linenr,__VA_ARGS__)) -# endif -# define PARSERROR {CLEANUP_HANDLERS; goto free_linebuf_return;} -# define OUTOFMEMERROR {CLEANUP_HANDLERS; goto out_of_memory;} -# define CLEANUP_GOTO(lab) {CLEANUP_HANDLERS; goto lab;} - - *errstr=NULL; - if(in) { - linebuf=malloc(buflen); - if(!linebuf) { - /* If malloc() just failed, allocating space for an error message is unlikely to succeed. */ - return 0; - } - if(global) - conftype="config file"; - else - conftype="include file"; - } - else - conftype="config string"; - - p=prestr; - while((p=getnextp(&linebuf,&buflen,in,p,&linenr,&getnextperr))) { - if(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - sechdr=lookup_keyword(ps,len,section_headers); - if(!sechdr) { - REPORT_ERRORF("invalid section header: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='{') goto expected_bropen; - ++p; - SKIP_BLANKS(p); - - switch(sechdr) { - case GLOBAL: - if(!global) { - REPORT_ERROR(in?"global section not allowed in include file": - "global section not allowed in eval string"); - PARSERROR; - } - - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,global_options); - if(!option) { - REPORT_ERRORF("invalid option for global section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') goto expected_equals; - ++p; - SKIP_BLANKS(p); - - switch(option) { - pdnsd_a *ipaddrp; - - case PERM_CACHE: - if (isalpha(*p)) { - int cnst; - SCAN_ALPHANUM(ps,p,len); - cnst=lookup_const(ps,len); - if(cnst==C_OFF) { - global->perm_cache=0; - } - else - goto bad_perm_cache_option; - } - else if(isdigit(*p)) { - global->perm_cache=strtol(p,&p,0); - } - else { - bad_perm_cache_option: - REPORT_ERROR("bad qualifier in perm_cache= option."); - PARSERROR; - } - break; - - case CACHE_DIR: - SCAN_STRING(p,strbuf,len); - STRNDUP(global->cache_dir,strbuf,len); - break; - - case SERVER_PORT: - SCAN_UNSIGNED_NUM(global->port,p,"server_port option") - break; - - case OUTGOING_IP: - ipaddrp= &global->out_a; - goto scan_ip_or_interface; - - case SERVER_IP: - ipaddrp= &global->a; - scan_ip_or_interface: - SCAN_STRING(p,strbuf,len); - { - const char *err; - if ((err=parse_ip(strbuf,ipaddrp))) { -#if defined(HAVE_STRUCT_IFREQ) && defined(IFNAMSIZ) && defined(SIOCGIFADDR) - if(!strcmp(err,"bad IP address") && lenipv4= ((struct sockaddr_in *)&req.ifr_addr)->sin_addr; -# endif -# ifdef ENABLE_IPV6 - ELSE_IPV6 - ipaddrp->ipv6= ((struct sockaddr_in6 *)&req.ifr_addr)->sin6_addr; -# endif - close(fd); - } - else { - REPORT_ERRORF("Failed to get IP address of %s: %s",req.ifr_name,strerror(errno)); - if(fd!=-1) close(fd); - PARSERROR; - } - } - else -#endif - { - REPORT_ERRORF("%s for the %s= option.",err,option==SERVER_IP?"server_ip":"outgoing_ip"); - PARSERROR; - } - } - } - break; - - case SCHEME_FILE: - SCAN_STRING(p,strbuf,len); - STRNDUP(global->scheme_file, strbuf,len); - break; - - case LINKDOWN_KLUGE: - ASSIGN_ON_OFF(global->lndown_kluge,p,C_ON,"bad qualifier in linkdown_kluge= option."); - break; - - case MAX_TTL: - SCAN_TIMESECS(global->max_ttl,p,"max_ttl option"); - break; - - case MIN_TTL: - SCAN_TIMESECS(global->min_ttl,p,"min_ttl option"); - break; - - case RUN_AS: - SCAN_STRING(p,strbuf,len); - STRNCP(global->run_as, strbuf,len, "run_as"); - break; - - case STRICT_SETUID: - ASSIGN_ON_OFF(global->strict_suid, p,C_ON,"bad qualifier in strict_setuid= option."); - break; - - case USE_NSS: - ASSIGN_ON_OFF(global->use_nss, p,C_ON,"bad qualifier in use_nss= option."); - break; - - case PARANOID: - ASSIGN_ON_OFF(global->paranoid, p,C_ON,"bad qualifier in paranoid= option."); - break; - - case IGNORE_CD: { - int ignore_cd; - ASSIGN_ON_OFF(ignore_cd, p,C_ON,"bad qualifier in ignore_cd= option."); - fprintf(stderr, "Warning: ignore_cd option in configuration file is obsolete and currently has no effect.\n"); - } - break; - - case STATUS_CTL: { - int cnst; - ASSIGN_CONST(cnst, p,cnst==C_ON || cnst==C_OFF ,"bad qualifier in status_pipe= option."); - if(!cmdline.stat_pipe) global->stat_pipe=(cnst==C_ON); - } - break; - - case DAEMON: { - int cnst; - ASSIGN_CONST(cnst, p,cnst==C_ON || cnst==C_OFF ,"bad qualifier in daemon= option."); - if(!cmdline.daemon) global->daemon=(cnst==C_ON); - } - break; - - case C_TCP_SERVER: { - int cnst; - ASSIGN_CONST(cnst, p,cnst==C_ON || cnst==C_OFF ,"bad qualifier in tcp_server= option."); - if(!cmdline.notcp) { - global->notcp=(cnst==C_OFF); -#ifdef NO_TCP_SERVER - if(!global->notcp) { - REPORT_ERROR("pdnsd was compiled without TCP server support. tcp_server=on is not allowed."); - PARSERROR; - } -#endif - } - } - break; - - case PID_FILE: - SCAN_STRING(p,strbuf,len); - if(!cmdline.pidfile) {STRNDUP(global->pidfile,strbuf,len);} - break; - - case C_VERBOSITY: { - int val; - SCAN_UNSIGNED_NUM(val,p,"verbosity option"); - if(!cmdline.verbosity) global->verbosity=val; - } - break; - - case C_QUERY_METHOD: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==TCP_ONLY || cnst==UDP_ONLY || cnst==TCP_UDP || cnst==UDP_TCP,"bad qualifier in query_method= option."); -#ifdef NO_TCP_QUERIES - if (cnst==TCP_ONLY) { - REPORT_ERROR("the tcp_only option is only available when pdnsd is compiled with TCP support."); - PARSERROR; - } - else -#endif -#ifdef NO_UDP_QUERIES - if (cnst==UDP_ONLY) { - REPORT_ERROR("the udp_only option is only available when pdnsd is compiled with UDP support."); - PARSERROR; - } - else -#endif -#if defined(NO_TCP_QUERIES) || defined(NO_UDP_QUERIES) - if (cnst==TCP_UDP) { - REPORT_ERROR("the tcp_udp option is only available when pdnsd is compiled with both TCP and UDP support."); - PARSERROR; - } - else if (cnst==UDP_TCP) { - REPORT_ERROR("the udp_tcp option is only available when pdnsd is compiled with both TCP and UDP support."); - PARSERROR; - } - else -#endif - if(!cmdline.query_method) global->query_method=cnst; - } - break; - - case RUN_IPV4: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF,"bad qualifier in run_ipv4= option."); -#ifndef ENABLE_IPV4 - if(cnst==C_ON) { - REPORT_ERROR("You can only set run_ipv4=on when pdnsd is compiled with IPv4 support."); - PARSERROR; - } -#endif -#ifndef ENABLE_IPV6 - if(cnst==C_OFF) { - REPORT_ERROR("You can only set run_ipv4=off when pdnsd is compiled with IPv6 support."); - PARSERROR; - } -#endif -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - if(!cmdlineipv) { - run_ipv4=(cnst==C_ON); cmdlineipv=-1; - } - else if(cmdlineipv<0 && run_ipv4!=(cnst==C_ON)) { - REPORT_ERROR(cmdlineipv==-1? - "IPv4/IPv6 conflict: you are trying to set run_ipv4 to a value that conflicts with a previous run_ipv4 setting.": - "You must set the run_ipv4 option before specifying IP addresses."); - PARSERROR; - } -#endif - } - break; - - case IPV4_6_PREFIX: - SCAN_STRING(p,strbuf,len); -#ifdef ENABLE_IPV6 - if(!cmdline.prefix) { - if(inet_pton(AF_INET6,strbuf,&global->ipv4_6_prefix)<=0) { - REPORT_ERROR("ipv4_6_prefix: argument not a valid IPv6 address."); - PARSERROR; - } - } -#else - fprintf(stderr,"pdnsd was compiled without IPv6 support. ipv4_6_prefix option in config file will be ignored.\n"); -#endif - break; - - case C_DEBUG: { - int cnst; - ASSIGN_CONST(cnst, p,cnst==C_ON || cnst==C_OFF ,"bad qualifier in debug= option."); - if(!cmdline.debug) { - global->debug=(cnst==C_ON); -#if !DEBUG - if(global->debug) - fprintf(stderr,"pdnsd was compiled without debugging support. debug=on has no effect.\n"); -#endif - } - } - break; - - case C_CTL_PERMS: - SCAN_UNSIGNED_NUM(global->ctl_perms, p,"ctl_perms option"); - break; - - case C_PROC_LIMIT: - SCAN_UNSIGNED_NUM(global->proc_limit, p,"proc_limit option"); - break; - - case C_PROCQ_LIMIT: - SCAN_UNSIGNED_NUM(global->procq_limit, p,"procq_limit option"); - break; - - case TCP_QTIMEOUT: - SCAN_TIMESECS(global->tcp_qtimeout, p,"tcp_qtimeout option"); - break; - - case TIMEOUT: - SCAN_TIMESECS(global->timeout, p,"global timeout option"); - break; - - case C_PAR_QUERIES: { - int val; - SCAN_UNSIGNED_NUM(val, p,"par_queries option"); - if(val<=0) { - REPORT_ERROR("bad value for par_queries."); - PARSERROR; - } else { - global->par_queries=val; - } - } - break; - - case C_RAND_RECS: - ASSIGN_ON_OFF(global->rnd_recs, p,C_ON,"bad qualifier in randomize_recs= option."); - break; - - case NEG_TTL: - SCAN_TIMESECS(global->neg_ttl, p,"neg_ttl option"); - break; - - case NEG_RRS_POL: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF || cnst==C_DEFAULT || cnst==C_AUTH, - "bad qualifier in neg_rrs_pol= option."); - global->neg_rrs_pol=cnst; - } - break; - - case NEG_DOMAIN_POL: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF || cnst==C_AUTH,"bad qualifier in neg_domain_pol= option."); - global->neg_domain_pol=cnst; - } - break; - - case QUERY_PORT_START: { - int val; - if(isalpha(*p)) { - int cnst; - SCAN_ALPHANUM(ps,p,len); - cnst=lookup_const(ps,len); - if(cnst==C_NONE) - val=-1; - else - goto bad_port_start_option; - } - else if(isdigit(*p)) { - val=strtol(p,&p,0); - if(val>65535) { - REPORT_ERROR("value for query_port_start out of range."); - PARSERROR; - } - else if(val<1024) - fprintf(stderr,"Warning: query_port_start=%i but source ports <1204 can only be used as root.\n", - val); - } - else { - bad_port_start_option: - REPORT_ERROR("bad qualifier in query_port_start= option."); - PARSERROR; - } - global->query_port_start=val; - } - break; - - case QUERY_PORT_END: { - int val; - SCAN_UNSIGNED_NUM(val,p,"query_port_end option"); - if(val>65535) { - REPORT_ERROR("value for query_port_end out of range."); - PARSERROR; - } - global->query_port_end=val; - } - break; - - case UDP_BUFSIZE: { - int val; - SCAN_UNSIGNED_NUM(val,p,"udpbufsize"); - if(val<512 || val>65535-(20+8)) { - REPORT_ERROR("value for udpbufsize out of range."); - PARSERROR; - } - global->udpbufsize=val; - } - break; - - case DELEGATION_ONLY: - SCAN_STRING_LIST(&global->deleg_only_zones,p,strbuf,len,zone_add) - break; - - default: /* we should never get here */ - goto internal_parse_error; - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') goto expected_semicolon; - ++p; - SKIP_BLANKS(p); - } - - if(*p!='}') goto expected_closing_brace; - if (global->query_port_end < global->query_port_start) { - REPORT_ERROR("query_port_end may not be smaller than query_port_start."); - PARSERROR; - } - break; - - case SERVER: { - servparm_t server; - - if(!servers) { - REPORT_ERROR(in?"server section not allowed in include file": - "server section not allowed in eval string"); - PARSERROR; - } - - server=serv_presets; -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER (free_servparm(&server)) - - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,server_options); - if(!option) { - REPORT_ERRORF("invalid option for server section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') CLEANUP_GOTO(expected_equals); - ++p; - SKIP_BLANKS(p); - - switch(option) { - case IP: - SCAN_STRING_LIST(&server.atup_a,p,strbuf,len,addr_add_); - break; - - case FILET: - SCAN_STRING(p,strbuf,len); - { - char *errmsg; - if (!read_resolv_conf(strbuf, &server.atup_a, &errmsg)) { - if(errmsg) {REPORT_ERROR(errmsg); free(errmsg);} - else *errstr=NULL; - PARSERROR; - } - } - break; - - case PORT: - SCAN_UNSIGNED_NUM(server.port,p,"port option"); - break; - - case SCHEME: - SCAN_STRING(p,strbuf,len); - STRNCP(server.scheme, strbuf,len, "scheme"); - break; - - case UPTEST: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_PING || cnst==C_NONE || cnst==C_IF || cnst==C_EXEC || cnst==C_DEV || cnst==C_DIALD || cnst==C_QUERY,"bad qualifier in uptest= option."); - server.uptest=cnst; - } - break; - - case TIMEOUT: - SCAN_TIMESECS(server.timeout,p,"timeout option"); - break; - - case PING_TIMEOUT: - SCAN_UNSIGNED_NUM(server.ping_timeout,p,"ping_timeout option"); - break; - - case PING_IP: - SCAN_STRING(p,strbuf,len); - { - const char *err; - if ((err=parse_ip(strbuf,&server.ping_a))) { - REPORT_ERRORF("%s for the ping_ip= option.",err); - PARSERROR; - } - } - break; - - case UPTEST_CMD: - SCAN_STRING(p,strbuf,len); - STRNDUP(server.uptest_cmd, strbuf,len); - SKIP_BLANKS(p); - if(*p==',') { - ++p; - SKIP_BLANKS(p); - SCAN_STRING(p,strbuf,len); - STRNCP(server.uptest_usr, strbuf,len, "second argument of uptest_cmd"); - } - break; - - case QUERY_TEST_NAME: - if(isalpha(*p)) { - int cnst; - SCAN_ALPHANUM(ps,p,len); - if(*p!='.' && *p!='-') { - cnst=lookup_const(ps,len); - if(cnst==C_NONE) { - if(server.query_test_name) - free(server.query_test_name); - server.query_test_name=NULL; - break; - } - } - p=ps; /* reset current char pointer and try again. */ - } - { - unsigned char tname[DNSNAMEBUFSIZE], *copy; - unsigned sz; - - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,tname); - sz=rhnlen(tname); - copy= malloc(sz); - if(!copy) { - OUTOFMEMERROR; - } - memcpy(copy,tname,sz); - if(server.query_test_name) - free(server.query_test_name); - server.query_test_name=copy; - } - break; - - case INTERVAL: - if(isalpha(*p)) { - int cnst; - SCAN_ALPHANUM(ps,p,len); - cnst=lookup_const(ps,len); - if(cnst==C_ONQUERY) { - server.interval=-1; - } - else if(cnst==C_ONTIMEOUT) { - server.interval=-2; - } - else { - goto bad_interval_option; - } - } - else if(isdigit(*p)) { - char *err; - server.interval=strtotime(p,&p,&err); - if(err) { - REPORT_ERRORF("bad time specification in interval= option: %s",err); - PARSERROR; - } - } - else { - bad_interval_option: - REPORT_ERROR("bad qualifier in interval= option."); - PARSERROR; - } - break; - - case INTERFACE: - SCAN_STRING(p,strbuf,len); - STRNCP(server.interface, strbuf,len, "interface"); - break; - - case DEVICE: - SCAN_STRING(p,strbuf,len); - STRNCP(server.device, strbuf,len, "device"); - break; - - case PURGE_CACHE: - ASSIGN_ON_OFF(server.purge_cache,p,C_ON,"bad qualifier in purge_cache= option."); - break; - - case CACHING: - ASSIGN_ON_OFF(server.nocache,p,C_OFF,"bad qualifier in caching= option."); - break; - - case LEAN_QUERY: - ASSIGN_ON_OFF(server.lean_query,p,C_ON,"bad qualifier in lean_query= option."); - break; - - case EDNS_QUERY: - ASSIGN_ON_OFF(server.edns_query,p,C_ON,"bad qualifier in edns_query= option."); - break; - - case PRESET: - ASSIGN_ON_OFF(server.preset,p,C_ON,"bad qualifier in preset= option."); - break; - - case PROXY_ONLY: - ASSIGN_ON_OFF(server.is_proxy,p,C_ON,"bad qualifier in proxy_only= option."); - break; - - case ROOT_SERVER: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF || cnst==C_DISCOVER,"bad qualifier in root_server= option."); - server.rootserver= (cnst==C_DISCOVER? 2: cnst==C_ON); - } - break; - - case RANDOMIZE_SERVERS: - ASSIGN_ON_OFF(server.rand_servers,p,C_ON,"bad qualifier in randomize_servers= option."); - break; - - case POLICY: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_INCLUDED || cnst==C_EXCLUDED || cnst==C_SIMPLE_ONLY || cnst==C_FQDN_ONLY,"bad qualifier in policy= option."); - server.policy=cnst; - } - break; - - case INCLUDE: - SCAN_STRING_LIST(&server.alist,p,strbuf,len,include_list_add) - break; - - case EXCLUDE: - SCAN_STRING_LIST(&server.alist,p,strbuf,len,exclude_list_add) - break; - - case REJECTLIST: - SCAN_STRING_LIST(&server,p,strbuf,len,reject_add_); - break; - - case REJECTPOLICY: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_FAIL || cnst==C_NEGATE,"bad qualifier in reject_policy= option."); - server.rejectpolicy=cnst; - } - break; - - case REJECTRECURSIVELY: - ASSIGN_ON_OFF(server.rejectrecursively,p,C_ON,"bad qualifier in reject_recursively= option."); - break; - - case LABEL: - SCAN_STRING(p,strbuf,len); - STRNDUP(server.label,strbuf,len); - break; - - default: /* we should never get here */ - CLEANUP_GOTO(internal_parse_error); - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') CLEANUP_GOTO(expected_semicolon); - ++p; - SKIP_BLANKS(p); - } - - if(*p!='}') CLEANUP_GOTO(expected_closing_brace); - if (server.uptest==C_EXEC) { - if (!server.uptest_cmd) { - REPORT_ERROR("you must specify uptest_cmd if you specify uptest=exec!"); - PARSERROR; - } - } - if (server.is_proxy && server.rootserver) { - REPORT_ERROR("A server may not be specified as both a proxy and a root-server."); - PARSERROR; - } - if(server.rootserver && (server.policy==C_SIMPLE_ONLY || server.policy==C_FQDN_ONLY)) - fprintf(stderr,"Warning: using policy=%s with a root-server usually makes no sense.", - const_name(server.policy)); - if (DA_NEL(server.atup_a)) { - check_localaddrs(&server); - if(!DA_NEL(server.atup_a)) { - REPORT_ERROR("Server section contains only local IP addresses.\n" - "Bind pdnsd to a different local IP address or specify different port numbers" - " in global section and server section if you want pdnsd to query servers on" - " the same machine."); - PARSERROR; - } - } - { - int j,n=DA_NEL(server.atup_a); - for(j=0;jis_up=server.preset; - /* A negative test interval means don't test at startup or reconfig. */ - if(server.interval<0) at->i_ts=time(NULL); - } - } - if(server.interval==-1) global->onquery=1; - - if (!(*servers=DA_GROW1_F(*servers,(void(*)(void*))free_servparm))) { - OUTOFMEMERROR; - } - DA_LAST(*servers)= server; -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER - } - break; - - case RR: { - /* Initialize c_cent to all zeros. - Then it should be safe to call free_cent() on it, even before calling init_cent(). */ - dns_cent_t c_cent={0}; - time_t c_ttl=86400; - unsigned c_flags=DF_LOCAL; - unsigned char reverse=0; - -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER (free_cent(&c_cent DBG0)) - - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,rr_options); - if(!option) { - REPORT_ERRORF("invalid option for rr section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') CLEANUP_GOTO(expected_equals); - ++p; - SKIP_BLANKS(p); - - switch(option) { - int tp; const char *tpname; - case NAME: { - unsigned char c_name[DNSNAMEBUFSIZE]; - if (c_cent.qname) { - REPORT_ERROR("You may specify only one name in a rr section."); - PARSERROR; - } - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,c_name); - if (!init_cent(&c_cent, c_name, 0, 0, c_flags DBG0)) - goto out_of_memory; - } - break; - - case TTL: - SCAN_TIMESECS(c_ttl,p, "ttl option"); - break; - - case AUTHREC: { - int cnst; - if (c_cent.qname) { - REPORT_ERROR("The authrec= option has no effect unless it precedes name= in a rr section."); - PARSERROR; - } - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF,"Bad qualifier in authrec= option."); - c_flags=(cnst==C_ON)?DF_LOCAL:0; - } - break; - - case REVERSE: - ASSIGN_ON_OFF(reverse,p,C_ON,"bad qualifier in reverse= option."); - break; - - case A: { - unsigned int sz; - pdnsd_ca c_a; - - if (!c_cent.qname) - goto no_name_spec; - SCAN_STRING(p,strbuf,len); - if (inet_aton(strbuf,&c_a.ipv4)) { - tp=T_A; - sz=sizeof(struct in_addr); - } - else -#if ALLOW_LOCAL_AAAA - if (inet_pton(AF_INET6,strbuf,&c_a.ipv6)>0) { - tp=T_AAAA; - sz=sizeof(struct in6_addr); - } - else -#endif - { - REPORT_ERROR("bad IP address in a= option."); - PARSERROR; - } - - if(!add_cent_rr(&c_cent,tp,c_ttl,0,CF_LOCAL,sz,&c_a DBG0)) - goto add_rr_failed; - } - break; - - case OWNER: - tp=T_NS; - goto scan_name; - case CNAME: - tp=T_CNAME; - goto scan_name; - case PTR: - tp=T_PTR; - scan_name: - { - unsigned char c_name[DNSNAMEBUFSIZE]; - - if (!c_cent.qname) - goto no_name_spec; - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,c_name); - if(!add_cent_rr(&c_cent,tp,c_ttl,0,CF_LOCAL,rhnlen(c_name),c_name DBG0)) - goto add_rr_failed; - } - break; - - case MX: { - unsigned char *cp; - unsigned pref; - unsigned char c_mx[2+DNSNAMEBUFSIZE]; - - if (!c_cent.qname) - goto no_name_spec; - cp=c_mx+2; - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,cp); - SKIP_COMMA(p,"missing second argument (preference level) of mx= option"); - SCAN_UNSIGNED_NUM(pref,p,"second argument of mx= option"); - cp=c_mx; - PUTINT16(pref,cp); - if(!add_cent_rr(&c_cent,T_MX,c_ttl,0,CF_LOCAL,2+rhnlen(cp),c_mx DBG0)) - goto add_rr_failed; - } - break; - - case SOA: { - unsigned int blen,rlen; - unsigned char *bp; - uint32_t val; - unsigned char buf[2*DNSNAMEBUFSIZE+20]; - - if (!c_cent.qname) - goto no_name_spec; - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,buf); - rlen=rhnlen(buf); - blen=rlen; - bp=buf+rlen; - SKIP_COMMA(p,"missing 2nd argument of soa= option"); - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,bp); - rlen=rhnlen(bp); - blen += rlen; - bp += rlen; - SKIP_COMMA(p,"missing 3rd argument of soa= option"); - SCAN_UNSIGNED_NUM(val,p,"3rd argument of soa= option"); - PUTINT32(val,bp); - SKIP_COMMA(p,"missing 4th argument of soa= option"); - SCAN_TIMESECS(val,p,"4th argument of soa= option"); - PUTINT32(val,bp); - SKIP_COMMA(p,"missing 5th argument of soa= option"); - SCAN_TIMESECS(val,p,"5th argument of soa= option"); - PUTINT32(val,bp); - SKIP_COMMA(p,"missing 6th argument of soa= option"); - SCAN_TIMESECS(val,p,"6th argument of soa= option"); - PUTINT32(val,bp); - SKIP_COMMA(p,"missing 7th argument of soa= option"); - SCAN_TIMESECS(val,p,"7th argument of soa= option"); - PUTINT32(val,bp); - blen += 20; - if(!add_cent_rr(&c_cent,T_SOA,c_ttl,0,CF_LOCAL,blen,buf DBG0)) - goto add_rr_failed; - } - break; - case SPF: -#if IS_CACHED_SPF - tp=T_SPF; tpname="spf"; - goto define_txt_rr; -#else - REPORT_ERROR("Missing support for caching SPF records in rr section"); - PARSERROR; -#endif - case TXT: -#if IS_CACHED_TXT - tp=T_TXT; tpname="txt"; -#else - REPORT_ERROR("Missing support for caching TXT records in rr section"); - PARSERROR; -#endif -#if IS_CACHED_TXT || IS_CACHED_SPF -#if IS_CACHED_SPF - define_txt_rr: -#endif - { - unsigned char *rbuf; - unsigned sz,allocsz; - int rv; - - if (!c_cent.qname) - goto no_name_spec; - rbuf=NULL; - sz=allocsz=0; -# undef CLEANUP_HANDLER2 -# define CLEANUP_HANDLER2 (free(rbuf)) - - for(;;) { - unsigned char *newbuf,*cp; - unsigned newsz=sz+256; - int n; - if(newsz>allocsz) { - allocsz += 512; - newbuf=realloc(rbuf,allocsz); - if(!newbuf) { - OUTOFMEMERROR; - } - rbuf=newbuf; - } - cp = rbuf+sz; - n=scan_string(&p, charp (cp+1), 255, &scanstrerr); - if(n==-1) { - REPORT_ERRORF("%s in %s= option", scanstrerr, tpname); - PARSERROR; - } - if(n>255) { - REPORT_ERRORF("string longer than 255 bytes in %s= option", tpname); - PARSERROR; - } - *cp=n; - sz += n+1; - if(sz>0xffff) { - REPORT_ERRORF("data exceeds maximum size (65535 bytes) in %s= option", tpname); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!=',') break; - ++p; - SKIP_BLANKS(p); - } - rv=add_cent_rr(&c_cent,tp,c_ttl,0,CF_LOCAL,sz,rbuf DBG0); - CLEANUP_HANDLER2; -# undef CLEANUP_HANDLER2 -# define CLEANUP_HANDLER2 - if(!rv) - goto add_rr_failed; - } - break; -#endif - default: /* we should never get here */ - CLEANUP_GOTO(internal_parse_error); - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') CLEANUP_GOTO(expected_semicolon); - ++p; - SKIP_BLANKS(p); - } - - if(*p!='}') CLEANUP_GOTO(expected_closing_brace); - if (!c_cent.qname) - goto no_name_spec; - if(c_cent.qname[0]==1 && c_cent.qname[1]=='*') { - /* Wild card record. Set the DF_WILD flag for the name with '*.' removed. */ - if(!set_cent_flags(&c_cent.qname[2],DF_WILD)) { - unsigned char buf[DNSNAMEBUFSIZE]; - rhn2str(c_cent.qname,buf,sizeof(buf)); - REPORT_ERRORF("You must define some records for '%s'" - " before you can define records for the wildcard name '%s'", - &buf[2],buf); - PARSERROR; - } - } - - add_cache(&c_cent); - if(reverse) { - if(!add_reverse_cache(&c_cent)) { - REPORT_ERROR("Can't convert IP address in a= option" - " into form suitable for reverse resolving."); - PARSERROR; - } - } - CLEANUP_HANDLER; - break; - - add_rr_failed: - OUTOFMEMERROR; -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER - } - - case SOURCE: { - unsigned char c_owner[DNSNAMEBUFSIZE]; - time_t c_ttl; - unsigned c_flags; - unsigned char c_aliases; - - c_owner[0]='\0'; - c_ttl=86400; - c_flags=DF_LOCAL; - c_aliases=0; - - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,source_options); - if(!option) { - REPORT_ERRORF("invalid option for source section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') goto expected_equals; - ++p; - SKIP_BLANKS(p); - - switch(option) { - case OWNER: - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,c_owner); - break; - - case TTL: - SCAN_TIMESECS(c_ttl,p,"ttl option"); - break; - - case FILET: - if (!c_owner[0]) { - REPORT_ERROR("you must specify owner before file= in source records."); - PARSERROR; - } - SCAN_STRING(p,strbuf,len); - { - char *errmsg; - if (!read_hosts(strbuf, c_owner, c_ttl, c_flags, c_aliases, &errmsg)) { - if(errmsg) { REPORT_ERROR(errmsg); free(errmsg); } - else *errstr=NULL; - PARSERROR; - } - } - break; - - case SERVE_ALIASES: - ASSIGN_ON_OFF(c_aliases,p,C_ON,"Bad qualifier in serve_aliases= option."); - break; - - case AUTHREC: { - int cnst; - ASSIGN_CONST(cnst,p,cnst==C_ON || cnst==C_OFF,"Bad qualifier in authrec= option."); - c_flags=(cnst==C_ON)?DF_LOCAL:0; - } - break; - - default: /* we should never get here */ - goto internal_parse_error; - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') goto expected_semicolon; - ++p; - SKIP_BLANKS(p); - } - } - break; - - case INCLUDE_F: { - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,include_options); - if(!option) { - REPORT_ERRORF("invalid option for include section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') goto expected_equals; - ++p; - SKIP_BLANKS(p); - - switch(option) { - case FILET: - if(includedepth>=MAXINCLUDEDEPTH) { - REPORT_ERRORF("maximum include depth (%d) exceeded.",MAXINCLUDEDEPTH); - PARSERROR; - } - SCAN_STRING(p,strbuf,len); - { - char *errmsg; - if (!read_config_file(strbuf, NULL, NULL, includedepth+1, &errmsg)) { - if(errmsg) { - if(linenr) { - if(asprintf(errstr, "In file %s included at line %u:\n%s",strbuf,linenr,errmsg)<0) - *errstr=NULL; - } - else { - if(asprintf(errstr, "In file %s:\n%s",strbuf,errmsg)<0) - *errstr=NULL; - } - free(errmsg); - } - else - *errstr=NULL; - PARSERROR; - } - } - break; - - default: /* we should never get here */ - goto internal_parse_error; - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') goto expected_semicolon; - ++p; - SKIP_BLANKS(p); - } - } - break; - - case NEG: { - unsigned char c_name[DNSNAMEBUFSIZE]; - time_t c_ttl; - unsigned char htp,hdtp; - - htp=0; - hdtp=0; - c_name[0]='\0'; - c_ttl=86400; - - while(isalpha(*p)) { - SCAN_ALPHANUM(ps,p,len); - option=lookup_keyword(ps,len,neg_options); - if(!option) { - REPORT_ERRORF("invalid option for neg section: %.*s",(int)len,ps); - PARSERROR; - } - SKIP_BLANKS(p); - if(*p!='=') goto expected_equals; - ++p; - SKIP_BLANKS(p); - - switch(option) { - case NAME: - SCAN_STRING(p,strbuf,len); - PARSESTR2RHN(ucharp strbuf,len,c_name); - break; - - case TTL: - SCAN_TIMESECS(c_ttl,p, "ttl option"); - break; - - case TYPES: - if (!c_name[0]) { - REPORT_ERROR("you must specify a name before the types= option."); - PARSERROR; - } - if (isalpha(*p)) { - int cnst; - dns_cent_t c_cent /* ={0} */; - SCAN_ALPHANUM(ps,p,len); - cnst=lookup_const(ps,len); - if(cnst==C_DOMAIN) { - if (htp) { - REPORT_ERROR("You may not specify types=domain together with other types!"); - PARSERROR; - } - hdtp=1; - if (!init_cent(&c_cent, c_name, c_ttl, 0, DF_LOCAL|DF_NEGATIVE DBG0)) - goto out_of_memory; - } - else if(cnst==0) { - if (hdtp) { - REPORT_ERROR("You may not specify types=domain together with other types!"); - PARSERROR; - } - htp=1; - if (!init_cent(&c_cent, c_name, 0, 0, 0 DBG0)) - goto out_of_memory; -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER (free_cent(&c_cent DBG0)) - for(;;) { - { - TEMPSTRNCPY(buf,ps,len); - cnst=rr_tp_byname(buf); - } - if(cnst==-1) { - REPORT_ERRORF("unrecognized rr type '%.*s' used as argument for types= option.",(int)len,ps); - PARSERROR; - } - if(PDNSD_NOT_CACHED_TYPE(cnst)) { - REPORT_ERRORF("illegal rr type '%.*s' used as argument for types= option.",(int)len,ps); - PARSERROR; - } - if (!getrrset_eff(&c_cent,cnst) && !add_cent_rrset_by_type(&c_cent,cnst,c_ttl,0,CF_LOCAL|CF_NEGATIVE DBG0)) { - OUTOFMEMERROR; - } - SKIP_BLANKS(p); - if(*p!=',') break; - ++p; - SKIP_BLANKS(p); - if (!isalpha(*p)) - {CLEANUP_GOTO(bad_types_option);} - SCAN_ALPHANUM(ps,p,len); - } - } - else - goto bad_types_option; - - add_cache(&c_cent); - CLEANUP_HANDLER; -# undef CLEANUP_HANDLER -# define CLEANUP_HANDLER - } - else { - bad_types_option: - REPORT_ERROR("Bad argument for types= option."); - PARSERROR; - } - break; - - default: /* we should never get here */ - goto internal_parse_error; - } /* end of switch(option) */ - - SKIP_BLANKS(p); - if(*p!=';') goto expected_semicolon; - ++p; - SKIP_BLANKS(p); - } - } - break; - - default: /* we should never get here */ - goto internal_parse_error; - } /* end of switch(sechdr) */ - - if(*p!='}') goto expected_closing_brace; - ++p; - } - else { - REPORT_ERROR("expected section header"); - PARSERROR; - } - } - - if(!in || feof(in)) { - if(getnextperr) { - REPORT_ERROR(getnextperr); - PARSERROR; - } - retval=1; /* success */ - } - else - goto input_error; - - goto free_linebuf_return; - - expected_bropen: - REPORT_ERROR("expected opening brace after section name"); - PARSERROR; - - expected_closing_brace: - REPORT_ERROR("expected beginning of new option or closing brace"); - PARSERROR; - - expected_equals: - REPORT_ERROR("expected equals sign after option name"); - PARSERROR; - - expected_semicolon: - REPORT_ERROR("too many arguments to option or missing semicolon"); - PARSERROR; - - string_err: - REPORT_ERROR(scanstrerr); - PARSERROR; - - string_too_long: - REPORT_ERROR("string length exceeds buffer size"); - PARSERROR; - - no_name_spec: - REPORT_ERROR("you must specify a name before a,ptr,cname,mx,ns(owner) and soa records."); - PARSERROR; - - internal_parse_error: - if(asprintf(errstr,"Internal inconsistency detected while parsing line %u of %s.\n" - "Please consider reporting this error to one of the maintainers.\n",linenr,conftype)<0) - *errstr=NULL; - PARSERROR; - - out_of_memory: - /* If malloc() just failed, allocating space for an error message is unlikely to succeed. */ - *errstr=NULL; - PARSERROR; - - unexpected_eof: - if(!in || feof(in)) { - REPORT_ERROR(getnextperr?getnextperr:in?"unexpected end of file":"unexpected end of input string"); - } - else - input_error: { - if(asprintf(errstr,"Error while reading config file: %s",strerror(errno))<0) - *errstr=NULL; - } - - free_linebuf_return: - free(linebuf); - return retval; - -#undef SKIP_BLANKS -#undef SCAN_STRING -#undef REPORT_ERROR -#undef REPORT_ERRORF -#undef PARSERROR -#undef OUTOFMEMERROR -#undef CLEANUP_GOTO -} - - -/* Convert a string representation of an IP address into a binary format. */ -static const char* parse_ip(const char *ipstr, pdnsd_a *a) -{ -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - if(!cmdlineipv) cmdlineipv=-2; -#endif - { - if(!strcmp(ipstr,"any")) { -#ifdef ENABLE_IPV4 - if (run_ipv4) - a->ipv4.s_addr=INADDR_ANY; -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 - a->ipv6=in6addr_any; -#endif - } - else if(!str2pdnsd_a(ipstr,a)) { -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - if(run_ipv4 && inet_pton(AF_INET6,ipstr,&a->ipv6)>0) { - return "You should set run_ipv4=off or use the command-line option -6" - " before specifying an IPv6 address"; - } -#endif - return "bad IP address"; - } - } - return NULL; -} - -/* Add an IP address to the list of name servers. */ -static const char *addr_add(atup_array *ata, const char *ipstr) -{ - atup_t *at; - pdnsd_a addr; - -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - if(!cmdlineipv) cmdlineipv=-2; -#endif - { - if(!str2pdnsd_a(ipstr,&addr)) { -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - if(run_ipv4 && inet_pton(AF_INET6,ipstr,&addr.ipv6)>0) { - fprintf(stderr,"IPv6 address \"%s\" in config file ignored while running in IPv4 mode.\n",ipstr); - return NULL; - } -#endif - return "bad IP address"; - } - } - - if (!(*ata=DA_GROW1(*ata))) { - return "out of memory!"; - } - at=&DA_LAST(*ata); - SET_PDNSD_A2(&at->a, &addr); - at->is_up=0; - at->i_ts=0; - return NULL; -} - - -/* Helper functions for making netmasks */ -inline static uint32_t mk_netmask4(int len) -{ - uint32_t m; - - if(len<=0) - return 0; - - m= ~(uint32_t)0; - return (len<32)? htonl(m<<(32-len)): m; -} - -#if ALLOW_LOCAL_AAAA -inline static void mk_netmask6(struct in6_addr *m, int len) -{ - uint32_t *ma = (uint32_t *)m; - ma[0] = mk_netmask4(len); - ma[1] = mk_netmask4(len -= 32); - ma[2] = mk_netmask4(len -= 32); - ma[3] = mk_netmask4(len -= 32); -} -#endif - -/* Add an IP address/mask to the reject lists. */ -static const char *reject_add(servparm_t *serv, const char *ipstr) -{ - char *slash=strchr(ipstr,'/'); int mlen=0; - - if(slash) { - *slash++=0; - - if(*slash && isdigit(*slash)) { - char *endptr; - int l = strtol(slash,&endptr,10); - if(!*endptr) { - mlen=l; - slash=NULL; - } - } - } - else - mlen=128; /* Works for both IPv4 and IPv6 */ - - { - addr4maskpair_t am; - - am.mask.s_addr = mk_netmask4(mlen); - if(inet_aton(ipstr,&am.a) && (!slash || inet_aton(slash,&am.mask))) { - if(!(serv->reject_a4=DA_GROW1(serv->reject_a4))) - return "out of memory!"; - - DA_LAST(serv->reject_a4) = am; - return NULL; - } - } -#if ALLOW_LOCAL_AAAA - { - addr6maskpair_t am; - - mk_netmask6(&am.mask,mlen); - if(inet_pton(AF_INET6,ipstr,&am.a)>0 && (!slash || inet_pton(AF_INET6,slash,&am.mask)>0)) { - if(!(serv->reject_a6=DA_GROW1(serv->reject_a6))) - return "out of memory!"; - - DA_LAST(serv->reject_a6) = am; - return NULL; - } - } -#endif - - return "bad IP address"; -} - -/* Try to avoid the possibility that pdnsd will query itself. */ -static void check_localaddrs(servparm_t *serv) -{ - if(serv->port == global.port) { - atup_array ata=serv->atup_a; - int i,j=0,n=DA_NEL(ata); - for(i=0;ia))) { - char buf[ADDRSTR_MAXLEN]; - fprintf(stderr,"Local name-server address \"%s\" ignored in config file.\n", - pdnsd_a2str(PDNSD_A2_TO_A(&at->a),buf,ADDRSTR_MAXLEN)); - continue; - } - } - else { - if(equiv_inaddr2(&global.a,&at->a)) { - char buf[ADDRSTR_MAXLEN]; - fprintf(stderr,"Ignoring name-server address \"%s\" in config file (identical to server_ip address).\n", - pdnsd_a2str(PDNSD_A2_TO_A(&at->a),buf,ADDRSTR_MAXLEN)); - continue; - } - } - if(jatup_a=DA_RESIZE(ata,j); - } -} - -/* Read the name server addresses from a resolv.conf-style file. */ -static int read_resolv_conf(const char *fn, atup_array *ata, char **errstr) -{ - int rv=0; - FILE *f; - char *buf; - size_t buflen=256; - unsigned linenr=0; - - if (!(f=fopen(fn,"r"))) { - if(asprintf(errstr, "Failed to open %s: %s", fn, strerror(errno))<0) - *errstr=NULL; - return 0; - } - buf=malloc(buflen); - if(!buf) { - *errstr=NULL; - goto fclose_return; - } - while(getline(&buf,&buflen,f)>=0) { - size_t len; - char *p,*ps; - ++linenr; - p=buf; - for(;; ++p) { - if(!*p) goto nextline; - if(!isspace(*p)) break; - } - ps=p; - do { - if(!*++p) goto nextline; - } while(!isspace(*p)); - len=p-ps; - if(len==strlitlen("nameserver") && !strncmp(ps,"nameserver",len)) { - const char *errmsg; - do { - if(!*++p) goto nextline; - } while (isspace(*p)); - ps=p; - do { - ++p; - } while(*p && !isspace(*p)); - len=p-ps; - { - TEMPSTRNCPY(ipstr,ps,len); - errmsg=addr_add(ata, ipstr); - } - if(errmsg) { - if(asprintf(errstr, "%s in line %u of file %s", errmsg,linenr,fn)<0) - *errstr=NULL; - goto cleanup_return; - } - } - nextline:; - } - if (feof(f)) - rv=1; - else if(asprintf(errstr, "Failed to read %s: %s", fn, strerror(errno))<0) - *errstr=NULL; - cleanup_return: - free(buf); - fclose_return: - fclose(f); - return rv; -} - -static const char *slist_add(slist_array *sla, const char *nm, unsigned int len, int tp) -{ - slist_t *sl; - int exact=1; - const char *err; - size_t sz; - unsigned char rhn[DNSNAMEBUFSIZE]; - - if (len>1 && *nm=='.') { - exact=0; - ++nm; - --len; - } - if((err=parsestr2rhn(ucharp nm,len,rhn))) - return err; - sz=rhnlen(rhn); - if (!(*sla=DA_GROW1_F(*sla,free_slist_domain))) { - return "out of memory!"; - } - sl=&DA_LAST(*sla); - - sl->exact=exact; - sl->rule=tp; - if (!(sl->domain=malloc(sz))) - return "out of memory!"; - memcpy(sl->domain,rhn,sz); - return NULL; -} - -static const char *zone_add(zone_array *za, const char *zone, unsigned int len) -{ - zone_t z; - const char *err; - size_t sz; - unsigned char rhn[DNSNAMEBUFSIZE]; - - if((err=parsestr2rhn(ucharp zone,len,rhn))) - return err; - sz=rhnlen(rhn); - if(!(*za=DA_GROW1_F(*za,free_zone)) || !(DA_LAST(*za)=z=malloc(sz))) - return "out of memory!"; - memcpy(z,rhn,sz); - return NULL; -} - diff --git a/jni/pdnsd/src/conf-parser.h b/jni/pdnsd/src/conf-parser.h deleted file mode 100644 index d3a3e99d..00000000 --- a/jni/pdnsd/src/conf-parser.h +++ /dev/null @@ -1,29 +0,0 @@ -/* conf-parser.h - definitions for parser of pdnsd config files. - The parser was rewritten in C from scratch and doesn't require (f)lex - or yacc/bison. - - Copyright (C) 2004,2008 Paul A. Rombouts. - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#ifndef CONF_PARSER_H -#define CONF_PARSER_H - -int confparse(FILE* in, char *prestr, globparm_t *global, servparm_array *servers, int includedepth, char **errstr); - -#endif /* CONF_PARSER_H */ diff --git a/jni/pdnsd/src/conff.c b/jni/pdnsd/src/conff.c deleted file mode 100644 index db6c5d19..00000000 --- a/jni/pdnsd/src/conff.c +++ /dev/null @@ -1,544 +0,0 @@ -/* conff.c - Maintain configuration information - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ipvers.h" -#include "conff.h" -#include "consts.h" -#include "helpers.h" -#include "conf-parser.h" -#include "servers.h" -#include "icmp.h" - - -globparm_t global={ - perm_cache: 2048, - cache_dir: NULL, - pidfile: NULL, - port: 53, - a: PDNSD_A_INITIALIZER, - out_a: PDNSD_A_INITIALIZER, -#ifdef ENABLE_IPV6 - ipv4_6_prefix: IN6ADDR_ANY_INIT, -#endif - max_ttl: 604800, - min_ttl: 120, - neg_ttl: 900, - neg_rrs_pol: C_DEFAULT, - neg_domain_pol: C_AUTH, - verbosity: VERBOSITY, - run_as: "", - daemon: 0, - debug: 0, - stat_pipe: 0, - notcp: 0, - strict_suid: 1, - use_nss: 1, - paranoid: 0, - lndown_kluge: 0, - onquery: 0, - rnd_recs: 1, - ctl_perms: 0600, - scheme_file: NULL, - proc_limit: 40, - procq_limit: 60, - tcp_qtimeout: TCP_TIMEOUT, - timeout: 0, - par_queries: PAR_QUERIES, - query_method: M_PRESET, - query_port_start: 1024, - query_port_end: 65535, - udpbufsize: 1024, - deleg_only_zones: NULL -}; - -servparm_t serv_presets={ - port: 53, - uptest: C_NONE, - timeout: 120, - interval: 900, - ping_timeout: 600, - scheme: "", - uptest_cmd: NULL, - uptest_usr: "", - interface: "", - device: "", - query_test_name: NULL, - label: NULL, - purge_cache: 0, - nocache: 0, - lean_query: 1, - edns_query: 0, - is_proxy: 0, - rootserver: 0, - rand_servers: 0, - preset: 1, - rejectrecursively: 0, - rejectpolicy: C_FAIL, - policy: C_INCLUDED, - alist: NULL, - atup_a: NULL, - reject_a4: NULL, -#if ALLOW_LOCAL_AAAA - reject_a6: NULL, -#endif - ping_a: PDNSD_A_INITIALIZER -}; - -servparm_array servers=NULL; - -static void free_zones(zone_array za); -static void free_server_data(servparm_array sa); -static int report_server_stat(int f,int i); - - -/* - * Read a configuration file, saving the results in a (separate) global section and servers array, - * and the cache. - * - * char *nm should contain the name of the file to read. If it is NULL, the name of the config file - * read during startup is used. - * - * globparm_t *global should point to a struct which will be used to store the data of the - * global section(s). If it is NULL, no global sections are allowed in the - * file. - * - * servparm_array *servers should point to a dynamic array which will be grown to store the data - * of the server sections. If it is NULL, no server sections are allowed - * in the file. - * - * char **errstr is used to return a possible error message. - * In case of failure, *errstr will refer to a newly allocated string. - * - * read_config_file returns 1 on success, 0 on failure. - */ -int read_config_file(const char *nm, globparm_t *global, servparm_array *servers, int includedepth, char **errstr) -{ - int retval=0; - const char *conftype= (global?"config":"include"); - FILE *in; - - if (nm==NULL) - nm=conf_file; - - if (!(in=fopen(nm,"r"))) { - if(asprintf(errstr,"Error: Could not open %s file %s: %s",conftype,nm,strerror(errno))<0) - *errstr=NULL; - return 0; - } - - retval=confparse(in,NULL,global,servers,includedepth,errstr); -close_file: - if(fclose(in) && retval) { - if(asprintf(errstr,"Error: Could not close %s file %s: %s", - conftype,nm,strerror(errno))<0) - *errstr=NULL; - return 0; - } - if(retval && servers && !DA_NEL(*servers)) { - if(asprintf(errstr,"Error: no server sections defined in config file %s",nm)<0) - *errstr=NULL; - return 0; - } - return retval; -} - -/* - * Re-Read the configuration file. - * Return 1 on success, 0 on failure. - * In case of failure, the old configuration will be unchanged (although the cache may not) and - * **errstr will refer to a newly allocated string containing an error message. - */ -int reload_config_file(const char *nm, char **errstr) -{ - globparm_t global_new; - servparm_array servers_new; - - global_new=global; - global_new.cache_dir=NULL; - global_new.pidfile=NULL; - global_new.scheme_file=NULL; - global_new.deleg_only_zones=NULL; - global_new.onquery=0; - servers_new=NULL; - if(read_config_file(nm,&global_new,&servers_new,0,errstr)) { - if(global_new.cache_dir && strcmp(global_new.cache_dir,global.cache_dir)) { - *errstr=strdup("Cannot reload config file: the specified cache_dir directory has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.pidfile && (!global.pidfile || strcmp(global_new.pidfile,global.pidfile))) { - *errstr=strdup("Cannot reload config file: the specified pid_file has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.scheme_file && strcmp(global_new.scheme_file,global.scheme_file)) { - *errstr=strdup("Cannot reload config file: the specified scheme_file has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.port!=global.port) { - *errstr=strdup("Cannot reload config file: the specified server_port has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(!ADDR_EQUIV(&global_new.a,&global.a)) { - *errstr=strdup("Cannot reload config file: the specified interface address (server_ip) has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } -#ifdef ENABLE_IPV6 - if(!IN6_ARE_ADDR_EQUAL(&global_new.ipv4_6_prefix,&global.ipv4_6_prefix)) { - *errstr=strdup("Cannot reload config file: the specified ipv4_6_prefix has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } -#endif - if(strcmp(global_new.run_as,global.run_as)) { - *errstr=strdup("Cannot reload config file: the specified run_as id has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.daemon!=global.daemon) { - *errstr=strdup("Cannot reload config file: the daemon option has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.debug!=global.debug) { - *errstr=strdup("Cannot reload config file: the debug option has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.stat_pipe!=global.stat_pipe) { - *errstr=strdup("Cannot reload config file: the status_ctl option has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.notcp!=global.notcp) { - *errstr=strdup("Cannot reload config file: the tcp_server option has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.strict_suid!=global.strict_suid) { - *errstr=strdup("Cannot reload config file: the strict_setuid option has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(global_new.ctl_perms!=global.ctl_perms) { - *errstr=strdup("Cannot reload config file: the specified ctl_perms has changed.\n" - "Try restarting pdnsd instead."); - goto cleanup_return; - } - if(ping_isocket==-1 -#ifdef ENABLE_IPV6 - && ping6_isocket==-1 -#endif - ) { - int i,n=DA_NEL(servers_new); - for (i=0;idomain); -} - -void free_slist_array(slist_array sla) -{ - int j,m=DA_NEL(sla); - for(j=0;juptest_cmd); - free(serv->query_test_name); - free(serv->label); - da_free(serv->atup_a); - free_slist_array(serv->alist); - da_free(serv->reject_a4); -#if ALLOW_LOCAL_AAAA - da_free(serv->reject_a6); -#endif -} - -static void free_server_data(servparm_array sa) -{ - int i,n=DA_NEL(sa); - for(i=0;ireject_a4!=NULL || (s)->reject_a6!=NULL) -#else -#define serv_has_rejectlist(s) ((s)->reject_a4!=NULL) -#endif - - -/* Report the current status of server i to the file descriptor f. - Call with locks applied. -*/ -static int report_server_stat(int f,int i) -{ - servparm_t *st=&DA_INDEX(servers,i); - int j,m; - - fsprintf_or_return(f,"Server %i:\n------\n",i); - fsprintf_or_return(f,"\tlabel: %s\n",st->label?st->label:"(none)"); - m=DA_NEL(st->atup_a); - if(st->rootserver>1 && m) - fsprintf_or_return(f,"\tThe following name servers will be used for discovery of rootservers only:\n"); - for(j=0;jatup_a,j); - {char buf[ADDRSTR_MAXLEN]; - fsprintf_or_return(f,"\tip: %s\n",pdnsd_a2str(PDNSD_A2_TO_A(&at->a),buf,ADDRSTR_MAXLEN));} - fsprintf_or_return(f,"\tserver assumed available: %s\n",at->is_up?"yes":"no"); - } - fsprintf_or_return(f,"\tport: %hu\n",st->port); - fsprintf_or_return(f,"\tuptest: %s\n",const_name(st->uptest)); - fsprintf_or_return(f,"\ttimeout: %li\n",(long)st->timeout); - if(st->interval>0) { - fsprintf_or_return(f,"\tuptest interval: %li\n",(long)st->interval); - } else { - fsprintf_or_return(f,"\tuptest interval: %s\n", - st->interval==-1?"onquery": - st->interval==-2?"ontimeout": - "(never retest)"); - } - fsprintf_or_return(f,"\tping timeout: %li\n",(long)st->ping_timeout); - {char buf[ADDRSTR_MAXLEN]; - fsprintf_or_return(f,"\tping ip: %s\n",is_inaddr_any(&st->ping_a)?"(using server ip)":pdnsd_a2str(&st->ping_a,buf,ADDRSTR_MAXLEN));} - if(st->interface[0]) { - fsprintf_or_return(f,"\tinterface: %s\n",st->interface); - } - if(st->device[0]) { - fsprintf_or_return(f,"\tdevice (for special Linux ppp device support): %s\n",st->device); - } - if(st->uptest_cmd) { - fsprintf_or_return(f,"\tuptest command: %s\n",st->uptest_cmd); - fsprintf_or_return(f,"\tuptest user: %s\n",st->uptest_usr[0]?st->uptest_usr:"(process owner)"); - } - if(st->query_test_name) { - unsigned char nmbuf[DNSNAMEBUFSIZE]; - fsprintf_or_return(f,"\tname used in query uptest: %s\n", - rhn2str(st->query_test_name,nmbuf,sizeof(nmbuf))); - } - if (st->scheme[0]) { - fsprintf_or_return(f,"\tscheme: %s\n", st->scheme); - } - fsprintf_or_return(f,"\tforce cache purging: %s\n",st->purge_cache?"on":"off"); - fsprintf_or_return(f,"\tserver is cached: %s\n",st->nocache?"off":"on"); - fsprintf_or_return(f,"\tlean query: %s\n",st->lean_query?"on":"off"); - fsprintf_or_return(f,"\tUse EDNS in outgoing queries: %s\n",st->edns_query?"on":"off"); - fsprintf_or_return(f,"\tUse only proxy?: %s\n",st->is_proxy?"on":"off"); - fsprintf_or_return(f,"\tAssumed root server: %s\n",st->rootserver?(st->rootserver==1?"yes":"discover"):"no"); - fsprintf_or_return(f,"\tRandomize server query order: %s\n",st->rand_servers?"yes":"no"); - fsprintf_or_return(f,"\tDefault policy: %s\n",const_name(st->policy)); - fsprintf_or_return(f,"\tPolicies:%s\n", st->alist?"":" (none)"); - for (j=0;jalist);++j) { - slist_t *sl=&DA_INDEX(st->alist,j); - unsigned char buf[DNSNAMEBUFSIZE]; - fsprintf_or_return(f,"\t\t%s: %s%s\n", - sl->rule==C_INCLUDED?"include":"exclude", - sl->exact?"":".", - rhn2str(sl->domain,buf,sizeof(buf))); - } - if(serv_has_rejectlist(st)) { - fsprintf_or_return(f,"\tAddresses which should be rejected in replies:\n"); - m=DA_NEL(st->reject_a4); - for (j=0;jreject_a4,j); - char abuf[ADDRSTR_MAXLEN],mbuf[ADDRSTR_MAXLEN]; - fsprintf_or_return(f,"\t\t%s/%s\n",inet_ntop(AF_INET,&am->a,abuf,sizeof(abuf)), - inet_ntop(AF_INET,&am->mask,mbuf,sizeof(mbuf))); - } -#if ALLOW_LOCAL_AAAA - m=DA_NEL(st->reject_a6); - for (j=0;jreject_a6,j); - char abuf[INET6_ADDRSTRLEN],mbuf[INET6_ADDRSTRLEN]; - fsprintf_or_return(f,"\t\t%s/%s\n",inet_ntop(AF_INET6,&am->a,abuf,sizeof(abuf)), - inet_ntop(AF_INET6,&am->mask,mbuf,sizeof(mbuf))); - } -#endif - fsprintf_or_return(f,"\tReject policy: %s\n",const_name(st->rejectpolicy)); - fsprintf_or_return(f,"\tReject recursively: %s\n",st->rejectrecursively?"yes":"no"); - } - return 0; -} diff --git a/jni/pdnsd/src/conff.h b/jni/pdnsd/src/conff.h deleted file mode 100644 index a07b1561..00000000 --- a/jni/pdnsd/src/conff.h +++ /dev/null @@ -1,190 +0,0 @@ -/* conff.h - Definitions for configuration management. - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef CONFF_H -#define CONFF_H - -/* XXX should use the system defined ones. */ -/* #define MAXPATH 1024 */ -/* #define MAXIFNAME 31 */ - -#include -#include -#include -#include -#include -#include "ipvers.h" -#include "list.h" - -/* From main.c */ -#if DEBUG>0 -extern short int debug_p; -#else -#define debug_p 0 -#endif -extern short int stat_pipe; -extern pthread_t main_thrid; -extern uid_t init_uid; -extern char *conf_file; - -/* ----------- */ - -typedef DYNAMIC_ARRAY(pdnsd_a) *addr_array; -typedef DYNAMIC_ARRAY(pdnsd_a2) *addr2_array; - -typedef struct { - time_t i_ts; - char is_up; - pdnsd_a2 a; -} atup_t; -typedef DYNAMIC_ARRAY(atup_t) *atup_array; - -typedef struct { - unsigned char *domain; - short exact; - short rule; -} slist_t; -typedef DYNAMIC_ARRAY(slist_t) *slist_array; - -typedef struct { - struct in_addr a,mask; -} addr4maskpair_t; - -typedef DYNAMIC_ARRAY(addr4maskpair_t) *a4_array; - -#if ALLOW_LOCAL_AAAA -typedef struct { - struct in6_addr a,mask; -} addr6maskpair_t; - -typedef DYNAMIC_ARRAY(addr6maskpair_t) *a6_array; -#endif - -typedef struct { - unsigned short port; - short uptest; - time_t timeout; - time_t interval; - time_t ping_timeout; - char scheme[32]; - char *uptest_cmd; - char uptest_usr[21]; - char interface[IFNAMSIZ]; - char device[IFNAMSIZ]; - unsigned char *query_test_name; - char *label; - char purge_cache; - char nocache; - char lean_query; - char edns_query; - char is_proxy; - char rootserver; - char rand_servers; - char preset; - char rejectrecursively; - short rejectpolicy; - short policy; - slist_array alist; - atup_array atup_a; - a4_array reject_a4; -#if ALLOW_LOCAL_AAAA - a6_array reject_a6; -#endif - pdnsd_a ping_a; -} servparm_t; -typedef DYNAMIC_ARRAY(servparm_t) *servparm_array; - -typedef unsigned char *zone_t; -typedef DYNAMIC_ARRAY(zone_t) *zone_array; - -typedef struct { - long perm_cache; - char *cache_dir; - char *pidfile; - int port; - pdnsd_a a; - pdnsd_a out_a; -#ifdef ENABLE_IPV6 - struct in6_addr ipv4_6_prefix; -#endif - time_t max_ttl; - time_t min_ttl; - time_t neg_ttl; - short neg_rrs_pol; - short neg_domain_pol; - short verbosity; - char run_as[21]; - char daemon; - char debug; - char stat_pipe; - char notcp; - char strict_suid; - char use_nss; - char paranoid; - char lndown_kluge; - char onquery; - char rnd_recs; - int ctl_perms; - char *scheme_file; - int proc_limit; - int procq_limit; - time_t tcp_qtimeout; - time_t timeout; - int par_queries; - int query_method; - int query_port_start; - int query_port_end; - int udpbufsize; - zone_array deleg_only_zones; -} globparm_t; - -typedef struct { - char -#ifdef ENABLE_IPV6 - prefix, -#endif - pidfile, - verbosity, - pdnsduser, - daemon, - debug, - stat_pipe, - notcp, - query_method; -} cmdlineflags_t; - -extern globparm_t global; -extern cmdlineflags_t cmdline; -extern servparm_t serv_presets; - -extern servparm_array servers; - -int read_config_file(const char *nm, globparm_t *global, servparm_array *servers, int includedepth, char **errstr); -int reload_config_file(const char *nm, char **errstr); -void free_zone(void *ptr); -void free_slist_domain(void *ptr); -void free_slist_array(slist_array sla); -void free_servparm(servparm_t *serv); - -int report_conf_stat(int f); -#endif diff --git a/jni/pdnsd/src/consts.c b/jni/pdnsd/src/consts.c deleted file mode 100644 index c875a091..00000000 --- a/jni/pdnsd/src/consts.c +++ /dev/null @@ -1,133 +0,0 @@ -/* consts.c - Common config constants & handling - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2005, 2006, 2007, 2009 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include "consts.h" -#include "rr_types.h" - - -/* Order alphabetically!! */ -static const namevalue_t const_dic[]={ - {"auth", C_AUTH}, - {"default", C_DEFAULT}, - {"dev", C_DEV}, - {"diald", C_DIALD}, - {"discover", C_DISCOVER}, - {"domain", C_DOMAIN}, - {"excluded", C_EXCLUDED}, - {"exec", C_EXEC}, - {"fail", C_FAIL}, - {"false", C_OFF}, - {"fqdn_only", C_FQDN_ONLY}, - {"if", C_IF}, - {"included", C_INCLUDED}, - {"negate", C_NEGATE}, - {"no", C_OFF}, - {"none", C_NONE}, - {"off", C_OFF}, - {"on", C_ON}, - {"onquery", C_ONQUERY}, - {"ontimeout", C_ONTIMEOUT}, - {"ping", C_PING}, - {"query", C_QUERY}, - {"simple_only", C_SIMPLE_ONLY}, - {"tcp_only", TCP_ONLY}, - {"tcp_udp", TCP_UDP}, - {"true", C_ON}, - {"udp_only", UDP_ONLY}, - {"udp_tcp", UDP_TCP}, - {"yes", C_ON} -}; - -/* Added by Paul Rombouts */ -static const char *const const_names[]={ - "error", - "on", - "off", - "default", - "discover", - "none", - "if", - "exec", - "ping", - "query", - "onquery", - "ontimeout", - "udp_only", - "tcp_only", - "tcp_udp", - "udp_tcp", - "dev", - "diald", - "included", - "excluded", - "simple_only", - "fqdn_only", - "auth", - "domain", - "fail", - "negate" -}; - -/* compare two strings. - The first one is given as pointer to a char array of length len (which - should not contain any null chars), - the second one as a pointer to a null terminated char array. -*/ -inline static int keyncmp(const char *key1, int len, const char *key2) -{ - int cmp=strncmp(key1,key2,len); - if(cmp) return cmp; - return -(int)((unsigned char)(key2[len])); -} - -int binsearch_keyword(const char *name, int len, const namevalue_t dic[], int range) -{ - int i=0,j=range; - - while(i0) - i=k+1; - else - return dic[k].val; - } - - return 0; -} - - -int lookup_const(const char *name, int len) -{ - return binsearch_keyword(name,len,const_dic,sizeof(const_dic)/sizeof(namevalue_t)); -} - -/* Added by Paul Rombouts */ -const char *const_name(int c) -{ - return (c>=0 && c. -*/ - - -#ifndef CONSTS_H -#define CONSTS_H - -#include - -#define C_RRTOFFS 64 - -enum { - C_ERR, - C_ON, - C_OFF, - C_DEFAULT, - C_DISCOVER, - C_NONE, - C_IF, - C_EXEC, - C_PING, - C_QUERY, - C_ONQUERY, - C_ONTIMEOUT, - UDP_ONLY, - TCP_ONLY, - TCP_UDP, - UDP_TCP, - C_DEV, - C_DIALD, - C_INCLUDED, - C_EXCLUDED, - C_SIMPLE_ONLY, - C_FQDN_ONLY, - C_AUTH, - C_DOMAIN, - C_FAIL, - C_NEGATE -}; - -typedef struct { - const char *name; - int val; -} namevalue_t; - -int binsearch_keyword(const char *name, int len, const namevalue_t dic[], int range); -int lookup_const(const char *name, int len); -const char *const_name(int c); /* Added by Paul Rombouts */ - -#endif diff --git a/jni/pdnsd/src/debug.c b/jni/pdnsd/src/debug.c deleted file mode 100644 index dd7f244d..00000000 --- a/jni/pdnsd/src/debug.c +++ /dev/null @@ -1,64 +0,0 @@ -/* debug.c - Various debugging facilities - * Copyright (C) 2001 Thomas Moestl - * - * This file is part of the pdnsd package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include "helpers.h" -#include "error.h" - - -/* - * This is indeed very primitive (it does not track allocation failures - * and so on). It should be expanded some time. - */ -#ifdef ALLOC_DEBUG -void *DBGcalloc(size_t n, size_t sz, char *file, int line) -{ - DEBUG_MSG("+ calloc, %s:%d\n", file, line); - return calloc(n, sz); -} - -void *DBGmalloc(size_t sz, char *file, int line) -{ - DEBUG_MSG("+ malloc, %s:%d\n", file, line); - return malloc(sz); -} - -void *DBGrealloc(void *ptr, size_t sz, char *file, int line) -{ - if (ptr == NULL && sz != 0) - DEBUG_MSG("+ realloc, %s:%d\n", file, line); - if (ptr != NULL && sz == 0) - DEBUG_MSG("- realloc(0), %s:%d\n", file, line); - return realloc(ptr, sz); -} -void DBGfree(void *ptr, char *file, int line) -{ - DEBUG_MSG("- free, %s:%d\n", file, line); - free(ptr); -} -#endif diff --git a/jni/pdnsd/src/debug.h b/jni/pdnsd/src/debug.h deleted file mode 100644 index 02f0e5d4..00000000 --- a/jni/pdnsd/src/debug.h +++ /dev/null @@ -1,52 +0,0 @@ -/* debug.h - Various debugging facilities - * Copyright (C) 2001 Thomas Moestl - * - * This file is part of the pdnsd package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#ifndef DEBUG_H -#define DEBUG_H - -/* - * A hand-rolled alloc debug factility, because most available libraries have - * problems with at least one thread implementation. - */ -#ifdef ALLOC_DEBUG -void *DBGcalloc(size_t n, size_t sz, char *file, int line); -void *DBGmalloc(size_t sz, char *file, int line); -void *DBGrealloc(void *ptr, size_t sz, char *file, int line); -void DBGfree(void *ptr, char *file, int line); - -#define pdnsd_calloc(n,sz) DBGcalloc(n,sz,__FILE__,__LINE__) -#define pdnsd_malloc(sz) DBGmalloc(sz,__FILE__,__LINE__) -#define pdnsd_realloc(ptr,sz) DBGrealloc(ptr,sz,__FILE__,__LINE__) -#define pdnsd_free(ptr) DBGfree(ptr,__FILE__,__LINE__) -#else -#define pdnsd_calloc calloc -#define pdnsd_malloc malloc -#define pdnsd_realloc realloc -#define pdnsd_free free -#endif - -#endif /* def DEBUG_H */ diff --git a/jni/pdnsd/src/dns.c b/jni/pdnsd/src/dns.c deleted file mode 100644 index a02d7fde..00000000 --- a/jni/pdnsd/src/dns.c +++ /dev/null @@ -1,617 +0,0 @@ -/* dns.c - Declarations for dns handling and generic dns functions - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include "error.h" -#include "helpers.h" -#include "dns.h" - - -/* Decompress a name record, taking the whole message as msg, returning its results in tgt - * (which should be able hold at least DNSNAMEBUFSIZE chars), - * taking sz as the remaining msg size (it is returned decremented by the name length, ready for further use) and - * a source pointer (it is returned pointing to the location after the name). msgsize is the size of the whole message, - * len is the total name length. - * msg and msgsz are needed for decompression (see rfc1035). The returned data is decompressed, but still in the - * rr name form (length byte - string of that length, terminated by a 0 length byte). - * - * Returned is a dns return code, with one exception: RC_TRUNC, as defined in dns.h, indicates that the message is - * truncated at the name (which needs a special return code, as it might or might not be fatal). - */ -int decompress_name(unsigned char *msg, size_t msgsz, unsigned char **src, size_t *sz, unsigned char *tgt, unsigned int *len) -{ - unsigned int lb,offs; - unsigned int hops=0,tpos=0; - unsigned char *lptr=*src; - size_t oldsz=*sz; - size_t newsz=oldsz; - - if (newsz==0) - goto name_outside_data; - if (lptr-msg>=msgsz) - goto name_outside_msg; - - for(;;) { - newsz--; - lb=*lptr++; - - if(lb>0x3f) { - if (lb<0xc0) /* The two highest bits must be either 00 or 11 */ - goto unsupported_lbl_bits; - if (newsz==0) - goto name_outside_data; - if (lptr-msg>=msgsz) - goto name_outside_msg; - newsz--; - offs=((lb&0x3f)<<8)|(*lptr); - if (offs>=msgsz) - goto offset_outside_msg; - lptr=msg+offs; - goto jumped; - } - tgt[tpos++]=lb; - if (lb==0) - break; - - if (newsz<=lb) - goto name_outside_data; - if (lptr+lb-msg>=msgsz) - goto name_outside_msg; - if (tpos+lb>DNSNAMEBUFSIZE-1) /* terminating null byte has to follow */ - goto name_buf_full; - newsz -= lb; - do { - /* if (!*lptr || *lptr=='.') - return RC_FORMAT; */ - tgt[tpos++]=*lptr++; - } while(--lb); - } - goto return_OK; - - jumped: - ++hops; - for(;;) { - lb=*lptr++; - - while(lb>0x3f) { - if (lb<0xc0) /* The two highest bits must be either 00 or 11 */ - goto unsupported_lbl_bits; - if (lptr-msg>=msgsz) - goto name_outside_msg; - if (++hops>255) - goto too_many_hops; - offs=((lb&0x3f)<<8)|(*lptr); - if (offs>=msgsz) - goto offset_outside_msg; - lptr=msg+offs; - lb=*lptr++; - } - tgt[tpos++]=lb; - if (lb==0) - break; - - if (lptr+lb-msg>=msgsz) - goto name_outside_msg; - if(tpos+lb>DNSNAMEBUFSIZE-1) /* terminating null byte has to follow */ - goto name_buf_full; - do { - /* if (!*lptr || *lptr=='.') - return RC_FORMAT; */ - tgt[tpos++]=*lptr++; - } while(--lb); - } - return_OK: - *src += oldsz-newsz; - *sz = newsz; - if(len) *len=tpos; - return RC_OK; - - name_outside_data: - DEBUG_MSG("decompress_name: compressed name extends outside data field.\n"); - return RC_TRUNC; - - name_outside_msg: - DEBUG_MSG("decompress_name: compressed name extends outside message.\n"); - return RC_FORMAT; - - unsupported_lbl_bits: - DEBUG_MSG(lb==0x41?"decompress_name: Bit-string labels not supported.\n": - "decompress_name: unsupported label type.\n"); - return RC_FORMAT; - - offset_outside_msg: - DEBUG_MSG("decompress_name: offset points outside message.\n"); - return RC_FORMAT; - - name_buf_full: - DEBUG_MSG("decompress_name: decompressed name larger than %u bytes.\n", DNSNAMEBUFSIZE); - return RC_FORMAT; - - too_many_hops: - DEBUG_MSG("decompress_name: too many offsets in compressed name.\n"); - return RC_FORMAT; -} - -#if 0 -/* Compare two names (ordinary C-strings) back-to-forth and return the longest match. - The comparison is done at name granularity. - The return value is the length of the match in name elements. - *os (*od) is set to the offset in the domain name ms (md) of the match. - */ -int domain_name_match(const unsigned char *ms, const unsigned char *md, int *os, int *od) -{ - int i,j,k=0,offs,offd; - - offs=i=strlen(ms); offd=j=strlen(md); - if(i && ms[i-1]=='.') --offs; - if(j && md[j-1]=='.') --offd; - - if(i==0 || (i==1 && *ms=='.') || j==0 || (j==1 && *md=='.')) - /* Special case: root domain */ - ; - else { - --i; if(ms[i]=='.') --i; - --j; if(md[j]=='.') --j; - while(tolower(ms[i]) == tolower(md[j])) { - if(ms[i]=='.') { - ++k; - offs=i+1; offd=j+1; - } - if(i==0 || j==0) { - if((i==0 || ms[i-1]=='.') && (j==0 || md[j-1]=='.')) { - ++k; - offs=i; offd=j; - } - break; - } - --i; --j; - } - } - if(os) *os=offs; - if(od) *od=offd; - return k; -} -#endif - -/* Compare the names (in length byte-string notation) back-to-forth and return the longest match. - The comparison is done at name granularity. - The return value is the length of the match in name elements. - *os (*od) is set to the offset in the domain name ms (md) of the match. - */ -unsigned int domain_match(const unsigned char *ms, const unsigned char *md, unsigned int *os, unsigned int *od) -{ - unsigned int i,j,k,n,ns=0,nd=0,offs,offd; - unsigned char lb,ls[128],ld[128]; - - /* first collect all length bytes */ - i=0; - while((lb=ms[i])) { - PDNSD_ASSERT(ns<128, "domain_match: too many name segments"); - ls[ns++]=lb; - i += ((unsigned)lb)+1; - } - - j=0; - while((lb=md[j])) { - PDNSD_ASSERT(nd<128, "domain_match: too many name segments"); - ld[nd++]=lb; - j += ((unsigned)lb)+1; - } - - n=ns; if(n>nd) n=nd; - - for(k=1; offs=i,offd=j,k<=n; ++k) { - lb=ls[ns-k]; - if(lb!=ld[nd-k]) goto mismatch; - for(;lb;--lb) - if(tolower(ms[--i]) != tolower(md[--j])) goto mismatch; - --i; --j; - } - mismatch: - - if(os) *os=offs; - if(od) *od=offd; - return k-1; -} - -/* compress the domain name in in and put the result (of maximum length of rhnlen(in)) and - * fill cb with compression information for further strings.*cb may be NULL initially. - * offs is the offset the generated string will be placed in the packet. - * retval: 0 - error, otherwise length - * When done, just free() cb (if it is NULL, free will behave correctly). - * It is guaranteed (and insured by assertions) that the output is smaller or equal in - * size to the input. - */ -unsigned int compress_name(unsigned char *in, unsigned char *out, unsigned int offs, dlist *cb) -{ - compel_t *ci; - unsigned int longest=0,lrem=0,coffs=0; - unsigned int rl=0; - unsigned ilen = rhnlen(in); - unsigned short add=1; - - PDNSD_ASSERT(ilen<=DNSNAMEBUFSIZE, "compress_name: name too long"); - - /* part 1: compression */ - for (ci=dlist_first(*cb); ci; ci=dlist_next(ci)) { - unsigned int rv,rem,to; - if ((rv=domain_match(in, ci->s, &rem,&to))>longest) { - /* - * This has some not obvious implications that should be noted: If a - * domain name as saved in the list has been compressed, we only can - * index the non-compressed part. We rely here that the first occurence - * can't be compressed. So we take the first occurence of a given length. - * This works perfectly, but watch it if you change something. - */ - unsigned int newoffs= ci->index + to; - /* Only use if the offset is not too large. */ - if(newoffs<=0x3fff) { - longest=rv; - lrem=rem; - coffs= newoffs; - } - } - } - if (longest>0) { - PDNSD_ASSERT(lrem+2 <= ilen, "compress_name: length increased"); - memcpy(out, in,lrem); - out[lrem]=0xc0|((coffs&0x3f00)>>8); - out[lrem+1]=coffs&0xff; - rl=lrem+2; - add= lrem!=0; - } - else { - memcpy(out,in,ilen); - rl=ilen; - } - - /* part 2: addition to the cache structure */ - if (add) { - if (!(*cb=dlist_grow(*cb,sizeof(compel_t)+ilen))) - return 0; - ci=dlist_last(*cb); - ci->index=offs; - memcpy(ci->s,in,ilen); - } - return rl; -} - -/* Convert a numeric IP address into a domain name representation - (C string) suitable for PTR records. - buf is assumed to be at least DNSNAMEBUFSIZE bytes in size. -*/ -int a2ptrstr(pdnsd_ca *a, int tp, unsigned char *buf) -{ - if(tp==T_A) { - unsigned char *p=(unsigned char *)&a->ipv4.s_addr; - int n=snprintf(charp buf,DNSNAMEBUFSIZE,"%u.%u.%u.%u.in-addr.arpa.",p[3],p[2],p[1],p[0]); - if(n<0 || n>=DNSNAMEBUFSIZE) - return 0; - } - else -#if ALLOW_LOCAL_AAAA - if(tp==T_AAAA) { - unsigned char *p=(unsigned char *)&a->ipv6; - int i,offs=0; - for (i=15;i>=0;--i) { - unsigned char bt=p[i]; - int n=snprintf(charp(buf+offs), DNSNAMEBUFSIZE-offs,"%x.%x.",bt&0xf,(bt>>4)&0xf); - if(n<0) return 0; - offs+=n; - if(offs>=DNSNAMEBUFSIZE) return 0; - } - if(!strncp(charp(buf+offs),"ip6.arpa.",DNSNAMEBUFSIZE-offs)) - return 0; - } - else -#endif - return 0; - return 1; -} - -/* - * Add records for a host as read from a hosts-style file. - * Returns 1 on success, 0 in an out of memory condition, and -1 when there was a problem with - * the record data. - */ -static int add_host(unsigned char *pn, unsigned char *rns, pdnsd_ca *a, int tp, int a_sz, time_t ttl, unsigned flags, int reverse) -{ - dns_cent_t ce; - - if (!init_cent(&ce, pn, 0, 0, flags DBG0)) - return 0; - if (!add_cent_rr(&ce,tp,ttl,0,CF_LOCAL,a_sz,a DBG0)) - goto free_cent_return0; - if (!add_cent_rr(&ce,T_NS,ttl,0,CF_LOCAL,rhnlen(rns),rns DBG0)) - goto free_cent_return0; - add_cache(&ce); - free_cent(&ce DBG0); - if (reverse) { - unsigned char b2[DNSNAMEBUFSIZE],rhn[DNSNAMEBUFSIZE]; - if(!a2ptrstr(a,tp,b2)) - return -1; - if (!str2rhn(b2,rhn)) - return -1; - if (!init_cent(&ce, rhn, 0, 0, flags DBG0)) - return 0; - if (!add_cent_rr(&ce,T_PTR,ttl,0,CF_LOCAL,rhnlen(pn),pn DBG0)) - goto free_cent_return0; - if (!add_cent_rr(&ce,T_NS,ttl,0,CF_LOCAL,rhnlen(rns),rns DBG0)) - goto free_cent_return0; - add_cache(&ce); - free_cent(&ce DBG0); - } - return 1; - - free_cent_return0: - free_cent(&ce DBG0); - return 0; -} - -/* - * Read a file in /etc/hosts-format and add generate rrs for it. - * Errors are largely ignored so that we can skip entries we do not understand - * (but others possibly do). - */ -int read_hosts(const char *fn, unsigned char *rns, time_t ttl, unsigned flags, int aliases, char **errstr) -{ - int rv=0; - FILE *f; - char *buf; - size_t buflen=256; - - if (!(f=fopen(fn,"r"))) { - if(asprintf(errstr, "Failed to source %s: %s", fn, strerror(errno))<0) *errstr=NULL; - return 0; - } - buf=malloc(buflen); - if(!buf) { - *errstr=NULL; - goto fclose_return; - } - while(getline(&buf,&buflen,f)>=0) { - unsigned int len; - unsigned char *p,*pn,*pi; - unsigned char rhn[DNSNAMEBUFSIZE]; - int tp,sz; - pdnsd_ca a; - - p= ucharp strchr(buf,'#'); - if(p) *p=0; - p= ucharp buf; - for(;;) { - if(!*p) goto nextline; - if(!isspace(*p)) break; - ++p; - } - pi=p; - do { - if(!*++p) goto nextline; - } while(!isspace(*p)); - *p=0; - do { - if(!*++p) goto nextline; - } while (isspace(*p)); - pn=p; - do { - ++p; - } while(*p && !isspace(*p)); - len=p-pn; - if (parsestr2rhn(pn,len,rhn)!=NULL) - continue; - if (inet_aton(charp pi,&a.ipv4)) { - tp=T_A; - sz=sizeof(struct in_addr); - } else { -#if ALLOW_LOCAL_AAAA /* We don't read them otherwise, as the C library may not be able to to that.*/ - if (inet_pton(AF_INET6,charp pi,&a.ipv6)>0) { - tp=T_AAAA; - sz=sizeof(struct in6_addr); - } else -#endif - continue; - } - { - int res=add_host(rhn, rns, &a, tp,sz, ttl, flags, 1); - if(res==0) { - *errstr= NULL; - goto cleanup_return; - } - else if(res<0) - continue; - } - if(aliases) { - for(;;) { - for(;;) { - if(!*p) goto nextline; - if(!isspace(*p)) break; - ++p; - } - pn=p; - do { - ++p; - } while(*p && !isspace(*p)); - len=p-pn; - if (parsestr2rhn(pn,len,rhn)!=NULL) - break; - if (add_host(rhn, rns, &a, tp,sz, ttl, flags, 0) == 0) { - *errstr= NULL; - goto cleanup_return; - } - } - } - nextline:; - } - if (feof(f)) - rv=1; - else if(asprintf(errstr, "Failed to source %s: %s", fn, strerror(errno))<0) *errstr=NULL; - cleanup_return: - free(buf); - fclose_return: - fclose(f); - return rv; -} - - -/* Get the name of an RR type given its value. */ -const char *getrrtpname(int tp) -{ - return tp>=T_MIN && tp<=T_MAX? rrnames[tp-T_MIN]: "[unknown]"; -} - -#if DEBUG>0 -/* - * Const decoders for debugging display - */ -static const char *const c_names[C_NUM] = {"IN","CS","CH","HS"}; -static const char *const qt_names[QT_NUM]={"IXFR","AXFR","MAILB","MAILA","*"}; - -const char *get_cname(int id) -{ - if (id>=C_MIN && id<=C_MAX) - return c_names[id-C_MIN]; - if (id==QC_ALL) - return "*"; - return "[unknown]"; -} - -const char *get_tname(int id) -{ - if (id>=T_MIN && id<=T_MAX) - return rrnames[id-T_MIN]; - else if (id>=QT_MIN && id<=QT_MAX) - return qt_names[id-QT_MIN]; - return "[unknown]"; -} - - -#define NRC 17 -static const char *const e_names[NRC]={ - "no error", - "query format error", - "server failed", - "non-existent domain", - "not supported", - "query refused", - "name exists when it should not", - "RR set exists when it should not", - "RR set that should exist does not", - "server not authoritative for zone", - "name not contained in zone", - "11", - "12", - "13", - "14", - "15", - "bad OPT version" -}; - -const char *get_ename(int id) -{ - if (id>=0 && idaa) - p=mempcpy(p, " AA", 3); - if (hdr->tc) - p=mempcpy(p, " TC", 3); - if (hdr->rd) - p=mempcpy(p, " RD", 3); - if (hdr->ra) - p=mempcpy(p, " RA", 3); - if (hdr->z) - p=mempcpy(p, " Z", 2); - if (hdr->ad) - p=mempcpy(p, " AD", 3); - if (hdr->cd) - p=mempcpy(p, " CD", 3); - *p=0; - - return buf; -} - -#endif - - -#if DEBUG>=9 -/* Based on debug code contributed by Kiyo Kelvin Lee. */ - -void debug_dump_dns_msg(void *data, size_t len) -{ - unsigned char *udata = (unsigned char *)data; -# define dmpchksz 16 - char buf[dmpchksz*4+2]; - size_t i, j, k, l; - - DEBUG_MSG("pointer=%p len=%lu\n", udata, (unsigned long)len); - - for (i = 0; i < len; i += dmpchksz) { - char *cp = buf; - k = l = i + dmpchksz; - if(k > len) k = len; - for (j = i; j < k; ++j) { - int n = sprintf(cp, "%02x ", udata[j]); - cp += n; - } - for (; j < l; ++j) { - *cp++ = ' '; - *cp++ = ' '; - *cp++ = ' '; - } - *cp++ = ' '; - for (j = i; j < k; ++j) { - *cp++ = isprint(udata[j]) ? udata[j] : '.'; - } - PDNSD_ASSERT(cp < buf + sizeof(buf), "debug_dump_dns_msg: line buffer overflowed"); - *cp = '\0'; - DEBUG_MSG("%s\n", buf); - } - - if(len >= sizeof(dns_hdr_t)) { - dns_hdr_t *hdr = (dns_hdr_t *)data; - - DEBUG_MSG( - "id=%04x qr=%x opcode=%x aa=%x tc=%x rd=%x " - "ra=%x z=%x ad=%x cd=%x rcode=%x\n", - ntohs(hdr->id), hdr->qr, hdr->opcode, hdr->aa, hdr->tc, hdr->rd, - hdr->ra, hdr->z, hdr->ad, hdr->cd, hdr->rcode); - DEBUG_MSG( - "qdcount=%04x ancount=%04x nscount=%04x arcount=%04x\n", - ntohs(hdr->qdcount), ntohs(hdr->ancount), ntohs(hdr->nscount), ntohs(hdr->arcount)); - } -} -#endif diff --git a/jni/pdnsd/src/dns.h b/jni/pdnsd/src/dns.h deleted file mode 100644 index 0f6a4ac1..00000000 --- a/jni/pdnsd/src/dns.h +++ /dev/null @@ -1,309 +0,0 @@ -/* dns.h - Declarations for dns handling and generic dns functions - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef DNS_H -#define DNS_H - -#include -#include -#include -#include -#include -#include -#include "rr_types.h" -#include "list.h" -#include "ipvers.h" - -#if (TARGET==TARGET_BSD) -# if !defined(__BIG_ENDIAN) -# if defined(BIG_ENDIAN) -# define __BIG_ENDIAN BIG_ENDIAN -# elif defined(_BIG_ENDIAN) -# define __BIG_ENDIAN _BIG_ENDIAN -# endif -# endif -# if !defined(__LITTLE_ENDIAN) -# if defined(LITTLE_ENDIAN) -# define __LITTLE_ENDIAN LITTLE_ENDIAN -# elif defined(_LITTLE_ENDIAN) -# define __LITTLE_ENDIAN _LITTLE_ENDIAN -# endif -# endif -# if !defined(__BYTE_ORDER) -# if defined(BYTE_ORDER) -# define __BYTE_ORDER BYTE_ORDER -# elif defined(_BYTE_ORDER) -# define __BYTE_ORDER _BYTE_ORDER -# endif -# endif -#endif - -/* Deal with byte orders */ -#ifndef __BYTE_ORDER -# if defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN) -# error Fuzzy endianness system! Both __LITTLE_ENDIAN and __BIG_ENDIAN have been defined! -# endif -# if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) -# error Strange Endianness-less system! Neither __LITTLE_ENDIAN nor __BIG_ENDIAN has been defined! -# endif -# if defined(__LITTLE_ENDIAN) -# define __BYTE_ORDER __LITTLE_ENDIAN -# elif defined(__BIG_ENDIAN) -# define __BYTE_ORDER __BIG_ENDIAN -# endif -#endif - -/* special rr type codes for queries */ -#define QT_MIN 251 -#define QT_IXFR 251 -#define QT_AXFR 252 -#define QT_MAILB 253 -#define QT_MAILA 254 -#define QT_ALL 255 -#define QT_MAX 255 -#define QT_NUM 5 - -/* rr classes */ -#define C_MIN 1 -#define C_IN 1 -#define C_CS 2 -#define C_CH 3 -#define C_HS 4 -#define C_MAX 4 -#define C_NUM 4 - -/* special classes for queries */ -#define QC_ALL 255 - -/* status codes */ -#define RC_OK 0 -#define RC_FORMAT 1 -#define RC_SERVFAIL 2 -#define RC_NAMEERR 3 -#define RC_NOTSUPP 4 -#define RC_REFUSED 5 -#define RC_BADVERS 16 - -/* - * special internal retvals - */ -#define RC_NOTCACHED 0xfffa -#define RC_CACHED 0xfffb -#define RC_STALE 0xfffc -#define RC_TCPREFUSED 0xfffd -#define RC_TRUNC 0xfffe -#define RC_FATALERR 0xffff - -/* query/response */ -#define QR_QUERY 0 -#define QR_RESP 1 - -/*opcodes */ -#define OP_QUERY 0 -#define OP_IQUERY 1 -#define OP_STATUS 2 - -#if 0 -typedef struct { - /* the name is the first field. It has variable length, so it can't be put in the struct */ - uint16_t type; - uint16_t class; - uint32_t ttl; - uint16_t rdlength; - /* rdata follows */ -} __attribute__((packed)) rr_hdr_t; - -#define sizeof_rr_hdr_t (sizeof rr_hdr_t) -#else - -/* We will not actually use the rr_hdr_t type, only its size: - sizeof(rr_hdr_t) = 2 + 2 + 4 + 2 */ -#define sizeof_rr_hdr_t 10 -#endif - -#define sizeof_opt_pseudo_rr (1+sizeof_rr_hdr_t) - -#if 0 -typedef struct { - /* The server name and maintainer mailbox are the first two fields. It has variable length, */ - /* so they can't be put in the struct */ - uint32_t serial; - uint32_t refresh; - uint32_t retry; - uint32_t expire; - uint32_t minimum; -} __attribute__((packed)) soa_r_t; - - -typedef struct { -/* char qname[];*/ - uint16_t qtype; - uint16_t qclass; -} __attribute__((packed)) std_query_t; -#endif - - -typedef struct { - uint16_t id; -#if __BYTE_ORDER == __LITTLE_ENDIAN - unsigned int rd:1; - unsigned int tc:1; - unsigned int aa:1; - unsigned int opcode:4; - unsigned int qr:1; - unsigned int rcode:4; - unsigned int cd:1; - unsigned int ad:1; - unsigned int z :1; - unsigned int ra:1; -#elif __BYTE_ORDER == __BIG_ENDIAN - unsigned int qr:1; - unsigned int opcode:4; - unsigned int aa:1; - unsigned int tc:1; - unsigned int rd:1; - unsigned int ra:1; - unsigned int z :1; - unsigned int ad:1; - unsigned int cd:1; - unsigned int rcode:4; -#else -# error "Please define __BYTE_ORDER to be __LITTLE_ENDIAN or __BIG_ENDIAN" -#endif - uint16_t qdcount; - uint16_t ancount; - uint16_t nscount; - uint16_t arcount; -} __attribute__((packed)) dns_hdr_t; - - -/* A structure that can also be used for DNS messages over TCP. */ -typedef struct { -#ifndef NO_TCP_QUERIES - uint16_t len; -#endif - dns_hdr_t hdr; -} __attribute__((packed)) dns_msg_t; - -#ifdef NO_TCP_QUERIES -# define dnsmsghdroffset 0 -#else -# define dnsmsghdroffset 2 -#endif - - -/* Structure for storing EDNS (Extension mechanisms for DNS) information. */ -typedef struct { - unsigned short udpsize; - unsigned short rcode; - unsigned short version; - unsigned char do_flg; -} edns_info_t; - - -/* Macros to retrieve or store integer data that is not necessarily aligned. - Also takes care of network to host byte order. - The pointer cp is advanced and should be of type void* or char*. - These are actually adapted versions of the NS_GET16 and NS_GET32 - macros in the arpa/nameser.h include file in the BIND 9 source. -*/ - -#define GETINT16(s,cp) do { \ - register uint16_t t_s; \ - register const unsigned char *t_cp = (const unsigned char *)(cp); \ - t_s = (uint16_t)*t_cp++ << 8; \ - t_s |= (uint16_t)*t_cp++; \ - (s) = t_s; \ - (cp) = (void *)t_cp; \ -} while (0) - -#define GETINT32(l,cp) do { \ - register uint32_t t_l; \ - register const unsigned char *t_cp = (const unsigned char *)(cp); \ - t_l = (uint32_t)*t_cp++ << 24; \ - t_l |= (uint32_t)*t_cp++ << 16; \ - t_l |= (uint32_t)*t_cp++ << 8; \ - t_l |= (uint32_t)*t_cp++; \ - (l) = t_l; \ - (cp) = (void *)t_cp; \ -} while (0) - -#define PUTINT16(s,cp) do { \ - register uint16_t t_s = (uint16_t)(s); \ - register unsigned char *t_cp = (unsigned char *)(cp); \ - *t_cp++ = t_s >> 8; \ - *t_cp++ = t_s; \ - (cp) = (void *)t_cp; \ -} while (0) - -#define PUTINT32(l,cp) do { \ - register uint32_t t_l = (uint32_t)(l); \ - register unsigned char *t_cp = (unsigned char *)(cp); \ - *t_cp++ = t_l >> 24; \ - *t_cp++ = t_l >> 16; \ - *t_cp++ = t_l >> 8; \ - *t_cp++ = t_l; \ - (cp) = (void *)t_cp; \ -} while (0) - - -/* Size (number of bytes) of buffers used to hold domain names. */ -#define DNSNAMEBUFSIZE 256 - -/* Recursion depth. */ -#define MAX_HOPS 20 - -/* - * Types for compression buffers. - */ -typedef struct { - unsigned int index; - unsigned char s[0]; -} compel_t; - - - -int decompress_name(unsigned char *msg, size_t msgsz, unsigned char **src, size_t *sz, unsigned char *tgt, unsigned int *len); -/* int domain_name_match(const unsigned char *ms, const unsigned char *md, int *os, int *od); */ -unsigned int domain_match(const unsigned char *ms, const unsigned char *md, unsigned int *os, unsigned int *od); -unsigned int compress_name(unsigned char *in, unsigned char *out, unsigned int offs, dlist *cb); -int a2ptrstr(pdnsd_ca *a, int tp, unsigned char *buf); -int read_hosts(const char *fn, unsigned char *rns, time_t ttl, unsigned flags, int aliases, char **errstr); - -const char *getrrtpname(int tp); -#if DEBUG>0 -const char *get_cname(int id); -const char *get_tname(int id); -const char *get_ename(int id); -#define DNSFLAGSMAXSTRSIZE (7*3+1) -char *dnsflags2str(dns_hdr_t *hdr, char *buf); -#endif - -#if DEBUG>=9 -void debug_dump_dns_msg(void *data, size_t len); -#define DEBUG_DUMP_DNS_MSG(d,l) {if(debug_p && global.verbosity>=9) debug_dump_dns_msg(d,l);} -#else -#define DEBUG_DUMP_DNS_MSG(d,l) -#endif - -#endif diff --git a/jni/pdnsd/src/dns_answer.c b/jni/pdnsd/src/dns_answer.c deleted file mode 100644 index 6a2a5b50..00000000 --- a/jni/pdnsd/src/dns_answer.c +++ /dev/null @@ -1,2170 +0,0 @@ -/* dns_answer.c - Receive and process incoming dns queries. - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -/* - * STANDARD CONFORMITY - * - * There are several standard conformity issues noted in the comments. - * Some additional comments: - * - * I always set RA but I ignore RD largely (in everything but CNAME recursion), - * not because it is not supported, but because I _always_ do a recursive - * resolve in order to be able to cache the results. - */ - -#include -#include "ipvers.h" -#include -#include -#include -#ifdef HAVE_SYS_POLL_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "thread.h" -#include "list.h" -#include "dns.h" -#include "dns_answer.h" -#include "dns_query.h" -#include "helpers.h" -#include "cache.h" -#include "error.h" -#include "debug.h" - - -/* - * This is for error handling to prevent spewing the log files. - * Maximums of different message types are set. - * Races do not really matter here, so no locks. - */ -#define TCP_MAX_ERRS 10 -#define UDP_MAX_ERRS 10 -#define MEM_MAX_ERRS 10 -#define THRD_MAX_ERRS 10 -#define MISC_MAX_ERRS 10 -static volatile unsigned long da_tcp_errs=0; -static volatile unsigned long da_udp_errs=0; -static volatile unsigned long da_mem_errs=0; -static volatile unsigned long da_thrd_errs=0; -#if DEBUG>0 -static volatile unsigned long da_misc_errs=0; -#endif -static volatile int procs=0; /* active query processes */ -static volatile int qprocs=0; /* queued query processes */ -static volatile unsigned long dropped=0,spawned=0; -static volatile unsigned thrid_cnt=0; -static pthread_mutex_t proc_lock = PTHREAD_MUTEX_INITIALIZER; - -#ifdef SOCKET_LOCKING -static pthread_mutex_t s_lock = PTHREAD_MUTEX_INITIALIZER; -#endif - -typedef union { -#ifdef ENABLE_IPV4 -# if (TARGET==TARGET_LINUX) - struct in_pktinfo pi4; -# else - struct in_addr ai4; -# endif -#endif -#ifdef ENABLE_IPV6 - struct in6_pktinfo pi6; -#endif -} pkt_info_t; - - -typedef struct { - union { -#ifdef ENABLE_IPV4 - struct sockaddr_in sin4; -#endif -#ifdef ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif - } addr; - - pkt_info_t pi; - - int sock; - int proto; - size_t len; - unsigned char buf[0]; /* Actual size determined by global.udpbufsize */ -} udp_buf_t; - - -/* ALLOCINITIALSIZE should be at least sizeof(dns_msg_t) = 2+12 */ -#define ALLOCINITIALSIZE 256 -/* This mask corresponds to a chunk size of 128 bytes. */ -#define ALLOCCHUNKSIZEMASK ((size_t)0x7f) - -typedef struct { - unsigned short qtype; - unsigned short qclass; - unsigned char query[0]; -} dns_queryel_t; - - -#define S_ANSWER 1 -#define S_AUTHORITY 2 -#define S_ADDITIONAL 3 - -typedef struct { - unsigned short tp,dlen; - unsigned char nm[0]; - /* unsigned char data[0]; */ -} sva_t; - - -/* - * Mark an additional record as added to avoid double records. - */ -static int sva_add(dlist *sva, const unsigned char *rhn, unsigned short tp, unsigned short dlen, void* data) -{ - if (sva) { - size_t rlen=rhnlen(rhn); - sva_t *st; - if (!(*sva=dlist_grow(*sva,sizeof(sva_t)+rlen+dlen))) { - return 0; - } - st=dlist_last(*sva); - st->tp=tp; - st->dlen=dlen; - memcpy(mempcpy(st->nm,rhn,rlen),data,dlen); - } - return 1; -} - -/* ans_ttl computes the ttl value to return to the client. - This is the ttl value stored in the cache entry minus the time - the cache entry has lived in the cache. - Local cache entries are an exception, they never "age". -*/ -inline static time_t ans_ttl(rr_set_t *rrset, time_t queryts) -{ - time_t ttl= rrset->ttl; - - if (!(rrset->flags&CF_LOCAL)) { - time_t tpassed= queryts - rrset->ts; - if(tpassed<0) tpassed=0; - ttl -= tpassed; - if(ttl<0) ttl=0; - } - return ttl; -} - -/* follow_cname_chain takes a cache entry and a buffer (must be at least DNSNAMEBUFSIZE bytes), - and copies the name indicated by the first cname record in the cache entry. - The name is returned in length-byte string notation. - follow_cname_chain returns 1 if a cname record is found, otherwise 0. -*/ -inline static int follow_cname_chain(dns_cent_t *c, unsigned char *name) -{ - rr_set_t *rrset=getrrset_CNAME(c); - rr_bucket_t *rr; - if (!rrset || !(rr=rrset->rrs)) - return 0; - PDNSD_ASSERT(rr->rdlen <= DNSNAMEBUFSIZE, "follow_cname_chain: record too long"); - memcpy(name,rr->data,rr->rdlen); - return 1; -} - - -/* - * Add data from a rr_bucket_t (as in cache) into a dns message in ans. Ans is grown - * to fit, sz is the old size of the packet (it is modified so at the end of the procedure - * it is the new size), type is the rr type and ltime is the time in seconds the record is - * old. - * cb is the buffer used for message compression. *cb should be NULL when you call compress_name - * or add_to_response the first time. - * It gets filled with a pointer to compression information that can be reused in subsequent calls - * to add_to_response. - * sect is the section (S_ANSWER, S_AUTHORITY or S_ADDITIONAL) in which the record - * belongs logically. Note that you still have to add the rrs in the right order (answer rrs first, - * then authority and last additional). - */ -static int add_rr(dns_msg_t **ans, size_t *sz, size_t *allocsz, - unsigned char *rrn, unsigned short type, uint32_t ttl, - unsigned int dlen, void *data, char section, unsigned *udp, dlist *cb) -{ - size_t osz= *sz; - unsigned int ilen,blen,rdlen; - unsigned char *rrht; - - { - unsigned int nlen; - unsigned char nbuf[DNSNAMEBUFSIZE]; - - if (!(nlen=compress_name(rrn,nbuf,*sz,cb))) - return 0; - - /* This buffer is usually over-allocated due to compression. - Never mind, just a few bytes, and the buffer is freed soon. */ - { - size_t newsz= dnsmsghdroffset + *sz + nlen + sizeof_rr_hdr_t + dlen; - if(newsz > *allocsz) { - /* Need to allocate more space. - To avoid frequent reallocs, we allocate - a multiple of a certain chunk size. */ - size_t newallocsz= (newsz+ALLOCCHUNKSIZEMASK)&(~ALLOCCHUNKSIZEMASK); - dns_msg_t *newans=(dns_msg_t *)pdnsd_realloc(*ans,newallocsz); - if (!newans) - return 0; - *ans=newans; - *allocsz=newallocsz; - } - } - memcpy((unsigned char *)(&(*ans)->hdr)+ *sz, nbuf, nlen); - *sz += nlen; - } - - /* the rr header will be filled in later. Just reserve some space for it. */ - rrht= ((unsigned char *)(&(*ans)->hdr)) + *sz; - *sz += sizeof_rr_hdr_t; - - switch (type) { - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - if (!(rdlen=compress_name(((unsigned char *)data), ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - PDNSD_ASSERT(rdlen <= dlen, "T_CNAME/T_MB/...: got longer"); - *sz+=rdlen; - break; -#if IS_CACHED_MINFO || IS_CACHED_RP -#if IS_CACHED_MINFO - case T_MINFO: -#endif -#if IS_CACHED_RP - case T_RP: -#endif - if (!(rdlen=compress_name(((unsigned char *)data), ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - *sz+=rdlen; - ilen=rhnlen((unsigned char *)data); - PDNSD_ASSERT(rdlen <= ilen, "T_MINFO/T_RP: got longer"); - if (!(blen=compress_name(((unsigned char *)data)+ilen, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen+=blen; - PDNSD_ASSERT(rdlen <= dlen, "T_MINFO/T_RP: got longer"); - *sz+=blen; - break; -#endif - case T_MX: -#if IS_CACHED_AFSDB - case T_AFSDB: -#endif -#if IS_CACHED_RT - case T_RT: -#endif -#if IS_CACHED_KX - case T_KX: -#endif - PDNSD_ASSERT(dlen > 2, "T_MX/T_AFSDB/...: rr botch"); - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),(unsigned char *)data,2); - *sz+=2; - if (!(blen=compress_name(((unsigned char *)data)+2, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen=2+blen; - PDNSD_ASSERT(rdlen <= dlen, "T_MX/T_AFSDB/...: got longer"); - *sz+=blen; - break; - case T_SOA: - if (!(rdlen=compress_name(((unsigned char *)data), ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - *sz+=rdlen; - ilen=rhnlen((unsigned char *)data); - PDNSD_ASSERT(rdlen <= ilen, "T_SOA: got longer"); - if (!(blen=compress_name(((unsigned char *)data)+ilen, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen+=blen; - *sz+=blen; - ilen+=rhnlen(((unsigned char *)data)+ilen); - PDNSD_ASSERT(rdlen <= ilen, "T_SOA: got longer"); - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),((unsigned char *)data)+ilen,20); - rdlen+=20; - PDNSD_ASSERT(rdlen <= dlen, "T_SOA: rr botch"); - *sz+=20; - break; -#if IS_CACHED_PX - case T_PX: - PDNSD_ASSERT(dlen > 2, "T_PX: rr botch"); - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),(unsigned char *)data,2); - *sz+=2; - ilen=2; - if (!(blen=compress_name(((unsigned char *)data)+ilen, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen=2+blen; - *sz+=blen; - ilen+=rhnlen(((unsigned char *)data)+ilen); - PDNSD_ASSERT(rdlen <= ilen, "T_PX: got longer"); - if (!(blen=compress_name(((unsigned char *)data)+ilen, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen+=blen; - PDNSD_ASSERT(rdlen <= dlen, "T_PX: got longer"); - *sz+=blen; - break; -#endif -#if IS_CACHED_SRV - case T_SRV: - PDNSD_ASSERT(dlen > 6, "T_SRV: rr botch"); - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),(unsigned char *)data,6); - *sz+=6; - if (!(blen=compress_name(((unsigned char *)data)+6, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen=6+blen; - PDNSD_ASSERT(rdlen <= dlen, "T_SRV: got longer"); - *sz+=blen; - break; -#endif -#if IS_CACHED_NXT - case T_NXT: - if (!(blen=compress_name(((unsigned char *)data), ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen=blen; - *sz+=blen; - ilen=rhnlen((unsigned char *)data); - PDNSD_ASSERT(rdlen <= ilen, "T_NXT: got longer"); - PDNSD_ASSERT(dlen >= ilen, "T_NXT: rr botch"); - if (dlen > ilen) { - unsigned int wlen = dlen - ilen; - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),((unsigned char *)data)+ilen,wlen); - *sz+=wlen; - rdlen+=wlen; - } - break; -#endif -#if IS_CACHED_NAPTR - case T_NAPTR: - PDNSD_ASSERT(dlen > 4, "T_NAPTR: rr botch"); - ilen=4; - { - int j; - for (j=0;j<3;j++) { - ilen += ((unsigned)*(((unsigned char *)data)+ilen)) + 1; - PDNSD_ASSERT(dlen > ilen, "T_NAPTR: rr botch 2"); - } - } - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),((unsigned char *)data),ilen); - (*sz)+=ilen; - - if (!(blen=compress_name(((unsigned char *)data)+ilen, ((unsigned char *)(&(*ans)->hdr))+(*sz),*sz,cb))) - return 0; - rdlen=ilen+blen; - PDNSD_ASSERT(rdlen <= dlen, "T_NAPTR: got longer"); - *sz+=blen; - break; -#endif - default: - memcpy(((unsigned char *)(&(*ans)->hdr))+(*sz),((unsigned char *)data),dlen); - rdlen=dlen; - *sz+=dlen; - } - - if (udp && *sz>*udp && section==S_ADDITIONAL) /* only add the record if we do not increase the length over 512 */ - *sz=osz; /* (or possibly more if the request used EDNS) in additionals for udp answer. */ - else { - PUTINT16(type,rrht); - PUTINT16(C_IN,rrht); - PUTINT32(ttl,rrht); - PUTINT16(rdlen,rrht); - - switch (section) { - case S_ANSWER: - (*ans)->hdr.ancount=htons(ntohs((*ans)->hdr.ancount)+1); - break; - case S_AUTHORITY: - (*ans)->hdr.nscount=htons(ntohs((*ans)->hdr.nscount)+1); - break; - case S_ADDITIONAL: - (*ans)->hdr.arcount=htons(ntohs((*ans)->hdr.arcount)+1); - break; - } - } - - return 1; -} - -/* Add an OPT pseudo RR containing EDNS info. - Can only be added to the additional section! -*/ -int add_opt_pseudo_rr(dns_msg_t **ans, size_t *sz, size_t *allocsz, - unsigned short udpsize, unsigned short rcode, - unsigned short ednsver, unsigned short Zflags) -{ - unsigned char *ptr; - size_t newsz= dnsmsghdroffset + *sz + sizeof_opt_pseudo_rr; - if(newsz > *allocsz) { - /* Need to allocate more space. - To avoid frequent reallocs, we allocate - a multiple of a certain chunk size. */ - size_t newallocsz= (newsz+ALLOCCHUNKSIZEMASK)&(~ALLOCCHUNKSIZEMASK); - dns_msg_t *newans=(dns_msg_t *)pdnsd_realloc(*ans,newallocsz); - if (!newans) - return 0; - *ans=newans; - *allocsz=newallocsz; - } - - ptr= ((unsigned char *)(&(*ans)->hdr)) + *sz; - *ptr++ = 0; /* Empty name */ - PUTINT16(T_OPT,ptr); /* type field */ - PUTINT16(udpsize,ptr); /* class field */ - *ptr++ = rcode>>4; /* 4 byte TTL field */ - *ptr++ = ednsver; - PUTINT16(Zflags,ptr); - PUTINT16(0,ptr); /* rdlen field */ - /* Empty RDATA. */ - - *sz += sizeof_opt_pseudo_rr; - /* Increment arcount field in dns header. */ - (*ans)->hdr.arcount = htons(ntohs((*ans)->hdr.arcount)+1); - return 1; -} - -/* Remove the last entry in the additional section, - assuming it is an OPT pseudo RR of fixed size. - Returns the new message size if successful, or - zero if an inconsistency is detected. -*/ -size_t remove_opt_pseudo_rr(dns_msg_t *ans, size_t sz) -{ - uint16_t acnt=ntohs(ans->hdr.arcount), type; - unsigned char *ptr; - /* First do some sanity checks. */ - if(!(acnt>0 && sz >= sizeof(dns_hdr_t)+sizeof_opt_pseudo_rr)) - return 0; - sz -= sizeof_opt_pseudo_rr; - ptr= ((unsigned char *)(&ans->hdr)) + sz; - if(*ptr++) - return 0; /* Name must be empty. */ - GETINT16(type,ptr); - if(type!=T_OPT) - return 0; /* RR type must be OPT. */ - /* Decrement arcount field in dns header. */ - ans->hdr.arcount = htons(acnt-1); - return sz; -} - -typedef struct rre_s { - unsigned short tp; - unsigned short tsz; /* Size of tnm field */ - uint32_t ttl; /* ttl of the record in the answer (if tp==T_NS or T_SOA) */ - unsigned char tnm[0]; /* Name for the domain a record refers to */ - /* unsigned char nm[0]; */ /* Name of the domain the record is for (if tp==T_NS or T_SOA) */ -} rr_ext_t; - - -/* types for the tp field */ -/* #define RRETP_NS T_NS */ /* For name server: add to authority, add address to additional. */ -/* #define RRETP_SOA T_SOA */ /* For SOA record: add to authority. */ -#define RRETP_ADD 0 /* For other records: add the address of buf to additional */ - -static int add_ar(dlist *ar,unsigned short tp, unsigned short tsz,void *tnm,unsigned char *nm, uint32_t ttl) -{ - rr_ext_t *re; - unsigned char *p; - size_t nmsz=0,size=sizeof(rr_ext_t)+tsz; - if(tp==T_NS || tp==T_SOA) { - nmsz=rhnlen(nm); - size += nmsz; - } - if (!(*ar=dlist_grow(*ar,size))) - return 0; - re=dlist_last(*ar); - re->tp=tp; - re->tsz=tsz; - re->ttl=ttl; - p=mempcpy(re->tnm,tnm,tsz); - if(tp==T_NS || tp==T_SOA) { - memcpy(p,nm,nmsz); - } - return 1; -} - - -/* Select a random rr record from a list. */ -inline static rr_bucket_t *randrr(rr_bucket_t *rrb) -{ - rr_bucket_t *rr; - unsigned cnt=0; - - /* In order to have an equal chance for each record to be selected, we have to count first. */ - for(rr=rrb; rr; rr=rr->next) ++cnt; - - /* We do not use the pdnsd random functions (these might use /dev/urandom if the user is paranoid, - * and we do not need any good PRNG here). */ - if(cnt) for(cnt=random()%cnt; cnt; --cnt) rrb=rrb->next; - - return rrb; -} - -#if IS_CACHED_SRV -#define AR_NUM 6 -#else -#define AR_NUM 5 -#endif -static const int ar_recs[AR_NUM]={T_NS, T_MD, T_MF, T_MB, T_MX -#if IS_CACHED_SRV - ,T_SRV -#endif -}; -/* offsets from record data start to server name */ -static const int ar_offs[AR_NUM]={0,0,0,0,2 -#if IS_CACHED_SRV - ,6 -#endif -}; - -/* This adds an rrset, optionally randomizing the first element it adds. - * if that is done, all rrs after the randomized one appear in order, starting from - * that one and wrapping over if needed. */ -static int add_rrset(dns_msg_t **ans, size_t *sz, size_t *allocsz, - unsigned char *rrn, unsigned tp, time_t queryts, - dns_cent_t *cached, unsigned *udp, dlist *cb, dlist *sva, dlist *ar) -{ - rr_set_t *crrset=getrrset(cached,tp); - - if (crrset && crrset->rrs) { - rr_bucket_t *b; - rr_bucket_t *first=NULL; /* Initialized to inhibit compiler warning */ - int i; - short rnd_recs=global.rnd_recs; - - b=crrset->rrs; - if (rnd_recs) b=first=randrr(crrset->rrs); - - while (b) { - if (!add_rr(ans, sz, allocsz, rrn, tp, ans_ttl(crrset,queryts), - b->rdlen, b->data, S_ANSWER, udp, cb)) - return 0; - if (tp==T_NS || tp==T_A || tp==T_AAAA) { - /* mark it as added */ - if (!sva_add(sva,rrn,tp,b->rdlen,b->data)) - return 0; - } - /* Mark for additional address records. XXX: this should be a more effective algorithm; at least the list is small */ - for (i=0;irdlen-ar_offs[i],((unsigned char *)(b->data))+ar_offs[i], - ucharp "", 0)) - return 0; - break; - } - } - b=b->next; - if (rnd_recs) { - if(!b) b=crrset->rrs; /* wraparound */ - if(b==first) break; - } - } - } - return 1; -} - -/* - * Add the fitting elements of the cached record to the message in ans, where ans - * is grown to fit, sz is the size of the packet and is modified to be the new size. - * The query is in qe. - * cb is the buffer used for message compression. *cb should be NULL if you call add_to_response - * the first time. It gets filled with a pointer to compression information that can be - * reused in subsequent calls to add_to_response. - */ -static int add_to_response(dns_msg_t **ans, size_t *sz, size_t *allocsz, - unsigned char *rrn, unsigned qtype, time_t queryts, - dns_cent_t *cached, unsigned *udp, dlist *cb, dlist *sva, dlist *ar) -{ - /* First of all, unless we have records of qtype, add cnames. - Well, actually, there should be at max one cname. */ - if (qtype!=T_CNAME && qtype!=QT_ALL && !(qtype>=T_MIN && qtype<=T_MAX && have_rr(cached,qtype))) - if (!add_rrset(ans, sz, allocsz, rrn, T_CNAME, queryts, cached, udp, cb, sva, ar)) - return 0; - - /* We need no switch for qclass, since we already have filtered packets we cannot understand */ - if (qtype==QT_AXFR || qtype==QT_IXFR) { - /* I do not know what to do in this case. Since we do not maintain zones (and since we are - no master server, so it is not our task), I just return an error message. If anyone - knows how to do this better, please notify me. - Anyway, this feature is rarely used in client communication, and there is no need for - other name servers to ask pdnsd. Btw: many bind servers reject an ?XFR query for security - reasons. */ - return 0; - } else if (qtype==QT_MAILB) { - if (!add_rrset(ans, sz, allocsz, rrn, T_MB, queryts, cached, udp, cb, sva, ar)) - return 0; - if (!add_rrset(ans, sz, allocsz, rrn, T_MG, queryts, cached, udp, cb, sva, ar)) - return 0; - if (!add_rrset(ans, sz, allocsz, rrn, T_MR, queryts, cached, udp, cb, sva, ar)) - return 0; - } else if (qtype==QT_MAILA) { - if (!add_rrset(ans, sz, allocsz, rrn, T_MD, queryts, cached, udp, cb, sva, ar)) - return 0; - if (!add_rrset(ans, sz, allocsz, rrn, T_MF, queryts, cached, udp, cb, sva, ar)) - return 0; - } else if (qtype==QT_ALL) { - int i, n= NRRITERLIST(cached); - const unsigned short *iterlist= RRITERLIST(cached); - for (i=0; i=T_MIN && qtype<=T_MAX) { - if (!add_rrset(ans, sz, allocsz, rrn, qtype, queryts, cached, udp, cb, sva, ar)) - return 0; - } else /* Shouldn't get here. */ - return 0; -#if 0 - if (!ntohs((*ans)->hdr.ancount)) { - /* Add a SOA if we have one and no other records are present in the answer. - * This is to aid caches so that they have a ttl. */ - if (!add_rrset(ans, sz, allocsz, rrn, T_SOA , queryts, cached, udp, cb, sva, ar)) - return 0; - } -#endif - return 1; -} - -/* - * Add an additional - */ -static int add_additional_rr(dns_msg_t **ans, size_t *rlen, size_t *allocsz, - unsigned char *rhn, unsigned tp, time_t ttl, - unsigned dlen, void *data, int sect, unsigned *udp, dlist *cb, dlist *sva) -{ - sva_t *st; - - /* Check if already added; no double additionals */ - for (st=dlist_first(*sva); st; st=dlist_next(st)) { - if (st->tp==tp && rhnicmp(st->nm,rhn) && st->dlen==dlen && - (memcmp(skiprhn(st->nm),data, dlen)==0)) - { - return 1; - } - } - /* add_rr will do nothing when udp!=NULL and sz>*udp. */ - if(!add_rr(ans, rlen, allocsz, rhn, tp, ttl, dlen, data, sect, udp, cb)) - return 0; - /* mark it as added */ - if (!sva_add(sva,rhn,tp,dlen,data)) - return 0; - - return 1; -} - -/* - * Add one or more additionals from an rr bucket. - */ -static int add_additional_rrs(dns_msg_t **ans, size_t *rlen, size_t *allocsz, - unsigned char *rhn, unsigned tp, time_t ttl, - rr_bucket_t *rrb, int sect, unsigned *udp, dlist *cb, dlist *sva) -{ - rr_bucket_t *rr; - rr_bucket_t *first=NULL; /* Initialized to inhibit compiler warning */ - short rnd_recs=global.rnd_recs; - - rr=rrb; - if (rnd_recs) rr=first=randrr(rrb); - - while(rr) { - if (!add_additional_rr(ans, rlen, allocsz, rhn, tp, ttl, rr->rdlen,rr->data, sect, udp, cb, sva)) - return 0; - rr=rr->next; - if (rnd_recs) { - if(!rr) rr=rrb; /* wraparound */ - if(rr==first) break; - } - } - return 1; -} - -/* - * The code below actually handles A and AAAA additionals. - */ -static int add_additional_a(dns_msg_t **ans, size_t *rlen, size_t *allocsz, - unsigned char *rhn, time_t queryts, - unsigned *udp, dlist *cb, dlist *sva) -{ - dns_cent_t *ae; - int retval = 1; - - if ((ae=lookup_cache(rhn,NULL))) { - rr_set_t *rrset; rr_bucket_t *rr; - rrset=getrrset_A(ae); - if (rrset && (rr=rrset->rrs)) - if (!add_additional_rrs(ans, rlen, allocsz, - rhn, T_A, ans_ttl(rrset,queryts), - rr, S_ADDITIONAL, udp, cb, sva)) - retval = 0; - -#if IS_CACHED_AAAA - if(retval) { - rrset=getrrset_AAAA(ae); - if (rrset && (rr=rrset->rrs)) - if (!add_additional_rrs(ans, rlen, allocsz, - rhn, T_AAAA, ans_ttl(rrset,queryts), - rr, S_ADDITIONAL, udp, cb, sva)) - retval = 0; - } -#endif - free_cent(ae DBG1); - pdnsd_free(ae); - } - return retval; -} - -/* - * Compose an answer message for the decoded query in ql, hdr is the header of the dns request - * rlen is set to be the answer length. - * If udp is not NULL, *udp indicates the max length the dns response may have. - */ -static dns_msg_t *compose_answer(llist *ql, dns_hdr_t *hdr, size_t *rlen, edns_info_t *ednsinfo, unsigned *udp, int *rcodep) -{ - unsigned short rcode=RC_OK, aa=1; - dlist cb=NULL; - dlist sva=NULL; - dlist ar=NULL; - time_t queryts=time(NULL); - dns_queryel_t *qe; - dns_msg_t *ans; - size_t allocsz= ALLOCINITIALSIZE; - dns_cent_t *cached; - - ans=(dns_msg_t *)pdnsd_malloc(allocsz); - if (!ans) - goto return_ans; - ans->hdr.id=hdr->id; - ans->hdr.qr=QR_RESP; - ans->hdr.opcode=OP_QUERY; - ans->hdr.aa=0; - ans->hdr.tc=0; /* If tc is needed, it is set when the response is sent in udp_answer_thread. */ - ans->hdr.rd=hdr->rd; - ans->hdr.ra=1; - ans->hdr.z=0; - ans->hdr.ad=0; - ans->hdr.cd=0; - ans->hdr.rcode=rcode; - ans->hdr.qdcount=0; /* this is first filled in and will be modified */ - ans->hdr.ancount=0; - ans->hdr.nscount=0; - ans->hdr.arcount=0; - - *rlen=sizeof(dns_hdr_t); - /* first, add the query to the response */ - for (qe=llist_first(ql); qe; qe=llist_next(qe)) { - unsigned int qclen; - size_t newsz= dnsmsghdroffset + *rlen + rhnlen(qe->query) + 4; - if(newsz > allocsz) { - /* Need to allocate more space. - To avoid frequent reallocs, we allocate - a multiple of a certain chunk size. */ - size_t newallocsz= (newsz+ALLOCCHUNKSIZEMASK)&(~ALLOCCHUNKSIZEMASK); - dns_msg_t *newans=(dns_msg_t *)pdnsd_realloc(ans,newallocsz); - if (!newans) - goto error_ans; - ans=newans; - allocsz=newallocsz; - } - - { - unsigned char *p = ((unsigned char *)&ans->hdr) + *rlen; - /* the first name occurrence will not be compressed, - but the offset needs to be stored for future compressions */ - if (!(qclen=compress_name(qe->query,p,*rlen,&cb))) - goto error_ans; - p += qclen; - PUTINT16(qe->qtype,p); - PUTINT16(qe->qclass,p); - } - *rlen += qclen+4; - ans->hdr.qdcount=htons(ntohs(ans->hdr.qdcount)+1); - } - - /* Barf if we get a query we cannot answer */ - for (qe=llist_first(ql); qe; qe=llist_next(qe)) { - if ((PDNSD_NOT_CACHED_TYPE(qe->qtype) && - (qe->qtype!=QT_MAILB && qe->qtype!=QT_MAILA && qe->qtype!=QT_ALL)) || - (qe->qclass!=C_IN && qe->qclass!=QC_ALL)) - { - DEBUG_MSG("Unsupported QTYPE or QCLASS.\n"); - ans->hdr.rcode=rcode=RC_NOTSUPP; - goto cleanup_return; - } - } - - /* second, the answer section */ - for (qe=llist_first(ql); qe; qe=llist_next(qe)) { - int hops; - unsigned char qname[DNSNAMEBUFSIZE]; - - rhncpy(qname,qe->query); - /* look if we have a cached copy. otherwise, perform a nameserver query. Same with timeout */ - hops=MAX_HOPS; - do { - int rc; - unsigned char c_soa=cundef; - if ((rc=dns_cached_resolve(qname,qe->qtype, &cached, MAX_HOPS,queryts,&c_soa))!=RC_OK) { - ans->hdr.rcode=rcode=rc; - if(rc==RC_NAMEERR) { - if(c_soa!=cundef) { - /* Try to add a SOA record to the authority section. */ - unsigned scnt=rhnsegcnt(qname); - if(c_soaflags&CF_NEGATIVE)) { - rr_bucket_t *rr; - for(rr=rrset->rrs; rr; rr=rr->next) { - if (!add_rr(&ans,rlen,&allocsz,cached->qname,T_SOA,ans_ttl(rrset,queryts), - rr->rdlen,rr->data,S_AUTHORITY,udp,&cb)) - goto error_cached; - } - } - free_cent(cached DBG1); - pdnsd_free(cached); - } - } - - /* Possibly add an OPT pseudo-RR to the additional section. */ - if(ednsinfo) { - if(!add_opt_pseudo_rr(&ans, rlen, &allocsz, global.udpbufsize, rcode, 0,0)) - goto error_ans; - } - } - goto cleanup_return; - } - if(!(cached->flags&DF_LOCAL)) - aa=0; - - if (!add_to_response(&ans,rlen,&allocsz,qname,qe->qtype,queryts,cached,udp,&cb,&sva,&ar)) - goto error_cached; - if (hdr->rd && qe->qtype!=T_CNAME && qe->qtype!=QT_ALL && - !(qe->qtype>=T_MIN && qe->qtype<=T_MAX && have_rr(cached,qe->qtype)) && - follow_cname_chain(cached,qname)) - /* The rd bit is set and the response does not contain records of the requested type, - * but the response does contain a cname, so repeat the inquiry with the cname. - * add_to_response() has already added the cname to the response. - * Because of follow_cname_chain(), qname now contains the last cname in the chain. */ - ; - else { - /* maintain a list (ar) for authority records: We will add every name server that was - listed as authoritative in a reply we received (and only those) to this list. - This list will be used to fill the authority and additional sections of our own reply. - We only do this for the last record in a cname chain, to prevent answer bloat. */ - rr_set_t *rrset; - int rretp=T_NS; - if((qe->qtype>=T_MIN && qe->qtype<=T_MAX && !have_rr(cached,qe->qtype)) || - (qe->qtype==QT_MAILB && !have_rr_MB(cached) && !have_rr_MG(cached) && !have_rr_MR(cached)) || - (qe->qtype==QT_MAILA && !have_rr_MD(cached) && !have_rr_MF(cached))) - { - /* no record of requested type in the answer section. */ - rretp=T_SOA; - } - rrset=getrrset(cached,rretp); - if(rrset && (rrset->flags&CF_NEGATIVE)) - rrset=NULL; - if(!rrset) { - /* Try to find a name server higher up the hierarchy . - */ - dns_cent_t *prev=cached; - unsigned scnt=rhnsegcnt(prev->qname); - unsigned tcnt=(rretp==T_NS?prev->c_ns:prev->c_soa); - if((cached=lookup_cache((tcnt!=cundef && tcntqname,scnt-tcnt):prev->qname,NULL))) { - rrset=getrrset(cached,rretp); - if(rrset && (rrset->flags&CF_NEGATIVE)) - rrset=NULL; - } - if(!rrset && (prev->flags&DF_LOCAL)) { - unsigned char *nm=getlocalowner(prev->qname,rretp); - if(nm) { - if(cached) { - free_cent(cached DBG1); - pdnsd_free(cached); - } - if((cached=lookup_cache(nm,NULL))) - rrset=getrrset(cached,rretp); - } - } - free_cent(prev DBG1); - pdnsd_free(prev); - } - if (rrset) { - rr_bucket_t *rr; - for (rr=rrset->rrs; rr; rr=rr->next) { - if (!add_ar(&ar, rretp, rr->rdlen,rr->data, cached->qname, - ans_ttl(rrset,queryts))) - goto error_cached; - } - } - hops=0; /* this will break the loop */ - } - if(cached) { - free_cent(cached DBG1); - pdnsd_free(cached); - } - } while (--hops>=0); - } - - { - rr_ext_t *rre; - /* Add the authority section */ - for (rre=dlist_first(ar); rre; rre=dlist_next(rre)) { - if (rre->tp == T_NS || rre->tp == T_SOA) { - unsigned char *nm = rre->tnm + rre->tsz; - if (!add_additional_rr(&ans, rlen, &allocsz, - nm, rre->tp, rre->ttl, rre->tsz, rre->tnm, - S_AUTHORITY, udp, &cb, &sva)) - { - goto error_ans; - } - } - } - - /* Add the additional section, but only if we stay within the UDP buffer limit. */ - /* If a pseudo RR doesn't fit, nothing else will. */ - if(!(udp && *rlen+sizeof_opt_pseudo_rr>*udp)) { - - /* Possibly add an OPT pseudo-RR to the additional section. */ - if(ednsinfo) { - if(!add_opt_pseudo_rr(&ans, rlen, &allocsz, global.udpbufsize, rcode, 0,0)) - goto error_ans; - } - - /* now add the name server addresses */ - for (rre=dlist_first(ar); rre; rre=dlist_next(rre)) { - if (rre->tp == T_NS || rre->tp == RRETP_ADD) { - if (!add_additional_a(&ans, rlen, &allocsz, - rre->tnm, queryts, udp, &cb, &sva)) - goto error_ans; - } - } - } - } - if (aa) - ans->hdr.aa=1; - goto cleanup_return; - - /* You may not like goto's, but here we avoid lots of code duplication. */ -error_cached: - free_cent(cached DBG1); - pdnsd_free(cached); -error_ans: - pdnsd_free(ans); - ans=NULL; -cleanup_return: - dlist_free(ar); - dlist_free(sva); - dlist_free(cb); -return_ans: - if(rcodep) *rcodep=rcode; - return ans; -} - -/* - * Decode the query (the query messgage is in data and rlen bytes long) into a dlist. - * XXX: data needs to be aligned. - * The return value can be RC_OK or RC_TRUNC, in which case the (partially) constructed list is - * returned in qp, or something else (RC_FORMAT or RC_SERVFAIL), in which case no list is returned. - * - * *ptrrem will be assigned the address just after the questions sections in the message, and *lenrem - * the remaining message length after the questions section. These values are only meaningful if the - * return value is RC_OK. - */ -static int decode_query(unsigned char *data, size_t rlen, unsigned char **ptrrem, size_t *lenrem, llist *qp) -{ - int i,res=RC_OK; - dns_hdr_t *hdr=(dns_hdr_t *)data; /* aligned, so no prob. */ - unsigned char *ptr=(unsigned char *)(hdr+1); - size_t sz= rlen - sizeof(dns_hdr_t); - uint16_t qdcount=ntohs(hdr->qdcount); - - llist_init(qp); - for (i=0; iqtype,ptr); - GETINT16(qe->qclass,ptr); - sz-=4; - memcpy(qe->query,qbuf,qlen); - } - - if(ptrrem) *ptrrem=ptr; - if(lenrem) *lenrem=sz; - return res; -} - - -/* Scan the additional section of a query message for an OPT pseudo RR. - data and rlen are as in decode_query(). Note in particular that data needs to be aligned! - ptr should point the beginning of the additional section, sz should contain the - length of this remaining part of the message and numrr the number of resource records in the section. - *numopt is incremented with the number of OPT RRs found (should be at most one). - - Note that a return value of RC_OK means the additional section was parsed without errors, not that - an OPT pseudo RR was found! Check the value of *numopt for the latter. - - The structure pointed to by ep is filled with the information of the first OPT pseudo RR found, - but only if *numopt was set to zero before the call. -*/ -static int decode_query_additional(unsigned char *data, size_t rlen, unsigned char *ptr, size_t sz, int numrr, - int *numopt, edns_info_t *ep) -{ - int i, res; - - for (i=0; i0 - if(nmbuf[0]!=0) { - DEBUG_MSG("decode_query_additional: name in OPT record not empty!\n"); - } -#endif - ep->udpsize= class; - ep->rcode= ((uint16_t)ttlp[0]<<4) | ((dns_hdr_t *)data)->rcode; - ep->version= ttlp[1]; - ep->do_flg= (ttlp[2]>>7)&1; -#if DEBUG>0 - if(debug_p) { - unsigned int Zflags= ((uint16_t)ttlp[2]<<8) | ttlp[3]; - if(Zflags & 0x7fff) { - DEBUG_MSG("decode_query_additional: Z field contains unknown nonzero bits (%04x).\n", - Zflags); - } - if(rdlen) { - DEBUG_MSG("decode_query_additional: RDATA field in OPT record not empty!\n"); - } - } -#endif - } - else { - DEBUG_MSG("decode_query_additional: ingnoring surplus OPT record.\n"); - } - } - else { - DEBUG_MSG("decode_query_additional: ignoring record of type %s (%d).\n", - getrrtpname(type), type); - } - - /* Skip RDATA field. */ - sz -= rdlen; - ptr += rdlen; - } - - return RC_OK; -} - -/* Make a dns error reply message - * Id is the query id and still in network order. - * op is the opcode to fill in, rescode - name says it all. - */ -static void mk_error_reply(unsigned short id, unsigned short opcode,unsigned short rescode,dns_hdr_t *rep) -{ - rep->id=id; - rep->qr=QR_RESP; - rep->opcode=opcode; - rep->aa=0; - rep->tc=0; - rep->rd=0; - rep->ra=1; - rep->z=0; - rep->ad=0; - rep->cd=0; - rep->rcode=rescode; - rep->qdcount=0; - rep->ancount=0; - rep->nscount=0; - rep->arcount=0; -} - -/* - * Analyze and answer the query in data. The answer is returned. rlen is at call the query length and at - * return the length of the answer. You have to free the answer after sending it. - */ -static dns_msg_t *process_query(unsigned char *data, size_t *rlenp, unsigned *udp, int *rcodep) -{ - size_t rlen= *rlenp; - int res; - dns_hdr_t *hdr; - llist ql; - dns_msg_t *ans; - edns_info_t ednsinfo= {0}, *ednsinfop= NULL; - - DEBUG_MSG("Received query (msg len=%u).\n", (unsigned int)rlen); - DEBUG_DUMP_DNS_MSG(data, rlen); - - /* - * We will ignore all records that come with a query, except for the actual query records, - * and possible OPT pseudo RRs in the addtional section. - * We will send back the query in the response. We will reject all non-queries, and - * some not supported thingies. - * If anyone notices behaviour that is not in standard conformance, please notify me! - */ - hdr=(dns_hdr_t *)data; - if (rlen<2) { - DEBUG_MSG("Message too short.\n"); - return NULL; /* message too short: no id provided. */ - } - if (rlenqr!=QR_QUERY) { - DEBUG_MSG("The QR bit indicates this is a response, not a query.\n"); - return NULL; /* RFC says: discard */ - } - if (hdr->opcode!=OP_QUERY) { - DEBUG_MSG("Not a standard query (opcode=%u).\n",hdr->opcode); - res=RC_NOTSUPP; - goto error_reply; - } -#if DEBUG>0 - if(debug_p) { - char flgsbuf[DNSFLAGSMAXSTRSIZE]; - dnsflags2str(hdr, flgsbuf); - if(flgsbuf[0]) { - DEBUG_MSG("Flags:%s\n", flgsbuf); - } - } -#endif - if (hdr->z!=0) { - DEBUG_MSG("Malformed query (nonzero Z bit).\n"); - res=RC_FORMAT; - goto error_reply; - } - if (hdr->rcode!=RC_OK) { - DEBUG_MSG("Bad rcode(%u).\n",hdr->rcode); - return NULL; /* discard (may cause error storms) */ - } - - if (hdr->ancount) { - DEBUG_MSG("Query has a non-empty answer section!\n"); - res=RC_FORMAT; - goto error_reply; - } - - if (hdr->nscount) { - DEBUG_MSG("Query has a non-empty authority section!\n"); - res=RC_FORMAT; - goto error_reply; - } - -#if 0 - /* The following only makes sense if we completely disallow - Extension Mechanisms for DNS (RFC 2671). */ - if (hdr->arcount) { - DEBUG_MSG("Query has a non-empty additional section!\n"); - res=RC_FORMAT; - goto error_reply; - } -#endif - { - unsigned char *ptr; - size_t sz; - uint16_t arcount; - res=decode_query(data,rlen,&ptr,&sz,&ql); - if(res!=RC_OK) { - if(res==RC_TRUNC) { - if(!hdr->tc || llist_isempty(&ql)) { - res=RC_FORMAT; - goto free_ql_error_reply; - } - } - else - goto error_reply; - } - - if ((arcount=ntohs(hdr->arcount))) { - int numoptrr= 0; - DEBUG_MSG("Query has a non-empty additional section: " - "checking for OPT pseudo-RR.\n"); - if(res==RC_TRUNC) { - DEBUG_MSG("Additional section cannot be read due to truncation!\n"); - res=RC_FORMAT; - goto free_ql_error_reply; - } - res=decode_query_additional(data,rlen,ptr,sz,arcount, &numoptrr, &ednsinfo); - if(!(res==RC_OK || (res==RC_TRUNC && hdr->tc))) { - res=RC_FORMAT; - goto free_ql_error_reply; - } - if(numoptrr) { -#if DEBUG>0 - if(numoptrr!=1) { - DEBUG_MSG("Additional section in query contains %d OPT pseudo-RRs!\n", numoptrr); - } -#endif - if(ednsinfo.version!=0) { - DEBUG_MSG("Query contains unsupported EDNS version %d!\n", ednsinfo.version); - res=RC_BADVERS; - goto free_ql_error_reply; - } - if(ednsinfo.rcode!=0) { - DEBUG_MSG("Query contains non-zero EDNS rcode (%d)!\n", ednsinfo.rcode); - res=RC_FORMAT; - goto free_ql_error_reply; - } - DEBUG_MSG("Query contains OPT pseudosection: EDNS udp size = %u, flag DO=%u\n", - ednsinfo.udpsize, ednsinfo.do_flg); - ednsinfop = &ednsinfo; - if(udp && ednsinfo.udpsize>UDP_BUFSIZE) { - unsigned udpbufsize = global.udpbufsize; - if(udpbufsize > ednsinfo.udpsize) - udpbufsize = ednsinfo.udpsize; - *udp = udpbufsize; - } - } - } - } - -#if DEBUG>0 - if (debug_p) { - if(!llist_isempty(&ql)) { - dns_queryel_t *qe; - DEBUG_MSG("Questions are:\n"); - for (qe=llist_first(&ql); qe; qe=llist_next(qe)) { - DEBUG_RHN_MSG("\tqc=%s (%u), qt=%s (%u), query=\"%s\"\n", - get_cname(qe->qclass),qe->qclass,get_tname(qe->qtype),qe->qtype,RHN2STR(qe->query)); - } - } - else { - DEBUG_MSG("Query contains no questions.\n"); - } - } -#endif - - if (llist_isempty(&ql)) { - res=RC_FORMAT; - goto error_reply; - } - if (!(ans=compose_answer(&ql, hdr, rlenp, ednsinfop, udp, rcodep))) { - /* An out of memory condition or similar could cause NULL output. Send failure notification */ - res=RC_SERVFAIL; - goto free_ql_error_reply; - } - llist_free(&ql); - return ans; - - free_ql_error_reply: - llist_free(&ql); - error_reply: - *rlenp=sizeof(dns_hdr_t); - { - size_t allocsz = sizeof(dns_msg_t); - if(res&~0xf) - allocsz += sizeof_opt_pseudo_rr; - ans= (dns_msg_t *)pdnsd_malloc(allocsz); - if (ans) { - mk_error_reply(hdr->id,rlen>=3?hdr->opcode:OP_QUERY,res,&ans->hdr); - if(res&~0xf) - add_opt_pseudo_rr(&ans,rlenp,&allocsz, - global.udpbufsize,res,0,0); - } - else if (++da_mem_errs<=MEM_MAX_ERRS) { - log_error("Out of memory in query processing."); - } - } - if(rcodep) *rcodep= res; - return ans; -} - -/* - * Called by *_answer_thread exit handler to clean up process count. - */ -inline static void decrease_procs() -{ - - pthread_mutex_lock(&proc_lock); - procs--; - qprocs--; - pthread_mutex_unlock(&proc_lock); -} - -static void udp_answer_thread_cleanup(void *data) -{ - pdnsd_free(data); - decrease_procs(); -} - -/* - * A thread opened to answer a query transmitted via udp. Data is a pointer to the structure udp_buf_t that - * contains the received data and various other parameters. - * After the query is answered, the thread terminates - * XXX: data must point to a correctly aligned buffer - */ -static void *udp_answer_thread(void *data) -{ - struct msghdr msg; - struct iovec v; - struct cmsghdr *cmsg; -#if defined(SRC_ADDR_DISC) - char ctrl[CMSG_SPACE(sizeof(pkt_info_t))]; -#endif - size_t rlen=((udp_buf_t *)data)->len; - unsigned udpmaxrespsize = UDP_BUFSIZE; - /* XXX: process_query is assigned to this, this mallocs, so this points to aligned memory */ - dns_msg_t *resp; - int rcode; - unsigned thrid; - pthread_cleanup_push(udp_answer_thread_cleanup, data); - THREAD_SIGINIT; - - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - pdnsd_exit(); - } - } - - for(;;) { - pthread_mutex_lock(&proc_lock); - if (procs0 - if(debug_p) { - int err; - if ((err=pthread_setspecific(thrid_key, &thrid)) != 0) { - if(++da_misc_errs<=MISC_MAX_ERRS) - log_error("pthread_setspecific failed: %s",strerror(err)); - /* pdnsd_exit(); */ - } - } -#endif - - if (!(resp=process_query(((udp_buf_t *)data)->buf,&rlen,&udpmaxrespsize,&rcode))) { - /* - * A return value of NULL is a fatal error that prohibits even the sending of an error message. - * logging is already done. Just exit the thread now. - */ - pthread_exit(NULL); /* data freed by cleanup handler */ - } - pthread_cleanup_push(free, resp); - if (rlen>udpmaxrespsize) { - rlen=udpmaxrespsize; - resp->hdr.tc=1; /*set truncated bit*/ - } - DEBUG_MSG("Outbound msg len %li, tc=%u, rc=\"%s\"\n",(long)rlen,resp->hdr.tc,get_ename(rcode)); - - v.iov_base=(char *)&resp->hdr; - v.iov_len=rlen; - msg.msg_iov=&v; - msg.msg_iovlen=1; -#if (TARGET!=TARGET_CYGWIN) -#if defined(SRC_ADDR_DISC) - msg.msg_control=ctrl; - msg.msg_controllen=sizeof(ctrl); -#else - msg.msg_control=NULL; - msg.msg_controllen=0; -#endif - msg.msg_flags=0; /* to avoid warning message by Valgrind */ -#endif - -#ifdef ENABLE_IPV4 - if (run_ipv4) { - - msg.msg_name=&((udp_buf_t *)data)->addr.sin4; - msg.msg_namelen=sizeof(struct sockaddr_in); -# if defined(SRC_ADDR_DISC) -# if (TARGET==TARGET_LINUX) - ((udp_buf_t *)data)->pi.pi4.ipi_spec_dst=((udp_buf_t *)data)->pi.pi4.ipi_addr; - cmsg=CMSG_FIRSTHDR(&msg); - cmsg->cmsg_len=CMSG_LEN(sizeof(struct in_pktinfo)); - cmsg->cmsg_level=SOL_IP; - cmsg->cmsg_type=IP_PKTINFO; - memcpy(CMSG_DATA(cmsg),&((udp_buf_t *)data)->pi.pi4,sizeof(struct in_pktinfo)); - msg.msg_controllen=CMSG_SPACE(sizeof(struct in_pktinfo)); -# else - cmsg=CMSG_FIRSTHDR(&msg); - cmsg->cmsg_len=CMSG_LEN(sizeof(struct in_addr)); - cmsg->cmsg_level=IPPROTO_IP; - cmsg->cmsg_type=IP_RECVDSTADDR; - memcpy(CMSG_DATA(cmsg),&((udp_buf_t *)data)->pi.ai4,sizeof(struct in_addr)); - msg.msg_controllen=CMSG_SPACE(sizeof(struct in_addr)); -# endif -# endif -# if DEBUG>0 - { - char buf[ADDRSTR_MAXLEN]; - - DEBUG_MSG("Answering to: %s", inet_ntop(AF_INET,&((udp_buf_t *)data)->addr.sin4.sin_addr,buf,ADDRSTR_MAXLEN)); -# if defined(SRC_ADDR_DISC) -# if (TARGET==TARGET_LINUX) - DEBUG_MSGC(", source address: %s\n", inet_ntop(AF_INET,&((udp_buf_t *)data)->pi.pi4.ipi_spec_dst,buf,ADDRSTR_MAXLEN)); -# else - DEBUG_MSGC(", source address: %s\n", inet_ntop(AF_INET,&((udp_buf_t *)data)->pi.ai4,buf,ADDRSTR_MAXLEN)); -# endif -# else - DEBUG_MSGC("\n"); -# endif - } -# endif /* DEBUG */ - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - - msg.msg_name=&((udp_buf_t *)data)->addr.sin6; - msg.msg_namelen=sizeof(struct sockaddr_in6); -# if defined(SRC_ADDR_DISC) - cmsg=CMSG_FIRSTHDR(&msg); - cmsg->cmsg_len=CMSG_LEN(sizeof(struct in6_pktinfo)); - cmsg->cmsg_level=SOL_IPV6; - cmsg->cmsg_type=IPV6_PKTINFO; - memcpy(CMSG_DATA(cmsg),&((udp_buf_t *)data)->pi.pi6,sizeof(struct in6_pktinfo)); - msg.msg_controllen=CMSG_SPACE(sizeof(struct in6_pktinfo)); -# endif -# if DEBUG>0 - { - char buf[ADDRSTR_MAXLEN]; - - DEBUG_MSG("Answering to: %s", inet_ntop(AF_INET6,&((udp_buf_t *)data)->addr.sin6.sin6_addr,buf,ADDRSTR_MAXLEN)); -# if defined(SRC_ADDR_DISC) - DEBUG_MSGC(", source address: %s\n", inet_ntop(AF_INET6,&((udp_buf_t *)data)->pi.pi6.ipi6_addr,buf,ADDRSTR_MAXLEN)); -# else - DEBUG_MSGC("\n"); -# endif - } -# endif /* DEBUG */ - } -#endif - - /* Lock the socket, and clear the error flag before dropping the lock */ -#ifdef SOCKET_LOCKING - pthread_mutex_lock(&s_lock); -#endif - if (sendmsg(((udp_buf_t *)data)->sock,&msg,0)<0) { -#ifdef SOCKET_LOCKING - pthread_mutex_unlock(&s_lock); -#endif - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("Error in udp send: %s",strerror(errno)); - } - } else { - int tmp; - socklen_t sl=sizeof(tmp); - getsockopt(((udp_buf_t *)data)->sock, SOL_SOCKET, SO_ERROR, &tmp, &sl); -#ifdef SOCKET_LOCKING - pthread_mutex_unlock(&s_lock); -#endif - } - - pthread_cleanup_pop(1); /* free(resp) */ - pthread_cleanup_pop(1); /* free(data) */ - return NULL; -} - -int init_udp_socket() -{ - int sock; - int so=1; - union { -#ifdef ENABLE_IPV4 - struct sockaddr_in sin4; -#endif -#ifdef ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif - } sin; - socklen_t sinl; - -#ifdef ENABLE_IPV4 - if (run_ipv4) { - if ((sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) { - log_error("Could not open udp socket: %s",strerror(errno)); - return -1; - } - memset(&sin.sin4,0,sizeof(struct sockaddr_in)); - sin.sin4.sin_family=AF_INET; - sin.sin4.sin_port=htons(global.port); - sin.sin4.sin_addr=global.a.ipv4; - SET_SOCKA_LEN4(sin.sin4); - sinl=sizeof(struct sockaddr_in); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - if ((sock=socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP))==-1) { - log_error("Could not open udp socket: %s",strerror(errno)); - return -1; - } - memset(&sin.sin6,0,sizeof(struct sockaddr_in6)); - sin.sin6.sin6_family=AF_INET6; - sin.sin6.sin6_port=htons(global.port); - sin.sin6.sin6_flowinfo=IPV6_FLOWINFO; - sin.sin6.sin6_addr=global.a.ipv6; - SET_SOCKA_LEN6(sin.sin6); - sinl=sizeof(struct sockaddr_in6); - } -#endif - -#ifdef SRC_ADDR_DISC -# if (TARGET!=TARGET_LINUX) - if (run_ipv4) { -# endif - /* The following must be set on any case because it also applies for IPv4 packets sent to - * ipv6 addresses. */ -# if (TARGET==TARGET_LINUX ) - if (setsockopt(sock,SOL_IP,IP_PKTINFO,&so,sizeof(so))!=0) { -# else - if (setsockopt(sock,IPPROTO_IP,IP_RECVDSTADDR,&so,sizeof(so))!=0) { -# endif - log_error("Could not set options on udp socket: %s",strerror(errno)); - close(sock); - return -1; - } -# if (TARGET!=TARGET_LINUX) - } -# endif - -# ifdef ENABLE_IPV6 - if (!run_ipv4) { - if (setsockopt(sock,SOL_IPV6,IPV6_RECVPKTINFO,&so,sizeof(so))!=0) { - log_error("Could not set options on udp socket: %s",strerror(errno)); - close(sock); - return -1; - } - } -# endif -#endif - if (bind(sock,(struct sockaddr *)&sin,sinl)!=0) { - log_error("Could not bind to udp socket: %s",strerror(errno)); - close(sock); - return -1; - } - return sock; -} - -/* - * Listen on the specified port for udp packets and answer them (each in a new thread to be nonblocking) - * This was changed to support sending UDP packets with exactly the same source address as they were coming - * to us, as required by rfc2181. Although this is a sensible requirement, it is slightly more difficult - * and may introduce portability issues. - */ -void *udp_server_thread(void *dummy) -{ - int sock; - ssize_t qlen; - pthread_t pt; - udp_buf_t *buf; - struct msghdr msg; - struct iovec v; - struct cmsghdr *cmsg; - char ctrl[512]; -#if defined(ENABLE_IPV6) && (TARGET==TARGET_LINUX) - struct in_pktinfo sip; -#endif - /* (void)dummy; */ /* To inhibit "unused variable" warning */ - - THREAD_SIGINIT; - - - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - pdnsd_exit(); - } - } - - sock=udp_socket; - - while (1) { - int udpbufsize= global.udpbufsize; - if (!(buf=(udp_buf_t *)pdnsd_calloc(1,sizeof(udp_buf_t)+udpbufsize))) { - if (++da_mem_errs<=MEM_MAX_ERRS) { - log_error("Out of memory in request handling."); - } - break; - } - - buf->sock=sock; - - v.iov_base=(char *)buf->buf; - v.iov_len=udpbufsize; - msg.msg_iov=&v; - msg.msg_iovlen=1; -#if (TARGET!=TARGET_CYGWIN) - msg.msg_control=ctrl; - msg.msg_controllen=sizeof(ctrl); -#endif - -#if defined(SRC_ADDR_DISC) -# ifdef ENABLE_IPV4 - if (run_ipv4) { - msg.msg_name=&buf->addr.sin4; - msg.msg_namelen=sizeof(struct sockaddr_in); - if ((qlen=recvmsg(sock,&msg,0))>=0) { - cmsg=CMSG_FIRSTHDR(&msg); - while(cmsg) { -# if (TARGET==TARGET_LINUX) - if (cmsg->cmsg_level==SOL_IP && cmsg->cmsg_type==IP_PKTINFO) { - memcpy(&buf->pi.pi4,CMSG_DATA(cmsg),sizeof(struct in_pktinfo)); - break; - } -# else - if (cmsg->cmsg_level==IPPROTO_IP && cmsg->cmsg_type==IP_RECVDSTADDR) { - memcpy(&buf->pi.ai4,CMSG_DATA(cmsg),sizeof(buf->pi.ai4)); - break; - } -# endif - cmsg=CMSG_NXTHDR(&msg,cmsg); - } - if (!cmsg) { - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("Could not discover udp destination address"); - } - goto free_buf_continue; - } - } else if (errno!=EINTR) { - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("error in UDP recv: %s", strerror(errno)); - } - } - } -# endif -# ifdef ENABLE_IPV6 - ELSE_IPV6 { - msg.msg_name=&buf->addr.sin6; - msg.msg_namelen=sizeof(struct sockaddr_in6); - if ((qlen=recvmsg(sock,&msg,0))>=0) { - cmsg=CMSG_FIRSTHDR(&msg); - while(cmsg) { - if (cmsg->cmsg_level==SOL_IPV6 && cmsg->cmsg_type==IPV6_PKTINFO) { - memcpy(&buf->pi.pi6,CMSG_DATA(cmsg),sizeof(struct in6_pktinfo)); - break; - } - cmsg=CMSG_NXTHDR(&msg,cmsg); - } - if (!cmsg) { - /* We might have an IPv4 Packet incoming on our IPv6 port, so we also have to - * check for IPv4 sender addresses */ - cmsg=CMSG_FIRSTHDR(&msg); - while(cmsg) { -# if (TARGET==TARGET_LINUX) - if (cmsg->cmsg_level==SOL_IP && cmsg->cmsg_type==IP_PKTINFO) { - memcpy(&sip,CMSG_DATA(cmsg),sizeof(sip)); - IPV6_MAPIPV4(&sip.ipi_addr,&buf->pi.pi6.ipi6_addr); - buf->pi.pi6.ipi6_ifindex=sip.ipi_ifindex; - break; - } - /* FIXME: What about BSD? probably ok, but... */ -# endif - cmsg=CMSG_NXTHDR(&msg,cmsg); - } - if (!cmsg) { - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("Could not discover udp destination address"); - } - goto free_buf_continue; - } - } - } else if (errno!=EINTR) { - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("error in UDP recv: %s", strerror(errno)); - } - } - } -# endif -#else /* !SRC_ADDR_DISC */ -# ifdef ENABLE_IPV4 - if (run_ipv4) { - msg.msg_name=&buf->addr.sin4; - msg.msg_namelen=sizeof(struct sockaddr_in); - } -# endif -# ifdef ENABLE_IPV6 - ELSE_IPV6 { - msg.msg_name=&buf->addr.sin6; - msg.msg_namelen=sizeof(struct sockaddr_in6); - } -# endif - qlen=recvmsg(sock,&msg,0); - if (qlen<0 && errno!=EINTR) { - if (++da_udp_errs<=UDP_MAX_ERRS) { - log_error("error in UDP recv: %s", strerror(errno)); - } - } -#endif /* SRC_ADDR_DISC */ - - if (qlen>=0) { - pthread_mutex_lock(&proc_lock); - if (qprocslen=qlen; - err=pthread_create(&pt,&attr_detached,udp_answer_thread,(void *)buf); - if(err==0) - continue; - if(++da_thrd_errs<=THRD_MAX_ERRS) - log_warn("pthread_create failed: %s",strerror(err)); - /* If thread creation failed, free resources associated with it. */ - pthread_mutex_lock(&proc_lock); - --qprocs; --spawned; - } - ++dropped; - pthread_mutex_unlock(&proc_lock); - } - free_buf_continue: - pdnsd_free(buf); - usleep_r(50000); - } - - udp_socket=-1; - close(sock); - udps_thrid=main_thrid; - if (tcp_socket==-1) - pdnsd_exit(); - return NULL; -} - -#ifndef NO_TCP_SERVER - -static void tcp_answer_thread_cleanup(void *csock) -{ - close(*((int *)csock)); - pdnsd_free(csock); - decrease_procs(); -} - -/* - * Process a dns query via tcp. The argument is a pointer to the socket. - */ -static void *tcp_answer_thread(void *csock) -{ - /* XXX: This should be OK, the original must be (and is) aligned */ - int sock=*((int *)csock); - unsigned thrid; - - pthread_cleanup_push(tcp_answer_thread_cleanup, csock); - THREAD_SIGINIT; - - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - pdnsd_exit(); - } - } - - for(;;) { - pthread_mutex_lock(&proc_lock); - if (procs0 - if(debug_p) { - int err; - if ((err=pthread_setspecific(thrid_key, &thrid)) != 0) { - if(++da_misc_errs<=MISC_MAX_ERRS) - log_error("pthread_setspecific failed: %s",strerror(err)); - /* pdnsd_exit(); */ - } - } -#endif -#ifdef TCP_SUBSEQ - - /* rfc1035 says we should process multiple queries in succession, so we are looping until - * the socket is closed by the other side or by tcp timeout. - * This in fact makes DoSing easier. If that is your concern, you should disable pdnsd's - * TCP server.*/ - for(;;) -#endif - { - int rlen,olen; - size_t nlen; - unsigned char *buf; - dns_msg_t *resp; - -#ifdef NO_POLL - fd_set fds; - struct timeval tv; - FD_ZERO(&fds); - PDNSD_ASSERT(sock=2) { /* We need the id to send a valid reply. */ - dns_msg_t err; - mk_error_reply(((dns_hdr_t*)buf)->id, - olen>=3?((dns_hdr_t*)buf)->opcode:OP_QUERY, - RC_FORMAT, - &err.hdr); - err.len=htons(sizeof(dns_hdr_t)); - write_all(sock,&err,sizeof(err)); /* error anyway. */ - } - pthread_exit(NULL); /* buf freed and socket closed by cleanup handlers */ - } - olen += rv; - } - nlen=rlen; - if (!(resp=process_query(buf,&nlen,NULL,NULL))) { - /* - * A return value of NULL is a fatal error that prohibits even the sending of an error message. - * logging is already done. Just exit the thread now. - */ - pthread_exit(NULL); - } - pthread_cleanup_pop(1); /* free(buf) */ - pthread_cleanup_push(free,resp); - { - int err; size_t rsize; - resp->len=htons(nlen); - rsize=dnsmsghdroffset+nlen; - if ((err=write_all(sock,resp,rsize))!=rsize) { - DEBUG_MSG("Error while writing to TCP client: %s\n",err==-1?strerror(errno):"unknown error"); - pthread_exit(NULL); /* resp is freed and socket is closed by cleanup handlers */ - } - } - pthread_cleanup_pop(1); /* free(resp) */ - } - - /* socket is closed by cleanup handler */ - pthread_cleanup_pop(1); - return NULL; -} - -int init_tcp_socket() -{ - int sock; - union { -#ifdef ENABLE_IPV4 - struct sockaddr_in sin4; -#endif -#ifdef ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif - } sin; - socklen_t sinl; - -#ifdef ENABLE_IPV4 - if (run_ipv4) { - if ((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))==-1) { - log_error("Could not open tcp socket: %s",strerror(errno)); - return -1; - } - memset(&sin.sin4,0,sizeof(struct sockaddr_in)); - sin.sin4.sin_family=AF_INET; - sin.sin4.sin_port=htons(global.port); - sin.sin4.sin_addr=global.a.ipv4; - SET_SOCKA_LEN4(sin.sin4); - sinl=sizeof(struct sockaddr_in); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - if ((sock=socket(PF_INET6,SOCK_STREAM,IPPROTO_TCP))==-1) { - log_error("Could not open tcp socket: %s",strerror(errno)); - return -1; - } - memset(&sin.sin6,0,sizeof(struct sockaddr_in6)); - sin.sin6.sin6_family=AF_INET6; - sin.sin6.sin6_port=htons(global.port); - sin.sin6.sin6_flowinfo=IPV6_FLOWINFO; - sin.sin6.sin6_addr=global.a.ipv6; - SET_SOCKA_LEN6(sin.sin6); - sinl=sizeof(struct sockaddr_in6); - } -#endif - { - int so=1; - /* The SO_REUSEADDR socket option tells the kernel that even if this port - is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it - is busy, but with another state, we should get an address already in - use error. It is useful if pdnsd is shut down, and then restarted right - away while sockets are still active on its port. There is a slight risk - though. If unexpected data comes in, it may confuse pdnsd, but while - this is possible, it is not likely. - */ - if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&so,sizeof(so))) - log_warn("Could not set options on tcp socket: %s",strerror(errno)); - } - if (bind(sock,(struct sockaddr *)&sin,sinl)) { - log_error("Could not bind tcp socket: %s",strerror(errno)); - close(sock); - return -1; - } - return sock; -} - -/* - * Listen on the specified port for tcp connects and answer them (each in a new thread to be nonblocking) - */ -void *tcp_server_thread(void *p) -{ - int sock; - pthread_t pt; - int *csock; - - /* (void)p; */ /* To inhibit "unused variable" warning */ - - THREAD_SIGINIT; - - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - pdnsd_exit(); - } - } - - sock=tcp_socket; - - if (listen(sock,5)) { - if (++da_tcp_errs<=TCP_MAX_ERRS) { - log_error("Could not listen on tcp socket: %s",strerror(errno)); - } - goto close_sock_return; - } - - while (1) { - if (!(csock=(int *)pdnsd_malloc(sizeof(int)))) { - if (++da_mem_errs<=MEM_MAX_ERRS) { - log_error("Out of memory in request handling."); - } - break; - } - if ((*csock=accept(sock,NULL,0))==-1) { - if (errno!=EINTR && ++da_tcp_errs<=TCP_MAX_ERRS) { - log_error("tcp accept failed: %s",strerror(errno)); - } - } else { - /* - * With creating a new thread, we follow recommendations - * in rfc1035 not to block - */ - pthread_mutex_lock(&proc_lock); - if (qprocs. -*/ - - -#ifndef DNS_ANSWER_H -#define DNS_ANSWER_H - -#include - -/* --- from main.c */ -extern pthread_t main_thrid,servstat_thrid,statsock_thrid,tcps_thrid,udps_thrid; -extern volatile int tcp_socket; -extern volatile int udp_socket; -/* --- */ - -int init_udp_socket(void); -int init_tcp_socket(void); -void start_dns_servers(void); -int report_thread_stat(int f); - -#endif diff --git a/jni/pdnsd/src/dns_query.c b/jni/pdnsd/src/dns_query.c deleted file mode 100644 index 0b6c9c04..00000000 --- a/jni/pdnsd/src/dns_query.c +++ /dev/null @@ -1,3798 +0,0 @@ -/* dns_query.c - Execute outgoing dns queries and write entries to cache - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#ifdef HAVE_SYS_POLL_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include "list.h" -#include "consts.h" -#include "ipvers.h" -#include "dns_query.h" -#include "cache.h" -#include "dns.h" -#include "conff.h" -#include "servers.h" -#include "helpers.h" -#include "netdev.h" -#include "error.h" -#include "debug.h" - - -#if defined(NO_TCP_QUERIES) && M_PRESET!=UDP_ONLY -# error "You may not define NO_TCP_QUERIES when M_PRESET is not set to UDP_ONLY" -#endif -#if defined(NO_UDP_QUERIES) && M_PRESET!=TCP_ONLY -# error "You may not define NO_UDP_QUERIES when M_PRESET is not set to TCP_ONLY" -#endif - -/* data type to hold lists of IP addresses (both v4 and v6) - The allocated size should be: - sizeof(rejectlist_t) + na4*sizeof(addr4maskpair_t) + na6*sizeof(addr6maskpair_t) -*/ -typedef struct rejectlist_s { - struct rejectlist_s *next; - short policy; - short inherit; - int na4; -#if ALLOW_LOCAL_AAAA - int na6; - addr6maskpair_t rdata[0]; /* dummy array for alignment */ -#else - addr4maskpair_t rdata[0]; -#endif -} rejectlist_t; - -/* --- structures and state constants for parallel query */ -typedef struct { - union { -#ifdef ENABLE_IPV4 - struct sockaddr_in sin4; -#endif -#ifdef ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif - } a; -#ifdef ENABLE_IPV6 - struct in_addr a4fallback; -#endif - time_t timeout; - unsigned short flags; - short state; - short qm; - char nocache; - char auth_serv; - char lean_query; - char edns_query; - char needs_testing; - char trusted; - char aa; - char tc; - char ra; - char failed; - const unsigned char *nsdomain; - rejectlist_t *rejectlist; - /* internal state for p_exec_query */ - int sock; -#if 0 - dns_cent_t nent; - dns_cent_t servent; -#endif - unsigned short transl; - unsigned short recvl; -#ifndef NO_TCP_QUERIES - int iolen; /* number of bytes written or read up to now */ -#endif - dns_msg_t *msg; - dns_hdr_t *recvbuf; - unsigned short myrid; - int s_errno; -} query_stat_t; -typedef DYNAMIC_ARRAY(query_stat_t) *query_stat_array; - -/* Some macros for handling data in reject lists - Perhaps we should use inline functions instead of macros. -*/ -#define have_rejectlist(st) ((st)->rejectlist!=NULL) -#define inherit_rejectlist(st) ((st)->rejectlist && (st)->rejectlist->inherit) -#define reject_policy(st) ((st)->rejectlist->policy) -#define nreject_a4(st) ((st)->rejectlist->na4) -#if ALLOW_LOCAL_AAAA -#define nreject_a6(st) ((st)->rejectlist->na6) -#define rejectlist_a6(st) ((addr6maskpair_t *)(st)->rejectlist->rdata) -#define rejectlist_a4(st) ((addr4maskpair_t *)(rejectlist_a6(st)+nreject_a6(st))) -#else -#define rejectlist_a4(st) ((addr4maskpair_t *)(st)->rejectlist->rdata) -#endif - -#define QS_INITIAL 0 /* This is the initial state. Set this before starting. */ - -#define QS_TCPINITIAL 1 /* Start a TCP query. */ -#define QS_TCPWRITE 2 /* Waiting to write data. */ -#define QS_TCPREAD 3 /* Waiting to read data. */ - -#define QS_UDPINITIAL 4 /* Start a UDP query */ -#define QS_UDPRECEIVE 5 /* UDP query transmitted, waiting for response. */ - -#define QS_QUERY_CASES case QS_TCPINITIAL: case QS_TCPWRITE: case QS_TCPREAD: case QS_UDPINITIAL: case QS_UDPRECEIVE - -#define QS_CANCELED 7 /* query was started, but canceled before completion */ -#define QS_DONE 8 /* done, resources freed, result is in stat_t */ - - -/* Events to be polled/selected for */ -#define QS_WRITE_CASES case QS_TCPWRITE -#define QS_READ_CASES case QS_TCPREAD: case QS_UDPRECEIVE - -/* - * This is for error handling to prevent spewing the log files. - * Races do not really matter here, so no locks. - */ -#define MAXPOLLERRS 10 -static volatile unsigned long poll_errs=0; - -#define SOCK_ADDR(p) ((struct sockaddr *) &(p)->a) - -#ifdef SIN_LEN -#undef SIN_LEN -#endif - -#define SIN_LEN SEL_IPVER(sizeof(struct sockaddr_in),sizeof(struct sockaddr_in6)) -#define PDNSD_A(p) SEL_IPVER(((pdnsd_a *) &(p)->a.sin4.sin_addr),((pdnsd_a *) &(p)->a.sin6.sin6_addr)) - -#ifndef EWOULDBLOCK -#define EWOULDBLOCK EAGAIN -#endif - -typedef DYNAMIC_ARRAY(dns_cent_t) *dns_cent_array; - - -/* - * Take the data from an RR and add it to an array of cache entries. - * The return value will be RC_OK in case of success, - * RC_SERVFAIL in case there is a problem with inconsistent ttl timestamps - * or RC_FATALERR in case of a memory allocation failure. - */ -static int rr_to_cache(dns_cent_array *centa, unsigned char *oname, int tp, time_t ttl, - unsigned dlen, void *data, unsigned flags, time_t queryts) -{ - int i,n; - dns_cent_t *cent; - - n=DA_NEL(*centa); - for(i=0;iqname,oname)) { - int retval=RC_OK; - /* We already have an entry in the array for this name. add_cent_rr is sufficient. - However, make sure there are no double records. This is done by add_cent_rr */ -#ifdef RFC2181_ME_HARDER - rr_set_t *rrset= getrrset(cent,tp); - if (rrset && rrset->ttl!=ttl) - retval= RC_SERVFAIL; -#endif - return add_cent_rr(cent,tp,ttl,queryts,flags,dlen,data DBG1)? retval: RC_FATALERR; - } - } - - /* Add a new entry to the array for this name. */ - if (!(*centa=DA_GROW1_F(*centa,free_cent0))) - return RC_FATALERR; - cent=&DA_LAST(*centa); - if (!init_cent(cent,oname, 0, 0, 0 DBG1)) { - *centa=DA_RESIZE(*centa,n); - return RC_FATALERR; - } - return add_cent_rr(cent,tp,ttl,queryts,flags,dlen,data DBG1)? RC_OK: RC_FATALERR; -} - -/* - * Takes a pointer (ptr) to a buffer with recnum rrs,decodes them and enters - * them into an array of cache entries. *ptr is modified to point after the last - * rr, and *lcnt is decremented by the size of the rrs. - * - * *numopt is incremented with the number of OPT pseudo RRs found (should be at most one). - * The structure pointed to by ep is filled with the information of the first OPT pseudo RR found, - * but only if *numopt was set to zero before the call. - * - * The return value will be either RC_OK (which indicates success), - * or one of the failure codes RC_FORMAT, RC_TRUNC, RC_SERVFAIL or RC_FATALERR - * (the latter indicates a memory allocation failure). -*/ -static int rrs2cent(unsigned char *msg, size_t msgsz, unsigned char **ptr, size_t *lcnt, int recnum, - unsigned flags, time_t queryts, dns_cent_array *centa, int *numopt, edns_info_t *ep) -{ - int rc, retval=RC_OK; - int i; - uint16_t type,class; uint32_t ttl; uint16_t rdlength; - - for (i=0;i0 - if(oname[0]!=0) { - DEBUG_MSG("rrs2cent: name in OPT record not empty!\n"); - } -#endif - ep->udpsize= class; - ep->rcode= ((uint16_t)ttlp[0]<<4) | ((dns_hdr_t *)msg)->rcode; - ep->version= ttlp[1]; - ep->do_flg= (ttlp[2]>>7)&1; -#if DEBUG>0 - if(debug_p) { - unsigned int Zflags= ((uint16_t)ttlp[2]<<8) | ttlp[3]; - if(Zflags & 0x7fff) { - DEBUG_MSG("rrs2cent: Z field contains unknown nonzero bits (%04x).\n", - Zflags); - } - } - if(rdlength) { - DEBUG_MSG("rrs2cent: RDATA field in OPT record not empty!\n"); - } -#endif - } - else { - DEBUG_MSG("rrs2cent: ingnoring surplus OPT record.\n"); - } - } - else if (!(PDNSD_NOT_CACHED_TYPE(type) || class!=C_IN)) { - /* Some types contain names that may be compressed, so these need to be processed. - * The other records are taken as they are. */ - - size_t blcnt=rdlength; - unsigned char *bptr=*ptr; /* make backup for decompression, because rdlength is the - authoritative record length and pointer and size will be - modified by decompress_name. */ - unsigned char *nptr; - unsigned int slen; - - switch (type) { - case T_A: - /* Validate types we use internally */ - if(rdlength!=4) goto invalid_length; - goto default_case; - - case T_CNAME: - case T_MB: - case T_MD: - case T_MF: - case T_MG: - case T_MR: - case T_NS: - case T_PTR: - { - unsigned char db[DNSNAMEBUFSIZE]; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, db, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, len, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; - -#if IS_CACHED_MINFO || IS_CACHED_RP -#if IS_CACHED_MINFO - case T_MINFO: -#endif -#if IS_CACHED_RP - case T_RP: -#endif - { - unsigned char db[DNSNAMEBUFSIZE+DNSNAMEBUFSIZE]; - nptr=db; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /* PDNSD_ASSERT(len + DNSNAMEBUFSIZE <= sizeof(db), "T_MINFO/T_RP: buffer limit reached"); */ - nptr+=len; - slen=len; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /*nptr+=len;*/ - slen+=len; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif - case T_MX: -#if IS_CACHED_AFSDB - case T_AFSDB: -#endif -#if IS_CACHED_RT - case T_RT: -#endif -#if IS_CACHED_KX - case T_KX: -#endif - { - unsigned char db[2+DNSNAMEBUFSIZE]; - if (blcnt<2) - goto record_too_short; - memcpy(db,bptr,2); /* copy the preference field*/ - blcnt-=2; - bptr+=2; - nptr=db+2; - slen=2; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /*nptr+=len;*/ - slen+=len; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; - - case T_SOA: - { - unsigned char db[DNSNAMEBUFSIZE+DNSNAMEBUFSIZE+20]; - nptr=db; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /* PDNSD_ASSERT(len + DNSNAMEBUFSIZE <= sizeof(db), "T_SOA: buffer limit reached"); */ - nptr+=len; - slen=len; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - nptr+=len; - slen+=len; - /* PDNSD_ASSERT(slen + 20 <= sizeof(db), "T_SOA: buffer limit reached"); */ - if (blcnt<20) - goto record_too_short; - memcpy(nptr,bptr,20); /*copy the rest of the SOA record*/ - blcnt-=20; - slen+=20; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#if IS_CACHED_AAAA - case T_AAAA: - /* Validate types we use internally */ - if(rdlength!=16) goto invalid_length; - goto default_case; -#endif -#if IS_CACHED_PX - case T_PX: - { - unsigned char db[2+DNSNAMEBUFSIZE+DNSNAMEBUFSIZE]; - if (blcnt<2) - goto record_too_short; - memcpy(db,bptr,2); /* copy the preference field*/ - blcnt-=2; - bptr+=2; - nptr=db+2; - slen=2; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /* PDNSD_ASSERT(len + DNSNAMEBUFSIZE <= sizeof(db), "T_PX: buffer limit reached"); */ - nptr+=len; - slen+=len; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /* nptr+=len; */ - slen+=len; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif -#if IS_CACHED_SRV - case T_SRV: - { - unsigned char db[6+DNSNAMEBUFSIZE]; - if (blcnt<6) - goto record_too_short; - memcpy(db,bptr,6); - blcnt-=6; - bptr+=6; - nptr=db+6; - slen=6; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /*nptr+=len;*/ - slen+=len; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif -#if IS_CACHED_NXT - case T_NXT: - { - unsigned char db[1040]; - nptr=db; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - nptr+=len; - slen=len+blcnt; - if (slen > sizeof(db)) - goto buffer_overflow; - memcpy(nptr,bptr,blcnt); - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif -#if IS_CACHED_NAPTR - case T_NAPTR: - { - int j; - unsigned char db[4 + 3*256 + DNSNAMEBUFSIZE]; - nptr=db; - /* - * After the preference field, three text strings follow, the maximum length being 255 - * characters for each (this is ensured by the type of *bptr), plus one length byte for - * each, so 3 * 256 = 786 in total. In addition, the name below is up to DNSNAMEBUFSIZE characters - * in size, and the preference field is another 4 bytes in size, so the total length - * that can be taken up is 1028 characters. This means that the whole record will always - * fit into db. - */ - len=4; /* also copy the preference field*/ - for (j=0;j<3;j++) { - if (len>=blcnt) - goto record_too_short; - len += ((unsigned)bptr[len])+1; - } - if(len>blcnt) - goto record_too_short; - memcpy(nptr,bptr,len); - blcnt-=len; - bptr+=len; - nptr+=len; - slen=len; - - /* PDNSD_ASSERT(slen+DNSNAMEBUFSIZE <= sizeof(db), "T_NAPTR: buffer limit reached (name)"); */ - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nptr, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - /*nptr+=len;*/ - slen+=len; - if (blcnt!=0) - goto trailing_junk; - if ((rc=rr_to_cache(centa, oname, type, ttl, slen, db, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif -#if IS_CACHED_IPSECKEY - case T_IPSECKEY: - { - unsigned gwtp; - /* An IPSECKEY record can contain a domain name, so we do some sanity checks just to be sure. */ - if(blcnt<3) goto record_too_short; - gwtp= bptr[1]; - blcnt -= 3; - bptr += 3; - switch(gwtp) { - case 0: goto default_case; - case 1: /* There should be enough room for IPv4 address. */ - if(blcnt<4) goto record_too_short; - goto default_case; - case 2: /* There should be enough room for IPv6 address. */ - if(blcnt<16) goto record_too_short; - goto default_case; - case 3: /* Check that domain name is not compressed. */ - if(isnormalencdomname(bptr,blcnt)) goto default_case; - /* It appears the name is compressed even though RFC 4025 - says it shouldn't be. For the sake of flexibility, we - try to decompress it anyway. */ - { - unsigned char *rbuf, nmbuf[DNSNAMEBUFSIZE]; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nmbuf, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - slen=3+len+blcnt; - rbuf=malloc(slen); - if(!rbuf) return RC_FATALERR; - nptr=mempcpy(rbuf,*ptr,3); - nptr=mempcpy(nptr,nmbuf,len); - memcpy(nptr,bptr,blcnt); - rc=rr_to_cache(centa, oname, type, ttl, slen, rbuf, flags,queryts); - free(rbuf); - if(rc!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; - default: - DEBUG_MSG("rrs2cent: %s record contains unsupported gateway type (%u).\n",getrrtpname(type),gwtp); - return RC_FORMAT; - } - } - break; -#endif -#if IS_CACHED_RRSIG - case T_RRSIG: - /* An RRSIG record contains a domain name, so we do some sanity checks just to be sure. */ - if(blcnt<18) goto record_too_short; - blcnt -= 18; - bptr += 18; - if(isnormalencdomname(bptr,blcnt)) goto default_case; - /* It appears the name is compressed even though RFC 4034 - says it shouldn't be. For the sake of flexibility, we - try to decompress it anyway. */ - { - unsigned char *rbuf, nmbuf[DNSNAMEBUFSIZE]; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nmbuf, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - slen=18+len+blcnt; - rbuf=malloc(slen); - if(!rbuf) return RC_FATALERR; - nptr=mempcpy(rbuf,*ptr,18); - nptr=mempcpy(nptr,nmbuf,len); - memcpy(nptr,bptr,blcnt); - rc=rr_to_cache(centa, oname, type, ttl, slen, rbuf, flags,queryts); - free(rbuf); - if(rc!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif -#if IS_CACHED_NSEC - case T_NSEC: - /* An NSEC record contains a domain name, so we do some sanity checks just to be sure. */ - if(isnormalencdomname(bptr,blcnt)) goto default_case; - /* It appears the name is compressed even though RFC 4034 - says it shouldn't be. For the sake of flexibility, we - try to decompress it anyway. */ - { - unsigned char *rbuf, nmbuf[DNSNAMEBUFSIZE]; - if ((rc=decompress_name(msg, msgsz, &bptr, &blcnt, nmbuf, &len))!=RC_OK) - return rc==RC_TRUNC?RC_FORMAT:rc; - slen=len+blcnt; - rbuf=malloc(slen); - if(!rbuf) return RC_FATALERR; - nptr=mempcpy(rbuf,nmbuf,len); - memcpy(nptr,bptr,blcnt); - rc=rr_to_cache(centa, oname, type, ttl, slen, rbuf, flags,queryts); - free(rbuf); - if(rc!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - break; -#endif - default: - default_case: - if ((rc=rr_to_cache(centa, oname, type, ttl, rdlength, *ptr, flags,queryts))!=RC_OK) { - if(rc==RC_FATALERR) - return rc; - retval=rc; - } - } - } - else { - /* skip otherwise */ - DEBUG_MSG("rrs2cent: ignoring record of type %s (%d), class %s (%d).\n", - getrrtpname(type), type, - class==C_IN?"IN":"[unknown]", class); - } - - *lcnt -= rdlength; - *ptr += rdlength; - } - return retval; - - trailing_junk: - DEBUG_MSG("rrs2cent: %s record has trailing junk.\n",getrrtpname(type)); - return RC_FORMAT; - - record_too_short: - DEBUG_MSG("rrs2cent: %s record too short.\n",getrrtpname(type)); - return RC_FORMAT; - - buffer_overflow: - DEBUG_MSG("rrs2cent: buffer too small to process %s record.\n",getrrtpname(type)); - return RC_FORMAT; - - invalid_length: - DEBUG_MSG("rrs2cent: %s record has length %u.\n",getrrtpname(type),rdlength); - return RC_FORMAT; -} - -/* - * Try to bind the socket to a port in the given port range. Returns 1 on success, or 0 on failure. - */ -static int bind_socket(int s) -{ - int query_port_start=global.query_port_start,query_port_end=global.query_port_end; - - /* - * -1, as a special value for query_port_start, denotes that we let the kernel select - * a port when we first use the socket, which used to be the default. - */ - if (query_port_start >= 0) { - union { -#ifdef ENABLE_IPV4 - struct sockaddr_in sin4; -#endif -#ifdef ENABLE_IPV6 - struct sockaddr_in6 sin6; -#endif - } sin; - socklen_t sinl; - int prt, pstart, range = query_port_end-query_port_start+1, m=0xffff; - unsigned try1,try2, maxtry2; - - if (range<=0 || range>0x10000) { - log_warn("Illegal port range in %s line %d, dropping query!\n",__FILE__,__LINE__); - return 0; - } - if(range<=0x8000) { - /* Find the smallest power of 2 >= range. */ - for(m=1; m= range. */ - for(try1=0;;) { - prt= get_rand16()&m; - if(prt=0x10000) { - log_warn("Cannot get random number < range" - " after %d tries in %s line %d," - " bad random number generator?\n", - try1,__FILE__,__LINE__); - return 0; - } - } - prt += query_port_start; - - for(pstart=prt;;) { -#ifdef ENABLE_IPV4 - if (run_ipv4) { - memset(&sin.sin4,0,sizeof(struct sockaddr_in)); - sin.sin4.sin_family=AF_INET; - sin.sin4.sin_port=htons(prt); - sin.sin4.sin_addr=global.out_a.ipv4; - SET_SOCKA_LEN4(sin.sin4); - sinl=sizeof(struct sockaddr_in); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - memset(&sin.sin6,0,sizeof(struct sockaddr_in6)); - sin.sin6.sin6_family=AF_INET6; - sin.sin6.sin6_port=htons(prt); - sin.sin6.sin6_flowinfo=IPV6_FLOWINFO; - sin.sin6.sin6_addr=global.out_a.ipv6; - SET_SOCKA_LEN6(sin.sin6); - sinl=sizeof(struct sockaddr_in6); - } -#endif - if (bind(s,(struct sockaddr *)&sin,sinl)==-1) { - if (errno!=EADDRINUSE && - errno!=EADDRNOTAVAIL) { /* EADDRNOTAVAIL should not happen here... */ - log_warn("Could not bind to socket: %s\n", strerror(errno)); - return 0; - } - /* If the address is in use, we continue. */ - } else - goto done; - - if(++try2>=maxtry2) { - /* It is possible we missed the free ports by chance, - try scanning the whole range. */ - if (++prt>query_port_end) - prt=query_port_start; - if (prt==pstart) { - /* Wrapped around, scanned the whole range. Give up. */ - log_warn("Out of ports in the range" - " %d-%d, dropping query!\n", - query_port_start,query_port_end); - return 0; - } - } - else /* Try new random number */ - break; - } - } - } -done: - return 1; -} - - -inline static void *realloc_or_cleanup(void *ptr,size_t size) -{ - void *retval=pdnsd_realloc(ptr,size); - if(!retval) - pdnsd_free(ptr); - return retval; -} - -#if defined(NO_TCP_QUERIES) -# define USE_UDP(st) 1 -#elif defined(NO_UDP_QUERIES) -# define USE_UDP(st) 0 -#else /* !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) */ -# define USE_UDP(st) ((st)->qm==UDP_ONLY || (st)->qm==UDP_TCP) - -/* These functions will be used in case a TCP query might fail and we want to try again using UDP. */ - -# define tentative_tcp_query(st) ((st)->qm==TCP_UDP && ((st)->state==QS_TCPWRITE || ((st)->state==QS_TCPREAD && (st)->iolen==0))) - -inline static void switch_to_udp(query_stat_t *st) -{ - st->qm=UDP_ONLY; - st->myrid=get_rand16(); - st->msg->hdr.id=htons(st->myrid); - st->state=QS_UDPINITIAL; - /* st->failed=0; */ -} - -/* This function will be used in case a UDP reply was truncated and we want to try again using TCP. */ - -inline static void switch_to_tcp(query_stat_t *st) -{ - /* PDNSD_ASSERT(st->state==QS_INITIAL || st->state==QS_DONE || st->state==QS_CANCELED, - "Attempt to switch to TCP while a query is in progress."); */ - st->qm=TCP_ONLY; - st->state=QS_INITIAL; - st->failed=0; -} -#endif - - -/* ------ following is the parallel query code. - * It has been observed that a whole lot of name servers are just damn lame, with response time - * of about 1 min. If that slow one is by chance the first server we try, serializing the tries is quite - * sub-optimal. Also when doing serial queries, the timeout values given in the config will add up, which - * is not the Right Thing. Now that serial queries are in place, this is still true for CNAME recursion, - * and for recursion in quest for the holy AA, but not totally for querying multiple servers. - * The impact on network bandwith should be only marginal (given todays bandwith). - * - * The actual strategy is to do (max) PAR_QUERIES parallel queries, and, if these time out or fail, do again - * that number of queries, until we are successful or there are no more servers to query. - * Since the memory footprint of a thread is considerably large on some systems, and because we have better - * control, we will do the parallel queries multiplexed in one thread. - */ - -/* The query state machine that is called from p_exec_query. This is called once for initialization (state - * QS_TCPINITIAL or QS_UDPINITIAL is preset), and the state that it gives back may either be state QS_DONE, - * in which case it must return a return code other than -1 and is called no more for this server - * (except perhaps in UDP mode if TCP failed). If p_query_sm returns -1, then the state machine is in a read - * or write state, and a function higher up the calling chain can setup a poll() or select() together with st->sock. - * If that poll/select is succesful for that socket, p_exec_query is called again and will hand over to p_query_sm. - * So, you can assume that read(), write() and recvfrom() will not block at the start of a state handling when you - * have returned -1 (which means "call again") as last step of the last state handling. */ -static int p_query_sm(query_stat_t *st) -{ - int retval=RC_SERVFAIL,rv; - -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - tryagain: -#endif - switch (st->state){ - /* TCP query code */ -#ifndef NO_TCP_QUERIES - case QS_TCPINITIAL: - if ((st->sock=socket(PDNSD_PF_INET,SOCK_STREAM,IPPROTO_TCP))==-1) { - DEBUG_MSG("Could not open socket: %s\n", strerror(errno)); - break; - } - /* sin4 or sin6 is intialized, hopefully. */ - - /* maybe bind */ - if (!bind_socket(st->sock)) { - close(st->sock); - break; - } - - /* transmit query by tcp*/ - /* make the socket non-blocking */ - { - int oldflags = fcntl(st->sock, F_GETFL, 0); - if (oldflags == -1 || fcntl(st->sock,F_SETFL,oldflags|O_NONBLOCK)==-1) { - DEBUG_PDNSDA_MSG("fcntl error while trying to make socket to %s non-blocking: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(errno)); - close(st->sock); - break; - } - } - st->iolen=0; -#ifdef ENABLE_IPV6 - retry_tcp_connect: -#endif - if (connect(st->sock,SOCK_ADDR(st),SIN_LEN)==-1) { - if (errno==EINPROGRESS || errno==EPIPE) { - st->state=QS_TCPWRITE; - /* st->event=QEV_WRITE; */ /* wait for writability; the connect is then done */ - return -1; - } else if (errno==ECONNREFUSED) { - st->s_errno=errno; - DEBUG_PDNSDA_MSG("TCP connection refused by %s\n", PDNSDA2STR(PDNSD_A(st))); - close(st->sock); - goto tcp_failed; /* We may want to try again using UDP */ - } else { - /* Since immediate connect() errors do not cost any time, we do not try to switch the - * server status to offline */ -#ifdef ENABLE_IPV6 - /* if IPv6 connectivity is for some reason unavailable, perhaps the - IPv4 fallback address can still be reached. */ - if(!run_ipv4 && (errno==ENETUNREACH || errno==ENETDOWN) - && st->a4fallback.s_addr!=INADDR_ANY) - { -#if DEBUG>0 - char abuf[ADDRSTR_MAXLEN]; - DEBUG_PDNSDA_MSG("Connecting to %s failed: %s, retrying with IPv4 address %s\n", - PDNSDA2STR(PDNSD_A(st)),strerror(errno), - inet_ntop(AF_INET,&st->a4fallback,abuf,sizeof(abuf))); -#endif - IPV6_MAPIPV4(&st->a4fallback,&st->a.sin6.sin6_addr); - st->a4fallback.s_addr=INADDR_ANY; - goto retry_tcp_connect; - } -#endif - DEBUG_PDNSDA_MSG("Error while connecting to %s: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(errno)); - close(st->sock); - break; - } - } - st->state=QS_TCPWRITE; - /* st->event=QEV_WRITE; */ - /* fall through in case of not EINPROGRESS */ - case QS_TCPWRITE: - { - int rem= dnsmsghdroffset + st->transl - st->iolen; - if(rem>0) { - rv=write(st->sock,((unsigned char*)st->msg)+st->iolen,rem); - if(rv==-1) { - if(errno==EWOULDBLOCK) - return -1; - st->s_errno=errno; - close(st->sock); - if (st->iolen==0 && - (st->s_errno==ECONNREFUSED || st->s_errno==ECONNRESET || - st->s_errno==EPIPE)) - { - /* This error may be delayed from connect() */ - DEBUG_PDNSDA_MSG("TCP connection to %s failed: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(st->s_errno)); - goto tcp_failed; /* We may want to try again using UDP */ - } - DEBUG_PDNSDA_MSG("Error while sending data to %s: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(st->s_errno)); - break; - } - st->iolen += rv; - if(rvstate=QS_TCPREAD; - st->iolen=0; - /* st->event=QEV_READ; */ - /* fall through */ - case QS_TCPREAD: - if(st->iolen==0) { - uint16_t recvl_net; - rv=read(st->sock,&recvl_net,sizeof(recvl_net)); - if(rv==-1 && errno==EWOULDBLOCK) - return -1; - if(rv!=sizeof(recvl_net)) - goto error_receiv_data; - st->iolen=rv; - st->recvl=ntohs(recvl_net); - if(!(st->recvbuf=(dns_hdr_t *)realloc_or_cleanup(st->recvbuf,st->recvl))) { - close(st->sock); - DEBUG_MSG("Out of memory in query.\n"); - retval=RC_FATALERR; - break; - } - } - { - int offset=st->iolen-sizeof(uint16_t); - int rem=st->recvl-offset; - if(rem>0) { - rv=read(st->sock,((unsigned char*)st->recvbuf)+offset,rem); - if(rv==-1) { - if(errno==EWOULDBLOCK) - return -1; - goto error_receiv_data; - } - if(rv==0) - goto error_receiv_data; /* unexpected EOF */ - st->iolen += rv; - if(rvsock); - st->state=QS_DONE; - return RC_OK; - error_receiv_data: - if(rv==-1) st->s_errno=errno; - DEBUG_PDNSDA_MSG("Error while receiving data from %s: %s\n", PDNSDA2STR(PDNSD_A(st)), - rv==-1?strerror(errno):(rv==0 && st->iolen==0)?"no data":"incomplete data"); - close(st->sock); - tcp_failed: -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - if(st->qm==TCP_UDP) { - switch_to_udp(st); - DEBUG_PDNSDA_MSG("TCP query to %s failed. Trying to use UDP.\n", PDNSDA2STR(PDNSD_A(st))); - goto tryagain; - } -#endif - break; -#endif - -#ifndef NO_UDP_QUERIES - /* UDP query code */ - case QS_UDPINITIAL: - if ((st->sock=socket(PDNSD_PF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1) { - DEBUG_MSG("Could not open socket: %s\n", strerror(errno)); - break; - } - - /* maybe bind */ - if (!bind_socket(st->sock)) { - close(st->sock); - break; - } - - /* connect */ -#ifdef ENABLE_IPV6 - retry_udp_connect: -#endif - if (connect(st->sock,SOCK_ADDR(st),SIN_LEN)==-1) { - if (errno==ECONNREFUSED) st->s_errno=errno; -#ifdef ENABLE_IPV6 - /* if IPv6 connectivity is for some reason unavailable, perhaps the - IPv4 fallback address can still be reached. */ - else if(!run_ipv4 && (errno==ENETUNREACH || errno==ENETDOWN) - && st->a4fallback.s_addr!=INADDR_ANY) - { -#if DEBUG>0 - char abuf[ADDRSTR_MAXLEN]; - DEBUG_PDNSDA_MSG("Connecting to %s failed: %s, retrying with IPv4 address %s\n", - PDNSDA2STR(PDNSD_A(st)),strerror(errno), - inet_ntop(AF_INET,&st->a4fallback,abuf,sizeof(abuf))); -#endif - IPV6_MAPIPV4(&st->a4fallback,&st->a.sin6.sin6_addr); - st->a4fallback.s_addr=INADDR_ANY; - goto retry_udp_connect; - } -#endif - DEBUG_PDNSDA_MSG("Error while connecting to %s: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(errno)); - close(st->sock); - break; - } - - /* transmit query by udp*/ - /* send will hopefully not block on a freshly opened socket (the buffer - * must be empty) */ - if (send(st->sock,&st->msg->hdr,st->transl,0)==-1) { - st->s_errno=errno; - DEBUG_PDNSDA_MSG("Error while sending data to %s: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(errno)); - close(st->sock); - break; - } - st->state=QS_UDPRECEIVE; - /* st->event=QEV_READ; */ - return -1; - case QS_UDPRECEIVE: - { - int udpbufsize= (st->edns_query?global.udpbufsize:UDP_BUFSIZE); - if(!(st->recvbuf=(dns_hdr_t *)realloc_or_cleanup(st->recvbuf,udpbufsize))) { - close(st->sock); - DEBUG_MSG("Out of memory in query.\n"); - retval=RC_FATALERR; - break; - } - if ((rv=recv(st->sock,st->recvbuf,udpbufsize,0))==-1) { - st->s_errno=errno; - DEBUG_PDNSDA_MSG("Error while receiving data from %s: %s\n", PDNSDA2STR(PDNSD_A(st)),strerror(errno)); - close(st->sock); - break; - } - st->recvl=rv; - if (st->recvlrecvbuf->id)!=st->myrid) { - DEBUG_MSG("Bad answer received. Ignoring it.\n"); - /* no need to care about timeouts here. That is done at an upper layer. */ - st->state=QS_UDPRECEIVE; - /* st->event=QEV_READ; */ - return -1; - } - close(st->sock); - st->state=QS_DONE; - return RC_OK; - } -#endif - } - - /* If we get here, something has gone wrong. */ - st->state=QS_DONE; - return retval; /* should be either RC_SERVFAIL or RC_FATALERR */ -} - -static dns_cent_t *lookup_cent_array(dns_cent_array ca, const unsigned char *nm) -{ - int i,n=DA_NEL(ca); - for(i=0;iqname,nm)) - return ce; - } - return NULL; -} - -/* Extract the minimum ttl field from the SOA record stored in an rr bucket. */ -static time_t soa_minimum(rr_bucket_t *rrs) -{ - uint32_t minimum; - unsigned char *p=(unsigned char *)(rrs->data); - - /* Skip owner and maintainer. Lengths are validated in cache. */ - p=skiprhn(skiprhn(p)); - /* Skip serial, refresh, retry, expire fields. */ - p += 4*sizeof(uint32_t); - GETINT32(minimum,p); - return minimum; -} - -/* - * The function that will actually execute a query. It takes a state structure in st. - * st->state must be set to QS_INITIAL before calling. - * This may return one of the RC_* codes, where RC_OK indicates success, the other - * RC codes indicate the appropriate errors. -1 is the return value that indicates that - * you should call p_exec_query again with the same state for the result until you get - * a return value >0. Alternatively, call p_cancel_query to cancel it. - * Timeouts are already handled by this function. - * Any records that the query has yielded and that are not a direct answer to the query - * (i.e. are records for other domains) are added to the cache, while the direct answers - * are returned in ent. - * All ns records, to whomever they might belong, are additionally returned in the ns list. - * Free it when done. - * This function calls another query state machine function that supports TCP and UDP. - * - * If you want to tell me that this function has a truly ugly coding style, ah, well... - * You are right, somehow, but I feel it is conceptually elegant ;-) - */ -static int p_exec_query(dns_cent_t **entp, const unsigned char *name, int thint, - query_stat_t *st, dlist *ns, unsigned char *c_soa) -{ - int rv,rcode; - unsigned short rd; - - switch (st->state){ - case QS_INITIAL: { - size_t transl,allocsz; - unsigned int rrnlen=0; - - allocsz= sizeof(dns_msg_t); - if(name) { - rrnlen=rhnlen(name); - allocsz += rrnlen+4; - if(st->edns_query) - allocsz += sizeof_opt_pseudo_rr; - } - st->msg=(dns_msg_t *)pdnsd_malloc(allocsz); - if (!st->msg) { - st->state=QS_DONE; - return RC_FATALERR; /* unrecoverable error */ - } - st->myrid=get_rand16(); - st->msg->hdr.id=htons(st->myrid); - st->msg->hdr.qr=QR_QUERY; - st->msg->hdr.opcode=OP_QUERY; - st->msg->hdr.aa=0; - st->msg->hdr.tc=0; - st->msg->hdr.rd=(name && st->trusted); - st->msg->hdr.ra=0; - st->msg->hdr.z=0; - st->msg->hdr.ad=0; - st->msg->hdr.cd=0; - st->msg->hdr.rcode=RC_OK; - st->msg->hdr.qdcount=htons(name!=NULL); - st->msg->hdr.ancount=0; - st->msg->hdr.nscount=0; - st->msg->hdr.arcount=0; - - transl= sizeof(dns_hdr_t); - if(name) { - unsigned char *p = mempcpy((unsigned char *)(&st->msg->hdr+1),name,rrnlen); - unsigned short qtype=(st->lean_query?thint:QT_ALL); - PUTINT16(qtype,p); - PUTINT16(C_IN,p); - transl += rrnlen+4; - if(st->edns_query) - add_opt_pseudo_rr(&st->msg,&transl,&allocsz, - global.udpbufsize,RC_OK,0,0); - } - st->transl=transl; -#ifndef NO_TCP_QUERIES - st->msg->len=htons(st->transl); -#endif - st->recvbuf=NULL; - st->state=(USE_UDP(st)?QS_UDPINITIAL:QS_TCPINITIAL); - /* fall through */ - } - QS_QUERY_CASES: - tryagain: - rv=p_query_sm(st); - if (rv==-1) { - return -1; - } - if (rv!=RC_OK) { - pdnsd_free(st->msg); - pdnsd_free(st->recvbuf); - st->state=QS_DONE; - if(st->needs_testing) { - switch(st->s_errno) { - case ENETUNREACH: /* network unreachable */ - case EHOSTUNREACH: /* host unreachable */ - case ENOPROTOOPT: /* protocol unreachable */ - case ECONNREFUSED: /* port unreachable */ - case ENETDOWN: /* network down */ - case EHOSTDOWN: /* host down */ -#ifdef ENONET - case ENONET: /* machine not on the network */ -#endif - /* Mark this server as down for a period of time */ - sched_server_test(PDNSD_A(st),1,0); - st->needs_testing=0; - } - } - return rv; - } - /* rv==RC_OK */ - DEBUG_PDNSDA_MSG("Received reply from %s (msg len=%u).\n", PDNSDA2STR(PDNSD_A(st)), st->recvl); - DEBUG_DUMP_DNS_MSG(st->recvbuf, st->recvl); - - /* Basic sanity checks */ - if (st->recvlrecvbuf->id); - if (recvid!=st->myrid) { - DEBUG_MSG("ID mismatch: expected %04x, got %04x!\n", st->myrid, recvid); - goto discard_reply; - } - } - if (st->recvbuf->qr!=QR_RESP) { - DEBUG_MSG("The QR bit indicates this is a query, not a response!\n"); - goto discard_reply; - } - if (st->recvbuf->opcode!=OP_QUERY) { - DEBUG_MSG("Not a reply to a standard query (opcode=%u).\n",st->recvbuf->opcode); - goto discard_reply; - } - - rcode=st->recvbuf->rcode; -#if DEBUG>0 - { - char flgsbuf[DNSFLAGSMAXSTRSIZE]; - DEBUG_MSG("rcode=%u (%s), flags:%s\n", rcode, get_ename(rcode), dnsflags2str(st->recvbuf, flgsbuf)); - } -#endif - if (st->recvbuf->z!=0) { - DEBUG_MSG("Malformed response (nonzero Z bit).\n"); - goto discard_reply; - } - - if(st->needs_testing) { - /* We got an answer from this server, so don't bother with up tests for a while. */ - sched_server_test(PDNSD_A(st),1,1); - st->needs_testing=0; - } - - rv=rcode; - if(rcode==RC_OK || rcode==RC_NAMEERR) { - /* success or at least no requery is needed */ - st->state=QS_DONE; - break; - } - else if (entp) { - if(rcode==RC_SERVFAIL || rcode==RC_NOTSUPP || rcode==RC_REFUSED) { - if (st->msg->hdr.rd && !st->recvbuf->ra) { - /* seems as if we have got no recursion available. - We will have to do it by ourselves (sigh...) */ - DEBUG_PDNSDA_MSG("Server %s returned error code: %s." - " Maybe does not support recursive query?" - " Querying non-recursively.\n", - PDNSDA2STR(PDNSD_A(st)),get_ename(rcode)); - st->msg->hdr.rd=0; - goto resetstate_tryagain; - } - else if(rcode!=RC_SERVFAIL && st->edns_query && st->msg->hdr.arcount) - goto try_withoutedns; - else if (st->recvbuf->ancount && st->auth_serv==2) { - /* The name server returned a failure code, - but the answer section is not empty, - and the answer is from a server lower down the call chain. - Use this answer tentatively (it may be the - best we can get), but remember the failure. */ - DEBUG_PDNSDA_MSG("Server %s returned error code: %s," - " but the answer section is not empty." - " Using the answer tentatively.\n", - PDNSDA2STR(PDNSD_A(st)),get_ename(rcode)); - st->failed=3; - st->state=QS_DONE; - break; - } - } - else if(rcode==RC_FORMAT && st->edns_query && st->msg->hdr.arcount) - try_withoutedns: { - size_t transl; - /* Perhaps the remote server barfs when the query - contains an OPT RR in the additional section. - Try again with an empty addtional section. */ - DEBUG_PDNSDA_MSG("Server %s returned error code: %s." - " Maybe cannot handle EDNS?" - " Querying with empty additional section.\n", - PDNSDA2STR(PDNSD_A(st)),get_ename(rcode)); - transl=remove_opt_pseudo_rr(st->msg,st->transl); - if(transl!=0 && st->msg->hdr.arcount==0) { - st->transl=transl; -#ifndef NO_TCP_QUERIES - st->msg->len=htons(st->transl); -#endif - st->edns_query=0; - resetstate_tryagain: - st->myrid=get_rand16(); - st->msg->hdr.id=htons(st->myrid); - st->state=(USE_UDP(st)?QS_UDPINITIAL:QS_TCPINITIAL); - goto tryagain; - } - else { - DEBUG_PDNSDA_MSG("Internal error: could not remove additional section from query" - " to server %s\n", PDNSDA2STR(PDNSD_A(st))); - } - } - } - - discard_reply: - /* report failure */ - pdnsd_free(st->msg); - pdnsd_free(st->recvbuf); - /*close(st->sock);*/ - st->state=QS_DONE; -#if DEBUG>0 - if(entp) { - DEBUG_PDNSDA_MSG("Discarding reply from server %s\n", PDNSDA2STR(PDNSD_A(st))); - } -#endif - if (rv!=RC_OK) - return rv; - - return RC_SERVFAIL; /* mock error code */ - - default: /* we shouldn't get here */ - st->state=QS_DONE; - return RC_SERVFAIL; /* mock error code */ - } - - /* If we reach this code, we have successfully received an answer, - * because we have returned error codes on errors or -1 on AGAIN conditions. - * So we *should* have a usable dns record in recvbuf by now. - */ - rd= st->msg->hdr.rd; /* Save the 'Recursion Desired' bit of the query. */ - pdnsd_free(st->msg); - if(entp) { - time_t queryts=time(NULL); - size_t lcnt= ((size_t)st->recvl) - sizeof(dns_hdr_t); - unsigned char *rrp=(unsigned char *)(st->recvbuf+1); - dns_cent_array secs[3]={NULL,NULL,NULL}; -# define ans_sec secs[0] -# define auth_sec secs[1] -# define add_sec secs[2] - unsigned short qtype,flags,aa,neg_ans=0,reject_ans=0,num_ns=0; - int numoptrr; - edns_info_t ednsinfo= {0}; - - if (ntohs(st->recvbuf->qdcount)!=1) { - DEBUG_PDNSDA_MSG("Bad number of query records in answer from %s\n", - PDNSDA2STR(PDNSD_A(st))); - rv=RC_SERVFAIL; - goto free_recvbuf_return; - } - /* check & skip the query record. */ - { - unsigned char nbuf[DNSNAMEBUFSIZE]; - if ((rv=decompress_name((unsigned char *)st->recvbuf, st->recvl, &rrp, &lcnt, nbuf, NULL))!=RC_OK) { - DEBUG_PDNSDA_MSG("Cannot decompress QNAME in answer from %s\n", - PDNSDA2STR(PDNSD_A(st))); - rv=RC_SERVFAIL; - goto free_recvbuf_return; - } - if(!rhnicmp(nbuf,name)) { - DEBUG_PDNSDA_MSG("Answer from %s does not match query.\n", - PDNSDA2STR(PDNSD_A(st))); - rv=RC_SERVFAIL; - goto free_recvbuf_return; - } - } - - qtype=(st->lean_query?thint:QT_ALL); - if (lcnt<4) { - DEBUG_PDNSDA_MSG("Format error in reply from %s (message truncated in qtype or qclass).\n", - PDNSDA2STR(PDNSD_A(st))); - rv=RC_SERVFAIL; /* mock error code */ - goto free_recvbuf_return; - } - { - unsigned short qt,qc; - GETINT16(qt,rrp); - GETINT16(qc,rrp); - if(qt!=qtype) { - DEBUG_PDNSDA_MSG("qtype in answer (%u) from %s does not match expected qtype (%u).\n", - qt,PDNSDA2STR(PDNSD_A(st)),qtype); - rv=RC_SERVFAIL; - goto free_recvbuf_return; - } - } - lcnt-=4; - - st->aa= (st->recvbuf->aa && !st->failed); - st->tc= st->recvbuf->tc; - st->ra= (rd && st->recvbuf->ra); - - /* Don't flag cache entries from a truncated reply as authoritative. */ - aa= (st->aa && !st->tc); - flags=st->flags; - if (aa) flags|=CF_AUTH; - - - /* Initialize a dns_cent_t in the array for the answer section */ - if (!(ans_sec=DA_GROW1(ans_sec))) { - rv=RC_FATALERR; /* unrecoverable error */ - goto free_recvbuf_return; - } - /* By marking DF_AUTH, we mean authoritative AND complete. */ - if (!init_cent(&DA_INDEX(ans_sec,0), name, 0, 0, (aa && qtype==QT_ALL)?DF_AUTH:0 DBG1)) { - rv=RC_FATALERR; /* unrecoverable error */ - goto free_centarrays_recvbuf_return; - } - - /* Now read the answer, authority and additional sections, - storing the results in the arrays ans_sec,auth_sec and add_sec. - */ - numoptrr=0; - rv=rrs2cent((unsigned char *)st->recvbuf, st->recvl, &rrp, &lcnt, ntohs(st->recvbuf->ancount), - flags, queryts, &ans_sec, &numoptrr, &ednsinfo); -#if DEBUG>0 - if(numoptrr!=0) { - DEBUG_MSG("Answer section in reply contains %d OPT pseudo-RRs!\n", numoptrr); - } -#endif - numoptrr=0; - if(rv==RC_OK) { - uint16_t nscount=ntohs(st->recvbuf->nscount); - if (nscount) { - rv=rrs2cent((unsigned char *)st->recvbuf, st->recvl, &rrp, &lcnt, nscount, - flags|CF_ADDITIONAL, queryts, &auth_sec, &numoptrr, &ednsinfo); -#if DEBUG>0 - if(numoptrr!=0) { - DEBUG_MSG("Authority section in reply contains %d OPT pseudo-RRs!\n", numoptrr); - } -#endif - } - } - - numoptrr=0; - if(rv==RC_OK) { - uint16_t arcount=ntohs(st->recvbuf->arcount); - if (arcount) { - rv=rrs2cent((unsigned char *)st->recvbuf, st->recvl, &rrp, &lcnt, arcount, - flags|CF_ADDITIONAL, queryts, &add_sec, &numoptrr, &ednsinfo); - if(numoptrr!=0) { -#if DEBUG>0 - if(numoptrr!=1) { - DEBUG_MSG("Additional section in reply contains %d OPT pseudo-RRs!\n", numoptrr); - } - DEBUG_PDNSDA_MSG("Reply from %s contains OPT pseudosection: EDNS version = %u, udp size = %u, flag DO=%u\n", - PDNSDA2STR(PDNSD_A(st)), ednsinfo.version, ednsinfo.udpsize, ednsinfo.do_flg); -#endif - if(rcode!=ednsinfo.rcode) { - DEBUG_PDNSDA_MSG("Reply from %s contains unexpected EDNS rcode %u (%s)!\n", - PDNSDA2STR(PDNSD_A(st)), ednsinfo.rcode, get_ename(ednsinfo.rcode)); - rcode=ednsinfo.rcode; - /* Mark as failed, but use answer tentatively. */ - if(!st->failed) st->failed=1; - } - } - } - } - - if(!(rv==RC_OK || (rv==RC_TRUNC && st->recvbuf->tc))) { - DEBUG_PDNSDA_MSG(rv==RC_FORMAT?"Format error in reply from %s.\n": - rv==RC_TRUNC?"Format error in reply from %s (message unexpectedly truncated).\n": - rv==RC_SERVFAIL?"Inconsistent timestamps in reply from %s.\n": - "Out of memory while processing reply from %s.\n", - PDNSDA2STR(PDNSD_A(st))); - if(rv==RC_SERVFAIL) { - /* Inconsistent ttl timestamps and we are - enforcing strict RFC 2181 compliance. - Mark as failed, but use answer tentatively. */ - if(!st->failed) st->failed=1; - } - else { - if(rv!=RC_FATALERR) rv=RC_SERVFAIL; - goto free_ent_centarrays_recvbuf_return; - } - } - - { - /* Remember references to NS and SOA records in the answer or authority section - so that we can add this information to our own reply. */ - int i,n=DA_NEL(ans_sec); - for(i=0;iqname); - - if(getrrset_NS(cent)) - cent->c_ns=scnt; - if(getrrset_SOA(cent)) - cent->c_soa=scnt; - - if((qtype>=QT_MIN && qtype<=QT_MAX) || - (/* (qtype>=T_MIN && qtype<=T_MAX) && */ getrrset(cent,qtype)) || - (n==1 && cent->num_rrs==0)) - { - /* Match this name with names in the authority section */ - int j,m=DA_NEL(auth_sec); - for(j=0;jqname,cent->qname, &rem, NULL); - if(rem==0 && - /* Don't accept records for the root domain from name servers - that were not listed in the configuration file. */ - (ml || st->auth_serv!=2)) { - if(getrrset_NS(ce)) { - if(cent->c_ns==cundef || cent->c_nsc_ns=ml; - } - if(getrrset_SOA(ce)) { - if(cent->c_soa==cundef || cent->c_soac_soa=ml; - } - } - } - } - } - } - - /* Check whether the answer contains an IP address that should be rejected. */ - if(have_rejectlist(st)) { - int i; - int na4=nreject_a4(st); - addr4maskpair_t *a4arr=rejectlist_a4(st); -#if ALLOW_LOCAL_AAAA - int na6=nreject_a6(st); - addr6maskpair_t *a6arr=rejectlist_a6(st); -#endif - /* Check addresses in the answer, authority and additional sections. */ - for(i=0;i<3;++i) { - dns_cent_array sec=secs[i]; - int j,nce=DA_NEL(sec); - for(j=0;jrrs; rr; rr=rr->next) { - struct in_addr *a=(struct in_addr *)(rr->data); - int k; - for(k=0;ka,&am->mask)) { -#if DEBUG>0 - unsigned char nmbuf[DNSNAMEBUFSIZE]; char abuf[ADDRSTR_MAXLEN]; - DEBUG_PDNSDA_MSG("Rejecting answer from server %s because it contains an A record" - " for \"%s\" with an address in the reject list: %s\n", - PDNSDA2STR(PDNSD_A(st)), - rhn2str(cent->qname,nmbuf,sizeof(nmbuf)), - inet_ntop(AF_INET,a,abuf,sizeof(abuf))); -#endif - reject_ans=1; goto rejectlist_scan_done; - } - } - } - } -#if ALLOW_LOCAL_AAAA - rrset=getrrset_AAAA(cent); - if(rrset && na6) { - rr_bucket_t *rr; - for(rr=rrset->rrs; rr; rr=rr->next) { - struct in6_addr *a=(struct in6_addr *)(rr->data); - int k; - for(k=0;ka,&am->mask)) { -#if DEBUG>0 - unsigned char nmbuf[DNSNAMEBUFSIZE]; char abuf[INET6_ADDRSTRLEN]; - DEBUG_PDNSDA_MSG("Rejecting answer from server %s because it contains an AAAA record" - " for \"%s\" with an address in the reject list: %s\n", - PDNSDA2STR(PDNSD_A(st)), - rhn2str(cent->qname,nmbuf,sizeof(nmbuf)), - inet_ntop(AF_INET6,a,abuf,sizeof(abuf))); -#endif - reject_ans=1; goto rejectlist_scan_done; - } - } - } - } -#endif - } - } - rejectlist_scan_done:; - } - - /* negative caching for domains */ - if (rcode==RC_NAMEERR) { - DEBUG_PDNSDA_MSG("Server %s returned error code: %s\n", PDNSDA2STR(PDNSD_A(st)),get_ename(rcode)); - name_error: - neg_ans=1; - { - /* We did not get what we wanted. Cache according to policy */ - dns_cent_t *ent=&DA_INDEX(ans_sec,0); - int neg_domain_pol=global.neg_domain_pol; - if (neg_domain_pol==C_ON || (neg_domain_pol==C_AUTH && st->aa)) { - time_t ttl=global.neg_ttl; - - /* Try to find a SOA record that came with the reply. - */ - if(ent->c_soa!=cundef) { - unsigned scnt=rhnsegcnt(name); - dns_cent_t *cent; - if(ent->c_soac_soa)))) { - rr_set_t *rrset=getrrset_SOA(cent); - if (rrset && rrset->rrs) { - time_t min=soa_minimum(rrset->rrs); - ttl=rrset->ttl; - if(ttl>min) - ttl=min; - } - } - } - DEBUG_RHN_MSG("Caching domain %s negative with ttl %li\n",RHN2STR(name),(long)ttl); - negate_cent(ent,ttl,queryts); - if(st->nocache) ent->flags |= DF_NOCACHE; - goto cleanup_return_OK; - } else { - if(c_soa) *c_soa=ent->c_soa; - free_cent(ent DBG1); - rv=RC_NAMEERR; - goto add_additional; - } - } - } - - if(reject_ans) { - if(reject_policy(st)==C_NEGATE && st->failed<=1) - goto name_error; - else { - rv=RC_SERVFAIL; - goto free_ent_centarrays_recvbuf_return; - } - } - - if(global.deleg_only_zones && st->auth_serv<3) { /* st->auth_serv==3 means this server is a root-server. */ - int missingdelegation,authcnt; - /* The deleg_only_zones data may change due to runtime reconfiguration, - therefore use locks. */ - lock_server_data(); - missingdelegation=0; authcnt=0; - { - int i,n=DA_NEL(global.deleg_only_zones); unsigned rem,zrem; - for(i=0;iqname,DA_INDEX(global.deleg_only_zones,l),&rem,&zrem) && zrem==0) { - if(rem) break; - else goto try_next_auth; - } - } - goto delegation_OK; - } - try_next_auth:; - } - } -#if DEBUG>0 - { - unsigned char nmbuf[DNSNAMEBUFSIZE],zbuf[DNSNAMEBUFSIZE]; - DEBUG_PDNSDA_MSG(authcnt?"%s is in %s zone, but no delegation found in answer returned by server %s\n" - :"%s is in %s zone, but no authority information provided by server %s\n", - rhn2str(name,nmbuf,sizeof(nmbuf)), rhn2str(DA_INDEX(global.deleg_only_zones,i),zbuf,sizeof(zbuf)), - PDNSDA2STR(PDNSD_A(st))); - } -#endif - missingdelegation=1; - } - delegation_OK:; - } - unlock_server_data(); - - if(missingdelegation) { - if(authcnt && st->failed<=1) { - /* Treat this as a nonexistant name. */ - goto name_error; - } - else if(st->auth_serv<2) { - /* If this is one of the servers obtained from the list - pdnsd was configured with, treat this as a failure. - Hopefully one of the other servers in the list will - return a non-empty authority section. - */ - rv=RC_SERVFAIL; - goto free_ent_centarrays_recvbuf_return; - } - } - } - - { - /* Negative caching of rr sets */ - dns_cent_t *ent=&DA_INDEX(ans_sec,0); - - if(!ent->num_rrs) neg_ans=1; - - if (thint>=T_MIN && thint<=T_MAX && !getrrset(ent,thint) && !st->tc && st->failed<=1) { - /* We did not get what we wanted. Cache according to policy */ - int neg_rrs_pol=global.neg_rrs_pol; - if (neg_rrs_pol==C_ON || (neg_rrs_pol==C_AUTH && aa) || - (neg_rrs_pol==C_DEFAULT && (aa || st->ra))) - { - time_t ttl=global.neg_ttl; - rr_set_t *rrset=getrrset_SOA(ent); - dns_cent_t *cent; - unsigned scnt; - /* If we received a SOA, we should take the ttl of that record. */ - if ((rrset && rrset->rrs) || - /* Try to find a SOA record higher up the hierarchy that came with the reply. */ - ((cent=lookup_cent_array(auth_sec, - (ent->c_soa!=cundef && ent->c_soa<(scnt=rhnsegcnt(name)))? - skipsegs(name,scnt-ent->c_soa): - name)) && - (rrset=getrrset_SOA(cent)) && rrset->rrs)) - { - time_t min=soa_minimum(rrset->rrs); - ttl=rrset->ttl; - if(ttl>min) - ttl=min; - } - DEBUG_RHN_MSG("Caching type %s for domain %s negative with ttl %li\n",getrrtpname(thint),RHN2STR(name),(long)ttl); - if (!add_cent_rrset_by_type(ent, thint, ttl, queryts, CF_NEGATIVE|flags DBG1)) { - rv=RC_FATALERR; - goto free_ent_centarrays_recvbuf_return; - } - } - } - } - - if (st->failed<=1) { - /* The domain names of all name servers found in the answer and authority sections are placed in *ns, - which is automatically grown. */ - /* dns_cent_array secs[2]={ans_sec,auth_sec}; */ - int i; - for(i=0;i<2;++i) { - dns_cent_array sec=secs[i]; - int j,n=DA_NEL(sec); - for(j=0;jqname) || st->auth_serv!=2) && - /* Don't accept possibly poisoning nameserver entries in paranoid mode */ - (st->trusted || !st->nsdomain || (domain_match(st->nsdomain, cent->qname, &rem,NULL),rem==0)) && - /* The following test is actually redundant and should never fail. */ - *(cent->qname)!=0xff) - { - /* Some nameservers obviously choose to send SOA records instead of NS ones. - * Although I think that this is poor behaviour, we'll have to work around that. */ - static const unsigned short nstypes[2]={T_NS,T_SOA}; - int k; - for(k=0;k<2;++k) { - rr_set_t *rrset=getrrset(cent,nstypes[k]); - if(rrset) { - rr_bucket_t *rr; - unsigned short first=1; - for(rr=rrset->rrs; rr; rr=rr->next) { - size_t sz1,sz2; - unsigned char *p; - /* Skip duplicate records */ - for(p=dlist_first(*ns); p; p=dlist_next(p)) { - if(rhnicmp(*p==0xff?p+1:skiprhn(p),(unsigned char *)(rr->data))) - goto next_nsr; - } - /* add to the nameserver list. - Here we use a little compression trick: if - the first byte of a name is 0xff, this means - repeat the previous name. - */ - sz1= (first?rhnlen(cent->qname):1); - sz2=rhnlen((unsigned char *)(rr->data)); - if (!(*ns=dlist_grow(*ns,sz1+sz2))) { - rv=RC_FATALERR; - goto free_ent_centarrays_recvbuf_return; - } - p=dlist_last(*ns); - if(first) { - first=0; - p=mempcpy(p,cent->qname,sz1); - } - else - *p++ = 0xff; /* 0xff means 'idem' */ - /* This will only copy the first name, which is the NS */ - memcpy(p,(unsigned char *)(rr->data),sz2); - ++num_ns; - next_nsr:; - } - } - } - } - } - } - } - cleanup_return_OK: - if(st->failed && neg_ans && num_ns==0) { - DEBUG_PDNSDA_MSG("Answer from server %s does not contain usable records.\n", - PDNSDA2STR(PDNSD_A(st))); - rv=RC_SERVFAIL; - goto free_ns_ent_centarrays_recvbuf_return; - } - if(!(*entp=malloc(sizeof(dns_cent_t)))) { - rv=RC_FATALERR; - goto free_ns_ent_centarrays_recvbuf_return; - } - **entp=DA_INDEX(ans_sec,0); - rv=RC_OK; - add_additional: - if (!st->failed && !reject_ans) { - /* Add the additional RRs to the cache. */ - /* dns_cent_array secs[3]={ans_sec,auth_sec,add_sec}; */ - int i; -#if DEBUG>0 - if(debug_p && neg_ans) { - int j,n=DA_NEL(ans_sec); - for(j=1; jqname) || st->auth_serv!=2) { - unsigned int rem; - if(st->trusted || !st->nsdomain || (domain_match(st->nsdomain, cent->qname, &rem, NULL),rem==0)) - add_cache(cent); - else { -#if DEBUG>0 - unsigned char nmbuf[DNSNAMEBUFSIZE],nsbuf[DNSNAMEBUFSIZE]; - DEBUG_MSG("Record for %s not in nsdomain %s; dropped.\n", - rhn2str(cent->qname,nmbuf,sizeof(nmbuf)),rhn2str(st->nsdomain,nsbuf,sizeof(nsbuf))); -#endif - } - } - else { -#if DEBUG>0 - static const char *const secname[3]={"answer","authority","additional"}; - DEBUG_PDNSDA_MSG("Record(s) for root domain in %s section from %s dropped.\n", secname[i],PDNSDA2STR(PDNSD_A(st))); -#endif - } - } - } - } - goto free_centarrays_recvbuf_return; - - free_ns_ent_centarrays_recvbuf_return: - dlist_free(*ns); *ns=NULL; - free_ent_centarrays_recvbuf_return: - if(DA_NEL(ans_sec)>=1) free_cent(&DA_INDEX(ans_sec,0) DBG1); - free_centarrays_recvbuf_return: - { - /* dns_cent_array secs[3]={ans_sec,auth_sec,add_sec}; */ - int i; - for(i=0;i<3;++i) { - dns_cent_array sec=secs[i]; - int j,n=DA_NEL(sec); - /* The first entry in the answer section is treated separately, so skip that one. */ - for(j= !i; jrecvbuf); - return rv; -} - -/* - * Cancel a query, freeing all resources. Any query state is valid as input (this may even be called - * if a call to p_exec_query already returned error or success) - */ -static void p_cancel_query(query_stat_t *st) -{ - switch (st->state) { - QS_WRITE_CASES: - QS_READ_CASES: - close(st->sock); - /* fall through */ - case QS_TCPINITIAL: - case QS_UDPINITIAL: - pdnsd_free(st->recvbuf); - pdnsd_free(st->msg); - } - if(st->state!=QS_INITIAL && st->state!=QS_DONE) - st->state=QS_CANCELED; -} - -#if 0 -/* - * Initialize a query_serv_t (server list for parallel query) - * This is there for historical reasons only. - */ -inline static void init_qserv(query_stat_array *q) -{ - *q=NULL; -} -#endif - -/* - * Add a server entry to a query_serv_t - * Note: only a reference to nsdomain is copied, not the name itself. - * Be sure to free the q-list before freeing the name. - */ -static int add_qserv(query_stat_array *q, pdnsd_a2 *a, int port, time_t timeout, unsigned flags, - char nocache, char lean_query, char edns_query, char auth_s, char needs_testing, char trusted, - const unsigned char *nsdomain, rejectlist_t *rejectlist) -{ - query_stat_t *qs; - - if ((*q=DA_GROW1(*q))==NULL) { - DEBUG_MSG("Out of memory in add_qserv()\n"); - return 0; - } - - qs=&DA_LAST(*q); -#ifdef ENABLE_IPV4 - if (run_ipv4) { - memset(&qs->a.sin4,0,sizeof(qs->a.sin4)); - qs->a.sin4.sin_family=AF_INET; - qs->a.sin4.sin_port=htons(port); - qs->a.sin4.sin_addr=a->ipv4; - SET_SOCKA_LEN4(qs->a.sin4); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - memset(&qs->a.sin6,0,sizeof(qs->a.sin6)); - qs->a.sin6.sin6_family=AF_INET6; - qs->a.sin6.sin6_port=htons(port); - qs->a.sin6.sin6_flowinfo=IPV6_FLOWINFO; - qs->a.sin6.sin6_addr=a->ipv6; - SET_SOCKA_LEN6(qs->a.sin6); - - qs->a4fallback=a->ipv4; - } -#endif - qs->timeout=timeout; - qs->flags=flags; - qs->nocache=nocache; - qs->auth_serv=auth_s; - qs->lean_query=lean_query; - qs->edns_query=edns_query; - qs->needs_testing=needs_testing; - qs->trusted=trusted; - qs->aa=0; - qs->tc=0; - qs->ra=0; - qs->failed=0; - qs->nsdomain=nsdomain; /* Note: only a reference is copied, not the name itself! */ - qs->rejectlist=rejectlist; - - qs->state=QS_INITIAL; - qs->qm=global.query_method; - qs->s_errno=0; - return 1; -} - -/* Test whether two pdnsd_a2 addresses are the same. */ -inline __attribute__((always_inline)) -static int same_inaddr2_2(pdnsd_a2 *a, pdnsd_a2 *b) -{ - return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr, - IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) && - a->ipv4.s_addr==b->ipv4.s_addr ); -} - -/* This can be used to check whether a server address was already used in a - previous query_stat_t entry. */ -inline static int query_stat_same_inaddr2(query_stat_t *qs, pdnsd_a2 *b) -{ - return SEL_IPVER( qs->a.sin4.sin_addr.s_addr==b->ipv4.s_addr, - IN6_ARE_ADDR_EQUAL(&qs->a.sin6.sin6_addr,&b->ipv6) && - qs->a4fallback.s_addr==b->ipv4.s_addr ); -} - - -/* - * Free resources used by a query_serv_t - * There for historical reasons only. - */ -inline static void del_qserv(query_stat_array q) -{ - da_free(q); -} - -struct qstatnode_s { - query_stat_array qa; - struct qstatnode_s *next; -}; -typedef struct qstatnode_s qstatnode_t; - -struct qhintnode_s { - const unsigned char *nm; - int tp; - struct qhintnode_s *next; -}; -/* typedef struct qhintnode_s qhintnode_t; */ /* Already defined in dns_query.h */ - -static int auth_ok(query_stat_array q, const unsigned char *name, int thint, dns_cent_t *ent, - int hops, qstatnode_t *qslist, qhintnode_t *qhlist, - query_stat_t *qse, dlist ns, query_stat_array *serv); -static int p_dns_cached_resolve(query_stat_array q, const unsigned char *name, int thint, dns_cent_t **cachedp, - int hops, qstatnode_t *qslist, qhintnode_t *qhlist, time_t queryts, - unsigned char *c_soa); -static int simple_dns_cached_resolve(atup_array atup_a, int port, char edns_query, time_t timeout, - const unsigned char *name, int thint, dns_cent_t **cachedp); - - -/* - * Performs a semi-parallel query on the servers in q. PAR_QUERIES are executed parallel at a time. - * name is the query name in dns protocol format (number.string etc), - * ent is the dns_cent_t that will be filled. - * hops is the number of recursions left. - * qslist should refer to a list of server arrays used higher up in the calling chain. This way we can - * avoid name servers that have already been tried for this name. - * qhlist should refer to a list of names that we are trying to resolve higher up in the calling chain. - * These names should be avoided further down the chain, or we risk getting caught in a wasteful cycle. - * thint is a hint on the requested query type used to decide whether an aa record must be fetched - * or a non-authoritative answer will be enough. - * - * nocache is needed because we add AA records to the cache. If the nocache flag is set, we do not - * take the original values for the record, but flags=0 and ttl=0 (but only if we do not already have - * a cached record for that set). These settings cause the record be purged on the next cache addition. - * It will also not be used again. - * - * The return value of p_recursive_query() has the same meaning as that of p_dns_cached_resolve() - * (see below). - */ -static int p_recursive_query(query_stat_array q, const unsigned char *name, int thint, dns_cent_t **entp, - int *nocache, int hops, qstatnode_t *qslist, qhintnode_t *qhlist, - unsigned char *c_soa) -{ - dns_cent_t *ent,*entsave=NULL; - int i,j,k; - int rv=RC_SERVFAIL; - int qualval=0; - query_stat_t *qse=NULL; /* Initialized to inhibit compiler warning */ - dlist ns=NULL,nssave=NULL; - query_stat_array serv=NULL,servsave=NULL; - -# define W_AUTHOK 8 -# define W_NOTFAILED 2 -# define W_NOTTRUNC 1 -# define NOTFAILMASK 6 -# define GOODQUAL (W_AUTHOK+3*W_NOTFAILED) -# define save_query_result(ent,qs,ns,serv,authok) \ - { \ - int qval = authok*W_AUTHOK + (3-qs->failed)*W_NOTFAILED + (!qs->tc)*W_NOTTRUNC; \ - if(entsave && qval>qualval) { \ - /* Free the old copy, because the new result is better. */ \ - free_cent(entsave DBG1); \ - pdnsd_free(entsave); \ - entsave=NULL; \ - del_qserv(servsave); \ - dlist_free(nssave); \ - } \ - if(!entsave) { \ - entsave=ent; \ - servsave=serv; \ - /* The serv array contains references to data within the ns list, \ - so we need to save a copy of the ns list as well! */ \ - if(DA_NEL(serv)>0) nssave=ns; else {nssave=NULL;dlist_free(ns);} \ - qualval=qval; \ - qse=qs; \ - } \ - else { \ - /* We already have a copy, free the present one. */ \ - free_cent(ent DBG1); \ - pdnsd_free(ent); \ - del_qserv(serv); \ - dlist_free(ns); \ - } \ - serv=NULL; \ - ns=NULL; \ - } - - { - time_t ts0=time(NULL),global_timeout=global.timeout; - int dc=0,mc=0,nq=DA_NEL(q),parqueries=global.par_queries; - - for (j=0; jnq) mc=nq; - - /* First, call p_exec_query once for each parallel set to initialize. - * Then, as long as not all have the state QS_DONE or we have a timeout, - * build a poll/select set for all active queries and call them accordingly. */ - for (i=dc;i=j) { - /* The below should not happen any more, but may once again - * (immediate success) */ - DEBUG_PDNSDA_MSG("Sending query to %s\n", PDNSDA2STR(PDNSD_A(qs))); - retryquery: - rv=p_exec_query(&ent, name, thint, qs,&ns,c_soa); - if (rv==RC_OK) { - int authok; - DEBUG_PDNSDA_MSG("Query to %s succeeded.\n", PDNSDA2STR(PDNSD_A(qs))); - if((authok=auth_ok(q, name, thint, ent, hops, qslist, qhlist, qs, ns, &serv))) { - if(authok>=0) { - if(!qs->failed -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - && !(qs->qm==UDP_TCP && qs->tc) -#endif - ) - { - qse=qs; - mc=i; /* No need to cancel queries beyond i */ - goto done; - } - } - else { - mc=i; /* No need to cancel queries beyond i */ - goto free_ent_return_failed; - } - } - /* We do not have a satisfactory answer. - However, we will save a copy in case none of the other - servers in the q list give a satisfactory answer either. - */ - save_query_result(ent,qs,ns,serv,authok); -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - if(qs->qm==UDP_TCP && qs->tc) { - switch_to_tcp(qs); - DEBUG_PDNSDA_MSG("Reply from %s was truncated. Trying again using TCP.\n", - PDNSDA2STR(PDNSD_A(qs))); - goto retryquery; - } -#endif - } - else if (rv==RC_NAMEERR || rv==RC_FATALERR) { - mc=i; /* No need to cancel queries beyond i */ - goto done; - } - } - if (qs->state==QS_DONE && i==dc) - dc++; - } - if (dcstate!=QS_DONE) { - if (i>=j && qs->timeout>maxto) - maxto=qs->timeout; -#ifdef NO_POLL - if (qs->sock>maxfd) { - maxfd=qs->sock; - PDNSD_ASSERT(maxfdstate) { - QS_READ_CASES: - FD_SET(qs->sock,&reads); - break; - QS_WRITE_CASES: - FD_SET(qs->sock,&writes); - break; - } -#else - polls[pc].fd=qs->sock; - switch (qs->state) { - QS_READ_CASES: - polls[pc].events=POLLIN; - break; - QS_WRITE_CASES: - polls[pc].events=POLLOUT; - break; - default: - polls[pc].events=0; - } -#endif - pc++; - } - } - if (pc==0) { - /* In this case, ALL are done and we do not need to cancel any - * query. */ - dc=mc; - break; - } - now=time(NULL); - maxto -= now-ts; - if (mc==nq) { -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - /* Don't use the global timeout if there are TCP queries - we might want to retry using UDP. */ - for (i=j;imaxto) maxto=globto; - } -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - skip_globto:; -#endif - } -#ifdef NO_POLL - tv.tv_sec=(maxto>0)?maxto:0; - tv.tv_usec=0; - nevents=select(maxfd+1,&reads,&writes,NULL,&tv); -#else - nevents=poll(polls,pc,(maxto>0)?(maxto*1000):0); -#endif - if (nevents<0) { - /* if(errno==EINTR) - continue; */ - log_warn("poll/select failed: %s",strerror(errno)); - goto done; - } - if (nevents==0) { - /* We have timed out. Mark the unresponsive servers so that we can consider - them for retesting later on. We will continue to listen for replies from - these servers as long as we have additional servers to try. */ - for (i=j;istate!=QS_DONE && qs->needs_testing) - qs->needs_testing=2; -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - if (tentative_tcp_query(qs)) { - /* We timed out while waiting for a TCP connection. - Try again using UDP. - */ - close(qs->sock); - switch_to_udp(qs); - DEBUG_PDNSDA_MSG("TCP connection to %s timed out. Trying to use UDP.\n", - PDNSDA2STR(PDNSD_A(qs))); - - rv=p_exec_query(&ent, name, thint, qs,&ns,c_soa); - /* In the unlikely case of immediate success */ - if (rv==RC_OK) { - int authok; - DEBUG_PDNSDA_MSG("Query to %s succeeded.\n", PDNSDA2STR(PDNSD_A(qs))); - if((authok=auth_ok(q, name, thint, ent, hops, qslist, qhlist, qs, ns, &serv))) { - if(authok>=0) { - if(!qs->failed) { - qse=qs; - goto done; - } - } - else - goto free_ent_return_failed; - } - save_query_result(ent,qs,ns,serv,authok); - } - else if (rv==RC_NAMEERR || rv==RC_FATALERR) { - goto done; - } - ++nevents; - } -#endif - } -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - if (mc==nq) { - /* We will not try additional servers, but we might want to try again - using UDP instead of TCP - */ - if(nevents && (time(NULL)-ts0)state!=QS_DONE) { - int srv_event=0; - /* This detection may seem suboptimal, but normally, we have at most 2-3 parallel - * queries, and anything else would be higher overhead, */ -#ifdef NO_POLL - switch (qs->state) { - QS_READ_CASES: - srv_event=FD_ISSET(qs->sock,&reads); - break; - QS_WRITE_CASES: - srv_event=FD_ISSET(qs->sock,&writes); - break; - } -#else - do { - PDNSD_ASSERT(icsock); - /* - * In case of an error, reenter the state machine - * to catch it. - */ - switch (qs->state) { - QS_READ_CASES: - srv_event=polls[k].revents&(POLLIN|POLLERR|POLLHUP|POLLNVAL); - break; - QS_WRITE_CASES: - srv_event=polls[k].revents&(POLLOUT|POLLERR|POLLHUP|POLLNVAL); - break; - } -#endif - if (srv_event) { - --nevents; - retryquery2: - rv=p_exec_query(&ent, name, thint, qs,&ns,c_soa); - if (rv==RC_OK) { - int authok; - DEBUG_PDNSDA_MSG("Query to %s succeeded.\n", PDNSDA2STR(PDNSD_A(qs))); - if((authok=auth_ok(q, name, thint, ent, hops, qslist, qhlist, qs, ns, &serv))) { - if(authok>=0) { - if(!qs->failed -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - && !(qs->qm==UDP_TCP && qs->tc) -#endif - ) - { - qse=qs; - goto done; - } - } - else - goto free_ent_return_failed; - } - save_query_result(ent,qs,ns,serv,authok); -#if !defined(NO_TCP_QUERIES) && !defined(NO_UDP_QUERIES) - if(qs->qm==UDP_TCP && qs->tc) { - switch_to_tcp(qs); - DEBUG_PDNSDA_MSG("Reply from %s was truncated. Trying again using TCP.\n", - PDNSDA2STR(PDNSD_A(qs))); - goto retryquery2; - } -#endif - } - else if (rv==RC_NAMEERR || rv==RC_FATALERR) { - goto done; - } - } - } - /* recheck, this might have changed after the last p_exec_query */ - if (qs->state==QS_DONE && i==dc) - dc++; - } - if(nevents>0) { - /* We have not managed to handle all the events reported by poll/select. - Better call it quits, or we risk getting caught in a wasteful cycle. - */ - if(++poll_errs<=MAXPOLLERRS) - log_error("%d unhandled poll/select event(s) in p_recursive_query() at %s, line %d.",nevents,__FILE__,__LINE__); - rv=RC_SERVFAIL; - goto done; - } - } while (dc 1) - ++n; - if(n>0) { - pdnsd_a addrs[n]; /* variable length array */ - k=0; - for (i=0;ineeds_testing > 1) - addrs[k++]= *PDNSD_A(qs); - } - sched_server_test(addrs,n,-1); - } - } - } - - if(entsave) { - /* - * If we didn't get rrs from any of the authoritative servers, or the answers were - * unsatisfactory for another reason, take the one we had. - * However, raise the CF_NOCACHE flag, so that it won't be used again (outside the - * cache latency period). - */ - DEBUG_PDNSDA_MSG("Using %s reply from %s.\n", - !(qualval&NOTFAILMASK)? "reportedly failed": - !(qualval&W_NOTFAILED)? "inconsistent": - !(qualval&W_NOTTRUNC)? "truncated": - !(qualval&W_AUTHOK)? "non-authoritative": "good", - PDNSDA2STR(PDNSD_A(qse))); - ent=entsave; - serv=servsave; - ns=nssave; - if(qualvalflags&DF_NEGATIVE)) { - int jlim= RRARR_LEN(ent); - for (j=0; jflags |= CF_NOCACHE; - } - } - else /* Very unlikely, but not impossible. */ - ent->flags |= DF_NOCACHE; - } - rv=RC_OK; - } - else if (rv!=RC_OK) { - if(rv==RC_FATALERR) { - DEBUG_MSG("Unrecoverable error encountered while processing query.\n"); - rv=RC_SERVFAIL; - } - DEBUG_MSG("%sReturning error code \"%s\"\n", - rv!=RC_NAMEERR? "No query succeeded. ": "", - get_ename(rv)); - goto clean_up_return; - } - - if(nocache) *nocache=qse->nocache; - - if (DA_NEL(serv)>0) { - /* Authority records present. Ask them, because the answer was non-authoritative. */ - qstatnode_t qsn={q,qslist}; - unsigned char save_ns=ent->c_ns,save_soa=ent->c_soa; - - if(qse->aa || qse->ra) { - /* The server claimed to be authoritative or have recursion available, - yet we did not completely trust the answer for some reason. - We will try to ask the servers in the authority records, - but in case we fail, we will save a copy of the answer. */ - entsave=ent; - } - else { - free_cent(ent DBG1); - pdnsd_free(ent); - entsave=NULL; - } - rv=p_dns_cached_resolve(serv, name, thint,&ent,hops-1,&qsn,qhlist,time(NULL),c_soa); - if(rv==RC_OK || rv==RC_CACHED || (rv==RC_STALE && !entsave)) { - if(save_ns!=cundef && (ent->c_ns==cundef || ent->c_nsc_ns=save_ns; - if(save_soa!=cundef && (ent->c_soa==cundef || ent->c_soac_soa=save_soa; - goto free_entsave; - } - else if(rv==RC_NAMEERR) { - if(c_soa && save_soa!=cundef && (*c_soa==cundef || *c_soaaa? "be authoritative": "have recursion available"); - ent=entsave; - rv=RC_OK; - } - } - - clean_up_return: - /* Always free the serv array before freeing the ns list, - because the serv array contains references to data within the ns list! */ - del_qserv(serv); - dlist_free(ns); - - if(rv==RC_OK || rv==RC_CACHED || rv==RC_STALE) *entp=ent; - return rv; -# undef save_query_result -} - -/* auth_ok returns 1 if we don't need an authoritative answer or - if we can find servers to ask for an authoritative answer. - In the latter case these servers will be added to the *serv list. - A return value of 0 means the answer is not satisfactory in the - previous sense. - A return value of -1 indicates an error. -*/ -static int auth_ok(query_stat_array q, const unsigned char *name, int thint, dns_cent_t *ent, - int hops, qstatnode_t *qslist, qhintnode_t *qhlist, - query_stat_t *qse, dlist ns, query_stat_array *serv) -{ - int retval=0; - - /* If the answer was obtained from a name server which returned a failure code, - the answer is never satisfactory. */ - if(qse->failed > 1) return 0; - - /* - Look into the query type hint. If it is a wildcard (QT_*), we need an authoritative answer. - Same if there is no record that answers the query. - This test will also succeed if we have a negative cached record. This is done purposely. - */ -#define aa_needed ((thint>=QT_MIN && thint<=QT_MAX) || \ - ((thint>=T_MIN && thint<=T_MAX) && \ - (!have_rr(ent,thint) && !have_rr_CNAME(ent)))) - - /* We will want to query authoritative servers if all of the following conditions apply: - - 1) The server from which we got the answer was not configured as "proxy only". - 2) The answer is not a negatively cached domain (i.e. the server did not reply with NXDOMAIN). - 3) The query type is a wild card (QT_*), or no record answers the query. - 4) The answer that we have is non-authoritative. - */ - if(!(qse->auth_serv && !(ent->flags&DF_NEGATIVE) && aa_needed)) - return 1; - - if(qse->aa) { - /* The reply we have claims to be authoritative. - However, I have seen cases where name servers raise the authority flag incorrectly (groan...), - so as a work-around, we will check whether the domains for which the servers in the ns - list are responsible, match the queried name better than the domain for which the - last server was responsible. */ - unsigned char *nsdomain; - - if(!qse->nsdomain) - return 1; - - nsdomain=dlist_first(ns); - if(!nsdomain) - return 1; - for(;;) { - unsigned int rem,crem; - domain_match(nsdomain,qse->nsdomain,&rem,&crem); - if(!(rem>0 && crem==0)) - return 1; - domain_match(nsdomain,name,&rem,NULL); - if(rem!=0) - return 1; - do { - nsdomain=dlist_next(nsdomain); - if(!nsdomain) - goto done_checkauth; - } while(*nsdomain==0xff); /* Skip repeats. */ - } - done_checkauth:; - - /* The name servers in the ns list are a better match for the queried name than - the server from which we got the last reply, so ignore the aa flag. - */ -#if DEBUG>0 - if(debug_p) { - unsigned char dbuf[DNSNAMEBUFSIZE],sdbuf[DNSNAMEBUFSIZE]; - nsdomain=dlist_first(ns); - DEBUG_PDNSDA_MSG("The name server %s which is responsible for the %s domain, raised the aa flag, but appears to delegate to the sub-domain %s\n", - PDNSDA2STR(PDNSD_A(qse)), - rhn2str(qse->nsdomain,dbuf,sizeof(dbuf)), - rhn2str(nsdomain,sdbuf,sizeof(sdbuf))); - } -#endif - } - - /* The answer was non-authoritative. Try to build a list of addresses of authoritative servers. */ - if (hops>0) { - unsigned char *nsdomp, *nsdomain=NULL; - rr_set_t *localrrset=NULL; - rr_bucket_t *localrr=NULL; - for (nsdomp=dlist_first(ns);;) { - unsigned char *nsname=NULL; /* Initialize to inhibit compiler warning. */ - int nserva, ia, n; - pdnsd_a2 serva[MAXNAMESERVIPS]; - - /* Get next name server. */ - if(localrr) { - /* Use next locally defined NS record. */ - nsname=(unsigned char *)(localrr->data); - localrr= localrr->next; - } - else { - if(localrrset) { - /* clean up rrset */ - del_rrset(localrrset DBG1); - localrrset=NULL; - } - if(!nsdomp) - break; - else if(*nsdomp!=0xff) { - /* New domain. */ - nsdomain=nsdomp; - if (global.paranoid) { - unsigned int rem; - /* paranoia mode: don't query name servers that are not responsible */ - domain_match(nsdomain,name,&rem,NULL); - if (rem!=0) { -#if DEBUG>0 - unsigned char nmbuf[DNSNAMEBUFSIZE],dbuf[DNSNAMEBUFSIZE],nsbuf[DNSNAMEBUFSIZE]; - DEBUG_MSG("The name server %s is responsible for the %s domain, which does not match %s\n", - rhn2str(nsname,nsbuf,sizeof(nsbuf)), - rhn2str(nsdomain,dbuf,sizeof(dbuf)), - rhn2str(name,nmbuf,sizeof(nmbuf))); -#endif - /* Skip records in ns list for the same domain. */ - do { - nsdomp=dlist_next(nsdomp); - } while (nsdomp && *nsdomp==0xff); - continue; - } - } - /* Check if we have locally defined NS records, because - they will override the ones provided by remote servers. - */ - localrrset=lookup_cache_local_rrset(nsdomain,T_NS); - if(localrrset) { - /* Skip records in ns list for the same domain. */ - do { - nsdomp=dlist_next(nsdomp); - } while (nsdomp && *nsdomp==0xff); - localrr=localrrset->rrs; - if(!localrr) continue; - nsname=(unsigned char *)(localrr->data); - localrr= localrr->next; - } - else { - nsname=skiprhn(nsdomp); - nsdomp=dlist_next(nsdomp); - } - } - else { - /* domain repeated. */ - nsname= nsdomp+1; - nsdomp=dlist_next(nsdomp); - } - } - /* look it up in the cache or resolve it if needed. - The records received should be in the cache now, so it's ok. - */ - nserva=0; - - { - const unsigned char *nm=name; - int tp=thint; - qhintnode_t *ql=qhlist; - - for(;;) { - if(rhnicmp(nm,nsname) && tp==T_A) { - DEBUG_RHN_MSG("Not looking up address for name server \"%s\": " - "risk of infinite recursion.\n",RHN2STR(nsname)); - goto skip_server; - } - if(!ql) break; - nm=ql->nm; - tp=ql->tp; - ql=ql->next; - } - { - qhintnode_t qhn={name,thint,qhlist}; - dns_cent_t *servent; - if (r_dns_cached_resolve(nsname,T_A, &servent, hops-1, &qhn,time(NULL),NULL)==RC_OK) { -#ifdef ENABLE_IPV4 - if (run_ipv4) { - rr_set_t *rrset=getrrset_A(servent); - rr_bucket_t *rrs; - if (rrset) - for(rrs=rrset->rrs; rrs && nservanext) - serva[nserva++].ipv4 = *((struct in_addr *)rrs->data); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - rr_set_t *rrset6=getrrset_AAAA(servent); - rr_bucket_t *rrs6= (rrset6? rrset6->rrs: NULL); - rr_set_t *rrset4=getrrset_A(servent); - rr_bucket_t *rrs4= (rrset4? rrset4->rrs: NULL); - while(nservadata); - rrs6=rrs6->next; - if (rrs4) { - /* Store IPv4 address as fallback. */ - serva[nserva].ipv4 = *((struct in_addr *)rrs4->data); - rrs4=rrs4->next; - } - else - serva[nserva].ipv4.s_addr=INADDR_ANY; - } - else if (rrs4) { - struct in_addr *ina = (struct in_addr *)rrs4->data; - struct in6_addr *in6a = &serva[nserva].ipv6; - IPV6_MAPIPV4(ina,in6a); - serva[nserva].ipv4.s_addr=INADDR_ANY; - rrs4=rrs4->next; - } - else - break; - ++nserva; - } - } -#endif - free_cent(servent DBG1); - pdnsd_free(servent); - } - } - } - -#if DEBUG>0 - if(nserva==0) { - DEBUG_RHN_MSG("Looking up address for name server \"%s\" failed.\n",RHN2STR(nsname)); - } -#endif - n=DA_NEL(*serv); - for(ia=0; iastate==QS_DONE && equiv_inaddr2(PDNSD_A(qs),pserva)) { - DEBUG_PDNSDA_MSG("Not trying name server %s, already queried.\n", PDNSDA2STR(PDNSD_A2_TO_A(pserva))); - goto skip_server_addr; - } - } - if(!ql) break; - qa=ql->qa; - ql=ql->next; - } - } - - /* lean query mode is inherited. CF_AUTH and CF_ADDITIONAL are not (as specified - * in CFF_NOINHERIT). */ - if (!add_qserv(serv, pserva, 53, qse->timeout, qse->flags&~CFF_NOINHERIT, 0, - qse->lean_query,qse->edns_query,2,0,!global.paranoid,nsdomain, - inherit_rejectlist(qse)?qse->rejectlist:NULL)) - { - return -1; - } - retval=1; - skip_server_addr:; - } - skip_server:; - } -#if DEBUG>0 - if(!retval) { - DEBUG_PDNSDA_MSG("No remaining authoritative name servers to try in authority section from %s.\n", PDNSDA2STR(PDNSD_A(qse))); - } -#endif - } - else { - DEBUG_MSG("Maximum hops count reached; not trying any more name servers.\n"); - } - - return retval; - -#undef aa_needed -} - -/* - * This checks the given name to resolve against the access list given for the server using the - * include=, exclude= and policy= parameters. - */ -static int use_server(servparm_t *s, const unsigned char *name) -{ - int i,n=DA_NEL(s->alist); - - for (i=0;ialist,i); - unsigned int nrem,lrem; - domain_match(name,sl->domain,&nrem,&lrem); - if(!lrem && (!sl->exact || !nrem)) - return sl->rule==C_INCLUDED; - } - - if (s->policy==C_SIMPLE_ONLY || s->policy==C_FQDN_ONLY) { - if(rhnsegcnt(name)<=1) - return s->policy==C_SIMPLE_ONLY; - else - return s->policy==C_FQDN_ONLY; - } - - return s->policy==C_INCLUDED; -} - -#if ALLOW_LOCAL_AAAA -#define serv_has_rejectlist(s) ((s)->reject_a4!=NULL || (s)->reject_a6!=NULL) -#else -#define serv_has_rejectlist(s) ((s)->reject_a4!=NULL) -#endif - -/* Take the lists of IP addresses from a server section sp and - convert them into a form that can be used by p_exec_query(). - If successful, add_rejectlist returns a new list which is added to the old list rl, - otherwise the return value is NULL. -*/ -static rejectlist_t *add_rejectlist(rejectlist_t *rl, servparm_t *sp) -{ - int i,na4=DA_NEL(sp->reject_a4); - addr4maskpair_t *a4p; -#if ALLOW_LOCAL_AAAA - int na6=DA_NEL(sp->reject_a6); - addr6maskpair_t *a6p; -#endif - rejectlist_t *rlist = malloc(sizeof(rejectlist_t) + na4*sizeof(addr4maskpair_t) -#if ALLOW_LOCAL_AAAA - + na6*sizeof(addr6maskpair_t) -#endif - ); - - if(rlist) { -#if ALLOW_LOCAL_AAAA - /* Store the larger IPv6 addresses first to avoid possible alignment problems. */ - rlist->na6 = na6; - a6p = (addr6maskpair_t *)rlist->rdata; - for(i=0;ireject_a6,i); -#endif - rlist->na4 = na4; -#if ALLOW_LOCAL_AAAA - a4p = (addr4maskpair_t *)a6p; -#else - a4p = (addr4maskpair_t *)rlist->rdata; -#endif - for(i=0;ireject_a4,i); - - rlist->policy = sp->rejectpolicy; - rlist->inherit = sp->rejectrecursively; - rlist->next = rl; - } - else { - DEBUG_MSG("Out of memory in add_rejectlist()\n"); - } - - return rlist; -} - -inline static void free_rejectlist(rejectlist_t *rl) -{ - while(rl) { - rejectlist_t *next = rl->next; - free(rl); - rl=next; - } -} - -/* Lookup addresses of nameservers provided by root servers for a given domain in the cache. - Returns NULL if unsuccessful (or the cache entries have timed out). -*/ -static addr2_array lookup_ns(const unsigned char *domain) -{ - addr2_array res=NULL; - - dns_cent_t *cent=lookup_cache(domain,NULL); - if(cent) { - rr_set_t *rrset=getrrset_NS(cent); - if(rrset && (rrset->flags&CF_ROOTSERV) && !timedout(rrset)) { - rr_bucket_t *rr; - for(rr=rrset->rrs; rr; rr=rr->next) { - dns_cent_t *servent=lookup_cache((unsigned char*)(rr->data),NULL); - int nserva=0; - pdnsd_a2 serva[MAXNAMESERVIPS]; - if(servent) { -#ifdef ENABLE_IPV4 - if (run_ipv4) { - rr_set_t *rrset=getrrset_A(servent); - rr_bucket_t *rrs; - if (rrset && !timedout(rrset)) - for(rrs=rrset->rrs; rrs && nservanext) - serva[nserva++].ipv4 = *((struct in_addr *)rrs->data); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - rr_set_t *rrset6=getrrset_AAAA(servent); - rr_set_t *rrset4=getrrset_A(servent); - rr_bucket_t *rrs6=NULL, *rrs4=NULL; - if (rrset6 && !(rrset6->flags&CF_NEGATIVE)) { - if(!timedout(rrset6)) { - rrs6= rrset6->rrs; - if (rrs6 && rrset4 && !(rrset4->flags&CF_NEGATIVE)) { - if(timedout(rrset4) || !(rrs4=rrset4->rrs)) - /* Treat this as a failure. */ - rrs6=NULL; - } - } - } - else if (rrset4 && !timedout(rrset4)) - rrs4= rrset4->rrs; - - while(nservadata); - rrs6=rrs6->next; - if (rrs4) { - /* Store IPv4 address as fallback. */ - serva[nserva].ipv4 = *((struct in_addr *)rrs4->data); - rrs4=rrs4->next; - } - else - serva[nserva].ipv4.s_addr=INADDR_ANY; - } - else if (rrs4) { - struct in_addr *ina = (struct in_addr *)rrs4->data; - struct in6_addr *in6a = &serva[nserva].ipv6; - IPV6_MAPIPV4(ina,in6a); - serva[nserva].ipv4.s_addr=INADDR_ANY; - rrs4=rrs4->next; - } - else - break; - ++nserva; - } - } -#endif - free_cent(servent DBG1); - pdnsd_free(servent); - } - if(nserva==0) { - /* Address lookup failed. */ - da_free(res); res=NULL; - break; - } - else { - int i, j, n=DA_NEL(res); - for(i=0; irrs; rr; rr=rr->next) { - dns_cent_t *servent; - int nserva=0; - pdnsd_a2 serva[MAXNAMESERVIPS]; - - rc=simple_dns_cached_resolve(atup_a,port,edns_query,timeout, - (const unsigned char *)(rr->data),T_A,&servent); - if(rc==RC_OK) { -#ifdef ENABLE_IPV4 - if (run_ipv4) { - rr_set_t *rrset=getrrset_A(servent); - rr_bucket_t *rrs; - if (rrset) - for(rrs=rrset->rrs; rrs && nservanext) - serva[nserva++].ipv4 = *((struct in_addr *)rrs->data); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - rr_set_t *rrset6=getrrset_AAAA(servent); - rr_bucket_t *rrs6= (rrset6? rrset6->rrs: NULL); - rr_set_t *rrset4=getrrset_A(servent); - rr_bucket_t *rrs4= (rrset4? rrset4->rrs: NULL); - while(nservadata); - rrs6=rrs6->next; - if (rrs4) { - /* Store IPv4 address as fallback. */ - serva[nserva].ipv4 = *((struct in_addr *)rrs4->data); - rrs4=rrs4->next; - } - else - serva[nserva].ipv4.s_addr=INADDR_ANY; - } - else if (rrs4) { - struct in_addr *ina = (struct in_addr *)rrs4->data; - struct in6_addr *in6a = &serva[nserva].ipv6; - IPV6_MAPIPV4(ina,in6a); - serva[nserva].ipv4.s_addr=INADDR_ANY; - rrs4=rrs4->next; - } - else - break; - ++nserva; - } - } -#endif - free_cent(servent DBG1); - pdnsd_free(servent); - } - else { - DEBUG_RHN_MSG("Simple query for %s type A failed (rc: %s)\n", - RHN2STR((const unsigned char *)(rr->data)),get_ename(rc)); - } - - if(nserva==0) { - /* Address lookup failed. */ - DEBUG_RHN_MSG("Failed to obtain address of root server %s in dns_rootserver_resolv()\n", - RHN2STR((const unsigned char *)(rr->data))); - ++nfail; - } - else { - int i, j, n=DA_NEL(res); - for(i=0; iDA_NEL(res)) { - DEBUG_MSG("Too many root-server resolve failures (%u succeeded, %u failed)," - " rejecting the result.\n", DA_NEL(res),nfail); - da_free(res); res=NULL; - } - } - free_cent_return: - free_cent(cent DBG1); - pdnsd_free(cent); - } - else { - DEBUG_MSG("Simple query for root domain type NS failed (rc: %s)\n",get_ename(rc)); - } - - return res; -} - - -static int p_dns_resolve(const unsigned char *name, int thint, dns_cent_t **cachedp, int hops, qhintnode_t *qhlist, - unsigned char *c_soa) -{ - int i,n,rc; - int one_up=0,seenrootserv=0; - query_stat_array serv=NULL; - rejectlist_t *rejectlist=NULL; - - /* try the servers in the order of their definition */ - lock_server_data(); - n=DA_NEL(servers); - for (i=0;irootserver<=1 && use_server(sp,name)) { - int m=DA_NEL(sp->atup_a); - if(m>0) { - rejectlist_t *rjl=NULL; - int j=0, jstart=0; - if(sp->rand_servers) j=jstart=random()%m; - do { - atup_t *at=&DA_INDEX(sp->atup_a,j); - if (at->is_up) { - if(sp->rootserver) { - if(!seenrootserv) { - int nseg,mseg=1,l=0; - const unsigned char *topdomain=NULL; - addr2_array adrs=NULL; - seenrootserv=1; - nseg=rhnsegcnt(name); - if(nseg>=2) { - static const unsigned char rhn_arpa[6]= {4,'a','r','p','a',0}; - unsigned int rem; - /* Check if the queried name ends in "arpa" */ - domain_match(rhn_arpa, name, &rem,NULL); - if(rem==0) mseg=3; - } - if(nseg<=mseg) { - if(nseg>0) mseg=nseg-1; else mseg=0; - } - for(;mseg>=1; --mseg) { - topdomain=skipsegs(name,nseg-mseg); - adrs=lookup_ns(topdomain); - l=DA_NEL(adrs); - if(l>0) break; - if(adrs) da_free(adrs); - } - if(l>0) { - /* The name servers for this top level domain have been found in the cache. - Instead of asking the root server, we will use this cached information. - */ - int k=0, kstart=0; - if(sp->rand_servers) k=kstart=random()%l; - if(serv_has_rejectlist(sp) && sp->rejectrecursively && !rjl) { - rjl=add_rejectlist(rejectlist,sp); - if(!rjl) {one_up=0; da_free(adrs); goto done;} - rejectlist=rjl; - } - do { - one_up=add_qserv(&serv, &DA_INDEX(adrs,k), 53, sp->timeout, - mk_flag_val(sp)&~CFF_NOINHERIT, sp->nocache, - sp->lean_query, sp->edns_query, 2, 0, - !global.paranoid, topdomain, rjl); - if(!one_up) { - da_free(adrs); - goto done; - } - if(++k==l) k=0; - } while(k!=kstart); - da_free(adrs); - DEBUG_PDNSDA_MSG("Not querying root-server %s, using cached information instead.\n", - PDNSDA2STR(PDNSD_A2_TO_A(&at->a))); - seenrootserv=2; - break; - } - } - else if(seenrootserv==2) - break; - } - if(serv_has_rejectlist(sp) && !rjl) { - rjl=add_rejectlist(rejectlist,sp); - if(!rjl) {one_up=0; goto done;} - rejectlist=rjl; - } - one_up=add_qserv(&serv, &at->a, sp->port, sp->timeout, - mk_flag_val(sp), sp->nocache, sp->lean_query, sp->edns_query, - sp->rootserver?3:(!sp->is_proxy), - needs_testing(sp), 1, NULL, rjl); - if(!one_up) - goto done; - } - if(++j==m) j=0; - } while(j!=jstart); - } - } - } - done: - unlock_server_data(); - if (one_up) { - dns_cent_t *cached; - int nocache; - rc=p_recursive_query(serv, name, thint, &cached, &nocache, hops, NULL, qhlist, c_soa); - if (rc==RC_OK) { - if (!nocache) { - dns_cent_t *tc; - add_cache(cached); - if ((tc=lookup_cache(name,NULL))) { - /* The cache may hold more information than the recent query yielded. - * try to get the merged record. If that fails, revert to the new one. */ - free_cent(cached DBG1); - pdnsd_free(cached); - cached=tc; - /* rc=RC_CACHED; */ - } else - DEBUG_MSG("p_dns_resolve: merging answer with cache failed, using local cent copy.\n"); - } else - DEBUG_MSG("p_dns_resolve: nocache.\n"); - - *cachedp=cached; - } - else if(rc==RC_CACHED || rc==RC_STALE) - *cachedp=cached; - } - else { - DEBUG_MSG("No server is marked up and allowed for this domain.\n"); - rc=RC_SERVFAIL; /* No server up */ - } - del_qserv(serv); - free_rejectlist(rejectlist); - return rc; -} - -static int set_flags_ttl(unsigned short *flags, time_t *ttl, dns_cent_t *cached, int tp) -{ - rr_set_t *rrset=getrrset(cached,tp); - if (rrset) { - time_t t; - *flags|=rrset->flags; - t=rrset->ts+CLAT_ADJ(rrset->ttl); - if (!*ttl || *ttl>t) - *ttl=t; - return 1; - } - return 0; -} - -static void set_all_flags_ttl(unsigned short *flags, time_t *ttl, dns_cent_t *cached) -{ - int i, ilim= RRARR_LEN(cached); - - for(i=0; iflags; - t=rrset->ts+CLAT_ADJ(rrset->ttl); - if (!*ttl || *ttl>t) - *ttl=t; - } - } -} - -/* - Lookup name in the cache, and if records of type thint are found, check whether a requery is needed. - Possible returns values are: - RC_OK: the name is locally defined. - RC_NAMEERR: the name is locally negatively cached. - RC_CACHED: name was found in the cache, requery not needed. - RC_STALE: name was found in the cache, but requery is needed. - RC_NOTCACHED: name was not found in the cache. -*/ -static int lookup_cache_status(const unsigned char *name, int thint, dns_cent_t **cachedp, unsigned short *flagsp, - time_t queryts, unsigned char *c_soa) -{ - dns_cent_t *cached; - int rc=RC_NOTCACHED; - int wild=0; - unsigned short flags=0; - - if ((cached=lookup_cache(name,&wild))) { - short int neg=0,timed=0,need_req=0; - time_t ttl=0; - - if (cached->flags&DF_LOCAL) { -#if DEBUG>0 - { - char dflagstr[DFLAGSTRLEN]; - DEBUG_RHN_MSG("Entry found in cache for '%s' with dflags=%s.\n", - RHN2STR(cached->qname),dflags2str(cached->flags,dflagstr)); - } -#endif - if((cached->flags&DF_NEGATIVE) || wild==w_locnerr) { - if(c_soa) { - if(cached->c_soa!=cundef) - *c_soa=cached->c_soa; - else if(have_rr_SOA(cached)) - *c_soa=rhnsegcnt(cached->qname); - else { - unsigned char *owner=getlocalowner(cached->qname,T_SOA); - if(owner) - *c_soa=rhnsegcnt(owner); - } - } - free_cent(cached DBG1); - pdnsd_free(cached); - rc= RC_NAMEERR; - goto return_rc; - } - else { - rc= RC_OK; - goto return_rc_cent; - } - } - DEBUG_RHN_MSG("Record found in cache for %s\n",RHN2STR(cached->qname)); - if (cached->flags&DF_NEGATIVE) { - if ((ttl=cached->neg.ts+CLAT_ADJ(cached->neg.ttl))>=queryts) - neg=1; - else - timed=1; - } else { - if (thint==QT_ALL) { - set_all_flags_ttl(&flags, &ttl, cached); - } - else if (!set_flags_ttl(&flags, &ttl, cached, T_CNAME) || (getrrset_CNAME(cached)->flags&CF_NEGATIVE)) { - flags=0; ttl=0; - if (thint>=T_MIN && thint<=T_MAX) { - if (set_flags_ttl(&flags, &ttl, cached, thint)) - neg=getrrset(cached,thint)->flags&CF_NEGATIVE && ttl>=queryts; - } - else if (thint==QT_MAILB) { - set_flags_ttl(&flags, &ttl, cached, T_MB); - set_flags_ttl(&flags, &ttl, cached, T_MG); - set_flags_ttl(&flags, &ttl, cached, T_MR); - } - else if (thint==QT_MAILA) { - set_flags_ttl(&flags, &ttl, cached, T_MD); - set_flags_ttl(&flags, &ttl, cached, T_MF); - } - } - if(!(flags&CF_LOCAL)) { - if (thint==QT_ALL) { - if(!(cached->flags&DF_AUTH)) - need_req=1; - } - else if (thint>=QT_MIN && thint<=QT_MAX) { - if(!(flags&CF_AUTH && !(flags&CF_ADDITIONAL))) - need_req=1; - } - if (ttl0 - { - char dflagstr[DFLAGSTRLEN],cflagstr[CFLAGSTRLEN]; - DEBUG_MSG("Requery decision: dflags=%s, cflags=%s, req=%i, neg=%i, timed=%i, %s=%li\n", - dflags2str(cached->flags,dflagstr),cflags2str(flags,cflagstr),need_req,neg,timed, - ttl?"ttl":"timestamp",(long)(ttl?(ttl-queryts):ttl)); - } -#endif - rc = (!neg && (need_req || timed))? RC_STALE: RC_CACHED; - return_rc_cent: - *cachedp=cached; - } - -return_rc: - if(flagsp) *flagsp=flags; - return rc; -} - - -/* - * Resolve records for name into dns_cent_t, type thint. - * q is the set of servers to query from. Set q to NULL if you want to ask the servers registered with pdnsd. - * qslist should refer to a list of server arrays already used higher up the calling chain (may be NULL). - * p_dns_cached_resolve() returns one of the following values: - * RC_OK means that the name was successfully resolved by querying other servers. - * RC_CACHED or RC_STALE means that the name was found in the cache. - * RC_NAMEERR or RC_SERVFAIL indicates a resolve error. - */ -static int p_dns_cached_resolve(query_stat_array q, const unsigned char *name, int thint, dns_cent_t **cachedp, - int hops, qstatnode_t *qslist, qhintnode_t *qhlist, time_t queryts, - unsigned char *c_soa) -{ - dns_cent_t *cached=NULL; - int rc; - unsigned short flags=0; - - DEBUG_RHN_MSG("Starting cached resolve for: %s, query %s\n",RHN2STR(name),get_tname(thint)); - rc= lookup_cache_status(name, thint, &cached, &flags,queryts,c_soa); - if(rc==RC_OK) { - /* Locally defined record. */ - *cachedp=cached; - return RC_CACHED; - } - else if(rc==RC_NAMEERR) /* Locally negated name. */ - return RC_NAMEERR; - - /* update server records set onquery */ - if(global.onquery) test_onquery(); - if (global.lndown_kluge && !(flags&CF_LOCAL)) { - int i,n,linkdown=1; - lock_server_data(); - n=DA_NEL(servers); - for(i=0;irootserver<=1) { - int j,m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j).is_up) { - linkdown=0; - goto done; - } - } - } - } - done: - unlock_server_data(); - if (linkdown) { - DEBUG_MSG("Link is down.\n"); - rc=RC_SERVFAIL; - goto cleanup_return; - } - } - if (rc!=RC_CACHED) { - dns_cent_t *ent; - DEBUG_MSG("Trying name servers.\n"); - if (q) - rc=p_recursive_query(q,name,thint, &ent,NULL,hops,qslist,qhlist,c_soa); - else - rc=p_dns_resolve(name,thint, &ent,hops,qhlist,c_soa); - - if(rc==RC_OK || rc==RC_CACHED || rc==RC_STALE) { - if (cached) { - free_cent(cached DBG1); - pdnsd_free(cached); - } - cached=ent; - } - else if (rc==RC_SERVFAIL && cached && (flags&CF_NOPURGE)) { - /* We could not get a new record, but we have a timed-out cached one - with the nopurge flag set. This means that we shall use it even - if timed out when no new one is available*/ - DEBUG_MSG("Falling back to cached record.\n"); - rc=RC_STALE; - } - else - goto cleanup_return; - } else { - DEBUG_MSG("Using cached record.\n"); - } - *cachedp=cached; - return rc; - - cleanup_return: - if(cached) { - free_cent(cached DBG1); - pdnsd_free(cached); - } - return rc; -} - - -/* r_dns_cached_resolve() is like p_dns_cached_resolve(), except that r_dns_cached_resolve() - will not return negatively cached entries, but returns RC_NAMEERR instead. - It also does not return RC_CACHED or RC_STALE, but RC_OK instead. -*/ -int r_dns_cached_resolve(unsigned char *name, int thint, dns_cent_t **cachedp, - int hops, qhintnode_t *qhlist, time_t queryts, - unsigned char *c_soa) -{ - dns_cent_t *cached; - int rc=p_dns_cached_resolve(NULL,name,thint,&cached,hops,NULL,qhlist,queryts,c_soa); - if(rc==RC_OK || rc==RC_CACHED || rc==RC_STALE) { - if(cached->flags&DF_NEGATIVE) { - if(c_soa) - *c_soa=cached->c_soa; - free_cent(cached DBG1); - pdnsd_free(cached); - return RC_NAMEERR; - } - else { - *cachedp=cached; - return RC_OK; - } - } - return rc; -} - - -static int simple_dns_cached_resolve(atup_array atup_a, int port, char edns_query, time_t timeout, - const unsigned char *name, int thint, dns_cent_t **cachedp) -{ - dns_cent_t *cached=NULL; - int rc; - - DEBUG_RHN_MSG("Starting simple cached resolve for: %s, query %s\n",RHN2STR(name),get_tname(thint)); - rc= lookup_cache_status(name, thint, &cached, NULL, time(NULL), NULL); - if(rc==RC_OK) { - /* Locally defined record. */ - *cachedp=cached; - return RC_OK; - } - else if(rc==RC_NAMEERR) /* Locally negated name. */ - return RC_NAMEERR; - - if (rc!=RC_CACHED) { - query_stat_array qserv; - int j,m; - if (cached) { - free_cent(cached DBG1); - pdnsd_free(cached); - cached=NULL; - } - DEBUG_MSG("Trying name servers.\n"); - qserv=NULL; - m=DA_NEL(atup_a); - for(j=0; jflags&DF_NEGATIVE) { - free_cent(cached DBG1); - pdnsd_free(cached); - return RC_NAMEERR; - } - - *cachedp=cached; - return RC_OK; -} - - -/* Check whether a server is responsive by sending it an (empty) query. - rep is the number of times this is tried in case of no reply. - */ -int query_uptest(pdnsd_a *addr, int port, const unsigned char *name, time_t timeout, int rep) -{ - query_stat_t qs; - int iter=0,rv; - -#ifdef ENABLE_IPV4 - if (run_ipv4) { - memset(&qs.a.sin4,0,sizeof(qs.a.sin4)); - qs.a.sin4.sin_family=AF_INET; - qs.a.sin4.sin_port=htons(port); - qs.a.sin4.sin_addr=addr->ipv4; - SET_SOCKA_LEN4(qs.a.sin4); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - memset(&qs.a.sin6,0,sizeof(qs.a.sin6)); - qs.a.sin6.sin6_family=AF_INET6; - qs.a.sin6.sin6_port=htons(port); - qs.a.sin6.sin6_flowinfo=IPV6_FLOWINFO; - qs.a.sin6.sin6_addr=addr->ipv6; - SET_SOCKA_LEN6(qs.a.sin6); - - qs.a4fallback.s_addr=INADDR_ANY; - } -#endif - qs.timeout=timeout; - qs.flags=0; - qs.nocache=0; - qs.auth_serv=0; - qs.lean_query=1; - qs.edns_query=0; - qs.needs_testing=0; - qs.trusted=1; - qs.aa=0; - qs.tc=0; - qs.ra=0; - qs.failed=0; - qs.nsdomain=NULL; - qs.rejectlist=NULL; - - try_again: - qs.state=QS_INITIAL; - qs.qm=global.query_method; - qs.s_errno=0; - rv=p_exec_query(NULL, name, T_A, &qs, NULL, NULL); - if(rv==-1) { - time_t ts, tpassed; - for(ts=time(NULL), tpassed=0;; tpassed=time(NULL)-ts) { - int event; -#ifdef NO_POLL - fd_set reads; - fd_set writes; - struct timeval tv; - FD_ZERO(&reads); - FD_ZERO(&writes); - PDNSD_ASSERT(qs.socktpassed?timeout-tpassed:0; - tv.tv_usec=0; - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that doing - this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - p_cancel_query(&qs); - return 0; - } - event=select(qs.sock+1,&reads,&writes,NULL,&tv); -#else - struct pollfd pfd; - pfd.fd=qs.sock; - switch (qs.state) { - QS_READ_CASES: - pfd.events=POLLIN; - break; - QS_WRITE_CASES: - pfd.events=POLLOUT; - break; - default: - pfd.events=0; - } - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that doing - this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - p_cancel_query(&qs); - return 0; - } - event=poll(&pfd,1,timeout>tpassed?(timeout-tpassed)*1000:0); -#endif - if (event<0) { - if(errno==EINTR && is_interrupted_servstat_thread()) { - DEBUG_MSG("poll/select interrupted in server status thread.\n"); - } - else - log_warn("poll/select failed: %s",strerror(errno)); - p_cancel_query(&qs); - return 0; - } - if(event==0) { - /* timed out */ - p_cancel_query(&qs); - if(++iter. -*/ - - -#ifndef DNS_QUERY_H -#define DNS_QUERY_H - -#include "cache.h" - -/* Default UDP buffer size (when EDNS is not used). */ -#define UDP_BUFSIZE 512 - - -typedef struct qhintnode_s qhintnode_t; - -/* --- parallel query */ -int r_dns_cached_resolve(unsigned char *name, int thint, dns_cent_t **cachedp, - int hops, qhintnode_t *qhlist, time_t queryts, - unsigned char *c_soa); -#define dns_cached_resolve(name,thint,cachedp,hops,queryts,c_soa) \ - r_dns_cached_resolve(name,thint,cachedp,hops,NULL,queryts,c_soa) - -addr2_array dns_rootserver_resolv(atup_array atup_a, int port, char edns_query, time_t timeout); -int query_uptest(pdnsd_a *addr, int port, const unsigned char *name, time_t timeout, int rep); - -/* --- from dns_answer.c */ -int add_opt_pseudo_rr(dns_msg_t **ans, size_t *sz, size_t *allocsz, - unsigned short udpsize, unsigned short rcode, - unsigned short ednsver, unsigned short Zflags); -size_t remove_opt_pseudo_rr(dns_msg_t *ans, size_t sz); - -#endif diff --git a/jni/pdnsd/src/error.c b/jni/pdnsd/src/error.c deleted file mode 100644 index 45848660..00000000 --- a/jni/pdnsd/src/error.c +++ /dev/null @@ -1,142 +0,0 @@ -/* error.c - Error handling - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2004, 2005, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "error.h" -#include "helpers.h" -#include "conff.h" - - -pthread_mutex_t loglock = PTHREAD_MUTEX_INITIALIZER; -volatile short int use_log_lock=0; - -/* - * Initialize a mutex for io-locking in order not to produce gibberish on - * multiple simultaneous errors. - */ -/* This is now defined as an inline function in error.h */ -#if 0 -void init_log_lock(void) -{ - use_log_lock=1; -} -#endif - -/* We crashed? Ooops... */ -void crash_msg(char *msg) -{ - log_error("%s", msg); - log_error("pdnsd probably crashed due to a bug. Please consider sending a bug"); - log_error("report to p.a.rombouts@home.nl or tmoestl@gmx.net"); -} - -/* Log a warning, error or info message. - * If we are a daemon, use the syslog. s is a format string like in printf, - * the optional following arguments are the arguments like in printf */ -void log_message(int prior, const char *s, ...) -{ - int gotlock=0; - va_list va; - FILE *f; - - if (use_log_lock) { - gotlock=softlock_mutex(&loglock); - /* If we failed to get the lock and the type of the - message is "info" or less important, then don't bother. */ - if(!gotlock && prior>=LOG_INFO) - return; - } - if (global.daemon) { - openlog("pdnsd",LOG_PID,LOG_DAEMON); - va_start(va,s); - vsyslog(prior,s,va); - va_end(va); - closelog(); - } - else { - f=stderr; -#if DEBUG > 0 - goto printtofile; - } - if(debug_p) { - f=dbg_file; - printtofile: -#endif - { - char ts[sizeof "* 12/31 23:59:59| "]; - time_t tt = time(NULL); - struct tm tm; - - if(!localtime_r(&tt, &tm) || strftime(ts, sizeof(ts), "* %m/%d %T| ", &tm) <=0) - ts[0]=0; - fprintf(f,"%spdnsd: %s: ", ts, - prior<=LOG_CRIT?"critical": - prior==LOG_ERR?"error": - prior==LOG_WARNING?"warning": - "info"); - } - va_start(va,s); - vfprintf(f,s,va); - va_end(va); - { - const char *p=strchr(s,0); - if(!p || p==s || *(p-1)!='\n') - fputc('\n',f); - } - } - if (gotlock) - pthread_mutex_unlock(&loglock); -} - - -#if DEBUG > 0 -/* XXX: The timestamp generation makes this a little heavy-weight */ -void debug_msg(int c, const char *fmt, ...) -{ - va_list va; - - if (!c) { - char ts[sizeof "12/31 23:59:59"]; - time_t tt = time(NULL); - struct tm tm; - unsigned *id; - - if(localtime_r(&tt, &tm) && strftime(ts, sizeof(ts), "%m/%d %T", &tm) > 0) { - if((id = (unsigned *)pthread_getspecific(thrid_key))) - fprintf(dbg_file,"%u %s| ", *id, ts); - else - fprintf(dbg_file,"- %s| ", ts); - } - } - va_start(va,fmt); - vfprintf(dbg_file,fmt,va); - va_end(va); - fflush(dbg_file); -} -#endif /* DEBUG */ diff --git a/jni/pdnsd/src/error.h b/jni/pdnsd/src/error.h deleted file mode 100644 index 1678744e..00000000 --- a/jni/pdnsd/src/error.h +++ /dev/null @@ -1,115 +0,0 @@ -/* error.h - Error handling - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2004, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef ERROR_H -#define ERROR_H - -#include -#include -#include -#include -#include -#include - -#include "thread.h" -#include "helpers.h" -#include "pdnsd_assert.h" - -/* --- from error.c */ -extern volatile short int use_log_lock; -/* --- */ - -void crash_msg(char *msg); - -inline static void init_log_lock(void) __attribute__((always_inline)); -inline static void init_log_lock(void) -{ - use_log_lock=1; -} - -void log_message(int prior,const char *s, ...) printfunc(2, 3); -#if !defined(CPP_C99_VARIADIC_MACROS) -/* GNU C Macro Varargs style. */ -#define log_error(args...) log_message(LOG_ERR,args) -#define log_warn(args...) log_message(LOG_WARNING,args) -#define log_info(level,args...) {if((level)<=global.verbosity) log_message(LOG_INFO,args);} -#else -/* ANSI C99 style. */ -#define log_error(...) log_message(LOG_ERR,__VA_ARGS__) -#define log_warn(...) log_message(LOG_WARNING,__VA_ARGS__) -#define log_info(level,...) {if((level)<=global.verbosity) log_message(LOG_INFO,__VA_ARGS__);} -#endif - -/* Following are some ugly macros for debug messages that - * should inhibit any code generation when DEBUG is not defined. - * Of course, those messages could be done in a function, but I - * want to save the overhead when DEBUG is not defined. - * debug_p needs to be defined (by including conff.h), or you - * will get strange errors. - * A macro call expands to a complete statement, so a semicolon after - * the macro call is redundant. - * The arguments are normal printfs, so you know how to use the args - */ -#if DEBUG>0 -void debug_msg(int c, const char *fmt, ...) printfunc(2, 3); -/* from main.c */ -extern FILE *dbg_file; -#endif - -#if !defined(CPP_C99_VARIADIC_MACROS) -/* GNU C Macro Varargs style. */ -# if DEBUG > 0 -# define DEBUG_MSG(args...) {if (debug_p) debug_msg(0,args);} -# define DEBUG_MSGC(args...) {if (debug_p) debug_msg(1,args);} -# define DEBUG_PDNSDA_MSG(args...) {char _debugsockabuf[ADDRSTR_MAXLEN]; DEBUG_MSG(args);} -# define PDNSDA2STR(a) pdnsd_a2str(a,_debugsockabuf,sizeof(_debugsockabuf)) -# define DEBUG_RHN_MSG(args...) {unsigned char _debugstrbuf[DNSNAMEBUFSIZE]; DEBUG_MSG(args);} -# define RHN2STR(a) rhn2str(a,_debugstrbuf,sizeof(_debugstrbuf)) -# else -# define DEBUG_MSG(args...) -# define DEBUG_MSGC(args...) -# define DEBUG_PDNSDA_MSG(args...) -# define DEBUG_RHN_MSG(args...) -# endif /* DEBUG > 0 */ -#else -/* ANSI C99 style. */ -# if DEBUG > 0 -/* - * XXX: The ANSI and GCC variadic macros should be merged as far as possible, but that - * might make things even more messy... - */ -# define DEBUG_MSG(...) {if (debug_p) debug_msg(0,__VA_ARGS__);} -# define DEBUG_MSGC(...) {if (debug_p) debug_msg(1,__VA_ARGS__);} -# define DEBUG_PDNSDA_MSG(...) {char _debugsockabuf[ADDRSTR_MAXLEN]; DEBUG_MSG(__VA_ARGS__);} -# define PDNSDA2STR(a) pdnsd_a2str(a,_debugsockabuf,ADDRSTR_MAXLEN) -# define DEBUG_RHN_MSG(...) {unsigned char _debugstrbuf[DNSNAMEBUFSIZE]; DEBUG_MSG(__VA_ARGS__);} -# define RHN2STR(a) rhn2str(a,_debugstrbuf,sizeof(_debugstrbuf)) -# else -# define DEBUG_MSG(...) -# define DEBUG_MSGC(...) -# define DEBUG_PDNSDA_MSG(...) -# define DEBUG_RHN_MSG(...) -# endif /* DEBUG > 0 */ -#endif - -#endif diff --git a/jni/pdnsd/src/freebsd_netinet_ip_icmp.h b/jni/pdnsd/src/freebsd_netinet_ip_icmp.h deleted file mode 100644 index e4577cea..00000000 --- a/jni/pdnsd/src/freebsd_netinet_ip_icmp.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/netinet/ip_icmp.h,v 1.20 2003/03/21 15:28:10 mdodd Exp $ - */ - -#ifndef _NETINET_IP_ICMP_H_ -#define _NETINET_IP_ICMP_H_ - -/* - * Interface Control Message Protocol Definitions. - * Per RFC 792, September 1981. - */ - -/* - * Internal of an ICMP Router Advertisement - */ -struct icmp_ra_addr { - u_int32_t ira_addr; - u_int32_t ira_preference; -}; - -/* - * Structure of an icmp header. - */ -struct icmp { - u_char icmp_type; /* type of message, see below */ - u_char icmp_code; /* type sub code */ - u_short icmp_cksum; /* ones complement cksum of struct */ - union { - u_char ih_pptr; /* ICMP_PARAMPROB */ - struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ - struct ih_idseq { - n_short icd_id; - n_short icd_seq; - } ih_idseq; - int ih_void; - - /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ - struct ih_pmtu { - n_short ipm_void; - n_short ipm_nextmtu; - } ih_pmtu; - - struct ih_rtradv { - u_char irt_num_addrs; - u_char irt_wpa; - u_int16_t irt_lifetime; - } ih_rtradv; - } icmp_hun; -#define icmp_pptr icmp_hun.ih_pptr -#define icmp_gwaddr icmp_hun.ih_gwaddr -#define icmp_id icmp_hun.ih_idseq.icd_id -#define icmp_seq icmp_hun.ih_idseq.icd_seq -#define icmp_void icmp_hun.ih_void -#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void -#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu -#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs -#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa -#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime - union { - struct id_ts { /* ICMP Timestamp */ - n_time its_otime; /* Originate */ - n_time its_rtime; /* Receive */ - n_time its_ttime; /* Transmit */ - } id_ts; - struct id_ip { - struct ip idi_ip; - /* options and then 64 bits of data */ - } id_ip; - struct icmp_ra_addr id_radv; - u_int32_t id_mask; - char id_data[1]; - } icmp_dun; -#define icmp_otime icmp_dun.id_ts.its_otime -#define icmp_rtime icmp_dun.id_ts.its_rtime -#define icmp_ttime icmp_dun.id_ts.its_ttime -#define icmp_ip icmp_dun.id_ip.idi_ip -#define icmp_radv icmp_dun.id_radv -#define icmp_mask icmp_dun.id_mask -#define icmp_data icmp_dun.id_data -}; - -/* - * Lower bounds on packet lengths for various types. - * For the error advice packets must first insure that the - * packet is large enough to contain the returned ip header. - * Only then can we do the check to see if 64 bits of packet - * data have been returned, since we need to check the returned - * ip header length. - */ -#define ICMP_MINLEN 8 /* abs minimum */ -#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ -#define ICMP_MASKLEN 12 /* address mask */ -#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ -#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) - /* N.B.: must separately check that ip_hl >= 5 */ - -/* - * Definition of type and code field values. - */ -#define ICMP_ECHOREPLY 0 /* echo reply */ -#define ICMP_UNREACH 3 /* dest unreachable, codes: */ -#define ICMP_UNREACH_NET 0 /* bad net */ -#define ICMP_UNREACH_HOST 1 /* bad host */ -#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ -#define ICMP_UNREACH_PORT 3 /* bad port */ -#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ -#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ -#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ -#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ -#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ -#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ -#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ -#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ -#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ -#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */ -#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */ -#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */ -#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ -#define ICMP_REDIRECT 5 /* shorter route, codes: */ -#define ICMP_REDIRECT_NET 0 /* for network */ -#define ICMP_REDIRECT_HOST 1 /* for host */ -#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ -#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ -#define ICMP_ECHO 8 /* echo service */ -#define ICMP_ROUTERADVERT 9 /* router advertisement */ -#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ -#define ICMP_TIMXCEED 11 /* time exceeded, code: */ -#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ -#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ -#define ICMP_PARAMPROB 12 /* ip header bad */ -#define ICMP_PARAMPROB_ERRATPTR 0 /* error at param ptr */ -#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ -#define ICMP_PARAMPROB_LENGTH 2 /* bad length */ -#define ICMP_TSTAMP 13 /* timestamp request */ -#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ -#define ICMP_IREQ 15 /* information request */ -#define ICMP_IREQREPLY 16 /* information reply */ -#define ICMP_MASKREQ 17 /* address mask request */ -#define ICMP_MASKREPLY 18 /* address mask reply */ - -#define ICMP_MAXTYPE 18 - -#define ICMP_INFOTYPE(type) \ - ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ - (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ - (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ - (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ - (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) - -#ifdef _KERNEL -void icmp_error(struct mbuf *, int, int, n_long, struct ifnet *); -void icmp_input(struct mbuf *, int); -#endif - -#endif diff --git a/jni/pdnsd/src/hash.c b/jni/pdnsd/src/hash.c deleted file mode 100644 index 12e20740..00000000 --- a/jni/pdnsd/src/hash.c +++ /dev/null @@ -1,322 +0,0 @@ -/* hash.c - Manage hashes for cached dns records - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2005 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include "hash.h" -#include "cache.h" -#include "error.h" -#include "helpers.h" -#include "consts.h" - - -/* This is not a perfect hash, but I hope it holds. It is designed for 1024 hash - * buckets, and hashes strings with case-insensitivity. - * It is position-aware in a limited way. - * It is exactly seen a two-way hash: because I do not want to exaggerate - * the hash buckets (i do have 1024), but I hash strings and string-comparisons - * are expensive, I save another 32 bit hash in each hash element that is checked - * before the string. The 32 bit hash is also used to order the entries in a hash chain. - * I hope not to have all too much collision concentration. - * - * The ip hash was removed. I don't think it concentrated the collisions too much. - * If it does, the hash algorithm needs to be changed, rather than using another - * hash. - * Some measurements seem to indicate that the hash algorithm is doing reasonable well. - */ - -dns_hash_ent_t *hash_buckets[HASH_NUM_BUCKETS]; - - -/* - * Hash a dns name (length-byte string format) to HASH_SZ bit. - * *rhash is set to a long int hash. - */ -static unsigned dns_hash(const unsigned char *str, unsigned long *rhash) -{ - unsigned s,i,lb,c; - unsigned long r; - s=0; r=0; - i=0; - while((lb=str[i])) { - s+=lb<<(i%(HASH_SZ-5)); - r+=((unsigned long)lb)<<(i%(8*sizeof(unsigned long)-7)); - ++i; - do { - c=toupper(str[i]); - s+=c<<(i%(HASH_SZ-5)); - r+=((unsigned long)c)<<(i%(8*sizeof(unsigned long)-7)); - ++i; - } while(--lb); - } - s=(s&HASH_BITMASK)+((s&(~HASH_BITMASK))>>HASH_SZ); - s=(s&HASH_BITMASK)+((s&(~HASH_BITMASK))>>HASH_SZ); - s &= HASH_BITMASK; -#ifdef DEBUG_HASH - { - unsigned char buf[DNSNAMEBUFSIZE]; - printf("Diagnostic: hashes for %s: %03x,%04lx\n",rhn2str(str,buf,sizeof(buf)),s,r); - } -#endif - if(rhash) *rhash=r; - return s; -} - -/* - * Initialize hash to hold a dns hash table - */ -/* This is now defined as an inline function in hash.h */ -#if 0 -void mk_dns_hash() -{ - int i; - for(i=0;irhash<=rh) { - if (he->rhash==rh && rhnicmp(key,he->data->qname)) { - retval = he->data; - break; - } - hep = &he->next; - } - if(loc) { - loc->pos = hep; - loc->rhash = rh; - } - return retval; -} - -/* - Add a cache entry to the hash table. - - loc must contain the location where the the new entry should be inserted - (this location can be obtained with dns_lookup). - - add_dns_hash returns 1 on success, or 0 if out of memory. -*/ -int add_dns_hash(dns_cent_t *data, dns_hash_loc_t *loc) -{ - dns_hash_ent_t *he = malloc(sizeof(dns_hash_ent_t)); - - if(!he) - return 0; - - he->next = *(loc->pos); - he->rhash = loc->rhash; - he->data = data; - *(loc->pos) = he; - - return 1; -} - -/* - Delete the hash entry indentified by the location returned by dns_lookup(). -*/ -dns_cent_t *del_dns_hash_ent(dns_hash_loc_t *loc) -{ - dns_hash_ent_t *he = *(loc->pos); - dns_cent_t *data; - - *(loc->pos) = he->next; - data = he->data; - free(he); - return data; -} - -/* - * Delete the first entry indexed by key from the hash. Returns the data field or NULL. - * Since two cents are not allowed to be for the same host name, there will be only one. - */ -dns_cent_t *del_dns_hash(const unsigned char *key) -{ - unsigned idx; - unsigned long rh; - dns_hash_ent_t **hep,*he; - dns_cent_t *data; - - idx = dns_hash(key,&rh); - hep = &hash_buckets[idx]; - while ((he= *hep) && he->rhash<=rh) { - if (he->rhash==rh && rhnicmp(key,he->data->qname)) { - *hep = he->next; - data = he->data; - free(he); - return data; - } - hep = &he->next; - } - return NULL; /* not found */ -} - - -/* - * Delete all entries in a hash bucket. - */ -void free_dns_hash_bucket(int i) -{ - dns_hash_ent_t *he,*hen; - - he=hash_buckets[i]; - hash_buckets[i]=NULL; - while (he) { - hen=he->next; - del_cent(he->data); - free(he); - he=hen; - } -} - -/* - * Delete all entries in a hash bucket whose names match those in - * an include/exclude list. - */ -void free_dns_hash_selected(int i, slist_array sla) -{ - dns_hash_ent_t **hep,*he,*hen; - int j,m=DA_NEL(sla); - - hep= &hash_buckets[i]; - he= *hep; - - while (he) { - unsigned char *name=he->data->qname; - for(j=0;jdomain,&nrem,&lrem); - if(!lrem && (!sl->exact || !nrem)) { - if(sl->rule==C_INCLUDED) - goto delete_entry; - else - break; - } - } - /* default policy is not to delete */ - hep= &he->next; - he= *hep; - continue; - - delete_entry: - *hep=hen=he->next;; - del_cent(he->data); - free(he); - he=hen; - } -} - -/* - * Delete the whole hash table, freeing all memory - */ -void free_dns_hash() -{ - int i; - dns_hash_ent_t *he,*hen; - for (i=0;inext; - del_cent(he->data); - free(he); - he=hen; - } - } -} - -/* - * The following functions are for iterating over the hash. - * fetch_first returns the data field of the first element (or NULL if there is none), and fills pos - * for subsequent calls of fetch_next. - * fetch_next returns the data field of the element after the element that was returned by the last - * call with the same position argument (or NULL if there is none) - * - * Note that these are designed so that you may actually delete the elements you retrieved from the hash. - */ -dns_cent_t *fetch_first(dns_hash_pos_t *pos) -{ - int i; - for (i=0;ibucket=i; - pos->ent=he->next; - return he->data; - } - } - return NULL; -} - -dns_cent_t *fetch_next(dns_hash_pos_t *pos) -{ - dns_hash_ent_t *he=pos->ent; - int i; - if (he) { - pos->ent=he->next; - return he->data; - } - - for (i=pos->bucket+1;ibucket=i; - pos->ent=he->next; - return he->data; - } - } - return NULL; -} - -#ifdef DEBUG_HASH -void dumphash() -{ - if(debug_p) { - int i, j; - dns_hash_ent_t *he; - - for (i=0; inext, j++) ; - DEBUG_MSG("bucket %d: %d entries\n", i, j); - } - } -} -#endif diff --git a/jni/pdnsd/src/hash.h b/jni/pdnsd/src/hash.h deleted file mode 100644 index db25a34f..00000000 --- a/jni/pdnsd/src/hash.h +++ /dev/null @@ -1,83 +0,0 @@ -/* hash.h - Manage hashes for cached dns records - - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2003, 2005 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _HASH_H_ -#define _HASH_H_ -#include -#include "cache.h" - -typedef struct dns_hash_ent_s { - struct dns_hash_ent_s *next; - unsigned long rhash; /* this is a better hash */ - dns_cent_t *data; -} dns_hash_ent_t; - -/* Redefine this if you want another hash size. Should work ;-). - * The number of hash buckets is computed as power of two; - * so, e.g. HASH_SZ set to 10 yields 1024 hash rows (2^10 or 1<<10). - * Only powers of two are possible conveniently. - * HASH_SZ may not be bigger than 32 (if you set it even close to that value, - * you are nuts.) */ -/* #define HASH_SZ 10 */ /* Now defined in config.h */ -#define HASH_NUM_BUCKETS (1<. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ipvers.h" -#include "thread.h" -#include "error.h" -#include "helpers.h" -#include "cache.h" -#include "conff.h" - - -/* - * This is to exit pdnsd from any thread. - */ -void pdnsd_exit() -{ - pthread_kill(main_thrid,SIGTERM); - pthread_exit(NULL); -} - -/* - * Try to grab a mutex. If we can't, fail. This will loop until we get the - * mutex or fail. This is only used in debugging code or at exit, otherwise - * we might run into lock contention problems. - */ -int softlock_mutex(pthread_mutex_t *mutex) -{ - unsigned int tr=0; - while(pthread_mutex_trylock(mutex)) { - if (++tr>=SOFTLOCK_MAXTRIES) - return 0; - usleep_r(10000); - } - return 1; -} - -/* - * setuid() and setgid() for a specified user. - */ -int run_as(const char *user) -{ - if (user[0]) { -#ifdef HAVE_GETPWNAM_R - struct passwd pwdbuf, *pwd; - size_t buflen; - int err; - - for(buflen=128;; buflen*=2) { - char buf[buflen]; /* variable length array */ - - /* Note that we use getpwnam_r() instead of getpwnam(), - which returns its result in a statically allocated buffer and - cannot be considered thread safe. - Doesn't use NSS! */ - err=getpwnam_r(user, &pwdbuf, buf, buflen, &pwd); - if(err==0 && pwd) { - /* setgid first, because we may not be allowed to do it anymore after setuid */ - if (setgid(pwd->pw_gid)!=0) { - log_error("Could not change group id to that of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } - - /* initgroups uses NSS, so we can disable it, - i.e. we might need DNS for LDAP lookups, which times out */ - if (global.use_nss && (initgroups(user, pwd->pw_gid)!=0)) { - log_error("Could not initialize the group access list of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } - if (setuid(pwd->pw_uid)!=0) { - log_error("Could not change user id to that of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } - break; - } - else if(err!=ERANGE) { - if(err) - log_error("run_as user '%s' could not be found: %s",user,strerror(err)); - else - log_error("run_as user '%s' could not be found.",user); - return 0; - } - else if(buflen>=16*1024) { - /* If getpwnam_r() seems defective, call it quits rather than - keep on allocating ever larger buffers until we crash. */ - log_error("getpwnam_r() requires more than %u bytes of buffer space.",(unsigned)buflen); - return 0; - } - /* Else try again with larger buffer. */ - } -#else - /* No getpwnam_r() :-( We'll use getpwnam() and hope for the best. */ - struct passwd *pwd; - - if (!(pwd=getpwnam(user))) { - log_error("run_as user %s could not be found.",user); - return 0; - } - /* setgid first, because we may not allowed to do it anymore after setuid */ - if (setgid(pwd->pw_gid)!=0) { - log_error("Could not change group id to that of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } - /* initgroups uses NSS, so we can disable it, - i.e. we might need DNS for LDAP lookups, which times out */ - if (global.use_nss && (initgroups(user, pwd->pw_gid)!=0)) { - log_error("Could not initialize the group access list of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } - if (setuid(pwd->pw_uid)!=0) { - log_error("Could not change user id to that of run_as user '%s': %s", - user,strerror(errno)); - return 0; - } -#endif - } - - return 1; -} - -/* - * returns whether c is allowed in IN domain names - */ -#if 0 -int isdchar (unsigned char c) -{ - if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-' -#ifdef UNDERSCORE - || c=='_' -#endif - ) - return 1; - return 0; -} -#endif - -/* - * Convert a string given in dotted notation to the transport format (length byte prepended - * domain name parts, ended by a null length sequence) - * The memory areas referenced by str and rhn may not overlap. - * The buffer rhn points to is assumed to be at least DNSNAMEBUFSIZE bytes in size. - * - * Returns 1 if successful, otherwise 0. - */ -int str2rhn(const unsigned char *str, unsigned char *rhn) -{ - unsigned int i,j; - - if(*str=='.' && !*(str+1)) { - /* Special case: root domain */ - rhn[0]=0; - return 1; - } - - for(i=0;;) { - unsigned int jlim= i+63; - if(jlim>DNSNAMEBUFSIZE-2) jlim=DNSNAMEBUFSIZE-2; /* DNSNAMEBUFSIZE-2 because the termination 0 has to follow */ - for(j=i; str[j] && str[j]!='.'; ++j) { - if(j>=jlim) return 0; - rhn[j+1]=str[j]; - } - if(!str[j]) - break; - if(j<=i) - return 0; - rhn[i]=(unsigned char)(j-i); - i = j+1; - } - - rhn[i]=0; - if (j>i || i==0) - return 0; - return 1; -} - -/* - parsestr2rhn is essentially the same as str2rhn, except that it doesn't look beyond - the first len chars in the input string. It also tolerates strings - not ending in a dot and returns a message in case of an error. - */ -const char *parsestr2rhn(const unsigned char *str, unsigned int len, unsigned char *rhn) -{ - unsigned int i,j; - - if(len>0 && *str=='.' && (len==1 || !*(str+1))) { - /* Special case: root domain */ - rhn[0]=0; - return NULL; - } - - i=0; - do { - unsigned int jlim= i+63; - if(jlim>DNSNAMEBUFSIZE-2) jlim=DNSNAMEBUFSIZE-2; - for(j=i; j=jlim) - return "Domain name element too long"; - rhn[j+1]=str[j]; - } - - if(j<=i) { - if(j=2) - str[j++]='.'; - } - else { - do { - for (;lb;--lb) { - unsigned char c; - if(j+2>=size) - goto overflow; - c=rhn[i++]; - if(isgraph(c)) { - if(c=='.' || c=='\\' || c=='"') { - str[j++]='\\'; - if(j+2>=size) - goto overflow; - } - str[j++]=c; - } - else { - unsigned int rem=size-1-j; - int n=snprintf(charp &str[j],rem,"\\%03o",c); - if(n<0 || n>=rem) { - str[j++]='.'; - goto overflow; - } - j+=n; - } - } - str[j++]='.'; - lb=rhn[i++]; - } while(lb); - } - str[j]=0; - return str; - - overflow: - j=size; - str[--j]=0; - if(j>0) { - str[--j]='.'; - if(j>0) { - str[--j]='.'; - if(j>0) - str[--j]='.'; - } - } - return str; -} - -/* Return the length of a domain name in transport format. - The definition has in fact been moved to helpers.h as an inline function. - Note added by Paul Rombouts: - Compared to the definition used by Thomas Moestl (strlen(rhn)+1), the following definition of rhnlen - may yield a different result in certain error situations (when a domain name segment contains null byte). -*/ -#if 0 -unsigned int rhnlen(const unsigned char *rhn) -{ - unsigned int i=0,lb; - - while((lb=rhn[i++])) - i+=lb; - return i; -} -#endif - -/* - * Non-validating rhn copy (use with checked or generated data only). - * Returns number of characters copied. The buffer dst points to is assumed to be DNSNAMEBUFSIZE (or - * at any rate large enough) bytes in size. - * The answer assembly code uses this; it is guaranteed to not clobber anything - * after the name. - */ -unsigned int rhncpy(unsigned char *dst, const unsigned char *src) -{ - unsigned int len = rhnlen(src); - - PDNSD_ASSERT(len<=DNSNAMEBUFSIZE,"rhncpy: src too long!"); - memcpy(dst,src,len>DNSNAMEBUFSIZE?DNSNAMEBUFSIZE:len); - return len; -} - - -/* Check whether a name is a normal wire-encoded domain name, - i.e. is not compressed, doesn't use extended labels and is not - too long. -*/ -int isnormalencdomname(const unsigned char *rhn, unsigned maxlen) -{ - unsigned int i,lb; - - if(maxlen>DNSNAMEBUFSIZE) - maxlen=DNSNAMEBUFSIZE; - for(i=0;;) { - if(i>=maxlen) return 0; - lb=rhn[i++]; - if(lb==0) break; - if(lb>0x3f) return 0; - i += lb; - } - - return 1; -} - -int str2pdnsd_a(const char *addr, pdnsd_a *a) -{ -#ifdef ENABLE_IPV4 - if (run_ipv4) { - return inet_aton(addr,&a->ipv4); - } -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - /* Try to map an IPv4 address to IPv6 */ - struct in_addr a4; - if(inet_aton(addr,&a4)) { - a->ipv6=global.ipv4_6_prefix; - ((uint32_t *)(&a->ipv6))[3]=a4.s_addr; - return 1; - } - return inet_pton(AF_INET6,addr,&a->ipv6)>0; - } -#endif - /* return 0; */ -} - -/* definition moved to helpers.h */ -#if 0 -int is_inaddr_any(pdnsd_a *a) -{ - return SEL_IPVER( a->ipv4.s_addr==INADDR_ANY, - IN6_IS_ADDR_UNSPECIFIED(&a->ipv6) ); -} -#endif - -/* - * This is used for user output only, so it does not matter when an error occurs. - */ -const char *pdnsd_a2str(pdnsd_a *a, char *buf, int maxlen) -{ - const char *res= SEL_IPVER( inet_ntop(AF_INET,&a->ipv4,buf,maxlen), - inet_ntop(AF_INET6,&a->ipv6,buf,maxlen) ); - if (!res) { - log_error("inet_ntop: %s", strerror(errno)); - return "?.?.?.?"; - } - - return res; -} - - -/* Appropriately set our random device */ -#ifdef R_DEFAULT -# if (TARGET == TARGET_BSD) && !defined(__NetBSD__) -# define R_ARC4RANDOM 1 -# else -# define R_RANDOM 1 -# endif -#endif - -#ifdef RANDOM_DEVICE -FILE *rand_file; -#endif - -#ifdef R_RANDOM -void init_crandom() -{ - struct timeval tv; - struct timezone tz; - - gettimeofday(&tv,&tz); - srandom(tv.tv_sec^tv.tv_usec); /* not as guessable as time() */ -} -#endif - -/* initialize the PRNG */ -int init_rng() -{ -#ifdef RANDOM_DEVICE - if (!(rand_file=fopen(RANDOM_DEVICE,"r"))) { - log_error("Could not open %s.",RANDOM_DEVICE); - return 0; - } -#endif -#ifdef R_RANDOM - init_crandom(); -#endif - return 1; -} - -/* The following function is now actually defined as a macro in helpers.h */ -#if 0 -void free_rng() -{ -#ifdef RANDOM_DEVICE - if (rand_file) - fclose(rand_file); -#endif -} -#endif - -/* generate a (more or less) random number 16 bits long. */ -unsigned short get_rand16() -{ -#ifdef RANDOM_DEVICE - unsigned short rv; - - if (rand_file) { - if (fread(&rv,sizeof(rv),1, rand_file)!=1) { - log_error("Error while reading from random device: %s", strerror(errno)); - pdnsd_exit(); - } - return rv&0xffff; - } else - return random()&0xffff; -#endif -#ifdef R_RANDOM - return random()&0xffff; -#endif -#ifdef R_ARC4RANDOM - return arc4random()&0xffff; -#endif -} - -/* fsprintf does formatted output to a file descriptor. - The functionality is similar to fprintf, but note that fd - is of type int instead of FILE*. - This function has been rewritten by Paul Rombouts */ -int fsprintf(int fd, const char *format, ...) -{ - int n; - va_list va; - - { - char buf[256]; - - va_start(va,format); - n=vsnprintf(buf,sizeof(buf),format,va); - va_end(va); - - if(n<(int)sizeof(buf)) { - if(n>0) n=write_all(fd,buf,n); - return n; - } - } - /* retry with a right sized buffer, needs glibc 2.1 or higher to work */ - { - unsigned bufsize=n+1; - char buf[bufsize]; - - va_start(va,format); - n=vsnprintf(buf,bufsize,format,va); - va_end(va); - - if(n>0) n=write_all(fd,buf,n); - } - return n; -} - -/* Convert data into a hexadecimal representation (for debugging purposes).. - The result is stored in the character array buf. - If buf is not large enough to hold the result, the - truncation is indicated by trailing dots. -*/ -void hexdump(const void *data, int dlen, char *buf, int buflen) -{ - const unsigned char *p=data; - int i,j=0; - for(i=0;i=rem) goto truncated; - j += n; - } - goto done; - - truncated: - if(j>=6) { - j -= 3; - if(j+4>=buflen) - j -= 3; - buf[j++]=' '; - buf[j++]='.'; - buf[j++]='.'; - buf[j++]='.'; - } - else { - int ndots=buflen-1; - if(ndots>3) ndots=3; - j=0; - while(j=size) - return -1; - c=in[i]; - if(!isprint(c)) { - int rem=size-j; - int n=snprintf(&str[j],rem,"\\%03o",c); - if(n<0 || n>=rem) { - return -1; - } - j+=n; - } - else { - if(c=='\\' || c=='"') { - str[j++]='\\'; - if(j+1>=size) - return -1; - } - str[j++]=c; - } - } - str[j]=0; - return j; -} - -/* - * This is not like strcmp, but will return 1 on match or 0 if the - * strings are different. - */ -/* definition moved to helpers.h as an inline function. */ -#if 0 -int stricomp(char *a, char *b) -{ - int i; - if (strlen(a) != strlen(b)) - return 0; - for (i=0;i= dstsz-1 && o!='\0') - return 0; - return 1; -} -#endif - -#ifndef HAVE_GETLINE -/* Note by Paul Rombouts: I know that getline is a GNU extension and is not really portable, - but the alternative standard functions have some real problems. - The following substitute does not have exactly the same semantics as the GNU getline, - but it should be good enough, as long as the stream doesn't contain any null chars. - This version is actually based on fgets_realloc() that I found in the WWWOFFLE source. -*/ - -#define BUFSIZE 256 -int getline(char **lineptr, size_t *n, FILE *stream) -{ - char *line=*lineptr; - size_t sz=*n,i; - - if(!line || sz=sz) { - /* retry with a right sized buffer, needs glibc 2.1 or higher to work */ - sz=n+1; - { - char *tmp=realloc(line,sz); - if(tmp) { - line=tmp; - n=vsnprintf(line,sz,format,vasave); - } - else - n= -1; - } - } - va_end(vasave); - - if(n>=0) - *lineptr=line; - else - free(line); - return n; -} -#endif - -#ifndef HAVE_ASPRINTF -int asprintf (char **lineptr, const char *format, ...) -{ - int n; - va_list va; - - va_start(va,format); - n=vasprintf(lineptr,format,va); - va_end(va); - - return n; -} -#endif - -#ifndef HAVE_INET_NTOP -const char *inet_ntop(int af, const void *src, char *dst, size_t size) -{ - const char *rc = NULL; - - if (src != NULL && dst != NULL && size > 0) { - switch (af) { - case AF_INET: - { - const unsigned char *p=src; - int n = snprintf(dst, size, "%u.%u.%u.%u", - p[0],p[1],p[2],p[3]); - if (n >= 0 && n < size) rc = dst; - } - break; - -#ifdef AF_INET6 - case AF_INET6: - { - const unsigned char *p=src; - unsigned int i,offs=0; - for (i=0;i<16;i+=2) { - int n=snprintf(dst+offs, size-offs,i==0?"%x":":%x", ((unsigned)p[i]<<8)|p[i+1]); - if(n<0) return NULL; - offs+=n; - if(offs>=size) return NULL; - } - rc = dst; - } - break; -#endif - } - } - - return rc; -} -#endif diff --git a/jni/pdnsd/src/helpers.h b/jni/pdnsd/src/helpers.h deleted file mode 100644 index e45c56ee..00000000 --- a/jni/pdnsd/src/helpers.h +++ /dev/null @@ -1,319 +0,0 @@ -/* helpers.h - Various helper functions - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2007, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef HELPERS_H -#define HELPERS_H - -#include -#include -#include -#include -#include -#include "cache.h" -#include "pdnsd_assert.h" - -#define SOFTLOCK_MAXTRIES 1000 - -int run_as(const char *user); -void pdnsd_exit(void); -int softlock_mutex(pthread_mutex_t *mutex); - -#if 0 -inline static int isdchar (unsigned char c) -{ - return ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-' -#ifdef UNDERSCORE - || c=='_' -#endif - ); -} -#endif - -const unsigned char *rhn2str(const unsigned char *rhn, unsigned char *str, unsigned int size); -int str2rhn(const unsigned char *str, unsigned char *rhn); -const char *parsestr2rhn(const unsigned char *str, unsigned int len, unsigned char *rhn); - -/* Note added by Paul Rombouts: - Compared to the definition used by Thomas Moestl (strlen(rhn)+1), the following definition of rhnlen - may yield a different result in certain error situations (when a domain name segment contains a null byte). -*/ -inline static unsigned int rhnlen(const unsigned char *rhn) - __attribute__((always_inline)); -inline static unsigned int rhnlen(const unsigned char *rhn) -{ - unsigned int i=0,lb; - - while((lb=rhn[i++])) - i+=lb; - return i; -} - -/* Skip k segments in a name in length-byte string notation. */ -inline static const unsigned char *skipsegs(const unsigned char *nm, unsigned k) - __attribute__((always_inline)); -inline static const unsigned char *skipsegs(const unsigned char *nm, unsigned k) -{ - unsigned lb; - for(;k && (lb= *nm); --k) { - nm += lb+1; - } - return nm; -} - -/* Skip a name in length-byte string notation and return a pointer to the - position right after the terminating null byte. -*/ -inline static unsigned char *skiprhn(unsigned char *rhn) - __attribute__((always_inline)); -inline static unsigned char *skiprhn(unsigned char *rhn) -{ - unsigned lb; - - while((lb= *rhn++)) - rhn += lb; - return rhn; -} - -/* count the number of name segments of a name in length-byte string notation. */ -inline static unsigned int rhnsegcnt(const unsigned char *rhn) - __attribute__((always_inline)); -inline static unsigned int rhnsegcnt(const unsigned char *rhn) -{ - unsigned int res=0,lb; - - while((lb= *rhn)) { - ++res; - rhn += lb+1; - } - return res; -} - -unsigned int rhncpy(unsigned char *dst, const unsigned char *src); -int isnormalencdomname(const unsigned char *rhn, unsigned maxlen); - -inline static int is_inaddr_any(pdnsd_a *a) __attribute__((always_inline)); -inline static int is_inaddr_any(pdnsd_a *a) -{ - return SEL_IPVER( a->ipv4.s_addr==INADDR_ANY, - IN6_IS_ADDR_UNSPECIFIED(&a->ipv6) ); -} - - -inline static int same_inaddr(pdnsd_a *a, pdnsd_a *b) - __attribute__((always_inline)); -inline static int same_inaddr(pdnsd_a *a, pdnsd_a *b) -{ - return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr, - IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) ); -} - -/* Compare a pdnsd_a* with a pdnsd_a2*. */ -inline static int same_inaddr2(pdnsd_a *a, pdnsd_a2 *b) - __attribute__((always_inline)); -inline static int same_inaddr2(pdnsd_a *a, pdnsd_a2 *b) -{ - return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr, - IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) && b->ipv4.s_addr==INADDR_ANY ); -} - -inline static int equiv_inaddr2(pdnsd_a *a, pdnsd_a2 *b) - __attribute__((always_inline)); -inline static int equiv_inaddr2(pdnsd_a *a, pdnsd_a2 *b) -{ - return SEL_IPVER( a->ipv4.s_addr==b->ipv4.s_addr, - IN6_ARE_ADDR_EQUAL(&a->ipv6,&b->ipv6) || - (b->ipv4.s_addr!=INADDR_ANY && ADDR_EQUIV6_4(&a->ipv6,&b->ipv4)) ); -} - -int str2pdnsd_a(const char *addr, pdnsd_a *a); -const char *pdnsd_a2str(pdnsd_a *a, char *buf, int maxlen); - -int init_rng(void); -#ifdef RANDOM_DEVICE -extern FILE *rand_file; -/* Because this is usually empty, it is now defined as a macro to save overhead.*/ -#define free_rng() {if (rand_file) fclose(rand_file);} -#else -#define free_rng() -#endif - -unsigned short get_rand16(void); - -int fsprintf(int fd, const char *format, ...) printfunc(2, 3); -#if !defined(CPP_C99_VARIADIC_MACROS) -/* GNU C Macro Varargs style. */ -# define fsprintf_or_return(args...) {int _retval; if((_retval=fsprintf(args))<0) return _retval;} -#else -/* ANSI C99 style variadic macro. */ -# define fsprintf_or_return(...) {int _retval; if((_retval=fsprintf(__VA_ARGS__))<0) return _retval;} -#endif - -/* Added by Paul Rombouts */ -inline static ssize_t write_all(int fd,const void *data,size_t n) - __attribute__((always_inline)); -inline static ssize_t write_all(int fd,const void *data,size_t n) -{ - ssize_t written=0; - - while(written -int vasprintf (char **lineptr, const char *format, va_list va); -#endif - -#ifndef HAVE_INET_NTOP -const char *inet_ntop(int af, const void *src, char *dst, size_t size); -#endif - -#define strlitlen(strlit) (sizeof(strlit)-1) - -#endif /* HELPERS_H */ diff --git a/jni/pdnsd/src/icmp.c b/jni/pdnsd/src/icmp.c deleted file mode 100644 index 6e3e46fe..00000000 --- a/jni/pdnsd/src/icmp.c +++ /dev/null @@ -1,544 +0,0 @@ -/* icmp.c - Server response tests using ICMP echo requests - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2005, 2007, 2012 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -/* - * This should now work on both Linux and FreeBSD (and CYGWIN?). If anyone - * with experience in other Unix flavors wants to contribute platform-specific - * code, he is very welcome. - */ - -#include -#ifdef HAVE_SYS_POLL_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include "ipvers.h" -#if (TARGET==TARGET_LINUX) -# include -# include -# include -#elif (TARGET==TARGET_BSD) -# include -# include -# include -#elif (TARGET==TARGET_CYGWIN) -# include -# include -# include -# include "freebsd_netinet_ip_icmp.h" -#else -# error Unsupported platform! -#endif -#ifdef ENABLE_IPV6 -# include -# include -#endif -#include -#include "icmp.h" -#include "error.h" -#include "helpers.h" -#include "servers.h" - - -#define ICMP_MAX_ERRS 10 -static volatile unsigned long icmp_errs=0; /* This is only here to minimize log output. - Since the consequences of a race is only - one log message more/less (out of - ICMP_MAX_ERRS), no lock is required. */ - -volatile int ping_isocket=-1; -#ifdef ENABLE_IPV6 -volatile int ping6_isocket=-1; -#endif - -/* different names, same thing... be careful, as these are macros... */ -#if (TARGET==TARGET_LINUX) -# define ip_saddr saddr -# define ip_daddr daddr -# define ip_hl ihl -# define ip_p protocol -#else -# define icmphdr icmp -# define iphdr ip -# define ip_saddr ip_src.s_addr -# define ip_daddr ip_dst.s_addr -#endif - -#if (TARGET==TARGET_LINUX) -# define icmp_type type -# define icmp_code code -# define icmp_cksum checksum -# define icmp_id un.echo.id -# define icmp_seq un.echo.sequence -#else -# define ICMP_DEST_UNREACH ICMP_UNREACH -# define ICMP_TIME_EXCEEDED ICMP_TIMXCEED -#endif - -#define ICMP_BASEHDR_LEN 8 -#define ICMP4_ECHO_LEN ICMP_BASEHDR_LEN - -#if (TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN) -/* - * These are the ping implementations for Linux/FreeBSD in their IPv4/ICMPv4 and IPv6/ICMPv6 versions. - * I know they share some code, but I'd rather keep them separated in some parts, as some - * things might go in different directions there. - */ - -/* Initialize the sockets for pinging */ -void init_ping_socket() -{ - if ((ping_isocket=socket(PF_INET, SOCK_RAW, IPPROTO_ICMP))==-1) { - log_warn("icmp ping: socket() failed: %s",strerror(errno)); - } -#ifdef ENABLE_IPV6 - if (!run_ipv4) { - /* Failure to initialize the IPv4 ping socket is not - necessarily a problem, as long as the IPv6 version works. */ - if ((ping6_isocket=socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6))==-1) { - log_warn("icmpv6 ping: socket() failed: %s",strerror(errno)); - } - } -#endif -} - -/* Takes a packet as send out and a received ICMP packet and looks whether the ICMP packet is - * an error reply on the sent-out one. packet is only the packet (without IP header). - * errmsg includes an IP header. - * to is the destination address of the original packet (the only thing that is actually - * compared of the IP header). The RFC says that we get at least 8 bytes of the offending packet. - * We do not compare more, as this is all we need.*/ -static int icmp4_errcmp(char *packet, int plen, struct in_addr *to, char *errmsg, int elen, int errtype) -{ - struct iphdr iph; - struct icmphdr icmph; - struct iphdr eiph; - char *data; - - /* XXX: lots of memcpy to avoid unaligned accesses on alpha */ - if (elen= ICMP_BASEHDR_LEN, "icmp4_errcmp: ICMP_BASEHDR_LEN botched"); - memcpy(&icmph,errmsg+iph.ip_hl*4,ICMP_BASEHDR_LEN); - memcpy(&eiph,errmsg+iph.ip_hl*4+ICMP_BASEHDR_LEN,sizeof(eiph)); - if (elens_addr, &eiph.ip_daddr, sizeof(to->s_addr))==0 && - memcmp(data, packet, plen<8?plen:8)==0; -} - -/* IPv4/ICMPv4 ping. Called from ping (see below) */ -static int ping4(struct in_addr addr, int timeout, int rep) -{ - int i; - int isock; -#if (TARGET==TARGET_LINUX) - struct icmp_filter f; -#endif - unsigned short id=(unsigned short)get_rand16(); /* randomize a ping id */ - - isock=ping_isocket; - -#if (TARGET==TARGET_LINUX) - /* Fancy ICMP filering -- only on Linux (as far is I know) */ - - /* In fact, there should be macros for treating icmp_filter, but I haven't found them in Linux 2.2.15. - * So, set it manually and unportable ;-) */ - /* This filter lets ECHO_REPLY (0), DEST_UNREACH(3) and TIME_EXCEEDED(11) pass. */ - /* !(0000 1000 0000 1001) = 0xff ff f7 f6 */ - f.data=0xfffff7f6; - if (setsockopt(isock,SOL_RAW,ICMP_FILTER,&f,sizeof(f))==-1) { - if (++icmp_errs<=ICMP_MAX_ERRS) { - log_warn("icmp ping: setsockopt() failed: %s", strerror(errno)); - } - return -1; - } -#endif - - for (i=0;i> 16) + (sum & 0xffff); - sum += (sum >> 16); - icmpd.icmp_cksum=~sum; - - memset(&to,0,sizeof(to)); - to.sin_family=AF_INET; - to.sin_port=0; - to.sin_addr=addr; - SET_SOCKA_LEN4(to); - if (sendto(isock,&icmpd,ICMP4_ECHO_LEN,0,(struct sockaddr *)&to,sizeof(to))==-1) { - if (++icmp_errs<=ICMP_MAX_ERRS) { - log_warn("icmp ping: sendto() failed: %s.",strerror(errno)); - } - return -1; - } - /* listen for reply. */ - tm=time(NULL); tpassed=0; - do { - int psres; -#ifdef NO_POLL - fd_set fds,fdse; - struct timeval tv; - FD_ZERO(&fds); - PDNSD_ASSERT(isocktpassed?timeout-tpassed:0; - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that the effort - to do this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - return -1; - } - psres=select(isock+1,&fds,NULL,&fdse,&tv); -#else - struct pollfd pfd; - pfd.fd=isock; - pfd.events=POLLIN; - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that the effort - to do this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - return -1; - } - psres=poll(&pfd,1,timeout>tpassed?(timeout-tpassed)*1000:0); -#endif - - if (psres<0) { - if(errno==EINTR && is_interrupted_servstat_thread()) { - DEBUG_MSG("poll/select interrupted in server status thread.\n"); - } - else if (++icmp_errs<=ICMP_MAX_ERRS) { - log_warn("poll/select failed: %s",strerror(errno)); - } - return -1; - } - if (psres==0) /* timed out */ - break; - -#ifdef NO_POLL - if (FD_ISSET(isock,&fds) || FD_ISSET(isock,&fdse)) -#else - if (pfd.revents&(POLLIN|POLLERR)) -#endif - { - char buf[1024]; - socklen_t sl=sizeof(from); - int len; - - if ((len=recvfrom(isock,&buf,sizeof(buf),0,(struct sockaddr *)&from,&sl))!=-1) { - if (len>sizeof(struct iphdr)) { - struct iphdr iph; - - memcpy(&iph, buf, sizeof(iph)); - if (len-iph.ip_hl*4>=ICMP_BASEHDR_LEN) { - struct icmphdr icmpp; - - memcpy(&icmpp, ((uint32_t *)buf)+iph.ip_hl, sizeof(icmpp)); - if (iph.ip_saddr==addr.s_addr && icmpp.icmp_type==ICMP_ECHOREPLY && - ntohs(icmpp.icmp_id)==id && ntohs(icmpp.icmp_seq)<=i) { - return (i-ntohs(icmpp.icmp_seq))*timeout+(time(NULL)-tm); /* return the number of ticks */ - } else { - /* No regular echo reply. Maybe an error? */ - if (icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_DEST_UNREACH) || - icmp4_errcmp((char *)&icmpd, ICMP4_ECHO_LEN, &to.sin_addr, buf, len, ICMP_TIME_EXCEEDED)) { - return -1; - } - } - } - } - } else { - return -1; /* error */ - } - } - else { - if (++icmp_errs<=ICMP_MAX_ERRS) { - log_error("Unhandled poll/select event in ping4() at %s, line %d.",__FILE__,__LINE__); - } - return -1; - } - tpassed=time(NULL)-tm; - } while (tpassedtpassed?timeout-tpassed:0; - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that the effort - to do this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - return -1; - } - psres=select(isock+1,&fds,NULL,&fdse,&tv); -#else - struct pollfd pfd; - pfd.fd=isock; - pfd.events=POLLIN; - /* There is a possible race condition with the arrival of a signal here, - but it is so unlikely to be a problem in practice that the effort - to do this properly is not worth the trouble. - */ - if(is_interrupted_servstat_thread()) { - DEBUG_MSG("server status thread interrupted.\n"); - return -1; - } - psres=poll(&pfd,1,timeout>tpassed?(timeout-tpassed)*1000:0); -#endif - - if (psres<0) { - if(errno==EINTR && is_interrupted_servstat_thread()) { - DEBUG_MSG("poll/select interrupted in server status thread.\n"); - } - else if (++icmp_errs<=ICMP_MAX_ERRS) { - log_warn("poll/select failed: %s",strerror(errno)); - } - return -1; - } - if (psres==0) /* timed out */ - break; - -#ifdef NO_POLL - if (FD_ISSET(isock,&fds) || FD_ISSET(isock,&fdse)) -#else - if (pfd.revents&(POLLIN|POLLERR)) -#endif - { - char buf[1024]; - socklen_t sl=sizeof(from); - int len; - if ((len=recvfrom(isock,&buf,sizeof(buf),0,(struct sockaddr *)&from,&sl))!=-1) { - if (len>=sizeof(struct icmp6_hdr)) { - /* we get packets without IPv6 header, luckily */ - struct icmp6_hdr icmpp; - - memcpy(&icmpp, buf, sizeof(icmpp)); - if (IN6_ARE_ADDR_EQUAL(&from.sin6_addr,&a) && - ntohs(icmpp.icmp6_id)==id && ntohs(icmpp.icmp6_seq)<=i) { - return (i-ntohs(icmpp.icmp6_seq))*timeout+(time(NULL)-tm); /* return the number of ticks */ - } else { - /* No regular echo reply. Maybe an error? */ - if (icmp6_errcmp((char *)&icmpd, sizeof(icmpd), &from.sin6_addr, buf, len, ICMP6_DST_UNREACH) || - icmp6_errcmp((char *)&icmpd, sizeof(icmpd), &from.sin6_addr, buf, len, ICMP6_TIME_EXCEEDED)) { - return -1; - } - } - } - } else { - return -1; /* error */ - } - } - else { - if (++icmp_errs<=ICMP_MAX_ERRS) { - log_error("Unhandled poll/select event in ping6() at %s, line %d.",__FILE__,__LINE__); - } - return -1; - } - tpassed=time(NULL)-tm; - } while (tpassedipv4,timeout,rep); -#endif -#ifdef ENABLE_IPV6 - ELSE_IPV6 { - /* If it is a IPv4 mapped IPv6 address, we prefer ICMPv4. */ - if (ping_isocket!=-1 && IN6_IS_ADDR_V4MAPPED(&addr->ipv6)) { - struct in_addr v4; - v4.s_addr=((uint32_t *)&addr->ipv6)[3]; - return ping4(v4,timeout,rep); - } else - return ping6(addr->ipv6,timeout,rep); - } -#endif - return -1; -} - -#else -# error "Huh! No OS macro defined!" -#endif /*(TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)*/ diff --git a/jni/pdnsd/src/icmp.h b/jni/pdnsd/src/icmp.h deleted file mode 100644 index 3fa6778c..00000000 --- a/jni/pdnsd/src/icmp.h +++ /dev/null @@ -1,43 +0,0 @@ -/* icmp.h - Server response tests using ICMP echo requests - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2007 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef ICMP_H -#define ICMP_H - - -#include -#include "ipvers.h" - -volatile extern int ping_isocket; -volatile extern int ping6_isocket; - -/* initialize a socket for pinging */ -void init_ping_socket(void); - -/* - * This is a classical ping routine. - * timeout in 10ths of seconds, rep is the repetition count. - */ - -int ping(pdnsd_a *addr, int timeout, int rep); - -#endif diff --git a/jni/pdnsd/src/ipvers.h b/jni/pdnsd/src/ipvers.h deleted file mode 100644 index b1d7a2cd..00000000 --- a/jni/pdnsd/src/ipvers.h +++ /dev/null @@ -1,297 +0,0 @@ -/* ipvers.h - definitions for IPv4 and IPv6 - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2007, 2009 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef IPVERS_H -#define IPVERS_H - -#include -#include -#include -#include -#include -#include "rr_types.h" - -#if defined(ENABLE_IPV4) && !defined(ENABLE_IPV6) -# ifdef DEFAULT_IPV4 -# undef DEFAULT_IPV4 -# endif -# define DEFAULT_IPV4 1 -#endif - -#if !defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -# ifdef DEFAULT_IPV4 -# undef DEFAULT_IPV4 -# endif -# define DEFAULT_IPV4 0 -#endif - -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -# define ELSE_IPV6 else -#else -# define ELSE_IPV6 -#endif - -/* From main.c */ -#ifdef ENABLE_IPV4 -# ifdef ENABLE_IPV6 -extern short int run_ipv4; -extern short int cmdlineipv; -# define SEL_IPVER(a4,a6) (run_ipv4? a4: a6) -# else -# define run_ipv4 1 -# define SEL_IPVER(a4,a6) (a4) -# endif -#else -# define run_ipv4 0 -# define SEL_IPVER(a4,a6) (a6) -#endif -#ifdef ENABLE_IPV6 -#define DEFAULT_IPV4_6_PREFIX "::ffff:0.0.0.0" -/* extern short int cmdlineprefix; */ -#endif - -#if (TARGET==TARGET_LINUX) && !defined(HAVE_STRUCT_IN_PKTINFO) -struct in_pktinfo -{ - int ipi_ifindex; - struct in_addr ipi_spec_dst; - struct in_addr ipi_addr; -}; -#endif - -#if (TARGET==TARGET_LINUX) -/* some older glibc versions seem to lack this. */ -# ifndef IP_PKTINFO -# define IP_PKTINFO 8 -# endif -# ifndef CMSG_LEN -/* ---- from glibc 2.1.2 */ - -/* Ancillary data object manipulation macros. */ -# if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2 -# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data) -# else -# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1)) -# endif -# define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg) -# define CMSG_FIRSTHDR(mhdr) \ - ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \ - ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL) -# define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \ - & ~(sizeof (size_t) - 1)) -# define CMSG_SPACE(len) (CMSG_ALIGN (len) \ - + CMSG_ALIGN (sizeof (struct cmsghdr))) -# define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) -extern struct cmsghdr *__cmsg_nxthdr __P ((struct msghdr *__mhdr, - struct cmsghdr *__cmsg)); -# ifdef __USE_EXTERN_INLINES -# ifndef _EXTERN_INLINE -# define _EXTERN_INLINE extern __inline -# endif -_EXTERN_INLINE struct cmsghdr * -__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW -{ - if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr)) - /* The kernel header does this so there may be a reason. */ - return 0; - - __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg - + CMSG_ALIGN (__cmsg->cmsg_len)); - if ((unsigned char *) (__cmsg + 1) >= ((unsigned char *) __mhdr->msg_control - + __mhdr->msg_controllen) - || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len) - >= ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen))) - /* No more entries. */ - return 0; - return __cmsg; -} -# endif /* Use `extern inline'. */ -/* ---- */ -# endif -#endif - -#if defined(ENABLE_IPV4) && !defined(SIN_LEN) && (TARGET==TARGET_BSD) -# define SIN_LEN -#endif - -#if defined(ENABLE_IPV6) && (TARGET==TARGET_LINUX) - -/* Some glibc versions (I know of 2.1.2) get this wrong, so we define our own. To be exact, this is fixed - * glibc code. */ -#ifdef IN6_ARE_ADDR_EQUAL -# undef IN6_ARE_ADDR_EQUAL -#endif -#define IN6_ARE_ADDR_EQUAL(a,b) \ - ((((uint32_t *) (a))[0] == ((uint32_t *) (b))[0]) && \ - (((uint32_t *) (a))[1] == ((uint32_t *) (b))[1]) && \ - (((uint32_t *) (a))[2] == ((uint32_t *) (b))[2]) && \ - (((uint32_t *) (a))[3] == ((uint32_t *) (b))[3])) - -#endif - -/* This is the IPv6 flowid that we pass on to the IPv6 protocol stack. This value was not currently defined - * at the time of writing. Should this change, define a appropriate flowinfo here. */ -#ifndef IPV6_FLOWINFO -#define IPV6_FLOWINFO 0 -#endif - -/* There does not seem to be a function/macro to generate IPv6-mapped IPv4-Adresses. So here comes mine. - * Pass an in_addr* and an in6_addr* */ -#define IPV6_MAPIPV4(a,b) {((uint32_t *)(b))[3]=(a)->s_addr; \ - ((uint32_t *)(b))[2]=htonl(0xffff); \ - ((uint32_t *)(b))[1]=((uint32_t *)(b))[0]=0; } - -/* A macro to extract the pointer to the address of a struct sockaddr (_in or _in6) */ - -#define SOCKA_A4(a) ((pdnsd_a *)&((struct sockaddr_in *)(a))->sin_addr) -#define SOCKA_A6(a) ((pdnsd_a *)&((struct sockaddr_in6 *)(a))->sin6_addr) - -#define SOCKA_A(a) SEL_IPVER(SOCKA_A4(a),SOCKA_A6(a)) -#define PDNSD_PF_INET SEL_IPVER(PF_INET,PF_INET6) -#define PDNSD_AF_INET SEL_IPVER(AF_INET,AF_INET6) - -/* This is to compare two addresses. This is a macro because it may change due to the more complex IPv6 adressing architecture - * (there are, for example, two equivalent addresses of the loopback device) - * Pass this two addresses as in_addr or in6_addr. pdnsd_a is ok (it is a union) */ - -#define ADDR_EQUIV4(a,b) (((struct in_addr *)(a))->s_addr==((struct in_addr *)(b))->s_addr) -#define ADDR_EQUIV6(a,b) IN6_ARE_ADDR_EQUAL(((struct in6_addr *)(a)),((struct in6_addr *)(b))) - -#define ADDR_EQUIV(a,b) SEL_IPVER(ADDR_EQUIV4(a,b), ADDR_EQUIV6(a,b)) - -/* Compare an IPv6 adress with an IPv4 one. b should have type struct in_addr*. - Note the similarity with the IPV6_MAPIPV4 macro. */ -#define ADDR_EQUIV6_4(a,b) (((uint32_t *)(a))[3]==(b)->s_addr && \ - ((uint32_t *)(a))[2]==htonl(0xffff) && \ - ((uint32_t *)(a))[1]==0 && \ - ((uint32_t *)(a))[0]==0) - -/* Compare two address a and b in combination with a netmask m. - Only the bits coresponding to those set in the netmask are matched, the rest are ignored. - Pass in_addr* or in6_addr* arguments, respectively. */ -#define ADDR4MASK_EQUIV(a,b,m) ((((a)->s_addr^(b)->s_addr)&(m)->s_addr)==0) -#define ADDR6MASK_EQUIV(a,b,m) (((((uint32_t *)(a))[0]^((uint32_t *)(b))[0])&((uint32_t *)(m))[0])==0 && \ - ((((uint32_t *)(a))[1]^((uint32_t *)(b))[1])&((uint32_t *)(m))[1])==0 && \ - ((((uint32_t *)(a))[2]^((uint32_t *)(b))[2])&((uint32_t *)(m))[2])==0 && \ - ((((uint32_t *)(a))[3]^((uint32_t *)(b))[3])&((uint32_t *)(m))[3])==0) - -/* See if we need 4.4BSD style sockaddr_* structures and define some macros that set the length field. - * The non-4.4BSD behaviour is the only one that is POSIX-conformant.*/ -#if defined(SIN6_LEN) || defined(SIN_LEN) -# define BSD44_SOCKA -# define SET_SOCKA_LEN4(socka) (socka.sin_len=sizeof(struct sockaddr_in)) -# define SET_SOCKA_LEN6(socka) (socka.sin6_len=sizeof(struct sockaddr_in6)) -#else -# define SET_SOCKA_LEN4(socka) -# define SET_SOCKA_LEN6(socka) -#endif - -#ifdef ENABLE_IPV6 -# define ADDRSTR_MAXLEN INET6_ADDRSTRLEN -#else -# ifdef INET_ADDRSTRLEN -# define ADDRSTR_MAXLEN INET_ADDRSTRLEN -# else -# define ADDRSTR_MAXLEN 16 -# endif -#endif - -#if (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN) -# define SOL_IPV6 IPPROTO_IPV6 -#endif - -#ifdef ENABLE_IPV6 -# ifndef IPV6_RECVPKTINFO -/* This appears to be needed e.g. on Darwin (Mac OS X). */ -# define IPV6_RECVPKTINFO IPV6_PKTINFO -# endif -#endif - -typedef union { -#ifdef ENABLE_IPV4 - struct in_addr ipv4; -#endif -#ifdef ENABLE_IPV6 - struct in6_addr ipv6; -#endif -} pdnsd_a; - -#ifdef ENABLE_IPV4 -#define PDNSD_A_INITIALIZER {{INADDR_ANY}} -#else -#define PDNSD_A_INITIALIZER {IN6ADDR_ANY_INIT} -#endif - - -/* The pdnsd_a2 type is very similar to pdnsd_a, but can hold - both an IPv4 and an IPv6 address at the same time, - i.e. a struct instead of a union. -*/ -typedef struct { -#ifdef ENABLE_IPV6 - struct in6_addr ipv6; -#endif - struct in_addr ipv4; -} pdnsd_a2; - -/* Macros/functions for assigning/converting a pdnsd_a* to a pdnsd_a2* type, - and vice versa. -*/ -#ifdef ENABLE_IPV6 -inline static void SET_PDNSD_A2(pdnsd_a2 *a2, pdnsd_a *a) __attribute__((always_inline)); -inline static void SET_PDNSD_A2(pdnsd_a2 *a2, pdnsd_a *a) -{ -#ifdef ENABLE_IPV4 - if(run_ipv4) - a2->ipv4=a->ipv4; - else -#endif - { - a2->ipv6=a->ipv6; - a2->ipv4.s_addr=INADDR_ANY; - } -} -#else -# define SET_PDNSD_A2(a2,a) ((a2)->ipv4=(a)->ipv4) -#endif - -#define PDNSD_A2_TO_A(a2) SEL_IPVER(((pdnsd_a *)&(a2)->ipv4),((pdnsd_a *)&(a2)->ipv6)) - -/* Do we have sufficient support in the C libraries to allow local AAAA records - to be defined? */ -#if defined(HAVE_STRUCT_IN6_ADDR) && defined(HAVE_INET_PTON) -# define ALLOW_LOCAL_AAAA IS_CACHED_AAAA -#else -# define ALLOW_LOCAL_AAAA 0 -#endif - -/* Used to enter local records */ -typedef union { - struct in_addr ipv4; -#if ALLOW_LOCAL_AAAA - struct in6_addr ipv6; -#endif -} pdnsd_ca; - - -#endif diff --git a/jni/pdnsd/src/list.c b/jni/pdnsd/src/list.c deleted file mode 100644 index 03701860..00000000 --- a/jni/pdnsd/src/list.c +++ /dev/null @@ -1,171 +0,0 @@ -/* list.c - Dynamic array and list handling - - Copyright (C) 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2007, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include "helpers.h" -#include "error.h" -#include "list.h" - - -/* Grow a dynamic array to hold one extra element. - This could be done using da_resize(), but this is such a common operation - it is has been given its own optimized implementation. - da_grow1() returns a pointer to the new (possibly reallocated) array if - successful, otherwise it frees the old array (after freeing all the array - elements if a clean-up routine is supplied) and returns NULL. -*/ -darray da_grow1(darray a, size_t headsz, size_t elemsz, void (*cleanuproutine) (void *)) -{ - size_t k = (a?a->nel:0); - if(!a || (k!=0 && (k&7)==0)) { - darray tmp=(darray)realloc(a, headsz+elemsz*(k+8)); - if (!tmp && a) { - if(cleanuproutine) { - size_t i; - for(i=0;inel=k+1; - return a; -} - -inline static size_t alloc_nel(size_t n) -{ - return n==0 ? 8 : (n+7)&(~7); -} - -/* da_resize() allows you to grow (or shrink) a dynamic array to an arbitrary length n, - but is otherwise similar to da_grow1(). -*/ -darray da_resize(darray a, size_t headsz, size_t elemsz, size_t n, void (*cleanuproutine) (void *)) -{ - size_t ael = (a?alloc_nel(a->nel):0); - size_t new_ael = alloc_nel(n); - if(new_ael != ael) { - /* adjust alloced space. */ - darray tmp=(darray)realloc(a, headsz+elemsz*new_ael); - if (!tmp && a) { - if(cleanuproutine) { - size_t i,k=a->nel; - for(i=0;inel=n; - return a; -} - -#ifdef ALLOC_DEBUG -void DBGda_free(darray a, size_t headsz, size_t elemsz, char *file, int line) -{ - if (a==NULL) - {DEBUG_MSG("- da_free, %s:%d, not initialized\n", file, line);} - else - {DEBUG_MSG("- da_free, %s:%d, %lu bytes\n", file, line, - (unsigned long)(headsz+elemsz*alloc_nel(a->nel)));} - free(a); -} -#endif - - -#define DLISTALIGN(len) (((len) + (sizeof(size_t)-1)) & ~(sizeof(size_t)-1)) -/* This mask corresponds to a chunk size of 1024. */ -#define DLISTCHUNKSIZEMASK ((size_t)0x3ff) - -/* Add space for a new item of size len to the list a. - dlist_grow() returns a pointer to the new (possibly reallocated) list structure if - successful, otherwise it frees the old list and returns NULL. -*/ -dlist dlist_grow(dlist a, size_t len) -{ - size_t sz=0, allocsz=0, szincr, newsz; - if(a) { - sz=a->last+a->lastsz; - allocsz = (sz+DLISTCHUNKSIZEMASK)&(~DLISTCHUNKSIZEMASK); - *((size_t *)&a->data[a->last])=a->lastsz; - } - szincr=DLISTALIGN(len+sizeof(size_t)); - newsz=sz+szincr; - if(newsz>allocsz) { - dlist tmp; - allocsz = (newsz+DLISTCHUNKSIZEMASK)&(~DLISTCHUNKSIZEMASK); - tmp=realloc(a, sizeof(struct _dynamic_list_head)+allocsz); - if (!tmp) - free(a); - a=tmp; - } - if(a) { - a->last=sz; - a->lastsz=szincr; - *((size_t *)&a->data[sz])=0; - } - return a; -} - - -/* Add a new node, capable of holding data of size len, at the end of a linked list. - llist_grow() returns 1 if successful, otherwise it frees the entire linked list - and returns 0. - */ -int llist_grow(llist *a, size_t len) -{ - struct llistnode_s *new= (struct llistnode_s *)malloc(sizeof(struct llistnode_s)+len); - - if(!new) { - llist_free(a); - return 0; - } - - new->next=NULL; - - if(!a->first) - a->first=new; - else - a->last->next=new; - - a->last=new; - - return 1; -} - -void llist_free(llist *a) -{ - struct llistnode_s *p= a->first; - - while(p) { - struct llistnode_s *next= p->next; - free(p); - p=next; - } - - a->first=NULL; - a->last= NULL; -} diff --git a/jni/pdnsd/src/list.h b/jni/pdnsd/src/list.h deleted file mode 100644 index c63534e7..00000000 --- a/jni/pdnsd/src/list.h +++ /dev/null @@ -1,170 +0,0 @@ -/* list.h - Dynamic array and list handling - - Copyright (C) 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2007, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef LIST_H -#define LIST_H - -#include -#include -#include "pdnsd_assert.h" - - -typedef struct {size_t nel;} *darray; - -/* used in type declarations */ -#define DYNAMIC_ARRAY(typ) struct {size_t nel; typ elem[0];} -#define DA_TYP_OFFSET(atyp) ((size_t)((atyp)0)->elem) -#define DA_OFFSET(a) DA_TYP_OFFSET(typeof (a)) - -#define DA_CREATE(atyp,n) ((atyp)da_resize(NULL,DA_TYP_OFFSET(atyp),sizeof(((atyp)0)->elem[0]),n,NULL)) -#define DA_INDEX(a,i) ((a)->elem[i]) -/* Used often, so make special-case macro here */ -#define DA_LAST(a) ((a)->elem[(a)->nel-1]) - -#define DA_GROW1(a) ((typeof (a))da_grow1((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),NULL)) -#define DA_GROW1_F(a,cleanup) ((typeof (a))da_grow1((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),cleanup)) -#define DA_RESIZE(a,n) ((typeof (a))da_resize((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]),n,NULL)) -#define DA_NEL(a) da_nel((darray)(a)) - -/* - * Some or all of these should be inline. - * They aren't macros for type safety. - */ - -darray da_grow1(darray a, size_t headsz, size_t elemsz, void (*cleanuproutine) (void *)); -darray da_resize(darray a, size_t headsz, size_t elemsz, size_t n, void (*cleanuproutine) (void *)); - -inline static unsigned int da_nel(darray a) - __attribute__((always_inline)); -inline static unsigned int da_nel(darray a) -{ - if (a==NULL) - return 0; - return a->nel; -} - -/* alloc/free debug code.*/ -#ifdef ALLOC_DEBUG -void DBGda_free(darray a, size_t headsz, size_t elemsz, char *file, int line); -#define da_free(a) DBGda_free((darray)(a),DA_OFFSET(a),sizeof((a)->elem[0]), __FILE__, __LINE__) -#else -#define da_free free -#endif - - -/* This dynamic "list" structure is useful if the items are not all the same size. - The elements can only be read back in sequential order, not indexed as with the dynamic arrays. -*/ -struct _dynamic_list_head { - size_t last,lastsz; - char data[0]; -}; - -typedef struct _dynamic_list_head *dlist; - -inline static void *dlist_first(dlist a) - __attribute__((always_inline)); -inline static void *dlist_first(dlist a) -{ - return a?&a->data[sizeof(size_t)]:NULL; -} - -/* dlist_next() returns a reference to the next item in the list, or NULL is there is no next item. - ref should be properly aligned. - If the dlist was grown with dlist_grow(), this should be OK. -*/ -inline static void *dlist_next(void *ref) - __attribute__((always_inline)); -inline static void *dlist_next(void *ref) -{ - size_t incr= *(((size_t *)ref)-1); - return incr?((char *)ref)+incr:NULL; -} - -/* dlist_last() returns a reference to the last item. */ -inline static void *dlist_last(dlist a) - __attribute__((always_inline)); -inline static void *dlist_last(dlist a) -{ - return a?&a->data[a->last+sizeof(size_t)]:NULL; -} - -dlist dlist_grow(dlist a, size_t len); - -#define dlist_free free - - -/* linked list data type. */ -struct llistnode_s { - struct llistnode_s *next; - char *data[0]; -}; - -typedef struct { - struct llistnode_s *first, *last; -} - llist; - -inline static void llist_init(llist *a) - __attribute__((always_inline)); -inline static void llist_init(llist *a) -{ - a->first=NULL; - a->last= NULL; -} - -inline static int llist_isempty(llist *a) - __attribute__((always_inline)); -inline static int llist_isempty(llist *a) -{ - return a->first==NULL; -} - -inline static void *llist_first(llist *a) - __attribute__((always_inline)); -inline static void *llist_first(llist *a) -{ - struct llistnode_s *p= a->first; - return p?p->data:NULL; -} - -inline static void *llist_next(void *ref) - __attribute__((always_inline)); -inline static void *llist_next(void *ref) -{ - struct llistnode_s *next= *(((struct llistnode_s **)ref)-1); - return next?next->data:NULL; -} - -inline static void *llist_last(llist *a) - __attribute__((always_inline)); -inline static void *llist_last(llist *a) -{ - struct llistnode_s *p= a->last; - return p?p->data:NULL; -} - -int llist_grow(llist *a, size_t len); -void llist_free(llist *a); - -#endif /* def LIST_H */ diff --git a/jni/pdnsd/src/main.c b/jni/pdnsd/src/main.c deleted file mode 100644 index 1190b77c..00000000 --- a/jni/pdnsd/src/main.c +++ /dev/null @@ -1,710 +0,0 @@ -/* main.c - Command line parsing, intialisation and server start - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -/* in order to use O_NOFOLLOW on Linux: */ -/* #define _GNU_SOURCE */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "consts.h" -#include "cache.h" -#include "status.h" -#include "servers.h" -#include "dns_answer.h" -#include "dns_query.h" -#include "error.h" -#include "helpers.h" -#include "icmp.h" -#include "hash.h" - - -#if DEBUG>0 -short int debug_p=0; -#endif -short int stat_pipe=0; - -/* int sigr=0; */ -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -short int run_ipv4=DEFAULT_IPV4; -short int cmdlineipv=0; -#endif -cmdlineflags_t cmdline={0}; -pthread_t main_thrid,servstat_thrid,statsock_thrid,tcps_thrid,udps_thrid; -uid_t init_uid; -#if DEBUG>0 -FILE *dbg_file=NULL; -#endif -volatile int tcp_socket=-1; -volatile int udp_socket=-1; -sigset_t sigs_msk; -char *conf_file=CONFDIR"/pdnsd.conf"; - - -/* version and licensing information */ -static const char info_message[] = - - "pdnsd - dns proxy daemon, version " VERSION "\n\n" - "Copyright (C) 2000, 2001 Thomas Moestl\n" - "Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Paul A. Rombouts\n\n" - "pdnsd is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 3 of the License, or\n" - "(at your option) any later version.\n\n" - "pdnsd is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n\n" - "You should have received a copy of the GNU General Public License\n" - "along with pdsnd; see the file COPYING. If not, see\n" - ".\n"; - - -/* the help page */ -static const char help_message[] = - - "\n\nUsage: pdnsd [-h] [-V] [-s] [-d] [-g] [-t] [-p file] [-vn] [-mxx] [-c file]" -#ifdef ENABLE_IPV4 - " [-4]" -#endif -#ifdef ENABLE_IPV6 - " [-6] [-i prefix]" -#endif -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - " [-a]" -#endif - "\n\n" - "Options:\n" - "-h\t\t--or--\n" - "--help\t\tprint this help page and exit.\n" - "-V\t\t--or--\n" - "--version\tprint version and license information and exit.\n" - "--pdnsd-user\tprint the user pdnsd will run as and exit.\n" - "-s\t\t--or--\n" - "--status\tEnable status control socket in the cache directory.\n" - "-d\t\t--or--\n" - "--daemon\tStart pdnsd in daemon mode (as background process.)\n" - "-g\t\t--or--\n" - "--debug\t\tPrint some debug messages on the console or to the\n" - "\t\tfile pdnsd.debug in your cache directory (in daemon mode).\n" - "-t\t\t--or--\n" - "--tcp\t\tEnables the TCP server thread. pdnsd will then serve\n" - "\t\tTCP and UDP queries.\n" - "-p\t\tWrites the pid the server runs as to a specified filename.\n" - "\t\tWorks only in daemon mode.\n" - "-vn\t\tsets the verbosity of pdnsd. n is a numeric argument from 0\n" - "\t\t(normal operation) to 9 (many messages for debugging).\n" - "\t\tUse like -v2\n" - "-mxx\t\tsets the query method pdnsd uses. Possible values for xx are:\n" - "\t\tuo (UDP only), to (TCP only), tu (TCP or, if the server\n" - "\t\tdoes not support this, UDP) and ut (UDP and, if the reply was\n" - "\t\ttruncated, TCP). Use like -muo. Preset: " -#if M_PRESET==UDP_ONLY - "-muo" -#elif M_PRESET==TCP_ONLY - "-mto" -#elif M_PRESET==TCP_UDP - "-mtu" -#else - "-mut" -#endif - "\n" - "-c\t\t--or--\n" - "--config-file\tspecifies the file the configuration is read from.\n" - "\t\tDefault is " CONFDIR "/pdnsd.conf\n" -#ifdef ENABLE_IPV4 - "-4\t\tswitches to IPv4 mode.\n" - "\t\t" -# if DEFAULT_IPV4 - "On" -# else - "Off" -# endif - " by default.\n" -#endif -#ifdef ENABLE_IPV6 - "-6\t\tswitches to IPv6 mode.\n" - "\t\t" -# if DEFAULT_IPV4 - "Off" -# else - "On" -# endif - " by default.\n" - "-i\t\t--or--\n" - "--ipv4_6_prefix\tspecifies the prefix pdnsd uses to map IPv4 to IPv6\n" - "\t\taddresses. Must be a valid IPv6 address.\n" - "\t\tDefault is " DEFAULT_IPV4_6_PREFIX "\n" -#endif -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) - "-a\t\tWith this option, pdnsd will try to detect automatically if\n" - "\t\tthe system supports IPv6, and revert to IPv4 otherwise.\n" -#endif - "\n\n\"no\" can be prepended to the --status, --daemon, --debug and --tcp\n" - "options (e.g. --notcp) to reverse their effect.\n"; - - -/* These are some init steps we have to call before we get daemon on linux, but need - * to call after daemonizing on other OSes. - * Theay are also the last steps before we drop privileges. */ -int final_init() -{ -#ifndef NO_TCP_SERVER - if (!global.notcp) - tcp_socket=init_tcp_socket(); -#endif - udp_socket=init_udp_socket(); - if (tcp_socket==-1 && udp_socket==-1) { - log_error("tcp and udp initialization failed. Exiting."); - return 0; - } - if (global.strict_suid) { - if (!run_as(global.run_as)) { - return 0; - } - } - return 1; -} - -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -/* Check if IPv6 is available. - * With thanks to Juliusz Chroboczek. - */ -static int check_ipv6() -{ - int fd; - fd = socket(PF_INET6, SOCK_STREAM, 0); - if(fd < 0) { - if(errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT || errno == EINVAL) - return 0; - return -1; - } - close(fd); - return 1; -} -#endif - - -/* - * Argument parsing, init, server startup - */ -int main(int argc,char *argv[]) -{ - int i,sig,pfd=-1; /* Initialized to inhibit compiler warning */ - - main_thrid=pthread_self(); - servstat_thrid=main_thrid; - statsock_thrid=main_thrid; - tcps_thrid=main_thrid; - udps_thrid=main_thrid; - init_uid=getuid(); -#ifdef ENABLE_IPV6 - { - int err; - if((err=inet_pton(AF_INET6,DEFAULT_IPV4_6_PREFIX,&global.ipv4_6_prefix))<=0) { - fprintf(stderr,"Error: inet_pton() wont accept default prefix %s in %s, line %d\n", - DEFAULT_IPV4_6_PREFIX,__FILE__,__LINE__); - if(err) - perror("inet_pton"); - exit(1); - } - } -#endif - - /* Parse the command line. - Remember which options were specified here, because the command-line options - shall override the ones given in the config file */ - for (i=1;ipw_name); - else - printf("%i\n",uid); - } - exit(0); - } - - if(!global.cache_dir) global.cache_dir = CACHEDIR; - if(!global.scheme_file) global.scheme_file = "/var/lib/pcmcia/scheme"; - stat_pipe=global.stat_pipe; - - if (!(global.run_as[0] && global.strict_suid)) { - for (i=0; iuptest==C_EXEC && sp->uptest_usr[0]=='\0') { - uid_t uid=getuid(); - struct passwd *pws=getpwuid(uid); - - /* No explicit uptest user given. If we run_as and strict_suid, we assume that - * this is safe. If not - warn. */ - fprintf(stderr,"Warning: uptest command \"%s\" will implicitly be executed as user ", sp->uptest_cmd); - if (pws) - fprintf(stderr,"%s\n",pws->pw_name); - else - fprintf(stderr,"%i\n",uid); - - } - } - } - - if (global.daemon && global.pidfile) { - if (unlink(global.pidfile)!=0 && errno!=ENOENT) { - log_error("Error: could not unlink pid file %s: %s",global.pidfile, strerror(errno)); - exit(1); - } - if ((pfd=open(global.pidfile,O_WRONLY|O_CREAT|O_EXCL -#ifdef O_NOFOLLOW - |O_NOFOLLOW -#else - /* - * No O_NOFOLLOW. Nevertheless, this not a hole, since the - * directory for pidfiles should not be world writeable. - * OS's that do not support O_NOFOLLOW are currently not - * supported, this is just-in-case code. - */ -#endif - , 0600))==-1) - { - log_error("Error: could not open pid file %s: %s",global.pidfile, strerror(errno)); - exit(1); - } - } - for (i=0;i0 - if (global.debug) { - char dbgpath[strlen(global.cache_dir)+sizeof("/pdnsd.debug")]; - stpcpy(stpcpy(dbgpath,global.cache_dir),"/pdnsd.debug"); - if (!(dbg_file=fopen(dbgpath,"w"))) - log_warn("Warning: could not open debug file %s: %s",dbgpath, strerror(errno)); - } -#endif - } else { -#if DEBUG>0 - dbg_file=stdout; -#endif - } - -#if DEBUG>0 - debug_p= (global.debug && dbg_file); -#endif - log_info(0,"pdnsd-%s starting.\n",VERSION); - DEBUG_MSG("Debug messages activated\n"); - -#if (TARGET!=TARGET_LINUX) - if (!final_init()) - _exit(1); -#endif - DEBUG_MSG(SEL_IPVER("Using IPv4.\n", "Using IPv6.\n")); - - /* initialize attribute for creating detached threads */ - pthread_attr_init(&attr_detached); - pthread_attr_setdetachstate(&attr_detached,PTHREAD_CREATE_DETACHED); - - read_disk_cache(); - - /* This must be done before any other thread is started to avoid races. */ - if (stat_pipe) - init_stat_sock(); - - - /* Before this point, logging and cache accesses are not locked because we are single-threaded. */ - init_log_lock(); - init_cache_lock(); - - sigemptyset(&sigs_msk); - sigaddset(&sigs_msk,SIGHUP); - sigaddset(&sigs_msk,SIGINT); -#ifndef THREADLIB_NPTL - sigaddset(&sigs_msk,SIGILL); -#endif - sigaddset(&sigs_msk,SIGABRT); - sigaddset(&sigs_msk,SIGFPE); -#ifndef THREADLIB_NPTL - sigaddset(&sigs_msk,SIGSEGV); -#endif - sigaddset(&sigs_msk,SIGTERM); - /* if (!daemon_p) { - sigaddset(&sigs_msk,SIGQUIT); - } */ -#if (TARGET==TARGET_LINUX) - pthread_sigmask(SIG_BLOCK,&sigs_msk,NULL); -#endif - -#if DEBUG>0 - { - int err; - /* Generate a key for storing our thread id's */ - if ((err=pthread_key_create(&thrid_key, NULL)) != 0) { - log_error("pthread_key_create failed: %s",strerror(err)); - _exit(1); - } - } -#endif - - { -#if DEBUG>0 - int thrdsucc=1; -# define thrdfail (thrdsucc=0) -#else -# define thrdfail -#endif - - if(start_servstat_thread()) thrdfail; - -#if (TARGET==TARGET_LINUX) - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - _exit(1); - } - } -#endif - - if (stat_pipe) - if(start_stat_sock()) thrdfail; - - start_dns_servers(); - -#if DEBUG>0 - if(thrdsucc) { - DEBUG_MSG("All threads started successfully.\n"); - } -#endif -#undef thrdfail - } - -#if (TARGET==TARGET_LINUX) && !defined(THREADLIB_NPTL) - pthread_sigmask(SIG_BLOCK,&sigs_msk,NULL); - waiting=1; -#endif - { - int err; - while ((err=sigwait(&sigs_msk,&sig))) { - if (err!=EINTR) { - log_error("sigwait failed: %s",strerror(err)); - sig=0; - break; - } - } - } - if(sig) DEBUG_MSG("Signal %i caught.\n",sig); - write_disk_cache(); - destroy_cache(); - if(sig) log_warn("Caught signal %i. Exiting.",sig); - if (sig==SIGSEGV || sig==SIGILL || sig==SIGBUS) - crash_msg("This is a fatal signal probably triggered by a bug."); - if (ping_isocket!=-1) - close(ping_isocket); -#ifdef ENABLE_IPV6 - if (ping6_isocket!=-1) - close(ping6_isocket); -#endif - /* Close and delete the status socket */ - if(stat_pipe) close(stat_sock); - if (sock_path && unlink(sock_path)) - log_warn("Failed to unlink %s: %s",sock_path, strerror(errno)); - - free_rng(); -#if DEBUG>0 - if (debug_p && global.daemon) - if(fclose(dbg_file)<0) { - log_warn("Could not close debug file: %s", strerror(errno)); - } -#endif - _exit(0); -} diff --git a/jni/pdnsd/src/make_rr_types_h.pl b/jni/pdnsd/src/make_rr_types_h.pl deleted file mode 100644 index c8c0f9fb..00000000 --- a/jni/pdnsd/src/make_rr_types_h.pl +++ /dev/null @@ -1,309 +0,0 @@ -#!/usr/bin/perl -w - -# This Perl script is used to generate rr_types.h, using rr_types.in as input. -# -# Copyright (C) 2010, 2011 Paul A. Rombouts -# -# This file is part of the pdnsd package. -# - -use strict; -use integer; - -print << "END-OF-TEXT"; -/* This file was generated by running '$0 @ARGV'. - Modifications to this file may be lost the next time it is automatically - regenerated. -*/ - -END-OF-TEXT - -my %valdic; -my %namedic; -my %classdic; -my %muset; -my $nrr=0; -my $nmu=0; -my $minval; -my $maxval; -#my $maxmuval; - -while(<>) { - if(/\S/ && !/^\s*\#/) { - if(/^\s*(?:([*+-])\s*)?([\w-]+)\s+(\d+)\s+(?:\((\w+)\))?/) { - my $mu = $1; my $name=$2; my $val=$3+0; my $class=$4; - $name =~ s/-/_/g; - if(defined($valdic{$name})) {warn "The name \"$name\" does not have a unique value.\n"} - if(defined($namedic{$val})) {warn "The value \"$val\" does not have a unique name.\n"} - $valdic{$name}=$val; $namedic{$val}=$name; $classdic{$val}=$class if defined($class); - if(defined($mu)) { - if($mu eq '-') {next} - $muset{$val}= 1; - ++$nmu; - #if(!defined($maxmuval) || $val>$maxmuval) {$maxmuval=$val} - } - else {$muset{$val}= 0} - ++$nrr; - if(!defined($minval) || $val<$minval) {$minval=$val} - if(!defined($maxval) || $val>$maxval) {$maxval=$val} - } - else {die "Can't find name-value pair in following line:\n$_\n"} - } -} - -defined($minval) or die "No values defined.\n"; -if($nrr>255) {warn "Warning: total number of cache-able RR types is greater than 255.\n"} - -print << 'END-OF-TEXT'; -/* rr_types.h - A header file with names & descriptions of - all rr types known to pdnsd - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2007, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#ifndef _RR_TYPES_H_ -#define _RR_TYPES_H_ - -#include - -END-OF-TEXT - -print "#define T_MIN $minval\n"; -foreach my $name (sort {$valdic{$a} <=> $valdic{$b} } (keys %valdic)) { - printf("#define %-12s %2d\n", "T_$name", $valdic{$name}); -} -print "#define T_MAX $maxval\n"; -print("\n/* T_MAX - T_MIN + 1 */\n","#define T_NUM ",$maxval+1-$minval,"\n"); -#print("\n/* Largest most frequently used type value. */\n","#define T_MAXMU $maxmuval\n"); -print("\n/* Number of most frequently used rr types. */\n","#define NRRMU $nmu\n"); -print("\n/* Number of remaining rr types. */\n","#define NRREXT ",$nrr-$nmu,"\n"); -print("\n/* NRRMU + NRREXT */\n","#define NRRTOT $nrr\n"); - -print << 'END-OF-TEXT'; - -/* Lookup table for converting rr type values to internally used indices. */ -extern const unsigned short int rrlkuptab[T_NUM]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const unsigned short int rrlkuptab[T_NUM] = { -END-OF-TEXT -my @rrtpval=(); -for(my $val=$minval, my $i=0, my $j=$nmu, my $k=$nrr; $val<=$maxval; ++$val) { - my $idx; - if(defined($muset{$val})) { - if($muset{$val}) { - $idx = $i++; - } - else { - $idx = $j++; - } - $rrtpval[$idx]=$val; - } - else { - $idx = $k++; - } - - printf('%4d', $idx); - if(defined($namedic{$val})) { - print " /* $namedic{$val} */"; - } - print ',' if $val<$maxval; - print "\n"; -} -#print << 'END-OF-TEXT'; -#}; -##endif -# -#/* Table for converting internally used indices to rr type values. -# This is more or less the inverse of the rrlkuptab[] mapping. */ -#extern const unsigned short int rrtpval[NRRTOT]; -##if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -#const unsigned short int rrtpval[NRRTOT] = { -#END-OF-TEXT -#for(my $i=0; $i<$nrr; ++$i) { -# if($i ==0) { -# print " /* Most frequently used types. */\n"; -# } -# else { -# print ",\n"; -# } -# print " /* Remaining (less frequently used) types. */\n" -# if $i == $nmu; -# my $val= $rrtpval[$i]; -# print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val); -#} -print << 'END-OF-TEXT'; -}; -#endif - -/* List of most frequently used RR types in ascending order. */ -extern const unsigned short int rrmuiterlist[NRRMU]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const unsigned short int rrmuiterlist[NRRMU] = { -END-OF-TEXT -for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) { - if(defined($muset{$val}) && $muset{$val}) { - print ",\n" if $i++; - print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val); - } -} -print << 'END-OF-TEXT'; - -}; -#endif - -/* List of the cache-able RR types in ascending order. */ -extern const unsigned short int rrcachiterlist[NRRTOT]; -#if DEFINE_RR_TYPE_ARRAYS -const unsigned short int rrcachiterlist[NRRTOT] = { -END-OF-TEXT -for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) { - if(defined($muset{$val})) { - print ",\n" if $i++; - print(" ",defined($namedic{$val})? "T_$namedic{$val}": $val); - } -} -print << 'END-OF-TEXT'; - -}; -#endif - -/* Optimized getrrset macros for fixed rr types. */ -END-OF-TEXT -for(my $val=$minval, my $i=0, my $j=0; $val<=$maxval; ++$val) { - if(defined($muset{$val})) { - my $name = $namedic{$val}; - my $mdef; - if($muset{$val}) { - $mdef= "GET_RRSMU(cent,$i)"; - ++$i; - } - else { - $mdef= "GET_RRSEXT(cent,$j)"; - ++$j; - } - printf("#define %-25s %s\n", "getrrset_$name(cent)", $mdef) - if defined($name); - } -} -print << 'END-OF-TEXT'; - -/* have_rr macros for fixed rr types. */ -END-OF-TEXT -for(my $val=$minval, my $i=0, my $j=0; $val<=$maxval; ++$val) { - my $name = $namedic{$val}; - my $mdef = '0'; - if(defined($muset{$val})) { - if($muset{$val}) { - $mdef= "HAVE_RRMU(cent,$i)"; - ++$i; - } - else { - $mdef= "HAVE_RREXT(cent,$j)"; - ++$j; - } - } - printf("#define %-25s %s\n", "have_rr_$name(cent)", $mdef) - if defined($name); -} -print << 'END-OF-TEXT'; - -/* These macros specify which RR types are cached by pdnsd. */ -END-OF-TEXT -for(my $val=$minval; $val<=$maxval; ++$val) { - if(defined($muset{$val})) { - my $name = $namedic{$val}; - printf("#define IS_CACHED_%-10s 1\n", defined($name)? $name: "TYPE$val") - } -} -print << 'END-OF-TEXT'; - -/* Array indices for most frequently used rr types. */ -END-OF-TEXT -for(my $val=$minval, my $i=0; $val<=$maxval; ++$val) { - if(defined($muset{$val}) && $muset{$val}) { - printf("#define %-18s %2d\n", "RRMUINDEX_$namedic{$val}", $i) - if defined($namedic{$val}); - ++$i; - } -} -print << 'END-OF-TEXT'; - -/* Table of rr names. */ -extern const char *const rrnames[T_NUM]; -#if DEFINE_RR_TYPE_ARRAYS -const char *const rrnames[T_NUM] = { -END-OF-TEXT -for(my $val=$minval; $val<=$maxval; ++$val) { - my $name = $namedic{$val}; - print(' "', defined($name)? $name: "TYPE$val", '"'); - print ',' if $val<$maxval; - print "\n"; -} -print << 'END-OF-TEXT'; -}; -#endif - -/* Structure for rr information */ -struct rr_infos { - unsigned short class; /* class (values see below) */ - unsigned short excludes; /* relations to other classes. - Mutual exclusion is marked by or'ing the - respective RRCL value in this field. - Exclusions should be symmetric. */ -}; - -/* Class values */ -#define RRCL_ALIAS 1 /* for CNAMES, conflicts with RRCL_RECORD */ -#define RRCL_RECORD 2 /* normal direct record */ -#define RRCL_IDEM 4 /* types that conflict with no others (MX, CNAME, ...) */ -#define RRCL_PTR 8 /* PTR */ - -/* Standard excludes for the classes */ -#define RRX_ALIAS (RRCL_RECORD|RRCL_PTR) -#define RRX_RECORD (RRCL_ALIAS|RRCL_PTR) -#define RRX_IDEM 0 -#define RRX_PTR (RRCL_ALIAS|RRCL_RECORD) - -/* There could be a separate table detailing the relationship of types, but this - * is slightly more flexible, as it allows a finer granularity of exclusion. Also, - * Membership in multiple classes could be added. - * Index by internally used RR-set indices, not RR type values! - */ -extern const struct rr_infos rr_info[NRRTOT]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const struct rr_infos rr_info[NRRTOT] = { -END-OF-TEXT -for(my $i=0; $i<$nrr; ++$i) { - print ",\n" if $i; - my $val=$rrtpval[$i]; - my $class = (defined($classdic{$val})? $classdic{$val}: 'IDEM'); - printf(' %-16s %-15s %s',"{RRCL_$class,", "RRX_$class}", defined($namedic{$val})?"/* $namedic{$val} */":""); -} -print << 'END-OF-TEXT'; - -}; -#endif - -int rr_tp_byname(char *name); -const char *loc2str(const void *binary, char *ascii, size_t asclen); - -#endif -END-OF-TEXT - -exit diff --git a/jni/pdnsd/src/netdev.c b/jni/pdnsd/src/netdev.c deleted file mode 100644 index bd5f8c45..00000000 --- a/jni/pdnsd/src/netdev.c +++ /dev/null @@ -1,363 +0,0 @@ -/* netdev.c - Test network devices for existence and status - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -/* - * Portions are under the following copyright and taken from FreeBSD - * (clause 3 deleted as it no longer applies): - * - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)if.h 8.1 (Berkeley) 6/10/93 - * $FreeBSD: src/sys/net/if.h,v 1.58.2.1 2000/05/05 13:37:04 jlemon Exp $ - */ - -#include -#include "ipvers.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "helpers.h" -#include "netdev.h" -#include "error.h" - - -#if (TARGET==TARGET_BSD) -/* Taken from FreeBSD net/if.h rev. 1.58.2.1 */ -#define SIZEOF_ADDR_IFREQ(ifr) \ - ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ - (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ - (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) -#elif (TARGET==TARGET_CYGWIN) -#define SIZEOF_ADDR_IFREQ(ifr) (sizeof(struct sockaddr)) -#endif - -#define MAX_SOCKETOPEN_ERRS 10 -static volatile unsigned long socketopen_errs=0; - -/* - * Portions of the following code are Linux/FreeBSD specific. - * Please write interface-detection routines for other flavours of Unix if you can and want. - */ - -#if (TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN) -# if (TARGET==TARGET_LINUX) - -static volatile unsigned long isdn_errs=0; - -# ifdef ISDN_SUPPORT - -/* - * Test the status of an ippp interface. Taken from the isdn4k-utils (thanks!) and adapted - * by me (I love free software!) - * This will not work with older kernels. - * If your kernel is too old or too new, just try to get the status as uptest=exec command - * This will work, although slower. - */ - -# include - -int statusif(char *name) -{ - isdn_net_ioctl_phone phone; - int isdninfo,rc=0; - - if ((isdninfo = open("/dev/isdninfo", O_RDONLY))<0) { - if (++isdn_errs<=2) { - log_warn("Could not open /dev/isdninfo for uptest: %s",strerror(errno)); - } - return 0; - } - - strncp(phone.name, name, sizeof(phone.name)); - if (ioctl(isdninfo, IIOCNETGPN, &phone)==0) - rc=1; - close(isdninfo); - return rc; -} -# endif - -/* - * Test whether the network interface specified in ifname and its - * associated device specified in devname have locks owned by the - * same process. - */ -int dev_up(char *ifname, char *devname) -{ - FILE *fd; - int pidi, pidd, rv; - - { - char path[sizeof("/var/run/.pid")+strlen(ifname)]; - stpcpy(stpcpy(stpcpy(path,"/var/run/"),ifname),".pid"); - if ((fd=fopen(path, "r")) == NULL ) - return 0; - - if (fscanf(fd, "%d", &pidi) != 1 ) { - fclose(fd) ; - return 0; - } - fclose(fd); - } - - { - char path[sizeof("/var/lock/LCK..")+strlen(devname)]; - stpcpy(stpcpy(path,"/var/lock/LCK.."),devname); - if ((fd=fopen(path, "r")) == NULL) - return 0; - - if (fscanf(fd, "%d", &pidd) != 1) { - fclose(fd); - return 0; - } - fclose(fd); - } - - if (pidi != pidd) - return 0; - /* Test whether pppd is still alive */ - rv=kill(pidi,0); - return (rv==0 || (rv==-1 && errno!=ESRCH)); -} - - -# endif /*(TARGET==TARGET_LINUX)*/ - -/* - * Test whether the network device specified in devname is up and - * running (returns -1) or non-existent, down or not-running (returns 0) - * - * Note on IPv6-Comptability: rfc2133 requires all IPv6 implementation - * to be backwards-compatible to IPv4 in means of permitting socket(PF_INET,...) - * and similar. So, I don't put code here for both IPv4 and IPv6, since - * I use that socket only for ioctls. If somebody notices incompatabilities, - * please notify me. - */ -int if_up(char *devname) -{ - int sock; - struct ifreq ifr; -# if (TARGET==TARGET_LINUX) - unsigned int devnamelen=strlen(devname); - if (devnamelen>4 && devnamelen<=6 && strncmp(devname,"ippp",4)==0) { - /* This function didn't manage the interface uptest correctly. Thanks to - * Joachim Dorner for pointing out. - * The new code (statusif()) was shamelessly stolen from isdnctrl.c of the - * isdn4k-utils. */ -# ifdef ISDN_SUPPORT - return statusif(devname); -# else - if (isdn_errs++==0) { - log_warn("An ippp? device was specified for uptest, but pdnsd was compiled without ISDN support."); - log_warn("The uptest result will be wrong."); - } -# endif - /* If it doesn't match our rules for isdn devices, treat as normal if */ - } -# endif - if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) { - if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) { - log_warn("Could not open socket in if_up(): %s",strerror(errno)); - } - return 0; - } - strncp(ifr.ifr_name,devname,IFNAMSIZ); - if (ioctl(sock,SIOCGIFFLAGS,&ifr)==-1) { - close(sock); - return 0; - } - close(sock); - return (ifr.ifr_flags&IFF_UP) && (ifr.ifr_flags&IFF_RUNNING); -} - -# if (TARGET==TARGET_LINUX) -# ifdef ENABLE_IPV6 -#define MAX_IF_INET6_OPEN_ERRS 10 -static volatile unsigned long if_inet6_open_errs=0; -# endif - -int is_local_addr(pdnsd_a *a) -{ - int res=0; - -# ifdef ENABLE_IPV4 - if (run_ipv4) { - int i,sock; - struct ifreq ifr; - if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) { - if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) { - log_warn("Could not open socket in is_local_addr(): %s",strerror(errno)); - } - return 0; - } - for (i=1;i<255;i++) { - ifr.ifr_ifindex=i; - if (ioctl(sock,SIOCGIFNAME,&ifr)==-1) { - /* There may be gaps in the interface enumeration, so just continue */ - continue; - } - if (ioctl(sock,SIOCGIFADDR, &ifr)==-1) { - continue; - } - if (((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr.s_addr==a->ipv4.s_addr) { - res=1; - break; - } - } - close(sock); - } - -# endif -# ifdef ENABLE_IPV6 - ELSE_IPV6 { - char buf[40]; - FILE *f; - struct in6_addr b; - /* the interface configuration and information retrieval is obiously currently done via - * rt-netlink sockets. I think it is relatively likely to change in an incompatible way the - * Linux kernel (there seem to be some major changes for 2.4). - * Right now, I just analyze the /proc/net/if_inet6 entry. This may not be the fastest, but - * should work and is easy to adapt should the format change. */ - if (!(f=fopen("/proc/net/if_inet6","r"))) { - if(++if_inet6_open_errs<=MAX_IF_INET6_OPEN_ERRS) { - log_warn("Could not open /proc/net/if_inet6 in is_local_addr(): %s",strerror(errno)); - } - return 0; - } - /* The address is at the start of the line. We just read 32 characters and insert a ':' 7 - * times. Such, we can use inet_pton conveniently. More portable, that. */ - for(;;) { - int i,ch; char *p=buf; - for (i=0;i<32;i++) { - if(i && i%4==0) *p++ = ':'; - if ((ch=fgetc(f))==EOF) - goto fclose_return; /* we are at the end of the file and haven't found anything.*/ - if(ch=='\n') goto nextline; - *p++ = ch; - } - *p=0; - if (inet_pton(AF_INET6,buf,&b) >0) { - if (IN6_ARE_ADDR_EQUAL(&b,&a->ipv6)) { - res=1; - goto fclose_return; - } - } - do { - if ((ch=fgetc(f))==EOF) goto fclose_return; - } while(ch!='\n'); - nextline:; - } - fclose_return: - fclose(f); - } -# endif - return res; -} - -# else /*(TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)*/ - - -#define MAX_SIOCGIFCONF_ERRS 4 -static volatile unsigned long siocgifconf_errs=0; - -int is_local_addr(pdnsd_a *a) -{ - int retval=0, sock, cnt; - struct ifconf ifc; - char buf[2048]; - - - if ((sock=socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP))==-1) { - if(++socketopen_errs<=MAX_SOCKETOPEN_ERRS) { - log_warn("Could not open socket in is_local_addr(): %s",strerror(errno)); - } - return 0; - } - - ifc.ifc_len=sizeof(buf); - ifc.ifc_buf=buf; - if (ioctl(sock,SIOCGIFCONF,&ifc)==-1) { - if(++siocgifconf_errs<=MAX_SIOCGIFCONF_ERRS) { - log_warn("ioctl() call with request SIOCGIFCONF failed in is_local_addr(): %s",strerror(errno)); - } - goto close_sock_return; - } - - cnt=0; - while(cnt+sizeof(struct ifreq)<=ifc.ifc_len) { - struct ifreq *ir= (struct ifreq *)(buf+cnt); - cnt += SIZEOF_ADDR_IFREQ(*ir); - if (cnt>ifc.ifc_len) - break; - if (SEL_IPVER(ir->ifr_addr.sa_family==AF_INET && - ((struct sockaddr_in *)&ir->ifr_addr)->sin_addr.s_addr==a->ipv4.s_addr, - ir->ifr_addr.sa_family==AF_INET6 && - IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 *)&ir->ifr_addr)->sin6_addr, - &a->ipv6))) - { - retval=1; - break; - } - } - - close_sock_return: - close(sock); - - return retval; -} - -# endif - -#else -# error "Huh. No OS macro defined." -#endif diff --git a/jni/pdnsd/src/netdev.h b/jni/pdnsd/src/netdev.h deleted file mode 100644 index 529b8a88..00000000 --- a/jni/pdnsd/src/netdev.h +++ /dev/null @@ -1,32 +0,0 @@ -/* netdev.h - Test network devices for existence and status - Copyright (C) 2000 Thomas Moestl - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _NETDEV_H_ -#define _NETDEV_H_ - -#include -#include "ipvers.h" - -int if_up(char *devname); -int dev_up(char *ifname, char *devname); -int is_local_addr(pdnsd_a *a); - -#endif diff --git a/jni/pdnsd/src/pdnsd-ctl/Makefile.am b/jni/pdnsd/src/pdnsd-ctl/Makefile.am deleted file mode 100644 index bcb73274..00000000 --- a/jni/pdnsd/src/pdnsd-ctl/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ - -sbin_PROGRAMS = pdnsd-ctl - -pdnsd_ctl_SOURCES = pdnsd-ctl.c -pdnsd_ctl_LDADD = rr_types.o -pdnsd_ctl_DEPENDENCIES = rr_types.o - -# These are Symlinks we want to have in the package -#EXTRA_DIST = rr_types.h - -pdnsd-ctl.o rr_types.o: ../rr_types.h - -../rr_types.h: ../make_rr_types_h.pl ../rr_types.in - perl ../make_rr_types_h.pl ../rr_types.in > ../rr_types.h - -rr_types.o: %.o: ../%.c - $(COMPILE) -DCLIENT_ONLY -c $< - diff --git a/jni/pdnsd/src/pdnsd-ctl/Makefile.in b/jni/pdnsd/src/pdnsd-ctl/Makefile.in deleted file mode 100644 index 80f39872..00000000 --- a/jni/pdnsd/src/pdnsd-ctl/Makefile.in +++ /dev/null @@ -1,470 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -sbin_PROGRAMS = pdnsd-ctl$(EXEEXT) -subdir = src/pdnsd-ctl -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(sbindir)" -PROGRAMS = $(sbin_PROGRAMS) -am_pdnsd_ctl_OBJECTS = pdnsd-ctl.$(OBJEXT) -pdnsd_ctl_OBJECTS = $(am_pdnsd_ctl_OBJECTS) -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(pdnsd_ctl_SOURCES) -DIST_SOURCES = $(pdnsd_ctl_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -pdnsd_ctl_SOURCES = pdnsd-ctl.c -pdnsd_ctl_LDADD = rr_types.o -pdnsd_ctl_DEPENDENCIES = rr_types.o -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pdnsd-ctl/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/pdnsd-ctl/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files - -clean-sbinPROGRAMS: - -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) -pdnsd-ctl$(EXEEXT): $(pdnsd_ctl_OBJECTS) $(pdnsd_ctl_DEPENDENCIES) - @rm -f pdnsd-ctl$(EXEEXT) - $(LINK) $(pdnsd_ctl_OBJECTS) $(pdnsd_ctl_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdnsd-ctl.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: - for dir in "$(DESTDIR)$(sbindir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-sbinPROGRAMS - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-sbinPROGRAMS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-sbinPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-sbinPROGRAMS install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-sbinPROGRAMS - - -# These are Symlinks we want to have in the package -#EXTRA_DIST = rr_types.h - -pdnsd-ctl.o rr_types.o: ../rr_types.h - -../rr_types.h: ../make_rr_types_h.pl ../rr_types.in - perl ../make_rr_types_h.pl ../rr_types.in > ../rr_types.h - -rr_types.o: %.o: ../%.c - $(COMPILE) -DCLIENT_ONLY -c $< - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/pdnsd-ctl/pdnsd-ctl.c b/jni/pdnsd/src/pdnsd-ctl/pdnsd-ctl.c deleted file mode 100644 index 33a21cec..00000000 --- a/jni/pdnsd/src/pdnsd-ctl/pdnsd-ctl.c +++ /dev/null @@ -1,799 +0,0 @@ -/* pdnsd-ctl.c - Control pdnsd through a pipe - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#ifdef HAVE_ALLOCA_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include /* for offsetof */ -#include "../helpers.h" -#include "../status.h" -#include "../conff.h" -#include "../list.h" -#include "../dns.h" -#include "../rr_types.h" -#include "../cache.h" - -#if !defined(HAVE_ALLOCA) && !defined(alloca) -#define alloca malloc -#endif - - -#if defined(HAVE_STRUCT_IN6_ADDR) && defined(HAVE_INET_PTON) -# define ALLOW_AAAA IS_CACHED_AAAA -#else -# define ALLOW_AAAA 0 -#endif - -static short int verbose=1; - -typedef struct { - char *name; - int val; -} cmd_s; - -#define CMD_LIST_RRTYPES (CTL_MAX+1) -#define CMD_HELP (CTL_MAX+2) -#define CMD_VERSION (CTL_MAX+3) - -static const cmd_s top_cmds[]={ - {"help",CMD_HELP},{"version",CMD_VERSION},{"list-rrtypes",CMD_LIST_RRTYPES}, - {"status",CTL_STATS},{"server",CTL_SERVER},{"record",CTL_RECORD}, - {"source",CTL_SOURCE},{"add",CTL_ADD},{"neg",CTL_NEG}, - {"config",CTL_CONFIG},{"include",CTL_INCLUDE},{"eval",CTL_EVAL}, - {"empty-cache",CTL_EMPTY}, {"dump",CTL_DUMP}, - {NULL,0} -}; -static const cmd_s server_cmds[]= {{"up",CTL_S_UP},{"down",CTL_S_DOWN},{"retest",CTL_S_RETEST},{NULL,0}}; -static const cmd_s record_cmds[]= {{"delete",CTL_R_DELETE},{"invalidate",CTL_R_INVAL},{NULL,0}}; -static const cmd_s onoff_cmds[]= {{"off",0},{"on",1},{NULL,0}}; -static const cmd_s rectype_cmds[]= {{"a",T_A}, -#if ALLOW_AAAA - {"aaaa",T_AAAA}, -#endif - {"ptr",T_PTR},{"cname",T_CNAME},{"mx",T_MX},{"ns",T_NS},{NULL,0}}; - -static const char version_message[] = - "pdnsd-ctl, version pdnsd-" VERSION "\n\n"; - -static const char license_statement[] = - "Copyright (C) 2000, 2001 Thomas Moestl\n" - "Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Paul A. Rombouts\n\n" - "This program is part of the pdnsd package.\n\n" - "pdnsd is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 3 of the License, or\n" - "(at your option) any later version.\n\n" - "pdnsd is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n\n" - "You should have received a copy of the GNU General Public License\n" - "along with pdsnd; see the file COPYING. If not, see\n" - ".\n"; - -static const char *const help_messages[] = -{ - "Usage: pdnsd-ctl [-c cachedir] [-q] [arguments]\n\n" - - "Command-line options:\n" - - "-c\tcachedir\n\tSet the cache directory to cachedir (must match pdnsd setting).\n" - "\tThe default is '" CACHEDIR "'.\n" - "-q\n\tBe quiet unless output is specified by command or something goes wrong.\n\n" - - "Commands and needed arguments are:\n" - - "help\t[no arguments]\n\tPrint this help.\n" - "version\t[no arguments]\n\tPrint version and license info.\n", - - "status\t[no arguments]\n\tPrint pdnsd's status.\n", - - "server\t(index|label)\t(up|down|retest)\t[dns1[,dns2[,...]]]\n" - "\tSet the status of the server with the given index to up or down, or\n" - "\tforce a retest. The index is assigned in the order of definition in\n" - "\tpdnsd.conf starting with 0. Use the status command to see the indexes.\n" - "\tYou can specify the label of a server (that matches the label option)\n" - "\tinstead of an index to make this easier.\n" - - "\tYou can specify all instead of an index to perform the action for all\n" - "\tservers registered with pdnsd.\n" - - "\tAn optional third argument can be given consisting of a list of IP\n" - "\taddresses separated by commas or spaces. This list will replace the\n" - "\taddresses of name servers used by pdnsd for the given server section.\n" - "\tThis feature is useful for run-time configuration of pdnsd with dynamic\n" - "\tDNS data in scripts called by ppp or DHCP clients. The last argument\n" - "\tmay also be an empty string, which causes existing IP addresses to be\n" - "\tremoved and the corresponding server section to become inactive.\n", - - "record\tname\t(delete|invalidate)\n" - "\tDelete or invalidate the record of the given domain if it is in the\n" - "\tcache.\n", - - "source\tfn\towner\t[ttl]\t[(on|off)]\t[noauth]\n" - "\tLoad a hosts-style file. Works like using the pdnsd source\n" - "\tconfiguration section.\n" - "\tOwner and ttl are used as in the source section. ttl has a default\n" - "\tof 900 (it does not need to be specified). The next to last argument\n" - "\tcorresponds to the serve_aliases option, and is off by default.\n" - "\tnoauth is used to make the domains non-authoritative (please\n" - "\tconsult the pdnsd manual for what that means).\n" - "\tfn is the name of the file, which must be readable by pdnsd.\n", - - "add\ta\taddr\tname\t[ttl]\t[noauth]\n" -#if ALLOW_AAAA - "add\taaaa\taddr\tname\t[ttl]\t[noauth]\n" -#endif - "add\tptr\thost\tname\t[ttl]\t[noauth]\n" - "add\tcname\thost\tname\t[ttl]\t[noauth]\n" - "add\tmx\thost\tname\tpref\t[ttl]\t[noauth]\n" - "add\tns\thost\tname\t[ttl]\t[noauth]\n" - "\tAdd a record of the given type to the pdnsd cache, replacing existing\n" - "\trecords for the same name and type. The 2nd argument corresponds\n" - "\tto the value of the option in the rr section that is named like\n" - "\tthe first argument. The addr argument may be a list of IP addresses,\n" - "\tseparated by commas or white space. The ttl is optional, the default is\n" - "\t900 seconds. noauth is used to make the domains non-authoritative.\n" - "\tIf you want no other record than the newly added in the cache, do\n" - "\tpdnsdctl record delete\n" - "\tbefore adding records.\n", - - "neg\tname\t[type]\t[ttl]\n" - "\tAdd a negatively cached record to pdnsd's cache, replacing existing\n" - "\trecords for the same name and type. If no type is given, the whole\n" - "\tdomain is cached negatively. For negatively cached records, errors are\n" - "\timmediately returned on a query, without querying other servers first.\n" - "\tThe ttl is optional, the default is 900 seconds.\n", - - "config\t[filename]\n" - "\tReload pdnsd's configuration file.\n" - "\tThe config file must be owned by the uid that pdnsd had when it was\n" - "\tstarted, and be readable by pdnsd's run_as uid. If no file name is\n" - "\tspecified, the config file used at start up is reloaded.\n", - - "include\tfilename\n" - "\tParse the given file as an include file, which may contain the same\n" - "\ttype of sections as a config file, expect for global and server\n" - "\tsections, which are not allowed. This command can be used to add data\n" - "\tto the cache without reconfiguring pdnsd.\n", - - "eval\tstring\n" - "\tParse string as if it were part of pdnsd's configuration file.\n" - "\tThe string should hold one or more complete configuration sections,\n" - "\tbut no global and server sections, which are not allowed.\n" - "\tIf multiple strings are given, they will be joined using newline chars\n" - "\tand parsed together.\n", - - "empty-cache\t[[+|-]name ...]\n" - "\tDelete all entries in the cache matching include/exclude rules.\n" - "\tIf no arguments are provided, the cache is completely emptied,\n" - "\tfreeing all existing entries. This also removes \"local\" records,\n" - "\tas defined by the config file. To restore local records, run\n" - "\t\"pdnsd-ctl config\" or \"pdnsd-ctl include filename\" immediately\n" - "\tafterwards.\n" - "\tIf one or more arguments are provided, these are interpreted as \n" - "\tinclude/exclude names. If an argument starts with a '+' the name is to\n" - "\tbe included. If an argument starts with a '-' it is to be excluded.\n" - "\tIf an argument does not begin with '+' or '-', a '+' is assumed.\n" - "\tIf the domain name of a cache entry ends in one of the names in the\n" - "\tlist, the first match will determine what happens. If the matching name\n" - "\tis to be included, the cache entry is deleted, otherwise it remains.\n" - "\tIf there are no matches, the default action is not to delete.\n", - - "dump\t[name]\n" - "\tPrint information stored in the cache about name.\n" - "\tIf name begins with a dot and is not the root domain, information\n" - "\tabout the names in the cache ending in name (including name without\n" - "\tthe leading dot) will be printed. If name is missing, information about\n" - "\tall the names in the cache will be printed.\n", - - "list-rrtypes\t[no arguments]\n" - "\tList available rr types for the neg command. Note that those are only\n" - "\tused for the neg command, not for add!\n" -}; - -#define NUM_HELP_MESSAGES (sizeof(help_messages)/sizeof(char*)) - - -/* Open connection to control socket and send command code. - If successful, open_sock returns a file descriptor for the new socket, - otherwise the program is aborted. -*/ -static int open_sock(const char *cache_dir, uint16_t cmd) -{ - struct sockaddr_un *sa; - unsigned int sa_len; - int sock; - uint16_t nc; - - if ((sock=socket(PF_UNIX,SOCK_STREAM,0))==-1) { - perror("Error: could not open socket"); - exit(2); - } - - sa_len = (offsetof(struct sockaddr_un, sun_path) + strlitlen("/pdnsd.status") + strlen(cache_dir)); - sa=(struct sockaddr_un *)alloca(sa_len+1); - sa->sun_family=AF_UNIX; - stpcpy(stpcpy(sa->sun_path,cache_dir),"/pdnsd.status"); - - if (connect(sock,(struct sockaddr *)sa,sa_len)==-1) { - fprintf(stderr,"Error: could not open socket %s: %s\n",sa->sun_path,strerror(errno)); - close(sock); - exit(2); - } - if(verbose) printf("Opening socket %s\n",sa->sun_path); - - /* Send command code */ - - nc=htons(cmd|CTL_CMDVERNR); /* Add magic number, convert to network byte order. */ - - if (write(sock,&nc,sizeof(nc))!=sizeof(nc)) { - perror("Error: could not write command code"); - close(sock); - exit(2); - } - - return sock; -} - -static void send_long(int fd,uint32_t cmd) -{ - uint32_t nc=htonl(cmd); - - if (write(fd,&nc,sizeof(nc))!=sizeof(nc)) { - perror("Error: could not write long"); - close(fd); - exit(2); - } -} - -static void send_short(int fd,uint16_t cmd) -{ - uint16_t nc=htons(cmd); - - if (write(fd,&nc,sizeof(nc))!=sizeof(nc)) { - perror("Error: could not write short"); - close(fd); - exit(2); - } -} - -#define MAXSENDSTRLEN 0xfffe - -static void send_string(int fd, const char *s) -{ - if(s) { - size_t len=strlen(s); - if(len>MAXSENDSTRLEN) { - fprintf(stderr,"Error: send_string: string length (%lu) exceeds maximum (%u).\n", - (unsigned long)len, MAXSENDSTRLEN); - close(fd); - exit(2); - } - send_short(fd,len); - if (write_all(fd,s,len)!=len) { - perror("Error: could not write string"); - close(fd); - exit(2); - } - } - else - send_short(fd, ~0); -} - -static uint16_t read_short(int fd) -{ - ssize_t err; - uint16_t nc; - - if ((err=read(fd,&nc,sizeof(nc)))!=sizeof(nc)) { - fprintf(stderr,"Error: could not read short: %s\n",err<0?strerror(errno):"unexpected EOF"); - close(fd); - exit(2); - } - return ntohs(nc); -} - -/* copy data from file descriptor fd to file stream out until EOF - or error is encountered. -*/ -static ssize_t copymsgtofile(int fd, FILE* out) -{ - ssize_t n,ntot=0; - char buf[1024]; - - while ((n=read(fd,buf,sizeof(buf)))>0) - ntot+=fwrite(buf,1,n,out); - - if(n<0) - return n; - - return ntot; -} - -static int match_cmd(const char *cmd, const cmd_s cmds[]) -{ - int i; - for(i=0; cmds[i].name; ++i) { - if (strcasecmp(cmd,cmds[i].name)==0) - return cmds[i].val; - } - return -1; -} - -int main(int argc, char *argv[]) -{ - char *cache_dir= CACHEDIR; - int rv=0; - { - int i; - char *arg; - for(i=1; i4) - goto wrong_args; - acnt=2; - server_cmd=match_cmd(argv[2],server_cmds); - if(server_cmd==-1) goto bad_arg; - pf=open_sock(cache_dir, cmd); - send_string(pf,argv[1]); - send_short(pf,server_cmd); - send_string(pf,argc<4?NULL:argv[3]); - } - goto read_retval; - - case CTL_RECORD: { - int record_cmd; - if (argc!=3) - goto wrong_args; - acnt=2; - record_cmd=match_cmd(argv[2],record_cmds); - if(record_cmd==-1) goto bad_arg; - pf=open_sock(cache_dir, cmd); - send_short(pf,record_cmd); - send_string(pf,argv[1]); - } - goto read_retval; - - case CTL_SOURCE: { - long ttl; - int servaliases,flags; - if (argc<3 || argc>6) - goto wrong_args; - ttl=900; - flags=DF_LOCAL; - acnt=3; - if (argc==6 || (argc>=4 && isdigit(argv[3][0]))) { - char *endptr; - ttl=strtol(argv[3],&endptr,0); - if (*endptr) - goto bad_arg; - acnt++; - } - servaliases=0; - if (acntacnt+2) - goto wrong_args; - - ttl=900; - flags=DF_LOCAL; - pref=0; - if(tp==T_MX) { - char *endptr; - pref=strtol(argv[4],&endptr,0); - if (*endptr) { - acnt=4; - goto bad_arg; - } - } - - if (acnt4) - goto wrong_args; - tp=255; - ttl=900; - acnt=2; - if (argc==3) { - if (isdigit(argv[2][0])) { - char *endptr; - ttl=strtol(argv[2],&endptr,0); - if (*endptr) - goto bad_arg; - } else if ((tp=rr_tp_byname(argv[2]))==-1) { - goto bad_type; - } - } else if (argc==4) { - char *endptr; - if ((tp=rr_tp_byname(argv[2]))==-1) - goto bad_type; - ttl=strtol(argv[3],&endptr,0); - if (*endptr) { - acnt=3; - goto bad_arg; - } - } - pf=open_sock(cache_dir, cmd); - send_string(pf,argv[1]); - send_short(pf,tp); - send_long(pf,ttl); - } - goto read_retval; - - case CTL_CONFIG: - if (argc>2) - goto wrong_args; - pf=open_sock(cache_dir, cmd); - send_string(pf,argc<2?NULL:argv[1]); - goto read_retval; - - case CTL_INCLUDE: - if (argc!=2) - goto wrong_args; - pf=open_sock(cache_dir, cmd); - send_string(pf,argv[1]); - goto read_retval; - - case CTL_EVAL: { - int i; size_t bufsz; - - if (argc<2) - goto wrong_args; - bufsz=0; - for(i=1; iMAXSENDSTRLEN) { - fprintf(stderr,"Cannot send 'eval' command: " - "string length (%lu) exceeds maximum (%u).\n", - (unsigned long)bufsz, MAXSENDSTRLEN); - exit(2); - } - pf=open_sock(cache_dir, cmd); - send_short(pf,bufsz); - { - /* Variable-size array for storing the joined strings. */ - char buf[bufsz]; - char *p=buf; - for(i=1; iMAXSENDSTRLEN) { - fprintf(stderr,"Cannot send 'empty' command: " - "string length (%lu) exceeds maximum (%u).\n", - (unsigned long)totsz, MAXSENDSTRLEN); - exit(2); - } - pf=open_sock(cache_dir, cmd); - if(argc>1) { - send_short(pf,totsz); - for(i=1; i2) - goto wrong_args; - pf=open_sock(cache_dir, cmd); - send_string(pf,argc<2?NULL:argv[1]); - copy_pf: - if((rv=read_short(pf))) - goto retval_failed; - if(copymsgtofile(pf,stdout)<0) { - perror("Error while reading from socket"); - close(pf); - exit(2); - } - goto close_pf; - - read_retval: - if((rv=read_short(pf))) { - retval_failed: - fprintf(stderr,"Failed: "); - if(copymsgtofile(pf,stderr)<0) - fprintf(stderr,"(could not read error message from socket: %s)",strerror(errno)); - - fputc('\n',stderr); - } - close_pf: - if(close(pf)==-1) - perror("Couldn't close socket"); - else if (rv==0 && verbose) - printf("Succeeded\n"); - break; - wrong_args: - fprintf(stderr,"Wrong number of arguments for '%s' command.\n",argv[0]); - goto print_cmd_usage; - bad_arg: - fprintf(stderr,"Bad argument for '%s' command: %s\n",argv[0],argv[acnt]); - print_cmd_usage: - fprintf(stderr,"Usage:\n\n%s\n" - "Try 'pdnsd-ctl help' for a description of all available commands and options.\n", - help_messages[cmd]); - exit(2); - bad_type: - fprintf(stderr,"Bad (type) argument for '%s' command: %s\n" - "Run 'pdnsd-ctl list-rrtypes' for a list of available rr types.\n", - argv[0],argv[acnt]); - exit(2); - } - } - - return rv; -} - diff --git a/jni/pdnsd/src/pdnsd_assert.h b/jni/pdnsd/src/pdnsd_assert.h deleted file mode 100644 index 0acdfc24..00000000 --- a/jni/pdnsd/src/pdnsd_assert.h +++ /dev/null @@ -1,51 +0,0 @@ -/* This include file was added by Paul A. Rombouts. - I had terrible difficulties with cyclic dependencies of the include files - written by Thomas Moestl. The only way I knew how to break the cycle was to - put some declarations in a seperate file. - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#ifndef PDNSD_ASSERT_H -#define PDNSD_ASSERT_H - -/* Originally in helpers.h */ - -/* format string checking for printf-like functions */ -#ifdef __GNUC__ -#define printfunc(fmt, firstva) __attribute__((__format__(__printf__, fmt, firstva))) -#else -#define printfunc(fmt, firstva) -#endif - -void pdnsd_exit(void); - - -/* - * Assert macro, used in some places. For now, it should be always defined, not - * only in the DEBUG case, to be on the safe side security-wise. - */ -#define PDNSD_ASSERT(cond, msg) \ - { if (!(cond)) { \ - log_error("%s:%d: %s", __FILE__, __LINE__, msg); \ - pdnsd_exit(); \ - } } - -#endif diff --git a/jni/pdnsd/src/rc/ArchLinux/Makefile.am b/jni/pdnsd/src/rc/ArchLinux/Makefile.am deleted file mode 100644 index 2a7b4204..00000000 --- a/jni/pdnsd/src/rc/ArchLinux/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ - -install-exec-local: - if [ "$(distribution)" = "ArchLinux" ] ; then \ - $(mkinstalldirs) "$(DESTDIR)/etc/rc.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/pdnsd";\ - fi - diff --git a/jni/pdnsd/src/rc/ArchLinux/Makefile.in b/jni/pdnsd/src/rc/ArchLinux/Makefile.in deleted file mode 100644 index 6af6f9e4..00000000 --- a/jni/pdnsd/src/rc/ArchLinux/Makefile.in +++ /dev/null @@ -1,332 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc/ArchLinux -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/pdnsd.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = pdnsd -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/ArchLinux/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/ArchLinux/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -pdnsd: $(top_builddir)/config.status $(srcdir)/pdnsd.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-exec-local - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-local \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am - - -install-exec-local: - if [ "$(distribution)" = "ArchLinux" ] ; then \ - $(mkinstalldirs) "$(DESTDIR)/etc/rc.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/pdnsd";\ - fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/ArchLinux/pdnsd.in b/jni/pdnsd/src/rc/ArchLinux/pdnsd.in deleted file mode 100644 index c3927506..00000000 --- a/jni/pdnsd/src/rc/ArchLinux/pdnsd.in +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -. /etc/rc.conf -. /etc/rc.d/functions - -PID=`pidof -o %PPID @prefix@/sbin/pdnsd` - -start() { - stat_busy "Starting PDNSD" - [ -z "$PID" ] && @prefix@/sbin/pdnsd -d -c /etc/pdnsd.conf - if [ $? -gt 0 ]; then - stat_fail - else - add_daemon pdnsd - stat_done - fi -} - -stop() { - stat_busy "Stopping PDNSD" - [ ! -z "$PID" ] && kill $PID &> /dev/null - if [ $? -gt 0 ]; then - stat_fail - else - rm_daemon pdnsd - stat_done - fi -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - $0 stop - sleep 2 - $0 start - ;; - *) - echo "usage: $0 {start|stop|restart}" -esac -exit 0 diff --git a/jni/pdnsd/src/rc/Debian/Makefile.am b/jni/pdnsd/src/rc/Debian/Makefile.am deleted file mode 100644 index 61d3eb3b..00000000 --- a/jni/pdnsd/src/rc/Debian/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ - -install-exec-local: - if [ "$(distribution)" = "Debian" ] ; then \ - CURDIR=`pwd`; \ - $(mkinstalldirs) "$(DESTDIR)/etc/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/init.d"; \ - update-rc.d pdnsd defaults 19 ;\ - fi diff --git a/jni/pdnsd/src/rc/Debian/Makefile.in b/jni/pdnsd/src/rc/Debian/Makefile.in deleted file mode 100644 index 992a0597..00000000 --- a/jni/pdnsd/src/rc/Debian/Makefile.in +++ /dev/null @@ -1,334 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc/Debian -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/pdnsd.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = pdnsd -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/Debian/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/Debian/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -pdnsd: $(top_builddir)/config.status $(srcdir)/pdnsd.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-exec-local - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-local \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am - - -install-exec-local: - if [ "$(distribution)" = "Debian" ] ; then \ - CURDIR=`pwd`; \ - $(mkinstalldirs) "$(DESTDIR)/etc/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/init.d"; \ - update-rc.d pdnsd defaults 19 ;\ - fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/Debian/pdnsd.in b/jni/pdnsd/src/rc/Debian/pdnsd.in deleted file mode 100644 index 068606ee..00000000 --- a/jni/pdnsd/src/rc/Debian/pdnsd.in +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -# -# This script was written and contributed by Markus Mohr, and -# slightly modified by me for version 1.0.6 (which obviously -# broke it some way). I then applied a set of corrections -# by Markus Mohr. -# -# Carsten Block has patched this with some magic so that -# the actual script is generated by configure, and that -# the pdnsd user is determined from pdnsd.conf -# I changed this a little to use the --pdnsd-user option -# of pdnsd to determine the run_as user. -# - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -test -x @prefix@/sbin/pdnsd || exit 0 - -case "$1" in - start) - # Check if cache dir exists and recreate if neccessary - test -d @cachedir@ || mkdir @cachedir@ - RUNAS=`@prefix@/sbin/pdnsd --pdnsd-user` || echo -n " failed" - [ -z "$RUNAS" ] && RUNAS=nobody - chown $RUNAS @cachedir@ - echo -n "Starting domain name service: pdnsd" - start-stop-daemon --start --quiet --pidfile /var/run/pdnsd.pid --name pdnsd \ - --exec @prefix@/sbin/pdnsd -- --daemon -p /var/run/pdnsd.pid \ - || echo -n " failed" - echo "." - ;; - - stop) - echo -n "Stopping domain name service: pdnsd" - start-stop-daemon --stop --quiet --pidfile /var/run/pdnsd.pid --name pdnsd --exec @prefix@/sbin/pdnsd \ - || echo -n " failed" - echo "." - ;; - - restart) - $0 stop - $0 start - ;; - - *) - echo "Usage: /etc/init.d/pdnsd {start|stop|restart}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/jni/pdnsd/src/rc/Makefile.am b/jni/pdnsd/src/rc/Makefile.am deleted file mode 100644 index abf2e6dc..00000000 --- a/jni/pdnsd/src/rc/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ - -SUBDIRS = RedHat SuSE Debian Slackware ArchLinux - -EXTRA_DIST = README - diff --git a/jni/pdnsd/src/rc/Makefile.in b/jni/pdnsd/src/rc/Makefile.in deleted file mode 100644 index 38ee297c..00000000 --- a/jni/pdnsd/src/rc/Makefile.in +++ /dev/null @@ -1,526 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ - distdir -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -am__relativize = \ - dir0=`pwd`; \ - sed_first='s,^\([^/]*\)/.*$$,\1,'; \ - sed_rest='s,^[^/]*/*,,'; \ - sed_last='s,^.*/\([^/]*\)$$,\1,'; \ - sed_butlast='s,/*[^/]*$$,,'; \ - while test -n "$$dir1"; do \ - first=`echo "$$dir1" | sed -e "$$sed_first"`; \ - if test "$$first" != "."; then \ - if test "$$first" = ".."; then \ - dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ - dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ - else \ - first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ - if test "$$first2" = "$$first"; then \ - dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ - else \ - dir2="../$$dir2"; \ - fi; \ - dir0="$$dir0"/"$$first"; \ - fi; \ - fi; \ - dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ - done; \ - reldir="$$dir2" -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = RedHat SuSE Debian Slackware ArchLinux -EXTRA_DIST = README -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ - $(am__relativize); \ - new_distdir=$$reldir; \ - dir1=$$subdir; dir2="$(top_distdir)"; \ - $(am__relativize); \ - new_top_distdir=$$reldir; \ - echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ - echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ - ($(am__cd) $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$new_top_distdir" \ - distdir="$$new_distdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - am__skip_mode_fix=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ - install-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic ctags \ - ctags-recursive distclean distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/README b/jni/pdnsd/src/rc/README deleted file mode 100644 index 4e007640..00000000 --- a/jni/pdnsd/src/rc/README +++ /dev/null @@ -1,104 +0,0 @@ -rc/ -=== - -These are start scripts for different Linux distros and other things that -do not directly belong to pdnsd. -If you do start scripts for the distro you use, please GPL them and send -them in, so that they can be included in this package for other users. -Note that there is NO WARRANTY OF ANY KIND on anything in this directory; -read the COPYING that comes with pdnsd for details. -So far there are files in the following directories: - -SuSE ----- -pdnsd - Start script for SuSE Linux. Tested for 6.? but should run on some - versions below. You can do 'make install' as root in the SuSE - directory to install it, or you can install manually: - --manual installation------------------------------------------------- - For manual installation, copy it into /sbin/init.d/, go to - /sbin/init.d/rc2.d/ and create there the following two symlinks: - S11pdnsd -> ../pdnsd (do "ln -s ../pdnsd S11pdnsd" in that dir) - K34pdnsd -> ../pdnsd (do "ln -s ../pdnsd K34pdnsd" in that dir) - The numbers dictate the order different services are started and - might need to be modified. Then edit your /etc/rc.config file and - add the line "START_PDNSD=yes" to start pdnsd at boot time. - ---------------------------------------------------------------------- - If you used the 'make install' command, "START_PDNSD=yes" has been - appended to your /etc/rc.config file, causing pdnsd to be started - at boot time. If you don't want that, change the "yes" into "no". - This start script was created from /sbin/init.d/skeleton by me, so the - most is copyrighted by SuSE. They put it under the GPL, however, so - the licence stated in COPYING also applies to this script. - This is no official SuSE script, and SuSE naturally does NO support - for it. - -Redhat ------- -The contents of the Redhat directory and the following documentation were -contributed by Torben Janssen. Thanks a lot! - -pdnsd - Start script for Redhat Linux. Tested for 6.1 but should run on 5.0+. - You can do 'make install' as root in the Redhat directory to - install it, or you can install manually: - - --manual installation------------------------------------------------- - For manual installation, copy pdnsd into /etc/rc.d/init.d/ - - Then go to /etc/rc.d/rc3.d and create there the following symlink: - S78pdnsd -> ../init.d/pdnsd - (do "ln -f -s ../init.d/pdnsd S78pdnsd" in that dir) - - Then go to /etc/rc.d/rc0.d and create there the following symlink: - K78pdnsd -> ../init.d/pdnsd - (do "ln -f -s ../init.d/pdnsd K78pdnsd" in that dir) - - Then go to /etc/rc.d/rc6.d and create there the following symlink: - K78pdnsd -> ../init.d/pdnsd - (do "ln -f -s ../init.d/pdnsd K78pdnsd" in that dir) - - WHY - --- - the rc[0-6].d dirs includes the scripts which starts/stops the - services on entering runlevel [0-6] - the interesting runlevels on Redhat are: - 0 - halt - 3 - multi user system - 6 - reboot - The links have an 'S' or 'K' and a number at the beginnig. All links - with 'S' starts the script on entering the runlevel and 'K' stops - them. - So, there's an 'S' link in rc3 and 'K' links in rc0 and rc6. - I choose 78 as number, because there was no script with this number on - my system. You can choose every number you want, AFAIK . - - This is no offical Redhat script, and Redhat naturally does NO support - for it. - -Debian ------- -The contents of the Debian directory were contributed by Markus Mohr. -His installation instructions are (translated): -Install the pdnsd script to /etc/init and run -update-rc.d pdnsd defaults 19 -as root. - -Slackware ---------- -A Slackware start-up script rc.pdnsd was contributed by Nikola Kotur . -His comments were: - -Slackware uses traditional BSD style init script layout instead of SystemV -style startup scripts. So I adjusted the start-up script for pdnsd, and -now it can be used with Slackware 9.1 distribution, and probably with all the -others. - -Additional info: -1) put these lines in the /etc/rc.d/rc.M: - if [ -x /etc/rc.d/rc.pdnsd ]; then - /etc/rc.d/rc.pdnsd start - fi - -2) put these lines in the /etc/rc.d/rc.6 and /etc/rc.d/rc.K: - if [ -x /etc/rc.d/rc.pdnsd ]; then - /etc/rc.d/rc.pdnsd stop - fi diff --git a/jni/pdnsd/src/rc/RedHat/Makefile.am b/jni/pdnsd/src/rc/RedHat/Makefile.am deleted file mode 100644 index cb8de885..00000000 --- a/jni/pdnsd/src/rc/RedHat/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ - -# no need to create links. 'chkconfig' will take care of this. -# In the spec case, chkconfig is called during rpm install -install-exec-local: - if [ "$(distribution)" = "RedHat" ] ; then \ - $(mkinstalldirs) "$(DESTDIR)/etc/rc.d/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/init.d/pdnsd"; \ - if [ "$(specbuild)" = "no" ] ; then \ - /sbin/chkconfig --add pdnsd; \ - fi \ - fi - diff --git a/jni/pdnsd/src/rc/RedHat/Makefile.in b/jni/pdnsd/src/rc/RedHat/Makefile.in deleted file mode 100644 index a88a037c..00000000 --- a/jni/pdnsd/src/rc/RedHat/Makefile.in +++ /dev/null @@ -1,337 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc/RedHat -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/pdnsd.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = pdnsd -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/RedHat/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/RedHat/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -pdnsd: $(top_builddir)/config.status $(srcdir)/pdnsd.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-exec-local - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-local \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am - - -# no need to create links. 'chkconfig' will take care of this. -# In the spec case, chkconfig is called during rpm install -install-exec-local: - if [ "$(distribution)" = "RedHat" ] ; then \ - $(mkinstalldirs) "$(DESTDIR)/etc/rc.d/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/etc/rc.d/init.d/pdnsd"; \ - if [ "$(specbuild)" = "no" ] ; then \ - /sbin/chkconfig --add pdnsd; \ - fi \ - fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/RedHat/pdnsd.in b/jni/pdnsd/src/rc/RedHat/pdnsd.in deleted file mode 100644 index b6d9081d..00000000 --- a/jni/pdnsd/src/rc/RedHat/pdnsd.in +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -# -# /etc/rc.d/init.d/pdnsd -# -# Script for starting the Proxy DNS Daemon -# Modified by Paul Rombouts, 2003 -# -# chkconfig: 2345 11 89 -# description: Proxy DNS Daemon -# processname: pdnsd -# config: /etc/pdnsd.conf - -PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin - -# Source function library. -. /etc/rc.d/init.d/functions - -# Source networking configuration. -. /etc/sysconfig/network - -# Check that networking is up. -if [[ $NETWORKING == [Nn][Oo] ]]; then exit 0; fi - -# Source sysconfig settings, if any. -if [ -f /etc/sysconfig/pdnsd ]; then . /etc/sysconfig/pdnsd; fi - -start() { - echo -n 'Starting pdnsd: ' - daemon @prefix@/sbin/pdnsd -d -s -p /var/run/pdnsd.pid "$EXTRAOPTIONS" - local RETVAL=$? - echo - if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/pdnsd; fi - return $RETVAL -} - -stop() { - echo -n 'Shutting down pdnsd: ' - killproc pdnsd - local RETVAL=$? - case @threadlib@ in - [Ll]inux[Tt]hreads*|lt*) - # Wait until all threads have terminated. - local -i count=20 - while [[ count -gt 0 ]] && pidof pdnsd > /dev/null - do - usleep 200000 - let --count - done - ;; - esac - echo - if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/pdnsd; fi - return $RETVAL -} - -restart() { - stop - start -} - -# -# See how we were called. -# -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status pdnsd - ;; - reload) - @prefix@/sbin/pdnsd-ctl config - ;; - restart) - restart - ;; - condrestart) - if [ -f /var/lock/subsys/pdnsd ]; then restart; fi - ;; - *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" - exit 1 -esac - -exit diff --git a/jni/pdnsd/src/rc/Slackware/Makefile.am b/jni/pdnsd/src/rc/Slackware/Makefile.am deleted file mode 100644 index e44b50f8..00000000 --- a/jni/pdnsd/src/rc/Slackware/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -# TODO: write an install rule for the Slackware start-up script. - -install-exec-local: diff --git a/jni/pdnsd/src/rc/Slackware/Makefile.in b/jni/pdnsd/src/rc/Slackware/Makefile.in deleted file mode 100644 index 14ebd33b..00000000 --- a/jni/pdnsd/src/rc/Slackware/Makefile.in +++ /dev/null @@ -1,330 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# TODO: write an install rule for the Slackware start-up script. -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc/Slackware -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/rc.pdnsd.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = rc.pdnsd -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/Slackware/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/Slackware/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -rc.pdnsd: $(top_builddir)/config.status $(srcdir)/rc.pdnsd.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-exec-local - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-local \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am - - -install-exec-local: - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/Slackware/rc.pdnsd.in b/jni/pdnsd/src/rc/Slackware/rc.pdnsd.in deleted file mode 100644 index 6e969713..00000000 --- a/jni/pdnsd/src/rc/Slackware/rc.pdnsd.in +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -# -# /etc/rc.d/rc.pdnsd -# -# Starts the Proxy DNS Daemon -# -# description: Proxy DNS Daemon -# processname: pdnsd -# config: /etc/pdnsd.conf -# distribution: Slackware -# author: Nikola Kotur -# -# Additional info: -# 1) put these lines in the /etc/rc.d/rc.M: -# if [ -x /etc/rc.d/rc.pdnsd ]; then -# /etc/rc.d/rc.pdnsd start -# fi -# -# 2) put these lines in the /etc/rc.d/rc.6 and /etc/rc.d/rc.K: -# if [ -x /etc/rc.d/rc.pdnsd ]; then -# /etc/rc.d/rc.pdnsd stop -# fi - - -test -x @prefix@/sbin/pdnsd || exit 0 -[ -f @sysconfdir@/pdnsd.conf ] || exit 1 - -RETVAL=0 - -start() { - echo -n "Starting pdnsd... " - RETVAL=$? - @prefix@/sbin/pdnsd -d - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/pdnsd - echo ' OK' -} - -stop() { - echo -n "Shutting down pdnsd... " - killall pdnsd - RETVAL=$? - [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/pdnsd - echo ' OK' -} - -restart() { - stop - start -} - -condrestart() { - [ -e /var/lock/subsys/pdnsd ] && restart - return 0 -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload|restart) - restart - ;; - condrestart) - condrestart - ;; - *) - echo $"Usage: $0 {start|stop|restart|condrestart|reload}" - RETVAL=1 -esac - -exit $RETVAL diff --git a/jni/pdnsd/src/rc/SuSE/Makefile.am b/jni/pdnsd/src/rc/SuSE/Makefile.am deleted file mode 100644 index dc5f485b..00000000 --- a/jni/pdnsd/src/rc/SuSE/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ - -install-exec-local: - if [ "$(distribution)" = "SuSE" ] ; then \ - CURDIR=`pwd`; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/sbin/init.d/pdnsd"; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc2.d"; \ - cd "$(DESTDIR)/sbin/init.d/rc2.d"; \ - ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \ - cd $$CURDIR ; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc3.d"; \ - cd "$(DESTDIR)/sbin/init.d/rc3.d"; \ - ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \ - cd $$CURDIR ; \ - grep "START_PDNSD" "$(DESTDIR)/etc/rc.config" > /dev/null ; \ - if [ $$? -eq 1 ] ; then \ - echo -e "\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" >> /etc/rc.config ; \ - fi \ - fi - - - diff --git a/jni/pdnsd/src/rc/SuSE/Makefile.in b/jni/pdnsd/src/rc/SuSE/Makefile.in deleted file mode 100644 index df1660fd..00000000 --- a/jni/pdnsd/src/rc/SuSE/Makefile.in +++ /dev/null @@ -1,345 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src/rc/SuSE -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/pdnsd.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = pdnsd -CONFIG_CLEAN_VPATH_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/rc/SuSE/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/rc/SuSE/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): -pdnsd: $(top_builddir)/config.status $(srcdir)/pdnsd.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-exec-local - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-local \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ - uninstall-am - - -install-exec-local: - if [ "$(distribution)" = "SuSE" ] ; then \ - CURDIR=`pwd`; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d"; \ - $(INSTALL_SCRIPT) $(srcdir)/pdnsd "$(DESTDIR)/sbin/init.d/pdnsd"; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc2.d"; \ - cd "$(DESTDIR)/sbin/init.d/rc2.d"; \ - ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \ - cd $$CURDIR ; \ - $(mkinstalldirs) "$(DESTDIR)/sbin/init.d/rc3.d"; \ - cd "$(DESTDIR)/sbin/init.d/rc3.d"; \ - ln -fs ../pdnsd K34pdnsd; ln -s ../pdnsd S11pdnsd; \ - cd $$CURDIR ; \ - grep "START_PDNSD" "$(DESTDIR)/etc/rc.config" > /dev/null ; \ - if [ $$? -eq 1 ] ; then \ - echo -e "\n\n#\n# Set to yes to start pdnsd at boot time\n#\nSTART_PDNSD=yes" >> /etc/rc.config ; \ - fi \ - fi - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/rc/SuSE/pdnsd.in b/jni/pdnsd/src/rc/SuSE/pdnsd.in deleted file mode 100644 index 9711ecad..00000000 --- a/jni/pdnsd/src/rc/SuSE/pdnsd.in +++ /dev/null @@ -1,68 +0,0 @@ -#! /bin/sh -# Copyright (c) 1995-1998 SuSE GmbH Nuernberg, Germany. -# -# Modified 2000 from SuSE Linux 6.3 /sbin/init.d/skeleton by Thomas Moestl -# -# /sbin/init.d/pdnsd -# -# and symbolic its link -# -# /sbin/rc?/pdnsd -# - -. /etc/rc.config - -# Determine the base and follow a runlevel link name. -base=${0##*/} -link=${base#*[SK][0-9][0-9]} - -# Force execution if not called by a runlevel directory. -test $link = $base && START_PDNSD=yes -test "$START_PDNSD" = yes || exit 0 - -# The echo return value for success (defined in /etc/rc.config). -return=$rc_done -case "$1" in - start) - echo -n "Starting pdnsd" - ## Start daemon with startproc(8). If this fails - ## the echo return value is set appropriate. - - startproc @prefix@/sbin/pdnsd -d || return=$rc_failed - - echo -e "$return" - ;; - stop) - echo -n "Shutting down pdnsd" - ## Stop daemon with killproc(8) and if this fails - ## set echo the echo return value. - - killproc -TERM @prefix@/sbin/pdnsd || return=$rc_failed - - echo -e "$return" - ;; - restart) - ## If first returns OK call the second, if first or - ## second command fails, set echo return value. - $0 stop && $0 start || return=$rc_failed - ;; - reload) - $0 stop && $0 start || return=$rc_failed - ;; - status) - echo -n "Checking for pdnsd: " - ## Check status with checkproc(8), if process is running - ## checkproc will return with exit status 0. - - checkproc @prefix@/sbin/pdnsd && echo OK || echo No process - ;; - *) - echo "Usage: $0 {start|stop|status|restart|reload}" - exit 1 - ;; -esac - -# Inform the caller not only verbosely and set an exit status. -test "$return" = "$rc_done" || exit 1 -exit 0 - diff --git a/jni/pdnsd/src/rr_types.c b/jni/pdnsd/src/rr_types.c deleted file mode 100644 index 275a90a4..00000000 --- a/jni/pdnsd/src/rr_types.c +++ /dev/null @@ -1,172 +0,0 @@ -/* rr_types.c - Tables with information for handling - all rr types known to pdnsd, plus - some helper functions useful for turning - binary RR data into text or vice versa. - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2003, 2004, 2007, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#define DEFINE_RR_TYPE_ARRAYS 1 -#include "helpers.h" -#include "dns.h" -#include "rr_types.h" - - -/* - * OK, this is inefficient. But it is used _really_ seldom (only in some cases while parsing the - * config file or by pdnsd-ctl), so it is much more effective to sort by id. - */ -int rr_tp_byname(char *name) -{ - int i; - - for (i=0;i> 4); - exponent = (prec & 0x0f); - - if(mantissa>=10 || exponent>=10) - return NULL; - if (exponent>= 2) - sprintf(retbuf, "%u", mantissa * poweroften[exponent-2]); - else - sprintf(retbuf, "0.%.2u", mantissa * poweroften[exponent]); - return (retbuf); -} - -/* takes an on-the-wire LOC RR and formats it in a human readable format. - This is an adapted version of the loc_ntoa function that - can be found in the BIND 9 source. - */ -const char *loc2str(const void *binary, char *ascii, size_t asclen) -{ - const unsigned char *cp = binary; - - int latdeg, latmin, latsec, latsecfrac; - int longdeg, longmin, longsec, longsecfrac; - char northsouth, eastwest; - const char *altsign; - int altmeters, altfrac; - - const uint32_t referencealt = 100000 * 100; - - int32_t latval, longval, altval; - uint32_t templ; - uint8_t sizeval, hpval, vpval, versionval; - - char sizestr[NPRECSIZE],hpstr[NPRECSIZE],vpstr[NPRECSIZE]; - - versionval = *cp++; - - if (versionval) { - /* unknown LOC RR version */ - return NULL; - } - - sizeval = *cp++; - - hpval = *cp++; - vpval = *cp++; - - GETINT32(templ, cp); - latval = (templ - ((unsigned)1<<31)); - - GETINT32(templ, cp); - longval = (templ - ((unsigned)1<<31)); - - GETINT32(templ, cp); - if (templ < referencealt) { /* below WGS 84 spheroid */ - altval = referencealt - templ; - altsign = "-"; - } else { - altval = templ - referencealt; - altsign = ""; - } - - if (latval < 0) { - northsouth = 'S'; - latval = -latval; - } else - northsouth = 'N'; - - latsecfrac = latval % 1000; - latval /= 1000; - latsec = latval % 60; - latval /= 60; - latmin = latval % 60; - latval /= 60; - latdeg = latval; - - if (longval < 0) { - eastwest = 'W'; - longval = -longval; - } else - eastwest = 'E'; - - longsecfrac = longval % 1000; - longval /= 1000; - longsec = longval % 60; - longval /= 60; - longmin = longval % 60; - longval /= 60; - longdeg = longval; - - altfrac = altval % 100; - altmeters = (altval / 100); - - if(!precsize_ntoa(sizeval,sizestr) || !precsize_ntoa(hpval,hpstr) || !precsize_ntoa(vpval,vpstr)) - return NULL; - { - int n=snprintf(ascii,asclen, - "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", - latdeg, latmin, latsec, latsecfrac, northsouth, - longdeg, longmin, longsec, longsecfrac, eastwest, - altsign, altmeters, altfrac, - sizestr, hpstr, vpstr); - if(n<0 || n>=asclen) - return NULL; - } - - return (ascii); -} - -#endif diff --git a/jni/pdnsd/src/rr_types.h b/jni/pdnsd/src/rr_types.h deleted file mode 100644 index 6025fae5..00000000 --- a/jni/pdnsd/src/rr_types.h +++ /dev/null @@ -1,536 +0,0 @@ -/* This file was generated by running 'make_rr_types_h.pl rr_types.in'. - Modifications to this file may be lost the next time it is automatically - regenerated. -*/ - -/* rr_types.h - A header file with names & descriptions of - all rr types known to pdnsd - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2007, 2010, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#ifndef _RR_TYPES_H_ -#define _RR_TYPES_H_ - -#include - -#define T_MIN 1 -#define T_A 1 -#define T_NS 2 -#define T_MD 3 -#define T_MF 4 -#define T_CNAME 5 -#define T_SOA 6 -#define T_MB 7 -#define T_MG 8 -#define T_MR 9 -#define T_NULL 10 -#define T_WKS 11 -#define T_PTR 12 -#define T_HINFO 13 -#define T_MINFO 14 -#define T_MX 15 -#define T_TXT 16 -#define T_RP 17 -#define T_AFSDB 18 -#define T_X25 19 -#define T_ISDN 20 -#define T_RT 21 -#define T_NSAP 22 -#define T_NSAP_PTR 23 -#define T_SIG 24 -#define T_KEY 25 -#define T_PX 26 -#define T_GPOS 27 -#define T_AAAA 28 -#define T_LOC 29 -#define T_NXT 30 -#define T_EID 31 -#define T_NIMLOC 32 -#define T_SRV 33 -#define T_ATMA 34 -#define T_NAPTR 35 -#define T_KX 36 -#define T_CERT 37 -#define T_A6 38 -#define T_DNAME 39 -#define T_SINK 40 -#define T_OPT 41 -#define T_APL 42 -#define T_DS 43 -#define T_SSHFP 44 -#define T_IPSECKEY 45 -#define T_RRSIG 46 -#define T_NSEC 47 -#define T_DNSKEY 48 -#define T_DHCID 49 -#define T_NSEC3 50 -#define T_NSEC3PARAM 51 -#define T_HIP 55 -#define T_NINFO 56 -#define T_RKEY 57 -#define T_TALINK 58 -#define T_SPF 99 -#define T_UINFO 100 -#define T_UID 101 -#define T_GID 102 -#define T_UNSPEC 103 -#define T_MAX 51 - -/* T_MAX - T_MIN + 1 */ -#define T_NUM 51 - -/* Number of most frequently used rr types. */ -#define NRRMU 8 - -/* Number of remaining rr types. */ -#define NRREXT 39 - -/* NRRMU + NRREXT */ -#define NRRTOT 47 - -/* Lookup table for converting rr type values to internally used indices. */ -extern const unsigned short int rrlkuptab[T_NUM]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const unsigned short int rrlkuptab[T_NUM] = { - 0 /* A */, - 1 /* NS */, - 8 /* MD */, - 9 /* MF */, - 2 /* CNAME */, - 3 /* SOA */, - 10 /* MB */, - 11 /* MG */, - 12 /* MR */, - 13 /* NULL */, - 14 /* WKS */, - 4 /* PTR */, - 15 /* HINFO */, - 16 /* MINFO */, - 5 /* MX */, - 6 /* TXT */, - 17 /* RP */, - 18 /* AFSDB */, - 19 /* X25 */, - 20 /* ISDN */, - 21 /* RT */, - 22 /* NSAP */, - 23 /* NSAP_PTR */, - 24 /* SIG */, - 25 /* KEY */, - 26 /* PX */, - 27 /* GPOS */, - 7 /* AAAA */, - 28 /* LOC */, - 29 /* NXT */, - 30 /* EID */, - 31 /* NIMLOC */, - 32 /* SRV */, - 33 /* ATMA */, - 34 /* NAPTR */, - 35 /* KX */, - 36 /* CERT */, - 47 /* A6 */, - 48 /* DNAME */, - 49 /* SINK */, - 50 /* OPT */, - 37 /* APL */, - 38 /* DS */, - 39 /* SSHFP */, - 40 /* IPSECKEY */, - 41 /* RRSIG */, - 42 /* NSEC */, - 43 /* DNSKEY */, - 44 /* DHCID */, - 45 /* NSEC3 */, - 46 /* NSEC3PARAM */ -}; -#endif - -/* List of most frequently used RR types in ascending order. */ -extern const unsigned short int rrmuiterlist[NRRMU]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const unsigned short int rrmuiterlist[NRRMU] = { - T_A, - T_NS, - T_CNAME, - T_SOA, - T_PTR, - T_MX, - T_TXT, - T_AAAA -}; -#endif - -/* List of the cache-able RR types in ascending order. */ -extern const unsigned short int rrcachiterlist[NRRTOT]; -#if DEFINE_RR_TYPE_ARRAYS -const unsigned short int rrcachiterlist[NRRTOT] = { - T_A, - T_NS, - T_MD, - T_MF, - T_CNAME, - T_SOA, - T_MB, - T_MG, - T_MR, - T_NULL, - T_WKS, - T_PTR, - T_HINFO, - T_MINFO, - T_MX, - T_TXT, - T_RP, - T_AFSDB, - T_X25, - T_ISDN, - T_RT, - T_NSAP, - T_NSAP_PTR, - T_SIG, - T_KEY, - T_PX, - T_GPOS, - T_AAAA, - T_LOC, - T_NXT, - T_EID, - T_NIMLOC, - T_SRV, - T_ATMA, - T_NAPTR, - T_KX, - T_CERT, - T_APL, - T_DS, - T_SSHFP, - T_IPSECKEY, - T_RRSIG, - T_NSEC, - T_DNSKEY, - T_DHCID, - T_NSEC3, - T_NSEC3PARAM -}; -#endif - -/* Optimized getrrset macros for fixed rr types. */ -#define getrrset_A(cent) GET_RRSMU(cent,0) -#define getrrset_NS(cent) GET_RRSMU(cent,1) -#define getrrset_MD(cent) GET_RRSEXT(cent,0) -#define getrrset_MF(cent) GET_RRSEXT(cent,1) -#define getrrset_CNAME(cent) GET_RRSMU(cent,2) -#define getrrset_SOA(cent) GET_RRSMU(cent,3) -#define getrrset_MB(cent) GET_RRSEXT(cent,2) -#define getrrset_MG(cent) GET_RRSEXT(cent,3) -#define getrrset_MR(cent) GET_RRSEXT(cent,4) -#define getrrset_NULL(cent) GET_RRSEXT(cent,5) -#define getrrset_WKS(cent) GET_RRSEXT(cent,6) -#define getrrset_PTR(cent) GET_RRSMU(cent,4) -#define getrrset_HINFO(cent) GET_RRSEXT(cent,7) -#define getrrset_MINFO(cent) GET_RRSEXT(cent,8) -#define getrrset_MX(cent) GET_RRSMU(cent,5) -#define getrrset_TXT(cent) GET_RRSMU(cent,6) -#define getrrset_RP(cent) GET_RRSEXT(cent,9) -#define getrrset_AFSDB(cent) GET_RRSEXT(cent,10) -#define getrrset_X25(cent) GET_RRSEXT(cent,11) -#define getrrset_ISDN(cent) GET_RRSEXT(cent,12) -#define getrrset_RT(cent) GET_RRSEXT(cent,13) -#define getrrset_NSAP(cent) GET_RRSEXT(cent,14) -#define getrrset_NSAP_PTR(cent) GET_RRSEXT(cent,15) -#define getrrset_SIG(cent) GET_RRSEXT(cent,16) -#define getrrset_KEY(cent) GET_RRSEXT(cent,17) -#define getrrset_PX(cent) GET_RRSEXT(cent,18) -#define getrrset_GPOS(cent) GET_RRSEXT(cent,19) -#define getrrset_AAAA(cent) GET_RRSMU(cent,7) -#define getrrset_LOC(cent) GET_RRSEXT(cent,20) -#define getrrset_NXT(cent) GET_RRSEXT(cent,21) -#define getrrset_EID(cent) GET_RRSEXT(cent,22) -#define getrrset_NIMLOC(cent) GET_RRSEXT(cent,23) -#define getrrset_SRV(cent) GET_RRSEXT(cent,24) -#define getrrset_ATMA(cent) GET_RRSEXT(cent,25) -#define getrrset_NAPTR(cent) GET_RRSEXT(cent,26) -#define getrrset_KX(cent) GET_RRSEXT(cent,27) -#define getrrset_CERT(cent) GET_RRSEXT(cent,28) -#define getrrset_APL(cent) GET_RRSEXT(cent,29) -#define getrrset_DS(cent) GET_RRSEXT(cent,30) -#define getrrset_SSHFP(cent) GET_RRSEXT(cent,31) -#define getrrset_IPSECKEY(cent) GET_RRSEXT(cent,32) -#define getrrset_RRSIG(cent) GET_RRSEXT(cent,33) -#define getrrset_NSEC(cent) GET_RRSEXT(cent,34) -#define getrrset_DNSKEY(cent) GET_RRSEXT(cent,35) -#define getrrset_DHCID(cent) GET_RRSEXT(cent,36) -#define getrrset_NSEC3(cent) GET_RRSEXT(cent,37) -#define getrrset_NSEC3PARAM(cent) GET_RRSEXT(cent,38) - -/* have_rr macros for fixed rr types. */ -#define have_rr_A(cent) HAVE_RRMU(cent,0) -#define have_rr_NS(cent) HAVE_RRMU(cent,1) -#define have_rr_MD(cent) HAVE_RREXT(cent,0) -#define have_rr_MF(cent) HAVE_RREXT(cent,1) -#define have_rr_CNAME(cent) HAVE_RRMU(cent,2) -#define have_rr_SOA(cent) HAVE_RRMU(cent,3) -#define have_rr_MB(cent) HAVE_RREXT(cent,2) -#define have_rr_MG(cent) HAVE_RREXT(cent,3) -#define have_rr_MR(cent) HAVE_RREXT(cent,4) -#define have_rr_NULL(cent) HAVE_RREXT(cent,5) -#define have_rr_WKS(cent) HAVE_RREXT(cent,6) -#define have_rr_PTR(cent) HAVE_RRMU(cent,4) -#define have_rr_HINFO(cent) HAVE_RREXT(cent,7) -#define have_rr_MINFO(cent) HAVE_RREXT(cent,8) -#define have_rr_MX(cent) HAVE_RRMU(cent,5) -#define have_rr_TXT(cent) HAVE_RRMU(cent,6) -#define have_rr_RP(cent) HAVE_RREXT(cent,9) -#define have_rr_AFSDB(cent) HAVE_RREXT(cent,10) -#define have_rr_X25(cent) HAVE_RREXT(cent,11) -#define have_rr_ISDN(cent) HAVE_RREXT(cent,12) -#define have_rr_RT(cent) HAVE_RREXT(cent,13) -#define have_rr_NSAP(cent) HAVE_RREXT(cent,14) -#define have_rr_NSAP_PTR(cent) HAVE_RREXT(cent,15) -#define have_rr_SIG(cent) HAVE_RREXT(cent,16) -#define have_rr_KEY(cent) HAVE_RREXT(cent,17) -#define have_rr_PX(cent) HAVE_RREXT(cent,18) -#define have_rr_GPOS(cent) HAVE_RREXT(cent,19) -#define have_rr_AAAA(cent) HAVE_RRMU(cent,7) -#define have_rr_LOC(cent) HAVE_RREXT(cent,20) -#define have_rr_NXT(cent) HAVE_RREXT(cent,21) -#define have_rr_EID(cent) HAVE_RREXT(cent,22) -#define have_rr_NIMLOC(cent) HAVE_RREXT(cent,23) -#define have_rr_SRV(cent) HAVE_RREXT(cent,24) -#define have_rr_ATMA(cent) HAVE_RREXT(cent,25) -#define have_rr_NAPTR(cent) HAVE_RREXT(cent,26) -#define have_rr_KX(cent) HAVE_RREXT(cent,27) -#define have_rr_CERT(cent) HAVE_RREXT(cent,28) -#define have_rr_A6(cent) 0 -#define have_rr_DNAME(cent) 0 -#define have_rr_SINK(cent) 0 -#define have_rr_OPT(cent) 0 -#define have_rr_APL(cent) HAVE_RREXT(cent,29) -#define have_rr_DS(cent) HAVE_RREXT(cent,30) -#define have_rr_SSHFP(cent) HAVE_RREXT(cent,31) -#define have_rr_IPSECKEY(cent) HAVE_RREXT(cent,32) -#define have_rr_RRSIG(cent) HAVE_RREXT(cent,33) -#define have_rr_NSEC(cent) HAVE_RREXT(cent,34) -#define have_rr_DNSKEY(cent) HAVE_RREXT(cent,35) -#define have_rr_DHCID(cent) HAVE_RREXT(cent,36) -#define have_rr_NSEC3(cent) HAVE_RREXT(cent,37) -#define have_rr_NSEC3PARAM(cent) HAVE_RREXT(cent,38) - -/* These macros specify which RR types are cached by pdnsd. */ -#define IS_CACHED_A 1 -#define IS_CACHED_NS 1 -#define IS_CACHED_MD 1 -#define IS_CACHED_MF 1 -#define IS_CACHED_CNAME 1 -#define IS_CACHED_SOA 1 -#define IS_CACHED_MB 1 -#define IS_CACHED_MG 1 -#define IS_CACHED_MR 1 -#define IS_CACHED_NULL 1 -#define IS_CACHED_WKS 1 -#define IS_CACHED_PTR 1 -#define IS_CACHED_HINFO 1 -#define IS_CACHED_MINFO 1 -#define IS_CACHED_MX 1 -#define IS_CACHED_TXT 1 -#define IS_CACHED_RP 1 -#define IS_CACHED_AFSDB 1 -#define IS_CACHED_X25 1 -#define IS_CACHED_ISDN 1 -#define IS_CACHED_RT 1 -#define IS_CACHED_NSAP 1 -#define IS_CACHED_NSAP_PTR 1 -#define IS_CACHED_SIG 1 -#define IS_CACHED_KEY 1 -#define IS_CACHED_PX 1 -#define IS_CACHED_GPOS 1 -#define IS_CACHED_AAAA 1 -#define IS_CACHED_LOC 1 -#define IS_CACHED_NXT 1 -#define IS_CACHED_EID 1 -#define IS_CACHED_NIMLOC 1 -#define IS_CACHED_SRV 1 -#define IS_CACHED_ATMA 1 -#define IS_CACHED_NAPTR 1 -#define IS_CACHED_KX 1 -#define IS_CACHED_CERT 1 -#define IS_CACHED_APL 1 -#define IS_CACHED_DS 1 -#define IS_CACHED_SSHFP 1 -#define IS_CACHED_IPSECKEY 1 -#define IS_CACHED_RRSIG 1 -#define IS_CACHED_NSEC 1 -#define IS_CACHED_DNSKEY 1 -#define IS_CACHED_DHCID 1 -#define IS_CACHED_NSEC3 1 -#define IS_CACHED_NSEC3PARAM 1 - -/* Array indices for most frequently used rr types. */ -#define RRMUINDEX_A 0 -#define RRMUINDEX_NS 1 -#define RRMUINDEX_CNAME 2 -#define RRMUINDEX_SOA 3 -#define RRMUINDEX_PTR 4 -#define RRMUINDEX_MX 5 -#define RRMUINDEX_TXT 6 -#define RRMUINDEX_AAAA 7 - -/* Table of rr names. */ -extern const char *const rrnames[T_NUM]; -#if DEFINE_RR_TYPE_ARRAYS -const char *const rrnames[T_NUM] = { - "A", - "NS", - "MD", - "MF", - "CNAME", - "SOA", - "MB", - "MG", - "MR", - "NULL", - "WKS", - "PTR", - "HINFO", - "MINFO", - "MX", - "TXT", - "RP", - "AFSDB", - "X25", - "ISDN", - "RT", - "NSAP", - "NSAP_PTR", - "SIG", - "KEY", - "PX", - "GPOS", - "AAAA", - "LOC", - "NXT", - "EID", - "NIMLOC", - "SRV", - "ATMA", - "NAPTR", - "KX", - "CERT", - "A6", - "DNAME", - "SINK", - "OPT", - "APL", - "DS", - "SSHFP", - "IPSECKEY", - "RRSIG", - "NSEC", - "DNSKEY", - "DHCID", - "NSEC3", - "NSEC3PARAM" -}; -#endif - -/* Structure for rr information */ -struct rr_infos { - unsigned short class; /* class (values see below) */ - unsigned short excludes; /* relations to other classes. - Mutual exclusion is marked by or'ing the - respective RRCL value in this field. - Exclusions should be symmetric. */ -}; - -/* Class values */ -#define RRCL_ALIAS 1 /* for CNAMES, conflicts with RRCL_RECORD */ -#define RRCL_RECORD 2 /* normal direct record */ -#define RRCL_IDEM 4 /* types that conflict with no others (MX, CNAME, ...) */ -#define RRCL_PTR 8 /* PTR */ - -/* Standard excludes for the classes */ -#define RRX_ALIAS (RRCL_RECORD|RRCL_PTR) -#define RRX_RECORD (RRCL_ALIAS|RRCL_PTR) -#define RRX_IDEM 0 -#define RRX_PTR (RRCL_ALIAS|RRCL_RECORD) - -/* There could be a separate table detailing the relationship of types, but this - * is slightly more flexible, as it allows a finer granularity of exclusion. Also, - * Membership in multiple classes could be added. - * Index by internally used RR-set indices, not RR type values! - */ -extern const struct rr_infos rr_info[NRRTOT]; -#if DEFINE_RR_TYPE_ARRAYS && !defined(CLIENT_ONLY) -const struct rr_infos rr_info[NRRTOT] = { - {RRCL_RECORD, RRX_RECORD} /* A */, - {RRCL_IDEM, RRX_IDEM} /* NS */, - {RRCL_ALIAS, RRX_ALIAS} /* CNAME */, - {RRCL_IDEM, RRX_IDEM} /* SOA */, - {RRCL_PTR, RRX_PTR} /* PTR */, - {RRCL_IDEM, RRX_IDEM} /* MX */, - {RRCL_IDEM, RRX_IDEM} /* TXT */, - {RRCL_RECORD, RRX_RECORD} /* AAAA */, - {RRCL_IDEM, RRX_IDEM} /* MD */, - {RRCL_IDEM, RRX_IDEM} /* MF */, - {RRCL_IDEM, RRX_IDEM} /* MB */, - {RRCL_IDEM, RRX_IDEM} /* MG */, - {RRCL_IDEM, RRX_IDEM} /* MR */, - {RRCL_IDEM, RRX_IDEM} /* NULL */, - {RRCL_RECORD, RRX_RECORD} /* WKS */, - {RRCL_RECORD, RRX_RECORD} /* HINFO */, - {RRCL_IDEM, RRX_IDEM} /* MINFO */, - {RRCL_RECORD, RRX_RECORD} /* RP */, - {RRCL_RECORD, RRX_RECORD} /* AFSDB */, - {RRCL_RECORD, RRX_RECORD} /* X25 */, - {RRCL_RECORD, RRX_RECORD} /* ISDN */, - {RRCL_RECORD, RRX_RECORD} /* RT */, - {RRCL_RECORD, RRX_RECORD} /* NSAP */, - {RRCL_PTR, RRX_PTR} /* NSAP_PTR */, - {RRCL_IDEM, RRX_IDEM} /* SIG */, - {RRCL_IDEM, RRX_IDEM} /* KEY */, - {RRCL_IDEM, RRX_IDEM} /* PX */, - {RRCL_RECORD, RRX_RECORD} /* GPOS */, - {RRCL_RECORD, RRX_RECORD} /* LOC */, - {RRCL_IDEM, RRX_IDEM} /* NXT */, - {RRCL_RECORD, RRX_RECORD} /* EID */, - {RRCL_RECORD, RRX_RECORD} /* NIMLOC */, - {RRCL_RECORD, RRX_RECORD} /* SRV */, - {RRCL_RECORD, RRX_RECORD} /* ATMA */, - {RRCL_RECORD, RRX_RECORD} /* NAPTR */, - {RRCL_RECORD, RRX_RECORD} /* KX */, - {RRCL_RECORD, RRX_RECORD} /* CERT */, - {RRCL_IDEM, RRX_IDEM} /* APL */, - {RRCL_IDEM, RRX_IDEM} /* DS */, - {RRCL_IDEM, RRX_IDEM} /* SSHFP */, - {RRCL_IDEM, RRX_IDEM} /* IPSECKEY */, - {RRCL_IDEM, RRX_IDEM} /* RRSIG */, - {RRCL_IDEM, RRX_IDEM} /* NSEC */, - {RRCL_IDEM, RRX_IDEM} /* DNSKEY */, - {RRCL_IDEM, RRX_IDEM} /* DHCID */, - {RRCL_IDEM, RRX_IDEM} /* NSEC3 */, - {RRCL_IDEM, RRX_IDEM} /* NSEC3PARAM */ -}; -#endif - -int rr_tp_byname(char *name); -const char *loc2str(const void *binary, char *ascii, size_t asclen); - -#endif diff --git a/jni/pdnsd/src/rr_types.in b/jni/pdnsd/src/rr_types.in deleted file mode 100644 index 5ebd2f37..00000000 --- a/jni/pdnsd/src/rr_types.in +++ /dev/null @@ -1,99 +0,0 @@ -# This file is part of the pdnsd package. - -# This file contains information about the RR types implemented in pdnsd -# and is used for generating rr_types.h. -# It was derived from the following source: http://www.bind9.net/dns-parameters -# -# After making modifications to this file the file rr_types.h should be regenerated! -# -# Info about the format of this file: -# Blank lines and lines starting with '#' are ignored, all other lines -# are assumed to define an RR type. Lines starting with '+' define most -# frequently used types. An RR type preceded by a '-' will not be cached -# by pdnsd. The next two fields are interpreted as the name and the value -# of the RR type, resp. A subsequent word in parenthesis will be interpreted a -# class name (used for conflict resolution). Remaining fields are ignored. -# -# Adding or removing an initial '+' can be done safely without requiring -# changes to the source code (other than regenerating rr_types.h). -# -# If you are sure that you will never use certain RR types you can disable -# caching for them and make pdnsd slightly more efficient by placing a -# '-' sign in front of the lines that define those types. -# For a list of obsolete RR types see e.g. -# http://en.wikipedia.org/wiki/List_of_DNS_record_types . -# Note that some RR types are essential for pdnsd; these are currently: -# A, NS, CNAME, SOA, PTR, MX and (if you want IPv6 support) AAAA. -# Disabling caching for these types will cause pdnsd to fail to compile -# or cause a fatal run-time error. -# -# Removing a '-' sign to enable caching can be risky if the support in -# the pdnsd code is missing or inadequate, so only do this if you really know -# what you are doing. SPF records are supported, however, so it should be safe -# to enable caching for them. - -# RR TYPE Value (class) and meaning Reference -# ----------- --------------------------------------------- --------- -+ A 1 (RECORD) a host address [RFC 1035] -+ NS 2 an authoritative name server [RFC 1035] - MD 3 a mail destination (Obsolete - use MX) [RFC 1035] - MF 4 a mail forwarder (Obsolete - use MX) [RFC 1035] -+ CNAME 5 (ALIAS) the canonical name for an alias [RFC 1035] -+ SOA 6 marks the start of a zone of authority [RFC 1035] - MB 7 a mailbox domain name (EXPERIMENTAL) [RFC 1035] - MG 8 a mail group member (EXPERIMENTAL) [RFC 1035] - MR 9 a mail rename domain name (EXPERIMENTAL) [RFC 1035] - NULL 10 a null RR (EXPERIMENTAL) [RFC 1035] - WKS 11 (RECORD) a well known service description [RFC 1035] -+ PTR 12 (PTR) a domain name pointer [RFC 1035] - HINFO 13 (RECORD) host information [RFC 1035] - MINFO 14 mailbox or mail list information [RFC 1035] -+ MX 15 mail exchange [RFC 1035] -+ TXT 16 text strings [RFC 1035] - RP 17 (RECORD) for Responsible Person [RFC 1183] - AFSDB 18 (RECORD) for AFS Data Base location [RFC 1183][RFC 5864] - X25 19 (RECORD) for X.25 PSDN address [RFC 1183] - ISDN 20 (RECORD) for ISDN address [RFC 1183] - RT 21 (RECORD) for Route Through [RFC 1183] - NSAP 22 (RECORD) for NSAP address, NSAP style A record [RFC 1706] - NSAP-PTR 23 (PTR) for domain name pointer, NSAP style [RFC 1348] - SIG 24 for security signature [RFC 4034][RFC 3755][RFC 2535] - KEY 25 for security key [RFC 4034][RFC 3755][RFC 2535] - PX 26 X.400 mail mapping information [RFC 2163] - GPOS 27 (RECORD) Geographical Position [RFC 1712] -+ AAAA 28 (RECORD) IP6 Address [RFC 3596] - LOC 29 (RECORD) Location Information [RFC 1876] - NXT 30 Next Domain - OBSOLETE [RFC 3755][RFC 2535] - EID 31 (RECORD) Endpoint Identifier [Patton] - NIMLOC 32 (RECORD) Nimrod Locator [Patton] - SRV 33 (RECORD) Server Selection [RFC 2782] - ATMA 34 (RECORD) ATM Address [ATMDOC] - NAPTR 35 (RECORD) Naming Authority Pointer [RFC 2915][RFC 2168][RFC 3403] - KX 36 (RECORD) Key Exchanger [RFC 2230] - CERT 37 (RECORD) CERT [RFC 4398] -- A6 38 A6 (Experimental) [RFC 3226][RFC 2874] -- DNAME 39 (ALIAS) DNAME [RFC 2672] -- SINK 40 SINK [Eastlake] -- OPT 41 OPT [RFC 2671] - APL 42 APL [RFC 3123] - DS 43 Delegation Signer [RFC 4034][RFC 3658] - SSHFP 44 SSH Key Fingerprint [RFC 4255] - IPSECKEY 45 IPSECKEY [RFC 4025] - RRSIG 46 RRSIG [RFC 4034][RFC 3755] - NSEC 47 NSEC [RFC 4034][RFC 3755] - DNSKEY 48 DNSKEY [RFC 4034][RFC 3755] - DHCID 49 DHCID [RFC 4701] - NSEC3 50 NSEC3 [RFC 5155] - NSEC3PARAM 51 NSEC3PARAM [RFC 5155] -# Unassigned 52-54 -- HIP 55 Host Identity Protocol [RFC 5205] -- NINFO 56 NINFO [Reid] -- RKEY 57 RKEY [Reid] -- TALINK 58 Trust Anchor LINK [Wijngaards] -# Unassigned 59-98 -- SPF 99 Sender Policy Framework [RFC 4408] -- UINFO 100 [IANA-Reserved] -- UID 101 [IANA-Reserved] -- GID 102 [IANA-Reserved] -- UNSPEC 103 [IANA-Reserved] -# Unassigned 104-248 diff --git a/jni/pdnsd/src/servers.c b/jni/pdnsd/src/servers.c deleted file mode 100644 index 8549865a..00000000 --- a/jni/pdnsd/src/servers.c +++ /dev/null @@ -1,856 +0,0 @@ -/* servers.c - manage a set of dns servers - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2005, 2007, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "thread.h" -#include "error.h" -#include "servers.h" -#include "conff.h" -#include "consts.h" -#include "icmp.h" -#include "netdev.h" -#include "helpers.h" -#include "dns_query.h" - - -/* - * We may be a little over-strict with locks here. Never mind... - * Also, there may be some code-redundancy regarding uptests. It saves some locks, though. - */ - -static pthread_mutex_t servers_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t server_data_cond = PTHREAD_COND_INITIALIZER; -static pthread_cond_t server_test_cond = PTHREAD_COND_INITIALIZER; -static int server_data_users = 0, server_status_ping = 0; -/* Used to notify the server status thread that it should discontinue uptests. */ -volatile int signal_interrupt=0; -#define statusintsig SIGHUP - -static short retest_flag=0; - -static char schm[32]; - -static void sigint_handler(int signum); - -/* - * Execute an individual uptest. Call with locks applied - */ -static int uptest (servparm_t *serv, int j) -{ - int ret=0, count_running_ping=0; - pdnsd_a *s_addr= PDNSD_A2_TO_A(&DA_INDEX(serv->atup_a,j).a); - - DEBUG_PDNSDA_MSG("performing uptest (type=%s) for %s\n",const_name(serv->uptest),PDNSDA2STR(s_addr)); - - /* Unlock the mutex because some of the tests may take a while. */ - ++server_data_users; - if((serv->uptest==C_PING || serv->uptest==C_QUERY) && pthread_equal(pthread_self(),servstat_thrid)) { - /* Inform other threads that a ping is in progress. */ - count_running_ping=1; - ++server_status_ping; - } - pthread_mutex_unlock(&servers_lock); - - switch (serv->uptest) { - case C_NONE: - /* Don't change */ - ret=DA_INDEX(serv->atup_a,j).is_up; - break; - case C_PING: - ret=ping(is_inaddr_any(&serv->ping_a) ? s_addr : &serv->ping_a, serv->ping_timeout,PINGREPEAT)!=-1; - break; - case C_IF: - case C_DEV: - case C_DIALD: - ret=if_up(serv->interface); -#if (TARGET==TARGET_LINUX) - if (ret!=0) { - if(serv->uptest==C_DEV) - ret=dev_up(serv->interface,serv->device); - else if (serv->uptest==C_DIALD) - ret=dev_up("diald",serv->device); - } -#endif - break; - case C_EXEC: { - pid_t pid; - - if ((pid=fork())==-1) { - DEBUG_MSG("Could not fork to perform exec uptest: %s\n",strerror(errno)); - break; - } else if (pid==0) { /* child */ - /* - * If we ran as setuid or setgid, do not inherit this to the - * command. This is just a last guard. Running pdnsd as setuid() - * or setgid() is a no-no. - */ - if (setgid(getgid()) == -1 || setuid(getuid()) == -1) { - log_error("Could not reset uid or gid: %s",strerror(errno)); - _exit(1); - } - /* Try to setuid() to a different user as specified. Good when you - don't want the test command to run as root */ - if (!run_as(serv->uptest_usr)) { - _exit(1); - } - { - struct rlimit rl; int i; - /* - * Mark all open fd's FD_CLOEXEC for paranoia reasons. - */ - if (getrlimit(RLIMIT_NOFILE, &rl) == -1) { - log_error("getrlimit() failed: %s",strerror(errno)); - _exit(1); - } - for (i = 0; i < rl.rlim_max; i++) { - if (fcntl(i, F_SETFD, FD_CLOEXEC) == -1 && errno != EBADF) { - log_error("fcntl(F_SETFD) failed: %s",strerror(errno)); - _exit(1); - } - } - } - execl("/bin/sh", "uptest_sh","-c",serv->uptest_cmd,(char *)NULL); - _exit(1); /* failed execl */ - } else { /* parent */ - int status; - pid_t wpid = waitpid(pid,&status,0); - if (wpid==pid) { - if(WIFEXITED(status)) { - int exitstatus=WEXITSTATUS(status); - DEBUG_MSG("uptest command \"%s\" exited with status %d\n", - serv->uptest_cmd, exitstatus); - ret=(exitstatus==0); - } -#if DEBUG>0 - else if(WIFSIGNALED(status)) { - DEBUG_MSG("uptest command \"%s\" was terminated by signal %d\n", - serv->uptest_cmd, WTERMSIG(status)); - } - else { - DEBUG_MSG("status of uptest command \"%s\" is of unkown type (0x%x)\n", - serv->uptest_cmd, status); - } -#endif - } -#if DEBUG>0 - else if (wpid==-1) { - DEBUG_MSG("Error while waiting for uptest command \"%s\" to terminate: " - "waitpid for pid %d failed: %s\n", - serv->uptest_cmd, pid, strerror(errno)); - } - else { - DEBUG_MSG("Error while waiting for uptest command \"%s\" to terminate: " - "waitpid returned %d, expected pid %d\n", - serv->uptest_cmd, wpid, pid); - } -#endif - } - } - break; - case C_QUERY: - ret=query_uptest(s_addr, serv->port, serv->query_test_name, - serv->timeout>=global.timeout?serv->timeout:global.timeout, - PINGREPEAT); - } /* end of switch */ - - pthread_mutex_lock(&servers_lock); - if(count_running_ping) - --server_status_ping; - PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it"); - if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond); - - DEBUG_PDNSDA_MSG("result of uptest for %s: %s\n", - PDNSDA2STR(s_addr), - ret?"OK":"failed"); - return ret; -} - -static int scheme_ok(servparm_t *serv) -{ - if (serv->scheme[0]) { - if (!schm[0]) { - ssize_t nschm; - int sc = open(global.scheme_file, O_RDONLY); - char *s; - if (sc<0) - return 0; - nschm = read(sc, schm, sizeof(schm)-1); - close(sc); - if (nschm < 0) - return 0; - schm[nschm] = '\0'; - s = strchr(schm, '\n'); - if (s) - *s='\0'; - } - if (fnmatch(serv->scheme, schm, 0)) - return 0; - } - return 1; -} - -/* Internal server test. Call with locks applied. - May test a single server ip or several collectively. - */ -static void retest(int i, int j) -{ - time_t s_ts; - servparm_t *srv=&DA_INDEX(servers,i); - int nsrvs=DA_NEL(srv->atup_a); - - if(!nsrvs) return; - if(j>=0) { - if(jatup_a,j); - at->is_up=0; - at->i_ts=s_ts; - } - } - else if(srv->uptest==C_NONE) { - s_ts=time(NULL); - - for(;jatup_a,j).i_ts=s_ts; - } - } - else if(srv->uptest==C_QUERY || (srv->uptest==C_PING && is_inaddr_any(&srv->ping_a))) { /* test each ip address separately */ - for(;jatup_a,j); - s_ts=time(NULL); - at->is_up=uptest(srv,j); - if(signal_interrupt) - break; - at->i_ts=s_ts; - } - } - else { /* test ip addresses collectively */ - int res; - - s_ts=time(NULL); - res=uptest(srv,j); - for(;jatup_a,j); - at->is_up=res; - if(signal_interrupt && srv->uptest==C_PING) - continue; - at->i_ts=s_ts; - } - } -} - - -/* This is called by the server status thread to discover the addresses of root servers. - Call with server_lock applied. -*/ -static addr2_array resolv_rootserver_addrs(atup_array a, int port, char edns_query, time_t timeout) -{ - addr2_array retval=NULL; - - /* Unlock the mutex because this may take a while. */ - ++server_data_users; - pthread_mutex_unlock(&servers_lock); - - retval= dns_rootserver_resolv(a,port,edns_query,timeout); - - pthread_mutex_lock(&servers_lock); - PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it"); - if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond); - - return retval; -} - -/* - * Refresh the server status by pinging or testing the interface in the given interval. - * Note that you may get inaccuracies in the dimension of the ping timeout or the runtime - * of your uptest command if you have uptest=ping or uptest=exec for at least one server. - * This happens when all the uptests for the first n servers take more time than the inteval - * of n+1 (or 0 when n+1>servnum). I do not think that these delays are critical, so I did - * not to anything about that (because that may also be costly). - */ -void *servstat_thread(void *p) -{ - struct sigaction action; - int keep_testing; - - /* (void)p; */ /* To inhibit "unused variable" warning */ - - THREAD_SIGINIT; - - pthread_mutex_lock(&servers_lock); - /* servstat_thrid=pthread_self(); */ - - signal_interrupt=0; - action.sa_handler = sigint_handler; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; - if(sigaction(statusintsig, &action, NULL) == 0) { - sigset_t smask; - sigemptyset(&smask); - sigaddset(&smask, statusintsig); - pthread_sigmask(SIG_UNBLOCK,&smask,NULL); - } - else { - log_warn("Cannot install signal handler for server status thread: %s\n",strerror(errno)); - } - - for(;;) { - do { - int i,n; - keep_testing=0; - retest_flag=0; - schm[0] = '\0'; - n=DA_NEL(servers); - for (i=0;irootserver==2) { - /* First get addresses of root servers. */ - addr2_array adrs; - int l, one_up=0; - - if(!scheme_ok(sp)) { - time_t now=time(NULL); - m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j).i_ts=now; - } else if(sp->uptest==C_PING || sp->uptest==C_QUERY) { - /* Skip ping or query tests until after discovery. */ - if(sp->interval>0) - one_up= DA_NEL(sp->atup_a); - else { - time_t now=time(NULL); - m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j); - if(at->is_up || at->i_ts==0) - one_up=1; - at->i_ts=now; - } - } - } - else { - retest(i,-1); - - m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j).is_up) { - one_up=1; - break; - } - } - } - - if(!one_up) { - if (needs_intermittent_testing(sp)) keep_testing=1; - continue; - } - - DEBUG_MSG("Attempting to discover root servers for server section #%d.\n",i); - adrs=resolv_rootserver_addrs(sp->atup_a,sp->port,sp->edns_query,sp->timeout); - l= DA_NEL(adrs); - if(l>0) { - struct timeval now; - struct timespec timeout; - atup_array ata; - DEBUG_MSG("Filling server section #%d with %d root server addresses.\n",i,l); - gettimeofday(&now,NULL); - timeout.tv_sec = now.tv_sec + 60; /* time out after 60 seconds */ - timeout.tv_nsec = now.tv_usec * 1000; - while (server_data_users>0) { - if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) { - DEBUG_MSG("Timed out while waiting for exclusive access to server data" - " to set root server addresses of server section #%d\n",i); - da_free(adrs); - keep_testing=1; - continue; - } - } - ata = DA_CREATE(atup_array, l); - if(!ata) { - log_warn("Out of memory in servstat_thread() while discovering root servers."); - da_free(adrs); - keep_testing=1; - continue; - } - for(j=0; ja = DA_INDEX(adrs,j); - at->is_up=sp->preset; - at->i_ts= sp->interval<0 ? time(NULL): 0; - } - da_free(sp->atup_a); - sp->atup_a=ata; - da_free(adrs); - /* Successfully set IP addresses for this server section. */ - sp->rootserver=1; - } - else { - DEBUG_MSG("Failed to discover root servers in servstat_thread() (server section #%d).\n",i); - if(adrs) da_free(adrs); - if(DA_NEL(sp->atup_a)) keep_testing=1; - continue; - } - } - - if (needs_testing(sp)) keep_testing=1; - m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j).i_ts) - goto individual_tests; - /* Test collectively */ - if(!signal_interrupt) retest(i,-1); - continue; - - individual_tests: - for(j=0; !signal_interrupt && jatup_a,j).i_ts, now; - - if (ts==0 /* Always test servers with timestamp 0 */ || - (needs_intermittent_testing(sp) && - ((now=time(NULL))-ts>sp->interval || - ts>now /* kluge for clock skew */))) - { - retest(i,j); - } - } - } - } while(!signal_interrupt && retest_flag); - - signal_interrupt=0; - - /* Break the loop and exit the thread if it is no longer needed. */ - if(!keep_testing) break; - - { - struct timeval now; - struct timespec timeout; - time_t minwait; - int i,n,retval; - - gettimeofday(&now,NULL); - minwait=3600; /* Check at least once every hour. */ - n=DA_NEL(servers); - for (i=0;iatup_a); - for(j=0;jatup_a,j).i_ts; - if(ts==0) { - /* Test servers with timestamp 0 without delay */ - if(minwait > 0) minwait=0; - } - else if(needs_intermittent_testing(sp)) { - time_t wait= ts + sp->interval - now.tv_sec; - if(wait < minwait) minwait=wait; - } - } - } - timeout.tv_sec = now.tv_sec; - if(minwait>0) - timeout.tv_sec += minwait; - timeout.tv_nsec = now.tv_usec * 1000 + 500000000; /* wait at least half a second. */ - if(timeout.tv_nsec>=1000000000) { - timeout.tv_nsec -= 1000000000; - ++timeout.tv_sec; - } - /* While we wait for a server_test_cond condition or a timeout - the servers_lock mutex is unlocked, so other threads can access - server data - */ - retval=pthread_cond_timedwait(&server_test_cond, &servers_lock, &timeout); - DEBUG_MSG("Server status thread woke up (%s signal).\n", - retval==0?"test condition":retval==ETIMEDOUT?"timer":retval==EINTR?"interrupt":"error"); - } - } - - /* server status thread no longer needed. */ - servstat_thrid=main_thrid; - pthread_mutex_unlock(&servers_lock); - DEBUG_MSG("Server status thread exiting.\n"); - return NULL; -} - -/* - * Start the server status thread. - */ -int start_servstat_thread() -{ - pthread_t stt; - - int rv=pthread_create(&stt,&attr_detached,servstat_thread,NULL); - if (rv) - log_warn("Failed to start server status thread: %s",strerror(rv)); - else { - servstat_thrid=stt; - log_info(2,"Server status thread started."); - } - return rv; -} - -/* - * This can be used to mark a server (or a list of nadr servers) up (up=1) or down (up=0), - * or to schedule an immediate retest (up=-1). - * We can't always use indices to identify a server, because we allow run-time - * configuration of server addresses, so the servers are identified by their IP addresses. - */ -void sched_server_test(pdnsd_a *sa, int nadr, int up) -{ - int k,signal_test; - - pthread_mutex_lock(&servers_lock); - - signal_test=0; - /* This obviously isn't very efficient, but nadr should be small - and anything else would introduce considerable overhead */ - for(k=0;katup_a); - for(j=0;jatup_a,j); - if(equiv_inaddr2(sak,&at->a)) { - if(up>=0) { - at->is_up=up; - at->i_ts=time(NULL); - DEBUG_PDNSDA_MSG("Marked server %s %s.\n",PDNSDA2STR(sak),up?"up":"down"); - } - else if(at->i_ts) { - /* A test may take a while, and we don't want to hold - up the calling thread. - Instead we set the timestamp to zero and signal - a condition which should wake up the server test thread. - */ - at->i_ts=0; - signal_test=1; - } - } - } - } - } - if(signal_test) pthread_cond_signal(&server_test_cond); - - pthread_mutex_unlock(&servers_lock); -} - -/* Mark a set of servers up or down or schedule uptests. - * If i>=0 only the server section with index i is scanned, - * if i<0 all sections are scanned. - * Only sections matching label are actually set. A NULL label matches - * any section. - * up=1 or up=0 means mark server up or down, up=-1 means retest. - * - * A non-zero return value indicates an error. - */ -int mark_servers(int i, char *label, int up) -{ - int retval=0,n,signal_test; - - pthread_mutex_lock(&servers_lock); - - signal_test=0; - n=DA_NEL(servers); - if(i>=0) { - /* just one section */ - if(ilabel && !strcmp(sp->label,label))) { - int j,m=DA_NEL(sp->atup_a); - - /* If a section with undiscovered root servers is marked up, signal a test. */ - if(m && sp->rootserver>1 && up>0) signal_test=1; - - for(j=0;jatup_a,j); - if(up>=0) { - at->is_up=up; - at->i_ts=time(NULL); - } - else if(at->i_ts) { - /* A test may take a while, and we don't want to hold - up the calling thread. - Instead we set the timestamp to zero and signal - a condition which should wake up the server test thread. - */ - at->i_ts=0; - signal_test=1; - } - } - } - } - if(signal_test) { - if(pthread_equal(servstat_thrid,main_thrid)) - retval=start_servstat_thread(); - else { - retest_flag=1; - retval=pthread_cond_signal(&server_test_cond); - } - } - - pthread_mutex_unlock(&servers_lock); - return retval; -} - -/* - * Test called by the dns query handlers to handle interval=onquery cases. - */ -void test_onquery() -{ - int i,n,signal_test; - - pthread_mutex_lock(&servers_lock); - schm[0] = '\0'; - signal_test=0; - n=DA_NEL(servers); - for (i=0;iinterval==-1) { - if(sp->rootserver<=1) - retest(i,-1); - else { - /* We leave root-server discovery to the server status thread */ - int j,m=DA_NEL(sp->atup_a); - for(j=0;jatup_a,j).i_ts=0; - signal_test=1; - } - } - } - - if(signal_test) { - int rv; - if(pthread_equal(servstat_thrid,main_thrid)) - start_servstat_thread(); - else { - retest_flag=1; - if((rv=pthread_cond_signal(&server_test_cond))) { - DEBUG_MSG("test_onquery(): couldn't signal server status thread: %s\n",strerror(rv)); - } - } - } - - pthread_mutex_unlock(&servers_lock); -} - -/* non-exclusive lock, for read only access to server data. */ -void lock_server_data() -{ - pthread_mutex_lock(&servers_lock); - ++server_data_users; - pthread_mutex_unlock(&servers_lock); -} - -void unlock_server_data() -{ - pthread_mutex_lock(&servers_lock); - PDNSD_ASSERT(server_data_users>0, "server_data_users non-positive before attempt to decrement it"); - if (--server_data_users==0) pthread_cond_broadcast(&server_data_cond); - pthread_mutex_unlock(&servers_lock); -} - -/* Try to obtain an exclusive lock, needed for modifying server data. - Return 1 on success, 0 on failure (time out after tm seconds). -*/ -int exclusive_lock_server_data(int tm) -{ - struct timeval now; - struct timespec timeout; - - pthread_mutex_lock(&servers_lock); - if(server_status_ping>0 && !pthread_equal(servstat_thrid,main_thrid)) { - int err; - /* Try to interrupt server status thread to prevent delays. */ - DEBUG_MSG("Sending server status thread an interrupt signal.\n"); - if((err=pthread_kill(servstat_thrid,statusintsig))) { - DEBUG_MSG("pthread_kill failed: %s\n",strerror(err)); - } - } - gettimeofday(&now,NULL); - timeout.tv_sec = now.tv_sec + tm; /* time out after tm seconds */ - timeout.tv_nsec = now.tv_usec * 1000; - while (server_data_users>0) { - if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) { - pthread_mutex_unlock(&servers_lock); - return 0; - } - } - return 1; -} -/* Call this to free the lock obtained with exclusive_lock_server_data(). - If retest is nonzero, the server-status thread is reactivated to check - which servers are up. This is useful in case the configuration has changed. -*/ -void exclusive_unlock_server_data(int retest) -{ - if(retest) { - if(pthread_equal(servstat_thrid,main_thrid)) - start_servstat_thread(); - else - pthread_cond_signal(&server_test_cond); - } - pthread_mutex_unlock(&servers_lock); -} - -/* - Change addresses of servers during runtime. - i is the number of the server section to change. - ar should point to an array of IP addresses (may be NULL). - up=1 or up=0 means mark server up or down afterwards, - up=-1 means retest. - - A non-zero return value indicates an error. -*/ -int change_servers(int i, addr_array ar, int up) -{ - int retval=0,j,change,signal_test; - int n; - servparm_t *sp; - - pthread_mutex_lock(&servers_lock); - - signal_test=0; - change=0; - n=DA_NEL(ar); - sp=&DA_INDEX(servers,i); - if(n != DA_NEL(sp->atup_a) || sp->rootserver>1) - change=1; - else { - int j; - for(j=0;jatup_a,j).a)) { - change=1; - break; - } - } - if(change) { - /* we need exclusive access to the server data to make the changes */ - struct timeval now; - struct timespec timeout; - atup_array ata; - - if(server_status_ping>0 && !pthread_equal(servstat_thrid,main_thrid)) { - int err; - /* Try to interrupt server status thread to prevent delays. */ - DEBUG_MSG("Sending server status thread an interrupt signal.\n"); - if((err=pthread_kill(servstat_thrid,statusintsig))) { - DEBUG_MSG("pthread_kill failed: %s\n",strerror(err)); - } - } - - DEBUG_MSG("Changing IPs of server section #%d\n",i); - gettimeofday(&now,NULL); - timeout.tv_sec = now.tv_sec + 60; /* time out after 60 seconds */ - timeout.tv_nsec = now.tv_usec * 1000; - while (server_data_users>0) { - if(pthread_cond_timedwait(&server_data_cond, &servers_lock, &timeout) == ETIMEDOUT) { - retval=ETIMEDOUT; - goto unlock_mutex; - } - } - - ata= DA_CREATE(atup_array, n); - if(!ata) { - log_warn("Out of memory in change_servers()."); - retval=ENOMEM; - goto unlock_mutex; - } - da_free(sp->atup_a); - sp->atup_a=ata; - /* Stop trying to discover rootservers - if we set the addresses using this routine. */ - if(sp->rootserver>1) sp->rootserver=1; - } - - for(j=0; jatup_a,j); - if(change) { - SET_PDNSD_A2(&at->a, &DA_INDEX(ar,j)); - at->is_up=sp->preset; - } - if(up>=0) { - at->is_up=up; - at->i_ts=time(NULL); - } - else if(change || at->i_ts) { - /* A test may take a while, and we don't want to hold - up the calling thread. - Instead we set the timestamp to zero and signal - a condition which should wake up the server test thread. - */ - at->i_ts=0; - signal_test=1; - } - } - - if(signal_test) { - if(pthread_equal(servstat_thrid,main_thrid)) - retval=start_servstat_thread(); - else { - retest_flag=1; - retval=pthread_cond_signal(&server_test_cond); - } - } - - unlock_mutex: - pthread_mutex_unlock(&servers_lock); - return retval; -} - - -/* - The signal handler for the signal to tell the server status thread to discontinue testing. -*/ -static void sigint_handler(int signum) -{ - signal_interrupt=1; -} diff --git a/jni/pdnsd/src/servers.h b/jni/pdnsd/src/servers.h deleted file mode 100644 index fd263c0c..00000000 --- a/jni/pdnsd/src/servers.h +++ /dev/null @@ -1,68 +0,0 @@ -/* servers.h - manage a set of dns servers - - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _SERVERS_H_ -#define _SERVERS_H_ - -#include -#include "consts.h" - -/* Number of ping timeouts before we take a server offline. */ -#define PINGREPEAT 2 - -extern pthread_t servstat_thrid; -extern volatile int signal_interrupt; - - -int start_servstat_thread(void); -void sched_server_test(pdnsd_a *sa, int nadr, int up); -int mark_servers(int i, char* label, int up); -void test_onquery(void); -void lock_server_data(); -void unlock_server_data(); -int exclusive_lock_server_data(int tm); -void exclusive_unlock_server_data(int retest); -int change_servers(int i, addr_array ar, int up); - -inline static int needs_testing(servparm_t *sp) - __attribute__((always_inline)); -inline static int needs_testing(servparm_t *sp) -{ - return ((sp->interval>0 || sp->interval==-2) && (sp->uptest!=C_NONE || sp->scheme[0])); -} - -inline static int needs_intermittent_testing(servparm_t *sp) - __attribute__((always_inline)); -inline static int needs_intermittent_testing(servparm_t *sp) -{ - return (sp->interval>0 && (sp->uptest!=C_NONE || sp->scheme[0])); -} - -inline static int is_interrupted_servstat_thread() - __attribute__((always_inline)); -inline static int is_interrupted_servstat_thread() -{ - return (signal_interrupt && pthread_equal(pthread_self(),servstat_thrid)); -} - -#endif diff --git a/jni/pdnsd/src/sort_namevalues.pl b/jni/pdnsd/src/sort_namevalues.pl deleted file mode 100644 index 2014f49f..00000000 --- a/jni/pdnsd/src/sort_namevalues.pl +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/perl -w - -use strict; - -my %dic; -my $maxkeylen=0; - -while(<>) { - if(/"(\w+)".*?(\w+)/) { - my $key=$1; my $val=$2; - if($dic{$key}) {die "The key \"$key\" does not have a unique value.\n"} - $dic{$key}=$val; - if(length($key)>$maxkeylen) {$maxkeylen=length($key)} - } - else {die "Can't find key-value pair in following line:\n$_\n"} -} - -my $linenr=0; -foreach my $key (sort(keys %dic)) { - if($linenr++) {print ",\n"} - printf("\t{%-*s%s}",$maxkeylen+4,"\"$key\",",$dic{$key}); -} -print "\n"; - -exit diff --git a/jni/pdnsd/src/status.c b/jni/pdnsd/src/status.c deleted file mode 100644 index 4240069d..00000000 --- a/jni/pdnsd/src/status.c +++ /dev/null @@ -1,824 +0,0 @@ -/* status.c - Allow control of a running server using a socket - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2011 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#ifdef HAVE_ALLOCA_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for offsetof */ -#include "ipvers.h" -#include "status.h" -#include "thread.h" -#include "cache.h" -#include "error.h" -#include "servers.h" -#include "dns_answer.h" -#include "helpers.h" -#include "conf-parser.h" - -#if !defined(HAVE_ALLOCA) && !defined(alloca) -#define alloca malloc -#endif - - -char *sock_path=NULL; -int stat_sock; - - -/* Print an error to the socket */ -static int print_serr(int rs, const char *msg) -{ - uint16_t cmd; - - DEBUG_MSG("Sending error message to control socket: '%s'\n",msg); - cmd=htons(1); - if(write(rs,&cmd,sizeof(cmd))!=sizeof(cmd) || - write_all(rs,msg,strlen(msg))<0) - { - DEBUG_MSG("Error writing to control socket: %s\n",strerror(errno)); - return 0; - } - return 1; -} - -/* Print a success code to the socket */ -static int print_succ(int rs) -{ - uint16_t cmd; - - cmd=htons(0); - if(write(rs,&cmd,sizeof(cmd))!=sizeof(cmd)) { - DEBUG_MSG("Error writing to control socket: %s\n" - "Failed to send success code.\n",strerror(errno)); - return 0; - } - return 1; -} - -/* Read a cmd short */ -static int read_short(int fh, uint16_t *res) -{ - uint16_t cmd; - - if (read(fh,&cmd,sizeof(cmd))!=sizeof(cmd)) { - /* print_serr(fh,"Bad arg."); */ - return 0; - } - *res= ntohs(cmd); - return 1; -} - -/* Read a cmd long */ -static int read_long(int fh, uint32_t *res) -{ - uint32_t cmd; - - if (read(fh,&cmd,sizeof(cmd))!=sizeof(cmd)) { - /* print_serr(fh,"Bad arg."); */ - return 0; - } - *res= ntohl(cmd); - return 1; -} - -/* Read a string preceded by a char count. - A buffer of the right size is allocated to hold the result. - A return value of 1 means success, - -1 means the result is undefined (*res is set to NULL), - 0 means read or allocation error. -*/ -static int read_allocstring(int fh, char **res, unsigned *len) -{ - uint16_t count; - char *buf; - unsigned int nread; - - if(!read_short(fh,&count)) return 0; - if(count==(uint16_t)(~0)) {*res=NULL; return -1;} - if(!(buf=malloc(count+1))) return 0; - nread=0; - while(nread=buflen) return 0; - nread=0; - while(nread=buflen) return 0; - buf[count]='.'; buf[count+1]=0; - } -#endif - return 1; -} - -static void *status_thread (void *p) -{ - THREAD_SIGINIT; - /* (void)p; */ /* To inhibit "unused variable" warning */ - - if (!global.strict_suid) { - if (!run_as(global.run_as)) { - pdnsd_exit(); - } - } - - if (listen(stat_sock,5)==-1) { - log_warn("Error: could not listen on socket: %s.\nStatus readback will be impossible",strerror(errno)); - goto exit_thread; - } - for(;;) { - struct sockaddr_un ra; - socklen_t res=sizeof(ra); - int rs; - if ((rs=accept(stat_sock,(struct sockaddr *)&ra,&res))!=-1) { - uint16_t cmd; - DEBUG_MSG("Status socket query pending.\n"); - if (read_short(rs,&cmd)) { - /* Check magic number in command */ - if((cmd & 0xff00) == CTL_CMDVERNR) { - const char *errmsg; - cmd &= 0xff; - switch(cmd) { - case CTL_STATS: { - struct utsname nm; - DEBUG_MSG("Received STATUS query.\n"); - if(!print_succ(rs)) - break; - uname(&nm); - if(fsprintf(rs,"pdnsd-%s running on %s.\n",VERSION,nm.nodename)<0 || - report_cache_stat(rs)<0 || - report_thread_stat(rs)<0 || - report_conf_stat(rs)<0) - { - DEBUG_MSG("Error writing to control socket: %s\n" - "Failed to send status report.\n",strerror(errno)); - } - } - break; - case CTL_SERVER: { - char *label,*dnsaddr; - int indx; - uint16_t cmd2; - DEBUG_MSG("Received SERVER command.\n"); - if (read_allocstring(rs,&label,NULL)<=0) { - print_serr(rs,"Error reading server label."); - break; - } - if (!read_short(rs,&cmd2)) { - print_serr(rs,"Missing up|down|retest."); - goto free_label_break; - } - if(!read_allocstring(rs, &dnsaddr,NULL)) { - print_serr(rs,"Error reading DNS addresses."); - goto free_label_break; - } - /* Note by Paul Rombouts: - We are about to access server configuration data. - Now that the configuration can be changed during run time, - we should be using locks before accessing server config data, even if it - is read-only access. - However, as long as this is the only thread that calls reload_config_file() - it should be OK to read the server config without locks, but it is - something to keep in mind. - */ - { - char *endptr; - indx=strtol(label,&endptr,0); - if(!*endptr) { - if (indx<0 || indx>=DA_NEL(servers)) { - print_serr(rs,"Server index out of range."); - goto free_dnsaddr_label_break; - } - } - else { - if (!strcmp(label, "all")) - indx=-2; /* all servers */ - else - indx=-1; /* compare names */ - } - } - if(cmd2==CTL_S_UP || cmd2==CTL_S_DOWN || cmd2==CTL_S_RETEST) { - if(!dnsaddr) { - if (indx==-1) { - int i; - for (i=0;idomain=malloc(sz))) { - print_serr(rs,"Out of memory."); - goto free_sla_names_break; - } - memcpy(sl->domain,rhn,sz); - sl->exact=0; - sl->rule=tp; - p = q+1; - } - } - if(empty_cache(sla)) - print_succ(rs); - else - print_serr(rs,"Could not lock the cache."); - free_sla_names_break: - free_slist_array(sla); - free_names_break: - free(names); - } - break; - case CTL_DUMP: { - int rv,exact=0; - unsigned char *nm=NULL; - char buf[DNSNAMEBUFSIZE]; - unsigned char rhn[DNSNAMEBUFSIZE]; - DEBUG_MSG("Received DUMP command.\n"); - if (!(rv=read_domain(rs,buf,sizeof(buf)))) { - print_serr(rs,"Bad domain name."); - break; - } - if(rv>0) { - int sz; - exact=1; nm= ucharp buf; sz=sizeof(buf); - if(buf[0]=='.' && buf[1]) { - exact=0; ++nm; --sz; - } - if ((errmsg=parsestr2rhn(nm,sz,rhn))!=NULL) - goto bad_domain_name; - nm=rhn; - } - if(!print_succ(rs)) - break; - if((rv=dump_cache(rs,nm,exact))<0 || - (!rv && fsprintf(rs,"Could not find %s%s in the cache.\n", - exact?"":nm?"any entries matching ":"any entries", - nm?buf:"")<0)) - { - DEBUG_MSG("Error writing to control socket: %s\n",strerror(errno)); - } - } - break; - incomplete_command: - print_serr(rs,"Malformed or incomplete command."); - break; - bad_arg: - print_serr(rs,"Bad arg."); - break; - bad_domain_name: - print_serr(rs,errmsg); - break; - bad_ttl: - print_serr(rs, "Bad TTL."); - break; - bad_flags: - print_serr(rs, "Bad cache flags."); - break; - out_of_memory: - print_serr(rs,"Out of memory."); - break; - default: - print_serr(rs,"Unknown command."); - } - } - else { - DEBUG_MSG("Incorrect magic number in status-socket command code: %02x\n",cmd>>8); - print_serr(rs,"Command code contains incompatible version number."); - } - } - else { - DEBUG_MSG("short status-socket query\n"); - print_serr(rs,"Command code missing or too short."); - } - close(rs); - usleep_r(100000); /* sleep some time. I do not want the query frequency to be too high. */ - } - else if (errno!=EINTR) { - log_warn("Failed to accept connection on status socket: %s. " - "Status readback will be impossible",strerror(errno)); - break; - } - } - - exit_thread: - stat_pipe=0; - close(stat_sock); - statsock_thrid=main_thrid; - - return NULL; -} - -/* - * Initialize the status socket - */ -void init_stat_sock() -{ - struct sockaddr_un *sa; - /* Should I include the terminating null byte in the calculation of the length parameter - for the socket address? The glibc info page "Details of Local Namespace" tells me I should not, - yet it is immediately followed by an example that contradicts that. - The SUN_LEN macro seems to be defined as - (offsetof(struct sockaddr_un, sun_path) + strlen(sa->sun_path)), - so I conclude it is not necessary to count the null byte, but it probably makes no - difference if you do. - */ - unsigned int sa_len = (offsetof(struct sockaddr_un, sun_path) + strlitlen("/pdnsd.status") + strlen(global.cache_dir)); - - sa=(struct sockaddr_un *)alloca(sa_len+1); - stpcpy(stpcpy(sa->sun_path,global.cache_dir),"/pdnsd.status"); - - if (unlink(sa->sun_path)!=0 && errno!=ENOENT) { /* Delete the socket */ - log_warn("Failed to unlink %s: %s.\nStatus readback will be disabled",sa->sun_path, strerror(errno)); - stat_pipe=0; - return; - } - if ((stat_sock=socket(PF_UNIX,SOCK_STREAM,0))==-1) { - log_warn("Failed to open socket: %s. Status readback will be impossible",strerror(errno)); - stat_pipe=0; - return; - } - sa->sun_family=AF_UNIX; -#ifdef BSD44_SOCKA - sa->sun_len=SUN_LEN(sa); -#endif - /* Early initialization, so that umask can be used race-free. */ - { - mode_t old_mask = umask((S_IRWXU|S_IRWXG|S_IRWXO)&(~global.ctl_perms)); - if (bind(stat_sock,(struct sockaddr *)sa,sa_len)==-1) { - log_warn("Error: could not bind socket: %s.\nStatus readback will be impossible",strerror(errno)); - close(stat_sock); - stat_pipe=0; - } - umask(old_mask); - } - - if(stat_pipe) sock_path= strdup(sa->sun_path); -} - -/* - * Start the status socket thread (see above) - */ -int start_stat_sock() -{ - pthread_t st; - - int rv=pthread_create(&st,&attr_detached,status_thread,NULL); - if (rv) - log_warn("Failed to start status thread. The status socket will be unuseable"); - else { - statsock_thrid=st; - log_info(2,"Status thread started."); - } - return rv; -} diff --git a/jni/pdnsd/src/status.h b/jni/pdnsd/src/status.h deleted file mode 100644 index 1d249f79..00000000 --- a/jni/pdnsd/src/status.h +++ /dev/null @@ -1,59 +0,0 @@ -/* status.h - Make server status information accessible through a named pipe - - Copyright (C) 2000, 2001 Thomas Moestl - Copyright (C) 2002, 2004, 2008, 2009 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _STATUS_H_ -#define _STATUS_H_ - -#include -#include "conff.h" - -extern char *sock_path; -extern int stat_sock; - -/* The commands for pdnsd-ctl */ -#define CTL_CMDVERNR 0x6800 /* pdnsd-ctl command version (magic number used to check compatibility) */ - -#define CTL_MIN 1 -#define CTL_STATS 1 /* Give out stats (like the "traditional" status pipe) */ -#define CTL_SERVER 2 /* Enable or disable a server */ -#define CTL_RECORD 3 /* Delete or invalidate records */ -#define CTL_SOURCE 4 /* Read a hosts-style file */ -#define CTL_ADD 5 /* Add a record of the given type */ -#define CTL_NEG 6 /* Add a negative cached record */ -#define CTL_CONFIG 7 /* Re-read config file */ -#define CTL_INCLUDE 8 /* Read file as config file, disregarding global and server sections */ -#define CTL_EVAL 9 /* Parse string as if part of config file */ -#define CTL_EMPTY 10 /* Empty the cache */ -#define CTL_DUMP 11 /* Dump cache contents */ -#define CTL_MAX 11 - -#define CTL_S_UP 1 -#define CTL_S_DOWN 2 -#define CTL_S_RETEST 3 -#define CTL_R_DELETE 1 -#define CTL_R_INVAL 2 - -void init_stat_sock(void); -int start_stat_sock(void); - -#endif diff --git a/jni/pdnsd/src/test/Makefile.am b/jni/pdnsd/src/test/Makefile.am deleted file mode 100644 index 81da0882..00000000 --- a/jni/pdnsd/src/test/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ - -.PHONY: all clean distclean - -noinst_PROGRAMS = if_up is_local_addr tping random - -## Dirty trick: I demand that these objects be built; then, with the knowledge -## that the object files will end up here, I redefine the link chain. - -TESTADDSRC= -#TESTADDSRC= netdev.c error.c thread.c helpers.c icmp.c -TESTDEPS = netdev.o error.o thread.o helpers.o icmp.o - -TESTOBJS = netdev.o error.o thread.o helpers.o icmp.o - -if_up_SOURCES = if_up.c $(TESTADDSRC) -if_up_LDADD = $(TESTOBJS) @thread_CFLAGS@ -if_up_DEPENDENCIES = $(TESTDEPS) - -is_local_addr_SOURCES = is_local_addr.c $(TESTADDSRC) -is_local_addr_LDADD = $(TESTOBJS) @thread_CFLAGS@ -is_local_addr_DEPENDENCIES = $(TESTDEPS) - -tping_SOURCES = tping.c $(TESTADDSRC) -tping_LDADD = $(TESTOBJS) @thread_CFLAGS@ -tping_DEPENDENCIES = $(TESTDEPS) - -random_SOURCES = random.c $(TESTADDSRC) -random_LDADD = $(TESTOBJS) @thread_CFLAGS@ -random_DEPENDENCIES = $(TESTDEPS) - -# These are Symlinks we want to have in the package -#EXTRA_DIST = conff.h error.h helpers.h icmp.h ipvers.h netdev.h thread.h cacheing - -$(TESTOBJS): %.o: ../%.c - $(COMPILE) @thread_CFLAGS@ -c $< diff --git a/jni/pdnsd/src/test/Makefile.in b/jni/pdnsd/src/test/Makefile.in deleted file mode 100644 index 2ad86412..00000000 --- a/jni/pdnsd/src/test/Makefile.in +++ /dev/null @@ -1,464 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -noinst_PROGRAMS = if_up$(EXEEXT) is_local_addr$(EXEEXT) tping$(EXEEXT) \ - random$(EXEEXT) -subdir = src/test -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -PROGRAMS = $(noinst_PROGRAMS) -am__objects_1 = -am_if_up_OBJECTS = if_up.$(OBJEXT) $(am__objects_1) -if_up_OBJECTS = $(am_if_up_OBJECTS) -am_is_local_addr_OBJECTS = is_local_addr.$(OBJEXT) $(am__objects_1) -is_local_addr_OBJECTS = $(am_is_local_addr_OBJECTS) -am_random_OBJECTS = random.$(OBJEXT) $(am__objects_1) -random_OBJECTS = $(am_random_OBJECTS) -am_tping_OBJECTS = tping.$(OBJEXT) $(am__objects_1) -tping_OBJECTS = $(am_tping_OBJECTS) -DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -am__mv = mv -f -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(if_up_SOURCES) $(is_local_addr_SOURCES) $(random_SOURCES) \ - $(tping_SOURCES) -DIST_SOURCES = $(if_up_SOURCES) $(is_local_addr_SOURCES) \ - $(random_SOURCES) $(tping_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -cachedir = @cachedir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -def_id = @def_id@ -distribution = @distribution@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -fullversion = @fullversion@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -packagerelease = @packagerelease@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -specbuild = @specbuild@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -thread_CFLAGS = @thread_CFLAGS@ -threadlib = @threadlib@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -TESTADDSRC = -#TESTADDSRC= netdev.c error.c thread.c helpers.c icmp.c -TESTDEPS = netdev.o error.o thread.o helpers.o icmp.o -TESTOBJS = netdev.o error.o thread.o helpers.o icmp.o -if_up_SOURCES = if_up.c $(TESTADDSRC) -if_up_LDADD = $(TESTOBJS) @thread_CFLAGS@ -if_up_DEPENDENCIES = $(TESTDEPS) -is_local_addr_SOURCES = is_local_addr.c $(TESTADDSRC) -is_local_addr_LDADD = $(TESTOBJS) @thread_CFLAGS@ -is_local_addr_DEPENDENCIES = $(TESTDEPS) -tping_SOURCES = tping.c $(TESTADDSRC) -tping_LDADD = $(TESTOBJS) @thread_CFLAGS@ -tping_DEPENDENCIES = $(TESTDEPS) -random_SOURCES = random.c $(TESTADDSRC) -random_LDADD = $(TESTOBJS) @thread_CFLAGS@ -random_DEPENDENCIES = $(TESTDEPS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/test/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -if_up$(EXEEXT): $(if_up_OBJECTS) $(if_up_DEPENDENCIES) - @rm -f if_up$(EXEEXT) - $(LINK) $(if_up_OBJECTS) $(if_up_LDADD) $(LIBS) -is_local_addr$(EXEEXT): $(is_local_addr_OBJECTS) $(is_local_addr_DEPENDENCIES) - @rm -f is_local_addr$(EXEEXT) - $(LINK) $(is_local_addr_OBJECTS) $(is_local_addr_LDADD) $(LIBS) -random$(EXEEXT): $(random_OBJECTS) $(random_DEPENDENCIES) - @rm -f random$(EXEEXT) - $(LINK) $(random_OBJECTS) $(random_LDADD) $(LIBS) -tping$(EXEEXT): $(tping_OBJECTS) $(tping_DEPENDENCIES) - @rm -f tping$(EXEEXT) - $(LINK) $(tping_OBJECTS) $(tping_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/if_up.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/is_local_addr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tping.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - shift; \ - if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - if test $$# -gt 0; then \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - "$$@" $$unique; \ - else \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$unique; \ - fi; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && $(am__cd) $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) "$$here" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(PROGRAMS) -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am - - -.PHONY: all clean distclean - -# These are Symlinks we want to have in the package -#EXTRA_DIST = conff.h error.h helpers.h icmp.h ipvers.h netdev.h thread.h cacheing - -$(TESTOBJS): %.o: ../%.c - $(COMPILE) @thread_CFLAGS@ -c $< - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/jni/pdnsd/src/test/if_up.c b/jni/pdnsd/src/test/if_up.c deleted file mode 100644 index af6ec976..00000000 --- a/jni/pdnsd/src/test/if_up.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include "../helpers.h" -#include "../conff.h" -#include "../netdev.h" - -short int daemon_p=0; -#if DEBUG>0 -short int debug_p=0; -#endif -short int verbosity=VERBOSITY; -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -short int run_ipv4=DEFAULT_IPV4; -#endif -#ifdef ENABLE_IPV6 -struct in6_addr ipv4_6_prefix; -#endif -pthread_t main_thrid,servstat_thrid; -volatile int signal_interrupt; -#if DEBUG>0 -FILE *dbg_file; -#endif -globparm_t global; - - -int main(int argc, char *argv[]) -{ - if (argc!=2) { - printf("Usage: %s \n",argv[0]); - exit(1); - } - printf("if_up: %s - %s\n",argv[1],if_up(argv[1])?"up":"down"); - return 0; -} diff --git a/jni/pdnsd/src/test/is_local_addr.c b/jni/pdnsd/src/test/is_local_addr.c deleted file mode 100644 index fda517d6..00000000 --- a/jni/pdnsd/src/test/is_local_addr.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include "../helpers.h" -#include "../conff.h" -#include "../netdev.h" -#include "../ipvers.h" - -short int daemon_p=0; -#if DEBUG>0 -short int debug_p=0; -#endif -short int verbosity=VERBOSITY; -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -short int run_ipv4=DEFAULT_IPV4; -#endif -#ifdef ENABLE_IPV6 -struct in6_addr ipv4_6_prefix; -#endif -pthread_t main_thrid,servstat_thrid; -volatile int signal_interrupt; -#if DEBUG>0 -FILE *dbg_file; -#endif -globparm_t global; - - -int main(int argc, char *argv[]) -{ - pdnsd_a a; - - if (argc!=2) { - printf("Usage: %s
    \n",argv[0]); - exit(1); - } -#ifdef ENABLE_IPV4 - if (inet_aton(argv[1],&a.ipv4)) { -# ifdef ENABLE_IPV6 - run_ipv4=1; -# endif - printf("is %s a local addr: %s\n",argv[1],is_local_addr(&a)?"yes":"no"); - return 0; - } -#endif -#ifdef ENABLE_IPV6 - if (inet_pton(AF_INET6,argv[1],&a.ipv6)) { -# ifdef ENABLE_IPV4 - run_ipv4=0; -# endif - printf("is %s a local addr: %s\n",argv[1],is_local_addr(&a)?"yes":"no"); - return 0; - } -#endif - printf("Adress invalid.\n"); - return 0; -} diff --git a/jni/pdnsd/src/test/random.c b/jni/pdnsd/src/test/random.c deleted file mode 100644 index a447e80c..00000000 --- a/jni/pdnsd/src/test/random.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include -#include -#include "../helpers.h" -#include "../conff.h" - -short int daemon_p=0; -#if DEBUG>0 -short int debug_p=0; -#endif -short int verbosity=VERBOSITY; -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -short int run_ipv4=DEFAULT_IPV4; -#endif -#ifdef ENABLE_IPV6 -struct in6_addr ipv4_6_prefix; -#endif -pthread_t main_thrid,servstat_thrid; -volatile int signal_interrupt; -#if DEBUG>0 -FILE *dbg_file; -#endif -globparm_t global; - - -int main(void) -{ - init_rng(); - printf("%i\n",(int)get_rand16()); - free_rng(); - return 0; -} diff --git a/jni/pdnsd/src/test/tping.c b/jni/pdnsd/src/test/tping.c deleted file mode 100644 index 734a25f7..00000000 --- a/jni/pdnsd/src/test/tping.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include -#include "../helpers.h" -#include "../conff.h" -#include "../icmp.h" -#include "../ipvers.h" - -short int daemon_p=0; -#if DEBUG>0 -short int debug_p=0; -#endif -short int verbosity=VERBOSITY; -#if defined(ENABLE_IPV4) && defined(ENABLE_IPV6) -short int run_ipv4=DEFAULT_IPV4; -#endif -#ifdef ENABLE_IPV6 -struct in6_addr ipv4_6_prefix; -#endif -pthread_t main_thrid,servstat_thrid; -volatile int signal_interrupt; -#if DEBUG>0 -FILE *dbg_file; -#endif -globparm_t global; - - -int main(int argc, char *argv[]) -{ - pdnsd_a a; - - if (argc!=2) { - printf("Usage: %s
    \n",argv[0]); - exit(1); - } -#ifdef ENABLE_IPV4 - if (inet_aton(argv[1],&a.ipv4)) { -# ifdef ENABLE_IPV6 - run_ipv4=1; -# endif - init_ping_socket(); - printf("ping (v4) echo from %s: %i\n",argv[1],ping(&a,100,2)); - return 0; - } -#endif -#ifdef ENABLE_IPV6 - if (inet_pton(AF_INET6,argv[1],&a.ipv6)) { -# ifdef ENABLE_IPV4 - run_ipv4=0; -# endif - init_ping_socket(); - printf("ping (v6) echo from %s: %i\n",argv[1],ping(&a,100,2)); - return 0; - } -#endif - printf("Adress invalid.\n"); - return 0; -} diff --git a/jni/pdnsd/src/thread.c b/jni/pdnsd/src/thread.c deleted file mode 100644 index 84c34f6d..00000000 --- a/jni/pdnsd/src/thread.c +++ /dev/null @@ -1,85 +0,0 @@ -/* thread.c - Threading helpers - - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2002, 2003 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "thread.h" -#include "error.h" -#include "helpers.h" -#include "conff.h" - - -#if (TARGET==TARGET_LINUX) && !defined(THREADLIB_NPTL) -volatile short int waiting=0; /* Has the main thread already done sigwait() ? */ -#endif -pthread_attr_t attr_detached; -#if DEBUG>0 -pthread_key_t thrid_key; -#endif - -/* This is a handler for signals to the threads. We just hand the sigs on to the main thread. - * Note that this may result in blocked locks. We have no means to open the locks here, because in LinuxThreads - * the mutex functions are not async-signal safe. So, locks may still be active. We account for this by using - * softlocks (see below) in any functions called after sigwait from main(). */ -#if (TARGET==TARGET_LINUX) && !defined(THREADLIB_NPTL) -void thread_sig(int sig) -{ - if (sig==SIGTSTP || sig==SIGTTOU || sig==SIGTTIN) { - /* nonfatal signal. Ignore, because proper handling is very difficult. */ - return; - } - if (waiting) { - log_warn("Caught signal %i.",sig); - if (sig==SIGSEGV || sig==SIGILL || sig==SIGBUS) - crash_msg("A fatal signal occured."); - pthread_kill(main_thrid,SIGTERM); - pthread_exit(NULL); - } else { - crash_msg("An error occured at startup."); - _exit(1); - } -} -#endif - -/* This is now defined as an inline function in thread.h */ -#if 0 -void usleep_r(unsigned long usec) -{ -#if ((TARGET==TARGET_LINUX) || (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN)) && defined(HAVE_USLEEP) - usleep(usec); -#else - struct timeval tv; - - tv.tv_sec=usec/1000000; - tv.tv_usec=usec%1000000; - select(0, NULL, NULL, NULL, tv); -#endif -} -#endif - diff --git a/jni/pdnsd/src/thread.h b/jni/pdnsd/src/thread.h deleted file mode 100644 index 12d17dd1..00000000 --- a/jni/pdnsd/src/thread.h +++ /dev/null @@ -1,143 +0,0 @@ -/* thread.h - Threading helpers - - Copyright (C) 2000 Thomas Moestl - Copyright (C) 2002, 2003, 2005 Paul A. Rombouts - - This file is part of the pdnsd package. - - pdnsd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - pdnsd is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with pdnsd; see the file COPYING. If not, see - . -*/ - - -#ifndef _THREAD_H_ -#define _THREAD_H_ - -#include -#include -#include - -/* --- from main.c */ -extern sigset_t sigs_msk; -/* --- */ - -#if (TARGET==TARGET_LINUX) && !defined(THREADLIB_NPTL) -extern volatile short int waiting; -void thread_sig(int sig); -#endif - -/* These are macros for setting up the signal handling of a new thread. They - * are needed because the LinuxThreads implementation obviously has some - * problems in signal handling, which makes the recommended solution (doing - * sigwait() in one thread and blocking the signals in all threads) impossible. - * So, for Linux, we have to install the fatal_sig handler. - * It seems to me that signal handlers in fact aren't shared between threads - * under Linux. Also, sigwait() does not seem to work as indicated in the docs */ - -/* Note added by Paul Rombouts: In the new Native POSIX Thread Library for Linux (NPTL) - signal handling has changed from per-thread signal handling to POSIX process signal handling, - which makes the recommended solution mentioned by Thomas Moestl possible. - In this case I can simply define THREAD_SIGINIT to be empty. - The signals are blocked in main() before any threads are created, - and we simply never unblock them except by calling sigwait() in main(). */ - -#if (TARGET==TARGET_LINUX) -# ifdef THREADLIB_NPTL -# define THREAD_SIGINIT -# else -# ifdef THREADLIB_LINUXTHREADS2 -# define THREAD_SIGINIT { \ - struct sigaction action; \ - pthread_sigmask(SIG_UNBLOCK,&sigs_msk,NULL); \ - action.sa_handler = thread_sig; \ - action.sa_mask = sigs_msk; \ - action.sa_flags = 0; \ - sigaction(SIGINT,&action,NULL); \ - sigaction(SIGILL,&action,NULL); \ - sigaction(SIGABRT,&action,NULL); \ - sigaction(SIGFPE,&action,NULL); \ - sigaction(SIGSEGV,&action,NULL); \ - sigaction(SIGTSTP,&action,NULL); \ - sigaction(SIGTTOU,&action,NULL); \ - sigaction(SIGTTIN,&action,NULL); \ - sigaction(SIGTERM,&action,NULL); \ - action.sa_handler = SIG_IGN; \ - sigemptyset(&action.sa_mask); \ - action.sa_flags = 0; \ - sigaction(SIGPIPE,&action,NULL); \ - } -# else -# define THREAD_SIGINIT { \ - struct sigaction action; \ - pthread_sigmask(SIG_UNBLOCK,&sigs_msk,NULL); \ - action.sa_handler = thread_sig; \ - action.sa_mask = sigs_msk; \ - action.sa_flags = 0; \ - sigaction(SIGILL,&action,NULL); \ - sigaction(SIGABRT,&action,NULL); \ - sigaction(SIGFPE,&action,NULL); \ - sigaction(SIGSEGV,&action,NULL); \ - sigaction(SIGTSTP,&action,NULL); \ - sigaction(SIGTTOU,&action,NULL); \ - sigaction(SIGTTIN,&action,NULL); \ - action.sa_handler = SIG_IGN; \ - sigemptyset(&action.sa_mask); \ - action.sa_flags = 0; \ - sigaction(SIGPIPE,&action,NULL); \ - } -# endif -# endif -#elif (TARGET==TARGET_BSD) || (TARGET==TARGET_CYGWIN) -#define THREAD_SIGINIT pthread_sigmask(SIG_BLOCK,&sigs_msk,NULL) -#else -# error Unsupported platform! -#endif - - -/* This is a thread-safe usleep(). - Implementation of the BSD usleep function using nanosleep. -*/ -inline static int usleep_r(unsigned long useconds) - __attribute__((always_inline)); -inline static int usleep_r(unsigned long useconds) -{ - struct timespec ts = { tv_sec: (useconds / 1000000), - tv_nsec: (useconds % 1000000) * 1000ul }; - - return nanosleep(&ts, NULL); -} - -/* This is a thread-safe sleep(). - The semantics are somewhat different from the POSIX sleep function, - but it suits our purposes. -*/ -inline static int sleep_r (unsigned int seconds) - __attribute__((always_inline)); -inline static int sleep_r (unsigned int seconds) -{ - struct timespec ts = { tv_sec: seconds, tv_nsec: 0 }; - - return nanosleep(&ts, NULL); -} - - -/* Used for creating detached threads */ -extern pthread_attr_t attr_detached; - -#if DEBUG>0 -/* Key for storing private thread ID's */ -extern pthread_key_t thrid_key; -#endif - -#endif diff --git a/jni/pdnsd/version b/jni/pdnsd/version deleted file mode 100644 index c400a378..00000000 --- a/jni/pdnsd/version +++ /dev/null @@ -1 +0,0 @@ -1.2.9b-par diff --git a/libs/android-support-v4.jar b/libs/android-support-v4.jar deleted file mode 100644 index aa0b1a5cc546b6169629194c53bb481d496cbc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1364299 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 z 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ðMvWzw}A7U5;VgP!biF@68Dt>Pa;VNz3Q6p)-#;|wE#}iFlc2MElX|} zV9=N?9#C+VPOdnYF&iWDIQ=nzh?v?DqNRObuCvXkN8GZ9*xj>`Jmx7g;U@4X zMuOgZm14mhzsPbk+|w?kY$eU45bWy2%}k51_$UczG>8)EzH_=1Z?TVGGU4khl{T|RSipPKJGTtrW#%gde5$PPM<9s)oy?uJv*yMj z>xs$X;X~~_b<@unsb+2k6x;!l>!)re`5rP<7;u<&X1}D#VMh1G%kUW%fM!n}5DJ(%@M-Xx zG#yNU=re2j&{879bg2R`ule7w5uz@lreRy^fIZx}bz&TASVR6Pgs;C-D;vlFokcs@3Kc>Iwp_@vqP)d3DoeIf+hsd-V zj8&T;;cM>PX{a?&QKLyj*mUyW{!+rrTM-eTDL-(Gli?Dyt1A1^ntM=OD@&p23Qc%% zqd{;3x0tM3Ptb6LgvtmO4c@pE6Y+J)!zYQUtNoHG5x6|VpG1YCnlm0F;apD4SZ;J7 zbQ6wjy#YAA8z&tIzZNLWkP+CKAix{7GlAM$7qzKDj41O1t0SfFfFu)=6iQZeSzg~R z>n(`KmvZ&X9PpTJ>iAzMhXxvmH-pdKs>(l54*v$T{JyvP$B1i7BQYyI6Qe(aIhp)2N44Bi2%{2m=mD=eo*i(V#B`1=)RjDkl@zfu)6EAsQGCe+iy)^RzYVuP= z1C!EV4=09=qvog1B~zgm-$XAOOLkPCT?y4N;zw7wZVB+#uewNGbys&b{Br5-j3V(pO8Td`#TIK(38r-_b^N zd-U{`eTiym!AfOONyF_+KK{&7b=&)LA)hhpoQ_RXy7tn&0R?!7gObLO37wQYHB=MH`HhPv^U++xV?qRPwhvwd5w0lUDZ)<{>6N zK#M#g3%xSxwi#3MuPO;$HOColZr}zUW=wA0xn}Z9X-B4Rc>HzYWNzz@^(j9xEgcJU zxI?YAOmx_niRe6aTYP6BvCyvIH_A24RMaXKugG1h#6y}EG#|$(ugn>wpy9aiF4 zw1=@+rnbNL%-r29qxVrD;jNAsObwYqLuGpO+OD(&_=kN`=zc5#V#5J^a1UXaN7_RFxf(o_0r-w5zX zwm+Tnl`~VtaF=d}!u~O==Q;bRHHdb~9`RZDa+${`6qHtit3_z-`*$fFdw&JLCm_z zj`8S1@#uqco&;X8`7&W+)`QqWkmrC4o1o2N=uSb0fNBF$d)F2mElB;(VQJ+_OG#4A z5^pIl^IaXD@c!`DhD=!Nj-Pfd{@dcZz;C_vzs2K-|K9inGyUzZixU6RZ~YJyU>P_- z0r|!+%YO%;41zZz0bNL`gsiS_cg?Z_J-Tbm+SD%QiOu!o#C1HH2*&G+H&$N zq*xDQlSPm`j>{O_>^oeGlC5PyZtD;6L1(V2@5Mi0!tWXzjw7|IZEf;^ zntSOi!+x!>_uJ=7Em(~sC6^fO|C(A8#m&6M{1oO#X+nEeh*#*yXZRnd zOB=JiI9@LHmUT`zB0gZtpNhN1s2QWdfznqGE%^OGJk`IwF=lnqdb26Z(?wXCA)i@q zwQZ-fL`2ipHA}B3qH$w5zn_Xk(4`5w*?iqfIsfJT*%{1eBO~*nLKZ4mgT9q^?B2K3 zO~m=ftk7bt0xJS`Dhh-geIx>i2PG+e(Jp3nMN60lrL_V7AmL@H=$I9x8Ope-TOqp0eXI_1R5KVnt2ZV4+&PfYi9V$m)-;^ekxUW75a-UF}SKAb^&lb z^`!d=OQ5_4YJG3pIA0RHWb?6AIuORxhp!5@Kn`8%dHP4-Bl~=gql~X4u}5pTZY;Bs z(TY$FPOyyV6LZDulwPt-sWc0?W _X0q1y5iN-X*QIrnWF8h;FpB_2$IrnDVRz4 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 Htz0%-X=lfK4l>f~bsVu@9CQjS?ebc&n6|5!kW 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

    7=E8)Xq5b}5{Qm)mqjxwW~tfr18kvC9G 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≈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 LdZpY6DdY)V1AquSaZo4SZ8iICsiyp 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 Ingf0QAGC17oB#j- diff --git a/res/drawable-hdpi-v11/ic_stat_notifyerr.png b/res/drawable-hdpi-v11/ic_stat_notifyerr.png deleted file mode 100644 index 1f97a9ed0381982b9fe8a24979197617a20ed915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)|Hy6F z+->$_c7j)2U}2J-nf+zve|Nj58WsDfit#jpfwC+k-z$tB<4?RG=29t@`C@~B0MkUG z5yq)6p=16IbLW8iapmv=U>#$W*B_Kwd-mvlZqB_IY2 znN%QxT4>4yx~BU?#6Q!n50000rP+{s%#M;=7A`}| zHA(JAXL_G{dV6or_kEaCv-sw@{oemM&pGE2!^||ycxVgA%+3G@Bt7fYhqVjz8F&t? zko2w-Q0)T!1V#eKCG8jvKo5Yqzz1M5FcavJw6|5bb`|Ocj%9~;0T+O4lDhvFkh`l7 z*y3&j)&pxKJ^trFW;PDk3fu(@cmuou#saS;d3+^X%PupsS-_L%#2>(jEXe0c^7u-& zc7S?-)6t2)G8q5Yc1b6aX`r>lXlB!a>%i0!pjW^$Nl#Ouk`yvC58{oUoq;L2!(xSe zXb{*BoRj2ZjjS<{nau#s0xL^)&I5&MSAb1T)oKJ}X3Mi2jyobOd zNuSD~>VUi~czJLuf@$iq`20ReJClLT%x}@7Ec5z$KRhTC;QWKaN7cD3Fnj@KOL|!Z zRjQDg?E;Qui(;5OT#C!W+})CnrUG3A))oL2DHU8=cFXc-_e)xr3gm?{Wa0qfu5xo_ z^D))bWxjq;(zH~dZ@{Qr?8NHi-IxOOUDD`OAV0u^*p&#e)+wOhk_z2h71Z9ePy9;? zy_Ym8RiQhc#BxC$$B?Vl%C+|`2P7>{1&WhmnX6)`lo%>aj#VyO3fwHX_W9ctepeOO zycpgq-AYnuD6yDb0#-GE@+nOfx-4mRa_Pu`76P|{F&(O9Ux6i({9#aNP1+BCS)9yP zw_EMENjg;q6Ebeq_|TY{9R%XnXe<5DAxZn{4y#otY+z=avqz!7yMi@oKfJp4N{U}7 zrCg1HGNtANhXF5)`L+3=cG!MkkEHu`%7pPGphztb_6^>WdT$eDbZ=9=hw_&9d{ywa g9Mny}tW)#;0KPy7G#IweEdT%j07*qoM6N<$f)8nS0ssI2 diff --git a/res/drawable-hdpi-v11/ic_stat_tor_off.png b/res/drawable-hdpi-v11/ic_stat_tor_off.png deleted file mode 100644 index 6df646eb46d61aaa8a6b4bd6e00c0f6b1eb508ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 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 diff --git a/res/drawable-hdpi-v9/ic_stat_notifyerr.png b/res/drawable-hdpi-v9/ic_stat_notifyerr.png deleted file mode 100644 index 58fc5ae800709365ec64e53425e161cc4ac3d28c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)x^MbRPR4~0U8U4{Tf-fp)=w!DGxy-&J@`}VX9$u7Iy zZrH^Ih`ihF3T;7TY9tc5Bz!KHJ4dFuSr(FAR;!iU#mE+rOKovD9MNz%oF>vjp`f-} zt&C`m$S#QZS+Q8G!Si+5g8o&2_#pDdve|4M>3U=WPN#DugJ!cS%z*e{>-Rqp$Ye66 zEJEo;QAK=_^ZC4VkqwKMUm%@Mo3aR1^n=l))KNhS#+t11comry0ND%1YoBxn_gzy0 z$z<{qzzrD~^B1vLEK4}N6TywQ4arqwiA3T6soVi5?4VRds;crT!sb-b7-btx#|HNC zW|vB(_V9;V>`W2(|AA2_Jo=CahtZ}WdJTNucs%}Wv}lQKbc!c1le(2>b)8J?ed=+7ZSN2OtlRDb|v z7c#lVPvK_^Fm0?&XxJ800+RYRJ-zxim0Gp@7X1SDz&V&UBHbqER~B4X*#1|1CcAmdls{{@59b>4SI)QC#i!`>#D7&$mgmscIle(!qASEenDmbvm7=Mx#;G>-E1~F4ujI z;|AM7ngOL!$!@V&E<)%!#D5tKh697a;BBMPxQ2{6<5_41)M~Zcy0M}j2~v)N4UI%?zhdc8kXj|x~KI2?{gc<~%;p}GLONKHQA z+}TN%?Z{vlc^y%o8IM|tgs#%@JpZxTY@UilB3sm1R4$jVLj0~;@qc1NNC;LHr~qW} z0_iTXx?|El>hT3O9i{^E`Fs=63)28d;bGB;?K^6a&1OgDxmHj#8f5~$Lv%r_@bLU5 z0Q;#HWipvNIN+TI0E->~aG457r_&4Qh<7+7YJ_ZID4vYPVxOo0vWYqz#Xr?EJnmBo zks-bskH?>kpI00efE>X~IowVLTtN&rm@|h(00000NkvXXu0mjfh>1c| diff --git a/res/drawable-hdpi-v9/inverse.png b/res/drawable-hdpi-v9/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-hdpi/ic_action_settings.png b/res/drawable-hdpi/ic_action_settings.png deleted file mode 100644 index d57b29053e2154ea744f4f596e5ef9dec0ae1f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmV+^0@nSBP)0Js1xRB!~&z!9JUT225L0CA3`2LuHYMR=AHDT?fjpFNx4 z;7FEM%6#6N89Q$iGt2xknd6@o0%LcubReb!RaI@k?+9y-^@jCejQNa-HFyUAehWZv zv36R3U-A1CBrF-~8iT+w5MDS?UV^|qg&xLZ5I9HPGY8OX5V$G?nhIc6*V$@F_NeeT z;`VmHm)H8b;(JF3fnFp)?0taP3n1XkYkgS)&n!U69w7Du2sravUzWg{1c<#45I+F~ zoO!J;MSuktYA+E8jnmkbW0b8JI`B6hWVN0-1c6Pg4=k%^z9d3DQsM;u?~;G_e$)un zAnp)syA^PW-&W6vAZqdlu(!G>n7rC1)*b`4>TUbj4yfvxLcmplK20K><*U+B)E@9@ zp%gunG%68V$SbM>I zVWr1oh>oH*u~d~rF?WObyD>USMa)U$gabfz{Gv8-A^}w$HC+Oj@x1@kgTPbDs5nmy zV;0gw(3cmd)Pg#Nrto4b?^lc3Ya~esnQc2y`ki_$DqL=v3er#uq+7j183k00000NkvXXu0mjfQc><8 diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png deleted file mode 100644 index e9954eb70c5f0c83631fe617bf8c737ae3d1634d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194 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 diff --git a/res/drawable-hdpi/ic_stat_notifyerr.png b/res/drawable-hdpi/ic_stat_notifyerr.png deleted file mode 100644 index b65fa6486b43a8fc9d5c3b58c607b5ed4b540434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 zcmV+*1>gFKP))Lz~PW>Vm%mW^Qh-C?g}2cYAyL zgJe?wo3eSJtgQU6L?S8N+}yku=X{kh4-b!05|E{D(a}HsQgyY+re*cZs7j@{-nFRTbBuoh=`CVDJgxJDa>M2 zR1}z*nQ`H_wzi<9r3ElM(i;ADcXtQv?d^00UoB;Lc({bDx6}a;6%!K!*4EZsC^2Yx zc^R6Un?J;neGMHQ9c)-wSeTG8Rzp-=TpZZg*n9~k1}`lwL1Sa1R2*ikv$K;8BYTVq zLsUXS!cU`K;_B<`nK*=zJ;sIw1qHo>Au1^;32bd`e=1XNJ1s6QLTzpBI~>A#dwbci zz`(#)Fhr%Kq=22B-G`{w)>c?wUl(F5EG!^8I{L%-g@pyEsi}E|Ls(y59~D( z+4<86Frd7=954&m@Ni^j(>nQK|LN&zsH&p{VD2yCkZWwNMvJAomPEJlxR#wIhBPEK$R#sNnFiT5IiM+hL z5J-+LXlZG2O^}t91(TDLLM)b;ii!%ZerIQAKuVMl`}p_>Yinz47^&J6Ha0fK4cpz_ zh0DuJVFGn^bucnA;)Z#8dQ#ZN#s(Wkp0OwlGr*g%tE(&FRAIwYt)`~N4RdvMr7-gB z#)g@ino8v4d|YN2os^0d>_Q+m5RJw3tp_BI=4Vq!vJc>e_i z1n`V6T=b-B3$gC*?od}($JK9OU;r{QGK5%!?dpfC(Z94-qF?o-K&fT5uwNKH+pC=s^5zt4v0 z>+4J2zOrHYz>N6%`hI0@sj*leF{5Ip#6Wx@IXF0A!}Rp@-odaV;_#8!&(H6F;c!nS zCMLc^;h+dRJUnE>baZr>FcF6@6Jn+Qs<6MmAL8TVnJ5uBp|jVx!&DRej!gT>7_|E-5NOF-OIc0=l6ZT-}@!N_W1+*tj`Vr zLwERKi^j7>)oS&mqA2N5D6}v)H|Gph^(+`E2jy~k#&zAds;b_PMx$cv0Mj&2S(dfV zIj=Vwjj3=reBHL~5Ak^X+c4Nj4oIX}EIvcT`Cu^kaC>`uwqCEF7DBYf0;p6fQ>|7j z%ow{62m~6IWqnGeQX2q(V*ymF)tiX;7!fJrx}qq$>$>-1u~_ZD0f-2uX}+;6Yo;sa zGR72L*Vp3l_~l_PcFjS#Tt1PoZOoOPVP)!6~4s>&uOCto^_vlxrTz7KLT5KyU9 z5{$82yWI|wI3h9tpwR^Yg`NX}09~5^a5ox_KJtV30&2C|O1s@oS(ZibP$KD)Yw2F` zigC`FuIt4}B(m5K*#R(3GvYW-mBeX(yOGn)4hLOFoq0{u80Y*}f8u)ptE;QWG)-G? zHk*e5z(qu*D}o*|g35Ub?Tosv|8g8>I+;xVkWP94rBbP|wY7DpFLK&*azH~*4!jPe z!-lqyj^hM9NtMa% zl&1F_3@S@iRX5Y=^dVos($W$YI|)hQ{*m7E!u&X{VHm0}pin5(0U+cN*|P&gY-BQ- zBZC~gN5qRB2QpgO)Tk(SbpQZshGAS91c9VJvf1qOp}j~h$mMe96-9Z1h|}FUndqKo2LQCC3zDtsW(-bmDFG#(W~Of{R$(}hCe%E+i44vBiuXf$4tQo6Qne=O;co}T`36etnE_x;-u@lyaeoJysnQtFxz z;^BNg|LvXtJkK-I>GTu;yw(or&&|!fFe2&(IQffK~g8SQmi>7H-0bp%rX6Bz^pj|7_vSc!uCjsF3D2nclq6p(Sz8=f6 zEM3WYL|on6+&trXo*V=k2&hylH;s*ry`hwv48zc3X3#%G?79mfz%Y!+G|dmUwzf`} zN~OPhA$@?hBx^wsoRo54QhkXUh5@#1pH)gd>p0Fvey7dwVWn za3G@hlu{RnXo{KBLM=B6GhW)?&gwX=ztS?M79H0it6 zkciGjQS=BRKBo_YWm#Vo3WWy;R^a>o?@Fm#0YI6i`7;0*h-heMX4ZGRr^76SI4h;R zLrQsE+k_B*%+Jps8VIOXtCyHL(;9JX6~~>^t~2avAmU}iFg}Rm_!*^CD-lHet5_`F zJP=T+RK8*6BW>fa0Pr0EoESE#dc#U7JEcCqu&{7+AfQ&Oy{^wP0Q`xFFAE_~NhxpB z>ql4L0qT^?(ozBdX*&_E6^lh3qjhyPxmK%9N-5U?;GAI?ivaMDQtCzkkld?JE7pGv zN5n~Hz6%j|5b=ppsiaqXKS1vv%d*}QLY%N|`y(mk_ssm_sI99fzRiC>48xP1d#P`d zmzI`}F!RSmlrc^7>dwy2c#^r$vI4;4uIqk1bX90$xm-&7Y`Fr2>@~caKkPqsmaXm5>eT8-CqXz41J@mudj=Zjg9*N;3)ve0>GU_ zl#b(g0}+2f#CNjU>{r9SG7`Nqht0t#+W}ydLdiZ`Mn)Opui_@% diff --git a/res/drawable-hdpi/inverse.png b/res/drawable-hdpi/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-ldpi-v11/ic_stat_notifyerr.png b/res/drawable-ldpi-v11/ic_stat_notifyerr.png deleted file mode 100644 index b73292ddd50cfa84ff8d5cac547748635a901ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhex1KJJAr}70DGP)Wj-;LY|Nnn* znjxwTD6|AIo)($Er7qd^d@A}FM}gg6L7OASFo&=k?u;t~XH{s3`u zNGKXiczs9Si-+BN-xIv>ap9hOKF&G!sdARIR8)`ax-ssiVF!Bfp_Cf?`HP5hB$d3x z5qk~M_d+77*(Bi>*5MqQNG8EpJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-ldpi-v9/ic_stat_notifyerr.png b/res/drawable-ldpi-v9/ic_stat_notifyerr.png deleted file mode 100644 index 2787bbb5d591d8f7ed79677ad684c54e432965a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd6pP)!EPK!tcQ7(C{s)3ekZzc!KY#wXFix8`?ZWr(-}RAA1}e4(s{04j za2RGCNE0U~=S9Ze-rlc&|NiAdb_dWejzCTSe*OA&5Luj=nfV)IXJ_YEpdg9{Ha0e} zhMzxwqG$lBBSS++M+b%tK(}52IR)r99kd|+#t77K7U(%6WC_;;AWguy*a@^&9Zm5K oU@W^gG&H<{Ck;}PIPH@+0Clf{*X*TV#sB~S07*qoM6N<$g2Fe8g#Z8m diff --git a/res/drawable-ldpi-v9/ic_stat_tor.png b/res/drawable-ldpi-v9/ic_stat_tor.png deleted file mode 100644 index 82d54466bd30372500c330d86f7143cdcb70f724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmV-s0h#`ZP)z968d$`{#MXcP`jw@$wA2$l6tQVw;^pN% z2~;S^%F3#pmzVbwrwtP)PE-XtrSJRq?_NN+GXXt)97yNo=H{M(X@c7@Wy%ywpx~w- zKYoY+Lk29*#KgqF&d&Y?$P5PBvCs$WjFTjYn z*49=>pkOW#8-n}{RCopG@u@)5w_$`54yRxU(>{3v0P|yP6!o2r7ytkO07*qoM6N<$ Eg5z7BWB>pF diff --git a/res/drawable-ldpi-v9/inverse.png b/res/drawable-ldpi-v9/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-ldpi/ic_action_settings.png b/res/drawable-ldpi/ic_action_settings.png deleted file mode 100644 index c3927fd7c79781cf98835da0e58392d3f3ad7517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 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 SddJzG sHQdE;IQ;kV@$m!4JRkW)hL^(r1EG506xpJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-mdpi-v11/ic_stat_notifyerr.png b/res/drawable-mdpi-v11/ic_stat_notifyerr.png deleted file mode 100644 index 935e2093426151406d09fdc9cc9fcde46e090719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmV-r0h<1aP)|hFjg`Oyoy%mT}$+QG_agAmPD7Z-V z3E>I{$r4h7i})%N$r3Rjdjk-w5eP2QD}6GmIJHR7Rpnn4}pM#*eDXAp|H~}6PZ3K0zdCqMV*p< zl>&Ux%)S9#xp1T$e3$ewdC@XJBk&`8;Hun%HQ;?wJFWTHWj)|C;4zIaT$}^{_nh@h z@*Z(xB>RDxbpZaVzRs%4tH>LV_X6+Ht3|?LE(s_*TxIPFh2WzZ@+VU^00000NkvXX Hu0mjf*!tty diff --git a/res/drawable-mdpi-v11/ic_stat_tor_xfer.png b/res/drawable-mdpi-v11/ic_stat_tor_xfer.png deleted file mode 100644 index fe291e7663c2899ef3b39b170b6c83bce07e9ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)UI9Fz_bMKrYInB(yv(Ns{S$nTNVvUz_@<+sVU2J=S zA|@B`0yqeqlXPb-0QZ4Yz)RpYupsG14k-5qgTOSf8L&jdl5VahU_I~vI0?K34oLdB zDu9UaEqj5xz<%I6a2j|bDcV75C5i|q9!V$P+K|i;-{_j8k9ClifQYapXMqV|M@@o7 zU>vwr)xQ4$B4Q(OC7pajI|+c_fPFF{=|?%f72v!L1!Q$tO6XdQN}8$#M8sa;X&YIJ z9P_{?pfkPj^ASm(8zD`njEG6#LWV33c?UeSCx9(!&!nV_b%1BUu{3w=ULW93+ThP} zTN<(})y!efB@NU8+!bBGFTmg3P3zJI7u?UqGHeFe2^>!^mn3bg1AGCB06X<7u)RVu z1KuR_6;dxsYKkw{U=A1pmVw(q4{$iMCJwW^z5m}T18l5Iz$3uJ%z8SeqoHm6Y_C{4 zzwZb3q>T20JyZ#>Yab``c=q%GhX5O>D6l^*pKs~H?*_Vo_rRc}g-U>bh=>!Zcy_3R z_hm@rrZ^*MwjA5a$?lX<;4+XqD#m~*NxoInsvCCx2Q$Qlu3Decu$#^vc8!@L!Zk7I tXc`~x`ES4n;1zJMta;WAGBnQ)Spgfkr5W%xVblNs002ovPDHLkV1gPo2Q2^q diff --git a/res/drawable-mdpi-v11/inverse.png b/res/drawable-mdpi-v11/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-mdpi-v9/ic_stat_notifyerr.png b/res/drawable-mdpi-v9/ic_stat_notifyerr.png deleted file mode 100644 index b149031561d91ef178199678ebd175b633ec7e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmV;*0X6=KP)X1^@s6IQ*`u0004zNkl9%R`#ao?n*-4Z8WYy8EQEApqbW(zhWUQ8~RlQd0x1IZbYusHK{I!$C| zjCmMGP!qv^f^{!uCMCMAb0w_T>kT2hBFOAEo6UU+>UO(hn1gj`qy)!#Wsc*FktN|= z0yh#621+K(w(Vc+=MK^6wE39~F~46sl^tJUI1$ihTX^iKro0xfGWFBA#`ntPsi z2}4bm{(cl>5csHcgCcN4H!!-8pwsD4>s|<)u4$UQ2Eb$`dE$*U8jWs&tEEW7VzKx| zd#>vq!pJHApj0Z=c`LWuZFHyhfN5nNgxlduR67xi^{`wn*LW+(9wJdym6TKk$64PR zAh@1*OevB(tWQKFQ1lMj*TU!gN7hXD4*V0p0ng5@xOgEX*Z=?k07*qoM6N<$g3i6n AiU0rr diff --git a/res/drawable-mdpi-v9/ic_stat_tor.png b/res/drawable-mdpi-v9/ic_stat_tor.png deleted file mode 100644 index c150cede007e230d2762dec3293906fa8f6574d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMv3P)X1^@s6IQ*`u0004^Nkl)*eB?RXK18Q3I^XE@qAf20+mp2bR*6_Mu^5n@YfSQAVE=VXX zEnS8!%CQ;%^f#M`h)Bin-@o(z{P{BxsJR(edco;}i4!MI0R~z&D=X{tf`Wo9k__nY z?^j}EWLyI@z>tN7F2gD-E8$*; zGuqnP?gBL^5pn@g{&7`Rl^li(T3cI7fg#>SgaIu;18Ol007W6te>Fgf3Ls|3Vh|{F zX98oR962g6QesO>iwV#ri9p3>Kr8~ppsafVm?jq1*47>%DKin_o#9X>0sy1pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-mdpi/ic_action_settings.png b/res/drawable-mdpi/ic_action_settings.png deleted file mode 100644 index d90f1255e77a74e368c5cd09d949ffb4c2aa4f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmV-y0h9iTP)4uymegPA3dCPslP}Z_DVW|u3Tc{}n~*j|Kg~Q&CNnpw$P)iV;{4fv z0Z1t)sOUmf^)7^XyDA*D0suH6;Zh~N0$|-Yzyk?KDyam(tZ#sqo)7?2Zvd3>;BvC9 zBiRnV4FEGou+1$q-*iGk z2WmpZ3QRPBmge%7SQ>~i96}T7*KCq8)E^qR-i3%crqTvS)r}N;0C+cRLx_@J$H^Zg zY`J6U1$7s&P(x@!T`%Ij2Rtf}_QQk)^?s0q1ZI7rHX)l-w<`b$$-5!VaQtfk0000< KMNUMnLSTZ?jFXT6 diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png deleted file mode 100644 index e45ce29a7fcd923bae8492948d5cf7b454a03633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2677 zcmV-*3X1iKP)I zMi}I@gBXVg$4x(R=+HLy?vlosEl{~=LvbX>vEB)+ry!*=hE7QV7l zMBzNuoYwjwg-|~pIk|4+P17K?yFiE|+Y*Lu=r4%l+qWG$bSP_(X9ZYYR=pL#3wEtl zG+)KERide6-wBGIqZD)RcS8>7Xnxy)g1kaFvO_@9gxCIc>fJ{G7$Xsn2(Y^J!L=Zc zw*WY^ZChd%Dp|{;V1^D~9fd0&m^hc9=^X=s1`4OcWgEiJ^*nW?>7UP!31CgxL)RKG zjslo$SNYgHXFkQ0Wdis<6%*$X^q;2a{V%nau?s;d)mwaLDjM2P?#rY@S__nyZ*vt( z9S11Lve7EP@rmV-_%J%WJ~TIXptH>n8X<7G+z9c0P#Ohc5aaWTK*-2mEGhi?+O`8X za~wCAPM5UOm8CVCDWR{AR(Y4pi5+_%L1FPYQ?%h!FW%gK(pu)M=O`3awtjax-6+VN zkTtM7`kQ`z%6sI;>EdA+06Sr6j;kJ^SB@57!A-NU?bUUbSSmpKMGyM@T}jK@ai@q8 z5sx+QFAE604XHW}2PmuBLP1^~t@63~Zan?+{g}6~BqKmrk@B@i*NdRkZs-AB+aK>)Vce|aaxbJ4%v*A|c<_$k_(*dxLQ)*x! z(2a}TEr=NLvnm=B3?hACpKLj}wkzO$FC#$ZlB!23CEM-n`qXK~*z&UqT(@X?#_5>= zVgiyZz}s05Sr%*swzs$8jWZp`+2LmSU=nI&S@l~KxIY`fwCR)Z)XVpQK_m`M)1fFT zG+l!cG0<`@fcJNJMqG}?L$mjDh!U4ICIX`G_^0PSx)Xp!oCL7Ctoj6in@0NLgra;r z|M~+cnKi|l7Kub4in6JA;%KS&C<)$O?sfIqfq zDnJi_uZ{G@%|BU*J1V|mO<}vv3xah(jRkHTYqscmMooP$}&YcE(C+di$zHagXaYpM)X-%tAPLfl^NCE zkYpa7^R=Le*G)_^5#mt8KfcWgeFrlEC;-y-f-Kj+vgZeI4DG%kNKjNZJvum!ha|;) zcq{-+=KO^^goMB_;#f=^Is4(#!SLXxnE?7TRi7*FDMiiWcMa{nfx%!rYp?(gh2rgO zBx0D^sHaWB(T}Wnvt@=}UmGs=w4|NOAU~c2=1qIR;8=&VbMx(n&x3PlJ zel-*^bnb-b-%AuI7ly7Yhg*O>SzTKFEC`-X1=zfG1@2hA*xKo^5_Oft7+~3l#Q=u# z_*g8!g$B^Mj_7h(@q-MDeO!x=dXpfGV2Rz9#YBC50oL5x?B zeSPsP#NLTwG((LApu4vf-F>Yo05o#S`{}BXG{}O(a-XyS>|sS&^)Cs)dQfXjo?3|C zzWYPCb6jTX32Y@vmiAVVltyGB?K{Oww#GWk7$9q z3rAMST8Mc?)U*jBW8Jf+^ugN<;y93aoybb)7k5@!-4{!r>QFF8p;YiJ#YUoS>u3R5 z+CE2+W5qyxH20i&qC4Q-omfKK0$`I?m(@H8(4?EOb(?O-cOSULT!Wpqp^yN5D5XZ9 zu^3UHYdTszgV^_Wdq#Ijd@&gG;X=DrA(*fFxt_l@T&(>O`!O-|*al!}wMgpR1z>$l zi1og#8;iA)41%2nsm%(l2y`5%48*kj`?xM;wPM32l0dcWs<0s^y>ajafe)oc;byF_pow{5cs7t}^%NOCcI~HQzf|J^mij5^zCo+ zoqK_od3J@tl+XHyjhIfO1{e|~GcKQd^VFhg4_{tXvWgJL1Th>kFR2QP#$o2{D=>LV z5oA$EQ@szmrb1RkXj;63qm-(CzIR_&uSz}8}TnOnK&*L zAaPx$bWUDg-lTkzU*dG-Of)FTF^HjSn!;;_+^wo=ET6MdmgUUkizGWvpEBo*1Q^5T jFJ0s-fJ@)QOIzXpwOB8FPuL-b00000NkvXXu0mjfXYUip diff --git a/res/drawable-mdpi/ic_stat_notifyerr.png b/res/drawable-mdpi/ic_stat_notifyerr.png deleted file mode 100644 index c4b3178e1eac1cfb48851466bb2968c684bd8fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmV-(1C0EMP)P000>X1^@s6#OZ}&0009zNklyO^R|!c~ELnq6o=t zG(3nP*YQ*h)z#WV`pcFd+zi3@bK_}$;nAJ327#^wY3cKZv_Pf zXlQ7FIDJJ#TwaWgjbUqRi;E#-YHEr{s;a64wOTC&YPDK4Ha5Nsyaf|9Iy#EY%}uHQ zh&qM|}VbUGbOCQ|@FZ+mofg!J@u&`bC?f*cM9Ha0fcZ9?Yf=Xs>Gv{ZNs^cgZYH;2f`NZA2~hK8`RvI4zckJi>! z*%+_ai^|GMhKPH_BjQmNC_fe#7ZqnRI57eYfrvAesAn3xz@q_?*h3kwUN zHSg%?kd3*!yF+enE?!?>aeREtBWY=A452z@x7%g&WME)`?TMIEXlrYe%@do=2C8R- zoSdBSNOE#AL#WX?@9OH3g_PEj647e4QoUj!gq)wB^GH%slHgx~jYcE7ySx7jBA~Og zlO^(7qk9(@7d(=fn8+a%Twh<0o}Qj}AsUSKXJTT4nX1^@s6IQ*`u0005rNklZ)Se~f8IO>VV@uF^E@16z;rqd0N_)j z(OBQDPAh95gt!F&%{u0|2zsvKyA4Sode*y?0?no&w z1Hcc@^Iir)@OaMvqs|z6rIb3w7$e5m7p?WBD2l!=Lw5YaWHMQE9OvF_HaliE6OjR6 zy=G zI#{lkumyv2zSVBGk5mA?UQby{rMew$6Gf-f;T1rZWt)h2dM^%$=wp&3XDfhyzyF{p ziuO|BOd+>#(#iv4>|q?orq%xxG0U=}0PvcKPVROKMD!UEFD6Oyy#g?kZnt~hah#__ zbjDJ&9c*&WZ^Uu@en%gai8M_Q*J`y$YkdPkjD65rKT%2z(=^>$*@^%2J|2KK Z@fSyf+8XdwEk*zU002ovPDHLkV1iRI>_z|p diff --git a/res/drawable-mdpi/ic_stat_tor_xfer.png b/res/drawable-mdpi/ic_stat_tor_xfer.png deleted file mode 100644 index 73ab233027c4c337477b9e1a79307c5462d8ac46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmV-e0;m0nP)X1^@s6IQ*`u0006XNklk#Sq_Pr} zAct^zl~~wViH*hCoxws0b_vAycHhVz$#E}U?M^VG#DYaG&qtAOkv` z&SL=RIgS(jOQ)F{1VQkOh;Cb!b%Tidj^ljX4Kx$bY&I`xt=F^JY+7r5({B)`^wBGhQr}uDdlL-fOflm#DT}-xJU_KuSsZeExYDhPR?9+EsW1N~hB=`u+Z*lrlD# zwgEv9T+>>=Hjfc;>*uNc2O=J`EXzc*;JWVGG~n%MG`a!+YHSPuCRDQ<;2I*%1Hi>h zCbM2Dm98cLzVB~pt&ao1>ec}wn>ESBw(U@B{XLH3dzNK=E0@bB6M#me@spVgsZ{D0 zGiMPoHzmXd5f#EPJc5Y*N~Kar0P6MnJ7zx5%uf(;5dg9PKx2qNL}KRj*!SM^yvx%O zENiXr3LzeZVQ93lccfs%Hg*~j&m!V-wOUpJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-xhdpi-v11/ic_stat_notifyerr.png b/res/drawable-xhdpi-v11/ic_stat_notifyerr.png deleted file mode 100644 index bed9e2157c03d424eddee10baafaeb288c7a1330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)@*NZeMVk}ELVO1w;tHQZQ4mo}wXyRFENuJ$-#`l+JJ@Sod7f_o{s?U>@DP4rf0$+2tz;b$ zKwtbhHk_7hT4D2r_x2kMiEBHT8v;){9K+sOzJ81oNM z@PU>y#pJ^|afEapC3;-yJ zkKqC1!|o42IbmaXpfa&Jz%ynn3S+cv788K>dO?mYQHKM(Vm#jxfHwdvB!C)k#SWq5 z0b8mh4_Hnpg-{A1+X5 znlyv)rp?gt^XMKJNfNjI3k{XawJOdrJupx!`afUli{w$NOx$2SDs1uBECySSNm@0n zvR-N`Z0%x&6SVPw4K+>O3tP++1VK;E2~8z}wfswq3}PGoGqfqe#u_H_;x2<&NB?pJ z5aH$Zk|!=23@5!GI7&IuL}J&*d^s+yztC_4T(Pke+eDZAR^WS8zsH{ ze@xCi0KNkD08W$i&b%S!0k93&5%?T9UeeZiLd*l;FJPx+^evKZUuppF14k#Lzm{}} z|Br~}z=cx-&BFt?0k>9WeP7@lU<2@`q*JE!$UFe{vZ27?$G~;+x2{P&5D~irX9Dj6UjiopKLX1neK@u8^8h$BEuYqH!wvBR z;H7m};6Pxlq|c^;nc4$q052BC{hjJU{=7!gGm91AA>i^BfK8GvS#$sqaWe2qG26DY z^uRyBDoL+R0WnDkMZ|f)Bf#D@MwI|=@+)weq|IX?Mgc^`F~D8GSq+BN0p#W{05?c- z^&TXH03yQut_JP|c54~A3BX-{2W|w`ONzb}y#XS^%i%^>)rP?w=XsglUXvGfU7rBf zN&2G?L@$7d@GkSIw6`h8v7vbecc}c>=7Fl7XH%VU-RLBJ0lXo*qR?!kZTzwsmAwyu zRX-@n+mBAt86YCo0_8?58(*FAa^SuI?ti`{d%9IR0Yt<;z(;_$##ub;7SDWLI91#E zgw{uX23AP=rL9v}0H3OEswkT^^EnTy;WWep9_kKBH;)F0h+Tkhfc+}Uyvmee<8O6& zFcjb?;9yCAHbJy{AR^8No-0Df{i=QIfO40i0Peq9((_{h9!Q6htfw^AVN(L-Q1W-T z&xicBh$w&GAnB^H0B@v&$t-{ps0^hs9@rx3#IXS10sAKzmvq2b zfa*O@-E3Erxh@yR0Bn=w%Yd2EC5dxLScyH*l)O^|Y?stjB-;=55%F8P>oh=J0#^&! z)Bsy0?K##1uE0koC3(-&HKE;ZObC4}X~kH8r-3yyidb7xj|JE)$)~+hIdBbdUqcn1 z=Q4V&r2EGL_^#*E%BHO}*k15oH5aBRWY)1<(ifuu7M7lfmw?k7yim9P=jKCm;AKgx z+DdopGMWHRO;;va->mI}e=oP!LjnB4<4fU2=>(7k6Fc8U9{^4E@IX0eM7Uxb!jF1K0SBc#aR~YT^IPBp;B_0{R$;qBjrKs- ff#%h2$picgP#0oABCi}g00000NkvXXu0mjf=n^EM diff --git a/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png b/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png deleted file mode 100644 index 27e8672576a38fae147244ad4eb2942d4ee1dc3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1337 zcmV-91;+Y`P)=++3`e1ty zO&($mc0mz)Z%cmI1H(Ay%)WE>3ETzu;hvej_xks0|5_s^xoDE>Pf-97aS5;|aG|6R zmc`{10}v7G0gnOu15W}MEejAO0qhDq4QvYh3%mfFA?cHGT4G!Ptg}H}D(U*k0$_9C zaln?SWFc@0urF`~uu#(6l7Na?z)D5LeZY*Gg1-W<0DA!I0P`dnP%$YD;6&g~VC@zS z?NV1ty1JP5P&|#U3Y=}Fo%$MZsR78pZh=?74>A=yzc0-cGSE)kJk@QXp1S0{6h^>GVfMbE3f#ouk3Scqt zh`E!b_cPWEe5DtFh*%dm$(aS%DO2&L60QsH0rvtANcz4HkO>2bh;0D#8&d-Z?5N^+ zaCW+^PmP!mfSU4Cd*1pWu(n1o3Z4xhBAga)26iu9!4oRS#+$(Tl3va=YZicrSi^n_ z9Fx282=BRCPnYy_&K{irBEt0GJo_kMAmbJ*J_oo((w|+2VLQ+@-^l=R>z0DOQ6SOwGvf13Ur+!njS-?c-W z(|-WWK!?d6z;h{eUXv(ElZsp?$>$H0E(_e_(MSz|sjyqZ`%^};|N7A8KC1xBcL4Aj zcW_I9Q-Ld5;^A&dXN>~Dq{}3&lBNZ$dzb*@y zY;9XIdTV<*6WN;PRJL*(uUaZ;>rpH)P5|?O7lCVAnx9JNkpaA&x~#TK_z?IK*bA`F zPgES}uC$)14)TOWlInx9|DDn0Lbn0uG!AeaEKR;^9HTOLCm_2C#{z2+7aA$@58ZE3$ec*Vh$lJJ3p+GSmT^-MSXoO}B3> za+aDR$w2x6@T!O~jkXz`^F2wJ1$+%0o+i;%MgAT5$x8;D=74qkSUtCkxLVsX?(jCN zt@E>4l3byON)8)!9`@9EzqFHY#DlAcfPE5EZ6jk{XAgRAfOgSoIX!YGfMkV30MGR| zPN({Yo(0U;UFz5Gt8L3VU(ifR{@T+ixd0rT&PEs1GLm_bU7!lY&ciZZ@WpsM?~jCL zqn(lkAX&k#p diff --git a/res/drawable-xhdpi-v11/inverse.png b/res/drawable-xhdpi-v11/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-xhdpi-v9/ic_stat_notifyerr.png b/res/drawable-xhdpi-v9/ic_stat_notifyerr.png deleted file mode 100644 index 7d1139c9b1387b69ca5371f1017d8269628ed4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747 zcmVb5Vp(Km^f%=5x8_QLf&5C zRtvyvpYZ^U5R0st?usDU>Bf(p3G320eTelk(BLt(KLz*V2xO}sDe z&M~{KSo^!;0Ve>I1lzZ+763$QD{I{VJR$y^q_P$+Oc4b58c z1J8nwg5;(EqFXw4)GPA9Is(7p+UA9zeZWis5dh?9<2qChB>8-P4IjSZ?FUYXM;zT+ z+O;@pQEY%Sz6IE$Y&QFMek23L8w8)@+Tlrpqqc4tMv^Ct))2T-T$u!I)C}S~zT4u> zCb+JR^?PdZ1pxXYm&2$iQn*_5vASKWv?sjmf(1OS2vfBd8jJYZZ z%i^XjF!Kb|aOw#fHC@k*YT5ohCr=>B7X%9ZJ;(Z6zu$ji?71)iM}J){u~ooTc8*{P dAQg}bJOg}%tw9Da%lmhCHiCQM$G!Y^f9HJ8_nhDP-7%^n zUrdqxs}ul50Yw2tfele05{WddtgLKmYipYlYIFqwfJ3dxWJ=<`1rDw0bh=8T(bzJX z%r1;HKt6DR6a-*+c=!OrFh4LN$z(E$=qE}`OB>-_hi6NBd;8Z70|DNYqa~3@ zYz4#&qCWu@rU7%wZnw|zr9rj=BO@aLIIB;kQgwh(!FdMH;qvlwJJJ%{&>DdB4RH1d z02Pp$d_|#vcX4s?y2s-YbWRKMRshj5h<+j-kDty)8O5BftE=mlP}FOG&l?~V3e_U| z*BF~&5WX``IQL6&&Z_`Lh%58A!GVE+eI+F&RhX}h#bV)ABMdXCR;!Jjot^Q50dN`W z@9*EM)oPzo)JscCH30pD{5LopjxSQ3=cNEG3I>A_+*+yX5&bWN!4O2Vxl&L7K4VD3 zMeO;Txp&ZXZd)vt3;zTF+e=?rSvkJEynHg}5H;}*X=z5s`z#eg(k=)D0tUTaA42ZW zVeivE*ONmOph~CHy+Y?R+ibS?QXoVFVA~yqVF#o?f~~jCM;2lZoiGfLI~^Sz-^G9k z0t^ieZHFNbD*Y4;S0HjuyC_H%QbFS_3e=92ybyxm1sEJ0+zF%i5cMIpsJV=j8f9f= z^H^&H#B)9fPJnFWx|3gdMp|MO+$?{{wfx@pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-xhdpi/ic_action_settings.png b/res/drawable-xhdpi/ic_action_settings.png deleted file mode 100644 index f2572c8463e5c8d6a7bd39fcad76933e2d3b3182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmV;-0yF)IP)EkpKp+tF9uP+aU^m_-fL4n@XkVJaSXTu=(yx+dQ$UOWNfEVW%7ImGOY6Fh%K$6{ zG!d|+bRK0GJbUGs0*(4r^1LH}VwHywZ3=jZ{xe04fVKD~ zQ!#Xh&27J}_sx821eEpr4&=_4%Dv#z)bH=E%0ku>=9qGLx;8h?au^D)K+$77_4@q- zzdHnkM-K=ym}43u3nM@;AnVOlR_Dhc0GwixHOoS`Q2KzSG*b>O1pwd%icMIQ`vQPX zrs6DFOaQ9lg{3%4P6ogt8S2fArLX!$NLz1f0Z8)b2A2H=?^D3RFx4I)$?E_>WA9Mh z10;oA8xxYe7y&f4#MmvY4gmbN*t}CftB~YbRvTNZk9M4x0$M>CK%n|v>k#cYW&|Yv zDtrd&wj(ErVkks8Z0-k`a@e`Q(D^A~78tqEFjp?vMMK2&7tH;D2W_4QIR+WZjLHDa z|JM>@LI8l|o1&`PqAhgVG1yj-`utEYRvCcgId~%Ne~wC_C;@c+JG;D=iZC$+GJw>t z$hd|uYrGVBQfO=S5K}-ah&?U?2-IJQIRcV@6;A%LblTVDYyAatKft8x6CQKnBEI_p y>{B3=yl6MU3?LAJ907qqN4rdpfM{J4NUtmi diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png deleted file mode 100644 index 13ee02bc785519ca7f77216d1b0f1f8b162d76ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5964 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 bb_M-{AS100000NkvXXu0mjfzl968 diff --git a/res/drawable-xhdpi/ic_stat_tor_xfer.png b/res/drawable-xhdpi/ic_stat_tor_xfer.png deleted file mode 100644 index 522d65308b9ab7ef0d394103ce811716f0b26a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1378 zcmV-o1)chdP)I1gW(m)rsyIAb4T65{9 zO`9#2CL;0xYJ(Sq- z`OW$GpDDsEe()Cihk1bc2+T)dJ^~d-AeBljwJhtHQtI7?hK7@~6|#x}1_lOR^gQpV zX_{$7d~^Hu?H|qtqGEvl{{GiJ&pU*OXqx69uIoM!kH`O-DMZBpsZ?r%@B2dlus}Pl zuCCreM2i_?b-wSnHa9nqR02~mfa5r|obwX^uoe-)vaB&8vXoM18Dr1x+`048oC4Uk z%@!_PxEcUHC8DJof{2JQwzZ|D<#;8|_1cOfFf=q|T)ldgxvu*y5j~Z4_^0c-ciFb> z&p7}QVMj-YQCnMkN=lgn7~`C;*tKg{dQJiK>C@@-!=`C&bX_+}M2mK?pIbApqcTV`JmFav(|qB$LUS znwpyDlu~vWhPu_X1n9yWKl$Xh5Q2md=K;VT85ucY+xGQhAVmRsdwcKXoF7+8t?_-| zR7w?eIvGMcv@FXv4C8bV1Y3*M#&xWp0^_! zjb12Zq#(fH;GocI=llL9DP_qt6{9l@gQ}{kzTlj{P+wmkOkP{i_`txxGoz!UCzVoc zx?ETCopVl>Wvy#!YC2UCpr@y2kzp7gd7ihv5+`{D`4bT>LBxCW_eUa;&oi0K%dM@g z|KvkVi9lap-)lh-9FkI+Gf6ySY*qgxh0n#A;igOG`hZM3X;j> z1u5mSJnCEoCP#}+Gt3A8E-}XThhdlq!|=hJEzbGHJ$v@tuw8H(I*z0Jb=eFHP%EPr zjdv`|+7JZ6lS-)@%4rzJ#aJv>9N@r#180;{tMaN^5z+Smup9vHDJH`?Xwx*Wg<)8$ zH6(vM0Q?e<$5$0if#W#Gh-gdRq8}0QpdK0Wl#1za`o6y=`%MthlolnT2qGF;;{pKmPZ#fv+A$2HJr;|-RSMu~DW$${>5FC$ z0DQn0dqhe(-g4O-7n=8cJl_93oQM`6;(j8^rENqAv1#w#y+0HM&~xC*l`9S+wg@54 zan6rODX$}9GXN|`M6CyUCQlf}MC1X0PWpI@A|iR7w?Yp_T^sr^b#-;I&6_t*m}~`S zK{ATK4VRcev2rX-91~6@n%86w&ihT$i+ZBLQyfU-5to&MQYV=0-z$p1Y@Joq k1#{tS9$-EK|H}yc3yieBQOp3jrvLx|07*qoM6N<$f`eFwuK)l5 diff --git a/res/drawable-xhdpi/inverse.png b/res/drawable-xhdpi/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-xxhdpi-v11/ic_stat_tor.png b/res/drawable-xxhdpi-v11/ic_stat_tor.png deleted file mode 100644 index 1451c50551dab5d7eff8116990e607659d992537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 zcmV-#2ax!QP)Qm7$n znyK8dB4{03Ako0J5{(v8!NjF>n)1YVxL596?)v=h@`wKC<-Pa!ET7*w=Q+=L&Lftk zk${%@G!s|`)S@A?0g8yTfqNu9b1}(wuGIUD+ z;H2YZIY#NmLq0a#CE6wy^;GLQF_|>DpOC{Yj z36WAKa|3!B@HOD%!npPawgS)2o~@O%VGcO%b5=l^7CjlbDDy{;051Xll!XBw2R2A@ zNHB}c0w^L3<%yDPK072L4gyvJ-kZH2*eL1uvrs8?Iv1c90>1?8R~#VT3fu|&9k>^8 zu=rT!!1n<51Fo0!z|_Fz0(1oM+nUM#JKLWb&{M2w*>@`>**8rpa{+oQ@XZE522++b zb8Kkm0`yg2bx%NBB%Ly;`pmJ4Ma15~Ex)!wz*~yG(if21-ws@mnVtRAU@|D6hO50MwkL9@9qkxN+dnB zK>s`abTB{>;kafKVAE<7JKEw7-Q)1HJegm&%(u1c_cpavlJ4*Faoab80E!4F-@gy+ zluxec-0Gj3z>{hQw}=MiP5uHnVF>5FFrX}T@eQD98<1;^`)i7UJi#FVxt-0x+a=jQ zCCdEGD)FIBxy0u&K0I@fft%G*+kwNe3H3A~}=udx5Hv+O|$am#sYMeq&N0bpOjTBBKFMA zt#+&E>_0Wjc^AzY8<49>o+HV}+MT7h21Uf1fvQT2yxym3)v5#MftH=Mzb&8Fcb-to zhi{Se-9C+_0Qw~Gfgal93EN>;^;H!ojb&mU@~0$yaBM){bG@!7pem8@C_isn(Z&W8lDg~-AD>$aAn%aN z%dnwUbzG%cRnUsC$275RlIk)Km1dU$=x)I0Tt%rfv8AR#z8li@_-V)dQUKlHjb8~+ zA7`AWTn;wi|QbasX;3x{j4*cL=$te?2o`c6@I8{&()OXs7mOM1?X?U z^ZO>vdTWrOM1-p=d_|xvO+Ke?!&*E<^mxYF&3{?ayZdNQ(khk#IvVidTp4iF&b=wq zICdQ5Kfy(y*G&b;V7#k;ZAFJoApFid`zFmD!^D1=owOQMFG(`7Op9KTT^T61(Uw}Z zmNlKQ4h_gqj*;ZL?B0?LD1+px_*E6XwrxoBEMgU?p#g1@)@d_2H?=4r_jRG9^B09P zG$4b?A=Qm7kDSL`#V!QSm(+VnuNw41PP(eWi0~bZFSQhK)|KEnMoQHnJNMHiT{eW~ zay> zLto##X3G1llL0D#@=|X=$7Z?h7i4!*eW2$P2b+yoJ0DQ~8Tdn1to3sPk~C-~eVdw1 p4ybKFOYQwKpq77R8BhzL{{hJGG-qOLbYlPj002ovPDHLkV1gH8j~@U4 diff --git a/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png b/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png deleted file mode 100644 index 59e63d4d5c78cf5e06df58cb97c568588bafed07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2019 zcmV<92ORi`P)_=oM~>9a%vb})8P5bW6VY|)4%_J*P&SmMJLg0ZH6y^9qK zkwg;_yAo^cEhg5HPu7;>@$7SUJ9{7S4qUkRp0(Fn^X=Jd=9`&)#FPw0KvVb(M_>w| z5f;)3KoK!Ja5%6uaFnFCCe@O=0%#%NSztlnPT-f4KAS|4x&mky;38m7;7j2C1k%To z22xi5{T|p2$ksPVcK|y}dSjA6niPOCOiq>b+bMt|`YkBK0 z&hal1u@bN;@GnWXbb(k`0Q~~E75LErr5^#-295#t1{Me216GvupSD5j3ZMmmCzJC1 zI@{g<4OkQSLHh6$U^z*zd@le>kI$LF!N6<Rp`UD7)R#x^>n6AMZJEdtz_EM=Hd zwy0lAI=@lP3r^M?# zt`q45pk7TQ;w0ec9PM8MW^@@{PXa*u0q5laWJ0@!B)j=eq;-HILXsjPehmCK#X7&s z(cWIm7W6_V==6}q*4EDeN{93hQ(ow}oDG=7UTtD4>C@IW*|SjV7L=_W5z7LXBsV`O zqRxhX0bGzM$meZ?)G9y`@l#+`U{_#0;3oyG*uXpl+y%^%^jcd$wE|E?%mtW#oo&hh z`0pxf+nSzs;0WB^#$#7ylcjE6L^udMAz4hutxC-?V6cI57V@-lv;46F6cHx^GgDC5 z^jeX;;8l|Ls*8Bu^-XX3>vejpW_`dFjB$!R-F?9Rk{)k*p~eA<2*9l09By(x?Iv;cA6h_dJd5u-rthiX7n^RRKDk_RdDGVrU^{IDf3 zM**#!cw1f4iv`AhYe-dq%%;z3Ia1Cx?o`LdfW6ddz_ta?KvR*t%w;ZaRROxLL(gUI z^%!s%VDID-^@ar=w>u;m*iup&pomy8C9mcywNmqgpHF9?6Z^*kJBS!J}a;~{*zS)*^U~1?4GvG66m`>YC`fHZ}+3ovmauveq zRUhK^A};*p<&!^1Ua8E!v#}omZ%g_xBDMmq9AQPR0CbeyX3m{*56_{1+f>}3>Ba=# zQM3C&9xwaMRo2qh3@n@u>&tV`(wmA1bDN*%tYB+#k??A?I7KHP!k4w0n_^csDy0CN0ey5rz)hk|HN96&ykY^6oI$O`KC z%`kh+eT$@PcMg{3W5hd%4X$2sA3fI(!S%tyzp=t9sv2=?|RZmq1 zkp63DN^)wruv9suhegs}IIC0boO+y3N%2bIO^tD2D}mw$DfSo?kQp3v9amEwIorF~ z^-h9#Kkni;O)4yJFaK8qyLeVy69=k8CJ_)M|Y`ZWb-3+yrd zisvBldebC%u2ND7Ag>S+PT0E+pB>g#z^@GWVD|srN$=FGt!)^?9<|{jHFl55Bg6*s z5J~5bT4>Pcl>tg1{R8MHf6mM!x}Y9Z@l0Iegu8?+*5G;cZSshC|Qv+h)#Rn6bQx{U#pKw3Ao!z@-(siubeD=v1IbbV73HVRMz z$uHy{pUT7INR;L2?k@Zj>UgX{6E_Y}0?9nfX^!nvuDGciI%pod@+(p>*!Wjlj0K=f zi-=eyvHH~#Ic*Xs6Vyi?kV#(-OAClxsn6MI**>YoYN|2NOAx=R%r#G z^w?#o5A!p#es@|Fr60}+n7+IYTm#%D$z|uUOKSl2YLYtCT;a?t$z|$;`qCOcPyPV- z%LE*7x++?=$)Pfkod8sMw;fzK1<(l4rvMrO&{qk$7iYR4o-P0Y002ovPDHLkV1kIi B#HRoN diff --git a/res/drawable-xxhdpi/ic_launcher.png b/res/drawable-xxhdpi/ic_launcher.png deleted file mode 100644 index c2f2f45d88de9a1737d5a337c0e81b654b9514da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9556 zcmV-aC9B$rP))?3prSztBq3y*?8)r=de8fPlS~~$GWXm&cV;fWeE#Mab1gT9D~m@Ek5BmiRp zVFbYP02uo|IRK&n!T>@53ju-)fJ0!gGePKPg4m#gu2lpYnITlWaQF1qdvULr(u$m5 z4}UEIbkRlk=8W(+&jJ$`0m1@+%>gh65Q+fk(y>Mi=+OZ+qJSDecUTbdsVE8u-uUcE zUpn5Wl|H{V09rS9ozYh?>|!wzIp3ILJRiWB0ETCAqC)@<>!ZRxF^BDq=)&*+W$!a> zS>z`zuRhTMB&?smeQqE>d?lh-1_2kOOTwry`>hPZ+lH|4H|vP-Uw7_&I-o+IS?}V6 z1kn8XOADr%rd|O-Tq{6W4q#-~XOf=*24FV?;RRz}#o)7>ci8EOk ze~rOpy0uTYNofj47Y8t6UI-m;79h~6PpL1J9`1s`{utH^zj^bcKQybJBV2-^O&pcL7XPd)^F%B2L-jf2P`|=-r?&uQ@YR`jO{b>q7E0=64(nSq-3BWhi+OGOfRQ}`$PTuG~ zZvJQ+YkRE#QNO091UgYT%Jk6(#zzbqx& z5Pu2a^h{4c{?th97@v$>O$;^9h|r6<$TJo|5VA5&NqJ;|8;t!d5Dfp~or61){36mj z!GKAhuUqZTZ&bFt zn{nkjBO{I(2N$>A!36dn08Ci}Pv48jo*Tfp3zDCPtyK(1pZ`)y5r{@i$j7+zf*3I; z3?Zi%T*qD((NoD_%rRvZME;QHZ*6T=<%fF?XVkl&2>=PD#TDNYApEp1WHj6OLGJh{ zre5!cKKDy&bbqE?%?yWs_a%UaO%X6-jShL^zHAu{0Ed1Xg}YhW} z+S`w2%#W6K0F|D7(~W`{eJrcn)&P*5xXg!pd`x z7+9GO+JS?QM-dGHGuP=bX5R5rRrjI@%NNH>u`Gj#SzK+8@2RP}6KGAl)jDkex^!OY zgkkyP_5qltE$Dp7P2rpnCa&;7XE+`NzD|aNPly;kRluChItcxo^+6}_#jkn+HV|bQ zMB(P1ntKj3?jci2TD|#c0nqa0x0*~g-{Xv-T&v)TpU6fp3Sh!z$Nx~{I?$9$b(nnd zSEosg0F7^m=>BYQ9V**8ktjx-M_Tr8ukSkiVqbbvT9zU$0J^HA;yXHqhXH6R$Y#J9 z6oB!U_%M25@GDZrdWhlZ3nFG-qr=$wUrrN?0xj>0Xy3)aI5NPpDTzXnfcaq4?rYm@ z&3n^=o?fenx^(rK+b#vC4jW#r>P2{vc+4b=$QU>QO6dj3(L&(CgxG7YXD;x2x$C^ z2s&lWx=x4O(SW_0p}UgBK%|7SD2dp?rjIr^c2_^&n_;UisRp1}HmI-V2>@HwWl`PU zX3Z-?UY-%H%~sfY$er|6Jth$Hf#v%V2{2H22Z1N-!Jx{r9PY9OqCm)3zwhX~>zzK! z0k!oZ)c~|=@wRK2AkvXN>z3wZi&}BV6}WQUVmNGGv^87M+GIgPZ6~_g9q8_Kz}oGC z+v7$cEG_ZLb&-=}L^w=8?Boh{;&zsA%6!6XhrRi^PwM_oSuG?(`IzPSb*KU$+PWa< z-s;Ui*EZeso#j}zX5oNLdObl{yPR;?y|7vwc;oqluylFAL=g-O0{x@YL9fd}PL2U4 zV_wYvb+rC-gd_aB19|vO2CCzbIbvYJFB|gI&jq@&_%f-W^_kD<#dMd~Cjbch%nNH?Q@C zJhf`shf)Sm*^(_+AgcQx0EJwulEp@Py$%mNwh^=EPvPQ%2SC)(v8FHJaP~RGxO%2W z0!)Tncwxf9(!_s{Xg#R+sZf$5y=OX5`dPMTwiE}=`ApU(u_4vlctWrPybMk z`~p5TjTb=eT@7gORF-*@X~mi`(fet``p!&kyZ{o#C~E6JgV&c_UrGk341*~2dBX>rTPzK40&wyIePDe~ z;nS-Zmv0jV;Yo#$XZ*2QbBpk!M>cS8UvdCMZM%BRXlXy1(zr4Sq8@kKYadm=MG2e~ zJH&s4>^DM15@_lCjRpC+#D*A!iCij4|K-y7xDl#61bn?=^vlPJ6RcB$_zbylu z!sL(~08zhAw*?K&RftAYi=fC9h&pVIJ3cw~KGh(wDV0J>03?(ZSNu1C4RRJETWuGf zGXuB&pcI88<>z?G1yFn|YwI`$QI5BDfXT@Oh$7KY*RJX}uX6dUbxNg>Yyg#&Y?%Y5 z+XY~Bwm`x2UP_Qya?$B1zhfyzk5%S6Py!(Gt#w;kV#oR@1rDV^nE+8u+vh*5ZL9np z07?sz&9Hm`on7%gh_P57&C>7@`B-^PF;=cGMqWOZeO5+F02F_d(`7+x$1zzJ>VddS zH;7z5+n#+@Z*B0yPd+l)3Y;teQN^$+IpSN4u}hRKNqV0$nhYqpU=~)cFTuc*lXD58XXxSnZvPw>1J$y1e+uIuHHiu=$f; z_31&f0`XN<-HX5}66z|{dv4h+m^j8U`%Zu;y z*>>-&dgZ!4*M_Vky&M1utBNaLVF1-E)C5hNIRQ6pzZhqpeQH`9l4=8pCM_Bb!`xO2 zo1;s%>myxWdYpuutV-P#topd;_}si@V{xq z1y|R(`9`eScrHq>ErHQQ7wV*s(gmP6$K-@1X%q;`tIm=R5VhNzp8d4$y*vAY&A9zz z`~WH`|1p?wSNfJqy62*k$6(8Cm*dQ{XCU2$Fho(rukYWD)&}JcQt1%^!H^%V?RBs_ zyLp-?v{5&n$QSe++Ex2nSs)M~G?Raf>og_QJ^+_MsN+ERm< z$PfsI5RFC=4o6~u4262_XgN8$Si;kveqMlb~l4KBL_7l78Czhzt~sH2*EQdPgyKvdQI@$L0pRg}p}21Tx5GcEvKvtawV zL1UP_wi$PxPMtmu|MtKdOgSZ?u8PbV4u>M}2LcF%!m(etPR})LWD-C$B$7m=6IpEX z>qMymqK2;OUmR-w=s&6UIOKXU z03_*LEq7`?}Ij zDYGPJvC8PjEY+v2GWnFeNowx}+ zl14Bt0F^D?dJqCTL&+fIK0|ryl)o;AVv@)2OL@!c|ITa!i1;BxBc)E$UnL~hi(lEe zYqPoMDCLZCoy7P6R9r#VFs9uGG;zvk-21ERG47-h+;f#K@DKx901)v(@kGt7l#MKT zC>n6yp1wM!!4iwzORmuq=SxE0#V|byd#m! zaem{jD{*-#pY$PVVRyJ8=;VuZug4Fc&yR383_&7tQA+@#lh~o^Jt>98@_?wm>+nNW z&HH}cXA7d#XH_H+og=xxCiTLBzCUHwNx1*f8$iZGDI)3Nbhr@_dmW&>L{@2+%Y$Gr zC<&Z+pIQPC@kG9|&h94OArIJ23Pg>aM}Bv# zNsxeFmfk~(w$teb1bGrmYXG7eL^a3ur<}N$3`7YMh$c(&-VLtba9ME$9qFXS0~Z9o z+K5hE5C3ipMvakHu}EKWy4~F1A%)m(b0ZiE%92)El|aN-Q%f~0Hf469{>w9vo#$sgQ&LcvwLdV4*XGV0Ffx0pbpDl_Ch+$cOP1Zk_%6h?3&_u z$j8MKia~mk-R49f7*GrzVn~YsqM-chy8W`lV3SR7B8Vy*_uOXgsd=f-=%mgTwyL<| zCQv!d5TdwqF#)flHgp1WjV|;`3+WuAf{Z*#kun+U-v0Db!Sgf`Jfh zHm7WbnY{SnP#BR&G$!RDVG$qwwFlOAzAaOVFEzjKwzS54WNH&hqN>*YS9e$&=xPKS zxH@*ARf{X$VFE5!o8k3aFTncp3naVsczg)Z@moS;qc~@a#UU$ICLE5!>-8fNjvTi= z?)|G(lK}GgoTxpvUv~VoI4&{LmE78A6#xXx86g?dvb>iaG!3BC9ML8TpQJOR9aXv+Cpk-`+x7KZ1`ZA%kQGV zY|Wz`X0q0EKe)mc5g7zHv#Q(vphX1%^jtaU;=q;^fgW1v-CN z@{+q0n(E^S)gT9GcejPh%ItReVsX+^$9pXUh;$&*h14Xc&-TuN#$B8H`cyBRqx9_Z zQb816QBgZg!LptKy?eZL|S_Tjm zW}vddY7t}1QQ5eAh1+k7yZcFjmaHGm51_Mex(8zPLA4mZru=+dyES>7e!w4s)9FHv zF?n(q9mgF`XHuou?+?Kn3%Zv!MxF=~$m4ayJo9RiC*a)uS^dsy`@%TLh{#o7fg3<; z7JlQ(s6OS_Tj$9+ELpEvjofP|@ya{###v>K0dsGg($#K^nR$ccNZ>!OObA>nTjr+c+h$BfMN#d43 z)RUS;7Oq-ff-Scvcdx}G35_ajVI-v@GOr-eGJu?JE9x35B^Q{dfz{phVwHIx6;&Xj zqb%t^TwY{Z09sSBb#hc>A45ROMVRUS3QFTiMlmJYFTDQb5{OcFdM)() zq-6l98CX`|S#@ixwf<$f`VY021t5B$w4`E(z;FZqG7Q}E>Sx85s8M{57d8nr8n%2$Nq2`5aSCcA3%$?T`TCs z=ahgi5iK)LpM-~>+$?#lCJQqp(szP^Ff0~Z(r87B^C3NmC!#UVr)5^E~!KJybQ%j4U^jr%Q(=ANm|^(Orz$X7qBuCOE2F#18p|wA zMs(blYLoc9mH|X=4030rNbG3G!R;NkMl#P3aiudSzEidYifvB{6+uExSSd_Kvo$K&zC?Uuf5hE8K-50VPypmAyy zKy-0S_0f-G87HYwi>?004INdKL`X!ZFWFZ|CE(fJOze$?1-Xq@HkX^k|qAwZy8UK9~sTk!C2H)HCl$* zcdAG6(!~`Q2m3j4pDk|rtxizxAEPq9 z_xxi2Nb#iR_o?1b zAC81ts?2-Vy8Nz|KE4QvBz+VOG$jBL17&A!nFE9F?*Jw$nW)@610Hy66Hc9-{Bb!2 zrAVq!CWllW*+BeKS~TT|MIs`0zS54KR^`8RCG(N&8IqV(WJ+nJGTNe=d+P3M>OS&h z!g~};AL=7z08uBa7FYa$35ds%$euTz;46L&eJ^-zyHd7GU(T2*{ zl?Y168+3nisAbQ_1iO!7-6#HjRRFYZ;Y}lgInh5049k@aZ0v+W-1lEMfQoD;Bg!JB z2t}z7*LWYKBvX#O0^Kmyh1LMnV6KAAE?Mtjz$qlfxw>`#HmkcU9z;Y6Go8Hn6vjao zMil_XwzA&)rCMnpbq zGId7TtrQv?mdHfy|6(mkAS!J~CGM1v!)JY~wsHTr0tm#jEGTW66lZ07VFDAX0%+ab zb;d~k@ZX4nutmv0DMsk#?<|+J+D zUzvKwn6I*N*A;HRy}s`Y+PX+_mQ2~2GyyRdsVLw$KbjUK z5Y>mKtDnd|C6`=2>)S`#KfNvC)I~N4Qk+xXy5hX3E`j15mlc<90)#)w9W=G)E&D=k zNs@TI{7Use{7`YJUfWM3wta?zy#~d1> z*`_I-y882xHUN>YEYv*mB|uyyckpzazx$`_LANyX5J?hGiXa;3J=we~gEB~(TdEZW zjZv6tZQJMDE$*(w%tKkBsyy>fZPErH>U??0*2zXNN{LRMK{x=n3(uK>JMLSJ{DS1= zU*eC_Hbm(?aza+6CMlZ$B9}#LN1f~{WTGfK>pBj7yVKG1cEb2bVJ5vtwzE`fj?xOC zm{Q$qANn(Z`BKdE|GsR)*|>iD#mLFwySI{bBHGU6D%OMXl`Q~K%1)!XDt5cH9Ab=l zo4RX%V7Ao0knkLLnzEdCrCkR~WM;+O4GWBU1oAogj7yrd=sk&Zm39dff7!}K+lzI& z@D2fxE{d4IA(g@_zkMmlM#M{G^P$3-@h}ZuyHEfAGcAEgS#D^ql3fEj1|Dm}!wsEP zbjwcsxTdPTXRx`?7=Va@6~)&s(ut<0^}3w7ykMYqqz6^pu@o0ApU-u?kM~VSb*e^2 z?hM-2c;cWF`N|}K=pGEpw2*t^Vodb3S{weOq3iIDe&C^_o9b0K`>$I@0Yon^E!jF> zC*qHC4UKe<*oK=g#EPpIOU4fMA7n3(dhd^?3fcx8DSI!T_4fQMd|aR9|YbXLU-T@L##gK&u)Nt9#IWA(-*Si9*w7>vnFz6{iF zJOYujG6+-@&Pre!OfqExKvXEIxwTsMov2YU($&yabx*sknIb~tlu__x4M6nbb#uRY zQXt>|h)&Q^sd{c8lVW_~in+Mq=1VbZOltSPP>>p3JV({bBGKM!F3FfkL1pxw9ltt& zPP3v&Ps!f}y^9h9sZgfe^qfG*S6$zE@GgtH>(gw4C#wLWmtVE;s(fdVZ5wVH{k?QMhKy1vuxTdE8r)c7FWkh zjh(f>^o5;?cRrDKowhCc-d5S%fAs(%Nd8-03yez%VmviDyzh}000FKNkl&dWL!>M>bRGGAtF`{s ze!eV9%XdvvbHTTp!*kL!n*KbY9!b~DkzNeJ~96U`l1E4-; z4W|_?Ty^S6bN(0SxbEe2XvJdnwH2_4Bgan!%YnyCE znew%)?#@^0d#Zoo|1yh$SdA;oq@bzpp5UGLtm{C7Fe*$Med?0w6HfpBnBfzskTlnE zi$LTLc~LMd7w26vAInyi;EXd*flkL?m9;-VsQ`#9$pjpWy&b`z{MfBP$alEKdhC&Q zTO;|j61OMvZ;-wtZx57%3K?y+CV>)IA2nj;#G>n_O_+OYzH!(bo-z4?ZiFJe^J>a9 z;;fRHC^>Hq7N0vC6N}{QNOA!bjYeV>Gn{Tq?4EbIdJgd&6(hE8XX~?VmSey7hP?f6 zQz3~%_c^E*&%-mX$=YZbKryy+3QdL6ri`DxdFr^+HW_n_Ndxv{cAk*upCF14oR0eo zOJ-r-nbR?2b`hq}oCGpVN|6+RNGT@i;`6&eRa0Fa8~lFh`#J`CFJsJO@pQe~WY_+IM(if^;IBlE}2o-%Ic4U@;5veuZBJ9V%z4+f%mdoo5& znKm9XPMeIPDPu71q){lEG8SXT6(TR+1PZG)nT()z1fb?Rdn^x&oUFsicDv2|jK$qf@jLx>8akR2aOAn>l`IzcDDSl&D%rQF!%4607Jl`Jz1TX$^-{b^Aia`{}dtwB$LTBZsLejFP}JS>asC~ zCtaWy^j|49_B-x!T{e`@26%2y#zcCo%}q zaqWZvPMq-*89?zdP`F|)ee#f3FrskGype_D7mq3!w_s$!*aZf?X{tZu(Zx?^yuYke z+A${Dd;wRL!*AQ~_FDJb1D48AC^S$i4M`Z_^~PDbhWu%H#)6Y`^aiTz$ro&$97$1;MZ0`Kk2x6jnSDWTgD2>& z4g?)FF29R>RfBCoByHlrQLcfff^wCf{W<|CaY{%k5s2cSe;OlArov%)2IFLtA#Z|C zrypNnC>*WR31cAWhMNqzd3v4RsAGbG0eXSVG6D-n#b_uT357*5?2C$mJs9y>L@{Ld z2YhXzh_BTf@=|fiWQs0*N4gCGCk`H!mN2{Bd|d&QIIA>9L*IvhME_2I(>ZoB^pRwt z4*`chC$yyb|FDJe{uBu~B%%6$$V@;V`ab@b`iuiDQNqyHME^~H;~xS|{6k>T{0WM8 z!jiR1=dVx={)YO{_zVmINaG8nb@qk;r1cfjIDbO`()a>toxLFdX?=w>&fgG#G`>Ju yXKx5VT3;cJ^EU(_jW3Ya*&70o)>la5{QV!8W0jC>M+iXx00002|GE9F3GiQgu<3!O2Li4@GlT*zVBqde4+LJqfCDr=5O4tlcW-(i@Dc_b zAXE>O%jG@*IF?8x_6M}fb@xyKCMPEk0Klz+Ago@uZrwiDRs?7mD!};o_&0`OERRGY zXL+8#Gm%Jq5x_QAT|)&J8yh=r7{(Peb1WA7ytTEpebuT}x+_b3HVPG>P$+zii0xzx z$8k)OqAIdVXNtvQ`3)O3^p#4bl|0Yy zV2mk=MB@veJjxfe9AR|Rld|42L=NV%ME0szM0CaYBbrsK905WWJbo4Qf z<6c2TNs^>8&-0fkit-R59zn!gdU|?h&S?NLZpV%tcLP9y0HdR$7scc8KE~MExw*MG#kehe=v_m^c@5aK!J^S9?FV}_O&jRy>iX3$ zh%bP0xxB_Oj3HH3+f-F`n!Bb4%nqU`(r!J)aa?x&`t^JKKzIV6T+j3Tgs$sr6-9v> zEB?2YuIB-Jzi2dyJkP(V>-xr2Dpm0U;u>Ihc(|pdrDb2WTD_-Qt=0+`%JqiLIC>YY z;ZqMiVMNJ?*NLWUQxD6sOySq?aRpE+m9{I2(pSUyKX<3ahMN;RYM_>N3lIazWU{}Z^={5W#bWU; z!!X{iR4S6q{W<_}RH!&;p=K6pq@744Qsp@AfmAB>ej^A+4-^W8m?(;eXJ==ZdobQ0 zF)XxqtpPh!JRU!$s_KgF?(R7!2uFZovDl#~$^?nf@{kB9*6n>MoT#Doo97TR=OLhI zG)h@%(iea%%iPkXOOI5m)oU#Skb$O=ZlHVv(BP6JeRbx{nHywTHnp~hrLG5d?b@}n zTCE-;;ac3QBO>o1oP24(9G?U&Nm6@fXXhvNyx;^dpLrUreywn_rd9HQ)JTX<-=op! zKxb!X-HcQhpin5htE%d~mQ9GV4sY9(>>e=%Y_<#J0rG?>iU+#8yYKVtft@>dey6JH zl@8%!H{RTdt&ofAfkr9R{#_Ks-y6k0BY^hfkn*o{Hy77dbJ;bwYsjq;A0=4%t5Erx;3$vRLb-Gv*~pDMLz%+ z>$*;N`Eds?n1zfr8JIgUb)&EfvJ=npJb#6GHCYS7@idyx=l3$k9=8dVglo-4PIW<` zEW{XlBbUoP;p;R?o$~p7I{;%iWsG>UW(#SIa^_6A0RS<-&0I(Jj zqXF)PDv0=krfJW~vV6*`@t!nLYw&H`wk_v4u7ff5C}V6{jW+epLZ|6B1;a2Vw`|#R z%#Y!ovQVQ5=;D{^X8^bj5w8P)%Mo$eg0LxDokqm(0pKVien@q$mkV5{`F({@BcOlt zdlTT_T^(!%$(i)}Oh;59@Ec-n>g|K7*VRu+y z*I{?VY8n$;sUMA)l2~nPs>Yf&O)MA{sUb$Iwkcv_>@M@(yZ0V*=uF(aosTy&j~bGB z|Lo3t=brofov(ZDy$IL%gV#8IXcPE6DLlr^L_uM)_RQ)!nm$`mWW1n?AY;xSf*@JC@})l)6*M^#o|dKTFqF55a2k@ z%X4#c8#0;9Y?Juv4!dducxFUoPi#!5(`PuuIyyR5&CbqVNRm)u1dbdza)Xp|+8A>$ zV=tS|^Spz$ZJ#s7Y&FJgAflt`bb7L`X=4f`Mu6v=n3#A_Ykdp=mXznWZF^P-L0ap@ zT5Drj)}ik1?%|mD>WU>wpin3*_kI5%Aw(|`2}A@U;!rC8eNG6`-PhOmo4Uwi3M5J( zm&nABccAM0Dri;NY)fVv8k~7y%-}ef##MIy*bHQtB~d%-!=5AmU$b z+g{z>-R;Lh7E>rO0z6-d1TI~=^psL+O9aCuA;il5{{G7`vBeTgj6eyz?Ck86TI-Wa zsjZP5@KdSO+ODpymt!G|DU=w2nVA{e_x+otlpphbf5;f~_DBvuDwTQ?0LCs}y!b*c zmz#@;v8Gre1dbm+eyf!70V2A?7_-LreUHIMA1Ni-w*5CL{!aOtPe{m_h_xx zhGDo!Ydyc-N9+HB-<%(=>&_wK?}_MZVHiH$OoBH|U}|dWHURjtG3K5i2$t8gcs(-W*QBvh6qedOuSo4`Iy#vT@VD7R@%Cjk0y5cw`Ezzah$VZ7;fwB?LA+Q zc=>y50#j2{?tnab6c(g_>j2&Ky<2+ z@jUNw-}lp*Oy>1!Bx-tKa&mHSu~^)DHR2u-PZQA}0pPO$u(A?BDdm4$*L`T`&YjZ@ z6W~==YyEH#1RqTzt}C<^j~in~j4^j1;z0ngD$V0K&QAg0i+z24uU7hA)dLd~6Q5B^ zO)8~sxC-IJrxtUb=RK#je$@B<^#E`W0IYa3s{Xf=6GHsUah$LA^z?kcQ39jfRnFg_ zbIT6^C5Vv$#kF+D%=JpCZxPYD zsK*`0neOlJPd7whe0=<@@B3>b$}W4J$H#^YkXvRhtqZCMB6je5?vuFJsq@$7X3iLM zISj+E6VXl4s>B2b1_m}XL||-e?7Y_c$|>9YhpjySsnqxL_iFDW>NEhHbsQ&)i1!zZ z#ZLo3DmteS;=<6-(7PHUkk9AOmyZeKghG=t+)596p0{0Vy+tXt06gnO#0%MMwlM;u zqodpruCB3Sno@W*-IZFF^@^18DI(ey1i_+e)s8*TFoAqN|BNwaa}}kR5b+6P%&kI* zjnUFquT3a_=SZ_Gi^4FhX#_<4SvH%!tDz7&eE9H));b$0qpX9==!_8JG;axwF)Nx3 zpV-5sl!u3gh8RoyGCDRkmQzaY0f6~g%cb#008sEeZ)>qw?5aR8Hn5n2e4ctRlgaFD zh(JD{-)xNGy1cR!MhyN%%d&=S+g=lf;a08n@_FIHt$_Dt&Mi0-EqASph{!1eVL|?l zh?0mbM6@b|-`{Q9-k!;1o@tZ-hsHOJF&{4tRjpxpFXmi55k;NU+SBEZ7=eEwdobpa9IMns|K zd5@^`o zI-AY@u$s=A?KI!2D5XY;sEflwN~s*jdCC~`4W-myi0BbSd{3D~sb<&QxX zrBw82X3DnhY^@uex;wIwk&*R8^a}vEjsccPoCScv}@O{ zn%A{;3Gg(B4jn20z=Hs=s1&b!_w|}mifi~ySD_Md7=Cy6?%kiOM>7_Id_KQIDK&+N zpR988lH}f)SNNZ3t$T-uhyRoa0akM0z=2!%>If0J#csNNsIxg@@RM5WiQ(blKi30) zCFkM@m1T0d++y3dzXJf9$~n=<_&Tz00Kl_h7~Yr5<@o`qqxfuW!#|RY${$s86DbMp>XyxXgm}qy-9I#A@#x%%5lA8tn$giF(2UiR9MkqdlGbcSSK9;4SS`sh qZ4V@A&1Q79JpJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable-xxxhdpi-v11/ic_stat_tor.png b/res/drawable-xxxhdpi-v11/ic_stat_tor.png deleted file mode 100644 index a78d29076417377e86a337ccddaefddcb2aad4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 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 u)Bv;{#8!T84Zy(YtpQjAFt7v$ZvH diff --git a/res/drawable-xxxhdpi/ic_launcher.png b/res/drawable-xxxhdpi/ic_launcher.png deleted file mode 100644 index 74a31304bfef267c8b51c94655acc2cf44f7529b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13297 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 diff --git a/res/drawable-xxxhdpi/ic_stat_tor_xfer.png b/res/drawable-xxxhdpi/ic_stat_tor_xfer.png deleted file mode 100644 index 8f9677936ad526d599d69f54240673a35537f19f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 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�yqF(=(DWo4ic|UK1hK}NwPb|Imj<|+<#2b_rt(XJqC~Nx*c$2WzAw#Ak zjqA5fHVKHOoZx=nNBvfUtu$<{q`iQmBjk9MDXlqL^XGq^{-V# z<^6C@g>|92(W7D+P~{k06*4Vxg06KL1|2z+7PhkfeOltqpJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable/button.xml b/res/drawable/button.xml deleted file mode 100644 index 4bff5791..00000000 --- a/res/drawable/button.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/drawable/button_off.xml b/res/drawable/button_off.xml deleted file mode 100644 index 18da2869..00000000 --- a/res/drawable/button_off.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/drawable/button_on.xml b/res/drawable/button_on.xml deleted file mode 100644 index 348a6df0..00000000 --- a/res/drawable/button_on.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/drawable/classyfabric.png b/res/drawable/classyfabric.png deleted file mode 100644 index ca3d2679cd62c18b0f30e1d5ad006d37ffd7ba12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8856 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 diff --git a/res/drawable/ic_chatsecure.png b/res/drawable/ic_chatsecure.png deleted file mode 100644 index aaddd883f3fa40274df943081e8f32765dd4cbe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4013 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 TY%VFN00000NkvXXu0mjfOvSUk diff --git a/res/drawable/ic_duckduckgo.png b/res/drawable/ic_duckduckgo.png deleted file mode 100644 index 696dcd6e85986b67b7a5f2d2cf55a1f8b9083ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5042 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 diff --git a/res/drawable/ic_launcher.png b/res/drawable/ic_launcher.png deleted file mode 100644 index ea47373935d9e97cc1b026de901c46b9f38ffb2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6055 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 f^KD-8!RQvi4Yx{E6BE@Je+-=*Tp>*+n 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 diff --git a/res/drawable/icon_story_maker.png b/res/drawable/icon_story_maker.png deleted file mode 100644 index 9c54ca5677c94c4d93cfb91e9053ab2294a64195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4290 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 diff --git a/res/drawable/inverse.png b/res/drawable/inverse.png deleted file mode 100644 index 65eff2c741b9d704a9c97c6bb31a2046d7a3de8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmV+e1pNDnP)pJc2?LC(yNu`wjQ7jf` z-EQ}j@$vDKe+7s{B5wkCs_S}ZM@I(&fdHDCnvl(AF)}g&P1A64a)RC6-QxE4wq=^; z<7_tj&GhuNb}L|LXy{|c*w3L*Nb2tH2Im}#qJS}mjg1Y=&dy$bNC*faV2mLaixm@z z#B;{j!^z3X!>WLxp`nk?&(ELr_4Sdqwl<{GX%ve^C%?J5iMhGC>lKzjTU%S^;^N|8 zrfI%AF)@*`^VA*;4-db=7+dV==^=irg&?d|PBpU?N@H9#a1dAm?3Jm~7` z!v6j~48y3X+?HvYRb?0k`uqDm0KOg@8++XW5JJX-!5}#2V2o9*@+OPQ?ecoP=z+Rf|^Q!{vcO8JsgvEbuL-!V2b5AAA0I;qkpN1&h*J7Am&;j{N-#}PRsUocS(b&J zot=WFX+JsuNs=ZH4-bi^X&{7DJxI3!EX#tTC`hGJ)a`aZaRBr4^9i5N_ggys0xp-! zY5IQwEH5uJ%d#F%O-(6I4@#?el+Wk?tgG|Ljg7BC)3k~mWrM4Ezq-204-O7exm@mB z=ea$IMx$Am%k?OoPFts^3Mi!&cTcqySeAvgwKZdXef=z%Onx>qGh6E(34_aM=olLJ$1@yI&AO-ZKoNUI>%iZ-2{>WtU<>?4IOuKP7(OdX~v#Q~>%F xaR5d+prUU8q>^ka?VbtX(m4QTNjDzxzX7mVP`Py}t!w}Q002ovPDHLkV1o9i+Ft+w diff --git a/res/drawable/n8fr8.jpg b/res/drawable/n8fr8.jpg deleted file mode 100644 index 4939d5c7df969913d492bea411d5565d79333f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18062 zcmbTeeLU0q|3AJ?r*l!Mcb$WxQqdKS6E;cZlw2h#+OW}%TyM>CeQobk;Y0`_lS;04 zLD&U`os$r=ay7DiF>7mUqeHf* zj$58Ix3aeUc9L~J|NQgjO`CV<=&K%jLSfM~x3{68P-zFYtOh97?X>F14`fCFg%0)4k`{rc~|U%z3)_um6Yrvk5o zzTdWC`@Umme)#2bz>oVQf3^HGzv3t3vrYf#dJZp`SY3;{`SV6S{T(|E4jepm_=u@B z1Zs2K_JqSZM<-_&*YjRiU~q3AUqm2qvqHnd(a|xnaq$U>Nw;pNXJr0$C##_Feo=AB zgHpoN%Bt#`+PZpTa|@M5XSBApKkt6g)7$s5e_&*Ej5|K@W|H@A=KTke_~WP9xkdTX zm*o}3s`Bf%xYmKz|2M4vjqLvs*ES%o@4o+j{r5k9i)-C?@xa&mZQpO$ckGAlXDXe*^o!5oEvkF&&b>8(@!Ht$zdih2W9orFozV?~o+M`07=`~PSamisrw-~C73cjWUepBCt z1DC}M>OcH}Nv#MAFK$hB>(NJ~JsF}rjCNwC;f@v6v)^a?>MM#F+ZgH%M0f7S9Dn21 zrQ-6B;K;~TraMlF-Me=aT2|((%E9UzCN-le11AT} zL1SL=UMT~A*w#}cYNSto^a^LzGwark@oX;tz5$wb#P7STBUGQw(E7c&;!5*-%`gCb^esLfH<`H@>Vp@HY3Kb>nTOYq3PT(h?b7Po^Nc zn1qy8hQPI^-n+B6n~sfIIRqM;;dLCeujVqeU&p6=irvx$8XoDUx9#rpI7_(`P6jg) zd|TuASh1g#g+KsP_pX70N#*{eH_PDzdgoQYSVxXwH{+-4v_mAdb!r82l}LlO%32y^ zop9suN)_W53stivHr zD<|RSsRD$@vi&?IM0tNaGZTf#m{6M-^r^ovaEi)Wi!8_n6k%HLTVgbgd#u!j+w+KR zxt*L(YX2Lo&quwr>kqga-8GDtSu5#lpu`}=$M^_D!71T%)#>nfJGQ%nr1-NX$%(QC zI%V2d?(@|!V$|2SOX7oDL3Hp|3HR#W@5wx;%bl$Lm_jpjzv5ep7gb&waRm-HJCH-+ z?vp=N@D4AL><0^R)936uiB){H^ulh*VW5N?1eGBy%n?dagL`I!D`#W71F5lF>Pv(=OPX*-RHadyfOB^y_PQa0f8@ z(f<6h>ljg^%08*B4Odeb9YOLU_8%1ERyT5YR^pfjT)#MDm6yfhmHcVwT+}CpX9^!t z2F**{%K1PSu7q`*Kkw3{Z4uW{@euEf_qYLWc#yAt)EF(0m~%xlxlMvD*iiTiW$pwQ z$Z5LK?sR-G)9z{bDI{s*2B-C=q05%a+u+zMMF2Hf}lFq2)l2amNr}^FxS0 z4U0rSy3JYym$G zf%)TAI6A(a_E?-kyDIY}%!TAv!n8)kBux{Gi9(*&@w&r4Bs16(Y%@r-k5~hRl&{FX zhQjJ{bofL^^lPL@nTDWkX4?o5NB@~iTJJLLhwlLb<>NE{;>VJ~+JRxFC`2n;m@pw& zBYxy)cxWz)>Z)Miw+K6d%5yLT%j^oS9=zrG{tDLf3f33otRSAxT%E%T!5~OUtTVkv z;JD#ml6u{6?tTi$i7HmHz^-CO;K>W2R4!e+>sXOcs^aKmAJ=aj4w3(qv(>Uf2hjpsmk$|VGG4TC8Jw^hWVps zcCx1PG{i610dnTAp|jeZ;rh|w7`;gE*NB7uAox&9na6 z5mYGk@*j&JJ@U6KS;EkdB+h0fUh>=kbJ$H&NvHZ); zW24SActvA#?ZSaKGiB6UXh{VuOuI2^_(_8y=IlVroTw6u>huCPSPhZO;>ys%FC6?A zgJ>I$Z~N(rU4*1QrZ`iC?ilrcd|+Un1Fu9FDL=|7E=(8$t7Hl45bs4bN`Czo5oZkI z++N;Z^W0!eq@s=o*GQG<2)pf<+go_bQdT^z3rj=qEOr!J2+k2gTqu`FSF*;o^rWK= zrDJIB!8!OQ9loD>QB#S)vXYK}t|Bg_7WWMjVtpn=Q=IdM&AmormQ`n^f+c4KhPh~S zvxDMsj@c|QU}8&IOf{@OOuKhDpd*CYl?#C@@o}6s{9CiDC3PvD3!Xe8y~0|lBI#7! z6@Jz6s+p`pBQL{s8F?7I5auLyge&1~DpuCCVX%hNRV5S%B1mhX7P!vq9y23lVCA&s z8fes27r#n;J;`pGl!Ws>`dgQEp^AxvEJ1@F>dpm@s{8=ZOZwJ8fv}L(oO%mEQxmF0 zQ&T%%Vc;`I?SySh_B*>$B3g>%B+eK z3ea{j0*qu6lU*ndM#!ixig1jjntf=HCW;pL`KOFt7{O|np@#KzGCr&ft>O9_qQ|>9 zyuPDKzqWkph|P3964-Jf1ja^IGB#pW&uc&G@9rCWkZPeM0;MT#AE#w_EZ^%D%A9Bq zOOEh&A)4WDmSS7;RBY!5l&iOS{@JOY?eMA<+GfI*l0(y@k~NTw@cL}=kyz*NxJ~bh z1QaX$YrD8L&`@#v4-2nyg>o@T`x)XMUh(G5RO0wBHOf+go3=`!!GB-e7MT-a`V1Vs@ishlTL+PV}fE+$G^(_%jNICx8)caYgeB7=Qt z?wFJT<9h=gQ-;B!-c=SH%WEe?>P476pI}7$mPQpMDj}^e@&H+A=EPY8eTR}=u`7ue zG`!)LIM`IS7|UV!j4GcA741-|mSc-3gntLg!884xGbvm$U*ta>s=!Y+#3DrvE!|~l z-AvU8BzmTkXZg%|2JDVz(pw_xKF~DNB6OQ|w)jdii`V!lcYkHBc*QB%LB*k6vr8os zg~_W#ESni?8^=9Q6*2duL(!NE%ryBJq54Y_wy$IbnOIZ;pmCJuho+C?#V$PP(0ou1 zD|@goUYmZkk&1ig6am&h)RFrNQh??A($y?T$kd#-{x249N{dgipmQWMguq$USc;2e zik42xR7@h~r{$l-s-wm8LyZa;UPcl2AP-kHnBCSxHzyXj8@mV-i|Aaot1+#>X=<=J zMQC+tTyA}L8VO*Sc&wK^-Y*erg{_ag&NNOk{7bB&z>C}7NFwyyhhMTR7U5s6^SxvD z9tFF$S0G}|)>)35v#eY(bqHmd_k3E^8i+dl62Ndzq?B}Y4|kt01miQ=h0I1~$DyRs z96Cd@40CU|78J<}3rh>8gddc@6ZolcTz1T@stPS^LRa7ZzkAbz`?LD;@2kADzm} z!ycd`j;{Wt0ZEn0;=+XPY$eW z*@<7;g{Cn?b(3LHSf8U_1=BkXWA62GG-7`)9IFq&|KJ=Zo_}HtII(8~Js^6E$L856 zJe%pf2J-t5To<%ZUWO+TX6#qDGqh~~^88h zPH)|CGWC((X4}$Nt8H|_S>gNyl(CuOf9US%FLtE-5a6)(PbM?Er}ry(tPUc#x@t}s z(3%%*Q>b?H<6B)8+bBp^VME^17({Ws<(v+*)cTPdeyalA{<+YG9li0Ta5|XB&D%AC zPa->;6q&!=J|8pWE_P~86|SJaxXZ`Ex2&9(;8kGXsW@xhdhX^}$ZsZyv4xMB)bhB1 zNTT4iu8@EFb#2ck$%e`tpvNh=K@{BT{^W#?OT{I2tOQPMs77cT7!2U?K#As9;hW(Ag2kxusnw1?CC%$4jjm0X>s=K{)@We+~3vqG{GU+U@<0<()wq zb_7Gtg+ov)cwVD>psKlhq```HhMQfBv-;51VK{SmB8ISg%xn$h4sFzOF0Fx{TTt-2 zWHd{1f%c`ix|%kYhO}(KZwFvYo1F$a{mTAp2uVH?6~_BDz&bG^@9inCE3H1`bFYj_ z;yG<3PsKa`4`6yK+DH*d!)Z;KkGDc{ALEnj(WV=y@Z|eOGfLv%^l!r_-D>F-wYK{Y z^7o&-PyjS=Tc}s{PfVXh!^fNZF)`!w9Ak?`tZGa&6xYbvYlN;3=nUp=RdfgAcdUqY0(!UQL;sd}ga`J-- zcA-dXFt$K`6q+70z6PqX3-4($m^~1LwO}jKP>QgpS)^U>9Dnr$RbqdIfdo`+?d9`- zJJZYPHBYnG?E$u!yZh6>9lrg{cid~%JX(Zyr}E;~F~ht3T^;ql)5|Rrjg4LYV;|oE z4E(&laFLwcQH+>Tm)fNAWG91IN5Os%FO0aVXiDNUc}g`bD{5cv>zL%A3`d*{TPJQJ zK$PB56PLeX-(jgh%XKDURfgCp3Ud|XYJco7s(w(JhMFdgXN%1xH2+G0TuO1@>Y;L! z^QnATQJHkC(}{W%nL|clLrMpo421@90$$ zd?f{T%&QSt6Xaj`X%wOSBI3KgCkg4+d>y^MtE20Gg4k9TI4W|UH{;`mw$Y{K;4CorJ^-D}HLdKVh7>YDpyHMio@s?ea_hQ6}LO1-2 z=T6bgq1o5Uq7jdBQg@|!iPDx6J+dIcv@VRT%v;3_H-5;k$PdJoVeo%ro~HyP(BmIn z6c(i|yKyJ=&o6j~&}4V^<&KBkl9_5{nz@hs9&dg9%g;v=^ZN}G^PAPIxQ2vi#||z9 z;WVrrHcS|I2K4A~l5xW5LoWa1_{yAzt#2S-ZHI5? zqWLep|HV+SCL6LnX&nVd!hVcN87t!yw`UG2cd#jyHv?6a75Aw8PQ82g^o7snGUGB2 zOuCA)8=Y__Zq>sBC?}`5FZvTjpIV$)R+eg#b~))_*+%|s+%uv?{tm_mHgJ8U%k!!> zhJ_aqQmvGpxi6? z$@XUYBo!c*c)@Vs4-q-PH#*uDRbrc+h8YUqxY4k6RIhp}h=)Bv7z2$z&3O86L-*Rt zzw10Lr)T|aFvcq=`&}BXwNeJ86Iy*zUQ;cKxu5nNlf$QtY~#U^q{zTc5xGz}c|jhT z+spMzb%T#s_A7|uDn1$31@q_Twx@So=j;Nvmmj3;%9n&qmZ&HQs_@Jq-7&O;lC#m# z|C&(|D_c5l#NW3DdYnYq?OIV9bQ7BEAv5#zzW6>alop2A^O)i@$Y4RmyrGvYbKXA_ zYP---<5WVgVJd5>CvL**X+q(pk=VnrKbs#cFk(h-f{KE*3Kje6KV)P#F+5UuW+?(y zhIMzUZfe+lK>AW13(uj`F3`|gPGx=fA0*Q;0wLa%bTcLA!LeDldMazx^35_J@1~1XtV+j+!kQ zgz+dQWmSmxp?TLITX4<=PMNwYAl7z?H1})c;}9i`;UW~kl%()W+_WODv|6|en7a7D?hN3SLZ!-~aohH(Y<9mEk+H5HcX zSe55d5Qd*{P<`U7$Sh#o_yjo^N|}AMeTdpf7Z#qvOB(?=+k#v_Sy|Vq{BXJAUND{We z3eh%ff}&m(o<%^FA#Kg!9V`W&=~Vr$Y-d3Xw*ecMT3)8}T{E#!O$|Yt)EZ?S71zT% zPzzs{LKD@Hyt*}zZUQayuf`O+n4#IPC4~@XA~w`2f>D|#SF_}=MYwnTCGYy#t9x&~ z;2ljWYNle_DhYZjAej@x|EX!nN)PsWDPHas>{knWe8GspVa|*j+m;*G9nox|{<&-o zbf+QBEhA&j1sKJnQ-$xyMAv9^{MlPE%KU3(Uf_a<4l_bcM`y z!<3A~q7kGeHJNc`4B^K!C^q(I(>syx(&`un*Lg?f5g2??JpMIQMHAi7%zf%Gu5+zf zZSf$SVus*anp>~{{|F4_|Dcg0&i*sI?dKKS&AhEvd=%cqgcdi|l}JGfk<5Z5N;r)L zW5}Y(@~w*dgOlJuAEYdm_vMqZ$|%DZ&orRifDUP%%6H&9_fI@QkC@IL>t*#U!D~_KyhO!I%oG2z)(^qB7$t6*gkSU?FLG#~(9F2sDc|%(RWhU)@QRt4{Ra}rNdDc(E z%Lwm67moh+ayocy1eku>sith=_NQO1?i7EWS){jE7gzy^+qocIw+6MU6AQm;m>$Ic zJ{c%6x>)nF-9$AjsgQ)f-8v$T`kF(~ln3xHK10pZ81l4`bf9kaXy(QU0^gea(h@e0 z6~9_0m6B;87+7ghQPop|-I39ej{*93tjB|wz~apKMeGznDx{2mz~B;b?H1-?lfaJQ zetbqUB}D)nrt7}K!5qR)`%XhFn(^zPX}~qDe&8qEPZtYU-Q2?_(0yAA8QM0j43Gip z%@5)w8(>QBV%!QVqYamC@UXokU0T`tkaK|czSrh39QLjMO%mF5f(>l-u>30-@Bpad^{ZVN@7RHpEMKVdo-${|J>a&shP=lMj3Mf2I2Y)!%c2BrbV1q~?f3ISa?&G)mA?Gf6 zgje$X1c(aN(UPPWg(h}42D*@`)2g%;0j-LNO>XWa-oFx5+J{0DZV#>A|9OT!G{4<# zN6fO(k-})_tqW>S`>DY}F8&?u!w7~jc9c!WBuIC{;u;@N7{I7V&imCZ_J`7V(dv!x zVunrA6v{(G*)5dmmWf~h@soIng9P-nFKs0rV;yHKoBQJF(-ZNFPOL%vwhxYK$pO4ppTDarHD54B=b?m9#2{>+r1qL!z6xy<;k1|`7nG3Em`FT z0Hr5IkG0=h07>Pit=`{VJ!M_y3x^8YJFwuVJZ65HOo84jCEJcL+rF$v^H7@a$@qo+ z_F7W{uNN3)&$t<>e?lx6wE*1G$qB8pvOfne0)|E*1hH+tROU_zxBv1hARzvoUPGr< zeM3FKf#2zM==bNTNY2Hq`O%?^+5R4J*l1wDd_v39eh)su_iXA4LArfT&d8G`Mn&+i z>WdlyD3F(t#o`&%YLbC7R6y*0F~yoaN(7LRPd!#X=u#4(Ntfup43KB(Kg zu1t&INV+2+hh@HqK3eiG39g;yA174-5#@R0&ghjEb;+jDpCWoAzz;}Bgde{oVlF3! zrkW0RHQ@6!<5Od{HRQ|6qU+BcK zna9mjXmITH9p|`^{W%LG%y7zJr-dSZ(+#!)gIEJy3GZ4F!Ibd2*|;S?B<=ZgVJILD zEPEFR=LhBBGitv2%;g;K5o|;9&<3w6R#Hz3P24FfSG33z>8(hsH-YxL- zlL594XGAN70!ZcP#3}%7_tdF3S>rY#2b#39IIeanqM>yn?TaotjcFL3eK#Fo(QfG~|dJX2{ zga1Md@GILb1>i5qco7vJ3dgN(m*7@^@#+evs*t23J8{M#s*~A3maKu84mm4!RYfk7 zkE)4jORMw=v*>FSU=4Arx)>kKr8z>fvyD_%ff70Z5X(YQ+#(`C3(+lDt?9?e@He6Y zkwEu74Ipk+w2P^v%@f;g3Nc&1vNKd9?Q500c3`}kZTd!%j&R*cC-x}_t*5TZ-E!RK zKkw&+UZ3{wKnqP7YASAp0Tm0pe?mo{zZ{kHujx4yx;0~ZLs&pQ!?mp|gufJlju6_h zQ2_V5IZ^`LVSZZ)8?~xGO*u?iA+~s*bu}0megl;v8uv2<6vs>vkGuI^WBC&JP<{TS z+MwNMxjdpjlVknc)DeIfi(+VR(>{CaE&87u0uTnNCvEq%L(S^Saj|K3GR9;ZLs2zF z{#L+A-mQVw$Uh)HJciA+OJbHH8 zqx2v*M6hH&7j>QMB<<5_Ts^(?Vw|Bziq&cFx3)~YOXjC^3IWpjyISYB^x=RhUg1Sy zkE)!cnfttNf~w)C4P(SMY&p%j4h>&&8fdmC7OLF?Z2kTB+}-zbz9{!c{{;=VH!l*i z;RVJdn-P;OpD3Aoq(4q=WTs7MN>SUzw>vaP~I>q$b6GxizY2GN|?pAZ`qDjZ?S~#@D%q5Vvf{ zSgj;ZsAH%-WKaO`@E!QCx{>%k|M+fz(#p!dg!&o{6z1%+W3MU|9_Pz6NIcWiLQn^6 zHMmeZmaTx74xY$5{KVU~JhkJ&yF!r?xk@Tq+{~#5x03-h(n$llMM%S~o{_{P^h?%r zZZ{`nq8NXj(H^d6znm}Ov3&z%?22L7LFs^GcRA~8?-bV%ZRma7jE25DFfjJ!+eAV` z$`$&@0%{68ItIDdeu}r05*IBvh~nWf*ZVXGHI^U4l1>m4tj=LWK1+VVs&?rt;YXbs z?HA(iM9vs(?+egp8}y0&Ts2%^x*>gHo0+Aaer1OY8$TZCPb41cnZ1T4{nnOs1dN!7 zdJ@cg+NufcPIG5kOan!9c+u}3f0CH`$kqfm6D;scD{T~pGd2Yh-A%q;7ap~8;S=<< zpKTVw=LCYB!_VPj=QG${Q0?~&MixY1a1=|!Gq1*45~plR!F{qhf}V!E}CgM^0(Z)pMdJk`qLIbw^2@h_p2^oWqMUwW_Z zUNSH9q!V^vBYZ;&2XTVFgWPZRX$|y#nDR#gdeWq`qu9|$LhX@jWeS#t@Wl+Eu3Ioj z+7wAXVT7-qN(h-HjJUE|g0O6ZetDmEZk%(Ve)RlBvq|;`2YhW`V&q3N2(5?pm99Oo z2C^5Bxm~3ZCK)m`$7q_bKx%kX;S~VG@oCbxvQT3@h*BptE$;}*bIbI61j(Bpi70S2 zTrKK?De>uLIQ0)TH!if_^MZ$5rPW=%zzW1wrwTR+CYsV$%({McNvrFHR0#GApp6ghodiPTir zpZuuDI6Jr4J6!2%*{8M#w4OUg8DC0^s>(c?%6+?*&QjVRLqwXXyL3QiHMAK>>EzqL zg%s8MC){$+e3dtEV`L$-PZ(YUEyC_r<+jIsC~9!7PYCUn?C;ZL*EYAL4AAFTFIZ|= zbW+KmF%Ni7RF&iXyR4+?cK{^Xt)f*Q$~Fi4dS4!v0?fc?V+~MR-m@S+nSP_O>2P{S zu9H?O`Ie{Y^-TAOS5W+x&w9s{ z+{>~`<;fo#FiLTo@cIw=EEyr(heH>XzUDDq}CO}M%s*{6bPeLc?4EQe`n)j2 zQZ;Sdv0_r-OH?KYY2{qolV&u0yp84yZA`FY^*L^E2OlRu5onZyQ$&h_xbsVLHY{Yx zxDYMHQeXl39X&kSR=^w`+J-PK9A3X~%n&ict^Vfl!l*t0 zCN%BHcsQetZ-BPjxuTy_=i47>W#$iHJE6Ogg4nTQws~k8X;WyUD8iin=us%SBs@Ff zY>ib^V#%~I@Lll6eyA7+*ek|wofpM*<9XR0ZDZq(vbdUFsr_trB|ge5 zBG+*WAcL)suS~fJW8wF`J0ONHXU%=DOUp1R6ihsVJ-R zXRm?sQfN*C?^S2V-E4OjhfUHa0)|5|R_5ZJ*2r1?xX*FlHX_hbo0s{2iHFnrHdz;d z$C4Qq18lkz3NT;*7NT<#k3#s#Z&oB&ChHEVu;6t+*WzeUKE3b5OMqg>C$Llyx1o`; z@eyO@*ugPlfk_&ocaRVFu#$b#Zxh%nx zUUr2Iphn4vrQc*$TnV~yT5B35RS~J10f9Mo(>IX;UJtwgoNR@7iXu|8;$uOV3v`tw z*vt8G{fH6sPkgbGQ2%<5fV#2QkKGPb&Gh!?nv5lfB5n{hzvebDQ#c!2*=Uvy%2czM z+XY5t@d{#RO+EBhBVukS0@p$Zls!=uSOJuU5a2D3bzVSwiQ%UTq~ZHoL&6jmijq|{ zc?tXlBZi7p{5b9>Y2_IC9bu=QTVhdAPKop-tuz%2d9lKaZLyB_>tC`2_uYq);PVb`$B6o9Jz+DwMZ3C927-1+%q!ZP`uw!7R`}YOTOEv>Q zLDr!ln@JJ=99RE{&{tK`tP>aO+N-JA@yVO@x2aps4!;~R!zX%6fm8lX%2-UTid*E9 z(E}B9X^7?nXUWP%_?#teT$l(98}4Oww_$EA7AbhN^qjP?cX_~gKx!*+XFgQn>k&C< zC)^apxxKV{D0QyDXgT}RXhq@m$2NkBn*MgO6DDNo7D~Gf-5IJumX;f{$1G2BbxV8r=@42e z0*ZV0%?mis&3l_y@?yAALHY1)0IK3vEKvjM1$$+WR97hgO)^g2@@L4-xm=a$D zk0OE-N;)>&N4F@ccr9`8H zF5IeIK`Fjd4S_3O5vD_M9Zd|jhS%kEw!pa|1-!6KYpB4@us;`3Y5e`Z&c-RD5lV#9 z8Yomnn{Ov7i%GOD#0RRYxV@vqrD^17MtOCg4)K*7D%S8c!V(pY|Du#Ge-oobx5YF? z`_WS`Zt`QmXiCzZ{J23fv#6*G{vWb_GC}+u)A&aP!m{*M~A2BY)$M0`c|0pIE zZ)@c1xf(__a_HqVhA2zNc7Ij}OhxNF&ibnkBQq$TC`(&Po#QZ3&!!^Vo656==jTYbt2EIDA*d<7=U9ygH z62@zI<0BDWeU^R3X%f~Vud?2kmfN}OUQ6mD5x_}=%FY6H@lf4+(zD5T0&OR~x$$c& zKi0+-Cm=Sfg*MuB$AQMu56=hrX-oK|@+xBQND4FF9e^j4?>lweSshFEOrXPeUMvH~ z3nI>9wM)i4>^}1(a`$--)Sg>%lHmiGNLXs*0{8Wpb;Q05f){ zulv;VyMBT7eRIeZj_^56%$OfRxp3rCKwbAz+~udCKg7D78U@zd^J4eKK6|x&9D!?P z&coO!h;5}c>2X?#uJM&ZqB3rt)nmi~04T(+8F3+R6|j&VDzP3h!v-@79D%v=RI`OP zn@Ih1&}aPHuJI=d1zLsHuAO)=R=+*DxQSLah-zoIVY;OOJ`pB)Dhj0}6 zaYkiP%x85PebZLXG=j&C<;zYurDT^C;8BMV^EvKMahs-6ANL?I5j@Hvpem;V6bnRG z{zY)6MC&6d(`uRl2gFs(ua869Gd^n*UN+-};HwpYDJXG|V0g+2=zFQ)b&&XI2S2{1 z&_+f3D0de}zQ5-{2-1!sF?xDQ!6YSZDB*H`_ym~scnDkn+gdhYe>#doLh$MF>(I3r)GCi$9 zTA6-+ut5q%WK9V|j^0kHRN`WigiQFc&A2H5Tan4<{8@M>w!R*2c1yeL~ z3wZnyVCyk$oF;RFVJe`a$2#wx>9bS|&A_o>-P~5D*-klNFiK1&AqIl6L)6E~A|OLr zmbaR_>XwK@lmt?bl^K413~=|6M_eQLa2H_MR&guRgx5#jrtG644ju>Q?s@s}@_c)D*8z1WVG2VoKk&|tWV;-1sN%sU7L>MG4!BP8Uz zl@SI%m3H|9^AwR~svcxPWz2JUo5d8W4RDfmD$ehJ1;dm?a!~-oh0lmUF%{^Yx^Wb< zJ4{_5uJ}};l$!``mI&a7v`er!K>P&jZ@Sk{2OI#o6U zXj!xEw~*xN_yG!&%|{A#fJXlu!Pb1X)dybBO|NXqLDtQMCpf<_@Moomj7pae2N3M; z80hBH)nuaZtKOVwc_qV@x^i=7Cw>OCkx|U2H;>Eyd^@`A5^F)9MEbezrm%`f&r%p@ z!0)gsv4St~0DI-+TyZ{+=R|L!Jy)~a%5WSy)fQeb_MQg~4sQHop~H;mtn;GGH|2pA z4v0``OE8Nq3C7(vUmYJ+#)GFMksBFBCU5+OE3Yx$sBoR!5>+R3dWSw+zCx5J(evlT zli4Kv%Y!%trr#IH8`6Y@7JE7v0GA!FfV>SiaQn-ftr`G|>ywGc>8rWzCA53Uv%?Lt zV(Py9I4NLGQpW*)15>h28>^Ec9ZywfjY~EsSK(yd*WzuJD6jMWNxcH3I2^hLdVON0 z@wUN!{wmrXjfu_p2*W{~7mu208-Xzout0g=T6OOBN~rD8J7Jlz4Un+9@o~B;ppT~d z$4BF;C#$yg$f0rvEgMJ<8H+eDfN@Dw^m71Jkv}9mZB5y2bYWm zjCl6hp{jWo%176BC~n%RB?7lngaqz9aml6x!n6>;ftHh+Lj4>fsC`ZrS~=_y{f7?E zkPvi3Q0+{_%?|=82I<-kKwe*ODfhS`7J*YRE;$V4daUXL(ZbXEUNEcC27y*Hv);~m9Q~{v8V%3q$M7u zCEE2gV%{C(;6#IcrU)>rQWB2gXQC7MUBROfJMprjdX@8m_}D=FKS`OHG43ZumM&!} z542^nF{R)&&~O@D#rk$FSge0EVo~=Mt!6gOuRUnQqNEL$(#q|UGZcttDP}X-ueVAv zHEEA6fybUaN&yqr3h{MDjQ`oMs+Y|j7~gSjL`RSR0Gqj5qL~|?n>apoU792=3p|i} zONT)0+kM+?^JA!NRX5Ce>qF89ft8KQtPQ_7_qOi^7U_t4_BrXa{3G>obNYJ!`QL}jm8D`Uup#V8#!wCs~KO% zB%5mAtQzlJa$fb`1j%9gy%fI>H+h&CG}AF}dOw(qnpy+BTrvHF7&Uts|Mn$be(u?Y zXT5Aq#V)ik`TBJZd|#m(Otbu9khFyL@fHJ;9Ff37<|%QHRUsH>kCCTi5%BRHcUR3! z>S_ameiR$#tv9|qQ8CCWS_8ecQ0K<~Nf!2ORqx!Yby>mRCKykCidxNBgdb$VRF-t1 zfZqr_8P?UM&@A}}-^b&)HSGoN|D3Q;z}pNT?-5qth4;UUz4_}tkp4j0WdI^JQSp0( zlZKz{n>&=72RYgTeKy>7lOnM#m?2BD?5t&9p4($LX70gxa(xZN=&@IUqigL&cz}f8mwGlS8Q{eJ zezykd*I)kGFdDBL@QUk%`_X1iw;y-DLYMS2*D*getBL!N{u+*FWOcKu-Nf zUDhq$lB<%pzA89%)|*iPYYEATqL?TA_&Li~C}*iRtby{=p8JPx{m*+E;zK`iyFS~f zVA0aXMM(5-nC(B^13!BEug%IQabK@|rf^<=-4Ye8ZN;aXhyKqyI+RhUy8J&YW=K(^ zz+PBkGGNeXDf52_Fd@12l4pRH{_nYwkJ%?9^OkR^4~y{wYoG;v?V067y!C(Y{{5UK z7|Ke_qq)+2t$^nLW(`DttU=$Q?e|b8zt{e_1{$v{T?3f`*Fh;a&5dZofYteyYS~^d zhx-8W@Ix?;P@KF{y!R1&Si6EQJiqn2CvY7gHym>J{Ld}FcU}m-ChS+0n!(ClKIc6r znds%5o@6EN${N1jdphv>!^|>@}P+7#v zj8~#1CwC?RXxyp5W10tjqp%qSsOYV1?Q39b{d;14RkuYZ%{$B0rr#v^Dwr9c+jsI- zF8&0!wIIA9u;b>T4CybbwvpeFI0Z7VG_0^ACR_Dbxg*uRA9MJBBFl4R0#+BEICclO zYmV#E5pd()hT_Sf{IsPX`etuBe}o;HAj}%-y~iZEKA!bC&Q|`XsBqpAEolEuu!|o> zA?R9@99nTT;WPfgjnwEXlO+%Pzg`ZtxuhG>p30wIWfRA%`fOXC{=fZokp@mP>=N5&+*kXX+g-NvMHE#3q4G9zD%v~lcab=<@ z>gn>Z#d{O>&}b&x`kz`J@$J>O_zB}HB0NCd0UO|~Z>r(g#$zan{oWiOr8KY0f~oovXfv6xy4IUQ86r7F&-=*Cy~ zd#rIR<*d}5|KaNvOlNyL@=glX?()S`&&rDhlo(;TH|If8Zjnp)uNGB;8xQ8uzqdYEFVx*k zw=wt0xZV2kk9&GX>Apuze%`i&&;>zHUf4;5;+1=Pexhr?xo!GbPbzN3VALTr`<74W& z{X9pW9@l>$vR@tEc=PY=E`J;ER^br=J9g~aL;a`cRR7*fO$Tj3Ak!PiiN*829=mQP zkQ~;f&id4BahbjR@id_0cpnNoWm~7%_4d+wuA1mNQ1j}D!?)vV{@twU1 z5Q_l4pkeYgSX=8@O-8TFyRa$VE%RB#@5FxAdd-!)7vIbO?G&}a5mUuCM!P3QTKa|C zY;5k`k2=zH^2Xb)g)>|C*~i>H^6{akD}{fGJ5_?XqWIU8>#q4i^xmc-oAmCZrn=wR z`u~{}v%k=tyN|FtP{NBTiAOx_!Vc!6e$tJ$e4YM-zSerq!{Kfyp^p&mSCVYN>!Fa_ z&v384J3We}yCn?W9NCv27@51v8uP_1mad7CP5i`ewuY|un?Kixkg^TwZuWMcKvH5;8_)+sK1+G4o zb)~JHQ82cX2KCQ>nVWNS_K>0<_{S2TAKgDPF!&&>G-{xi?fqy|qDiT_I4VE!MzHsv zOLoPE-jDvt`~JOdQDCrMwWX0gJN;=mA(f-sa&^R!EiJOe^9<^A!1cEPhT-GmeL-&4{&dnu^_vTbN^l z*=?<2wA4&eAPme)Oe4u8$mHQiQPUMd=TJA=l=t_R{$$fmj8IH=EK0jVWR1*ls5fME zCz5z-Q(K9xENE)lHLjUGqTJ1YWVb0J?7FfkaEh4Z#kk}#I8sQ-2ROxMYF4YJx(IF_ zXzuL3>6T3_g3a$YJns8*xGB-^4;2r_?sH`t+wDk=hlOS}J zo*%R71``_Rg)AfI>J?5&_NeBV?1(iB4F=ao7jSA?t;0<{#4r!+=+RxG5uBXQl|$yP z4hie>`sQkuOJS)^3}l$Fl0;js$3>Ad@3q%8KBcJ5sd;ft6lmi5?(NKH<;?z9$g7S5 n`Ch%pr7o)?Y8sWz%7#U4k;JXpBSnof@3jS7WhHBgq<{a}xtYy4 diff --git a/res/drawable/oldtoroff.png b/res/drawable/oldtoroff.png deleted file mode 100644 index 4b23e0b3a227de2933b20e6e24fae0d0e8e429a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63700 zcmce8hd;iwuj;O|wie4? z4U9F9aq5D5<+}ox-5`hhp_>}60hxd7?OQR3$p4S;PJ&KrzrT0~`L3QvwKYXxWg{^$ zr$ocn`>IQwJK8I&s#I_PD#?kvM#RVhh)A`Mt8w-;aU;7FBF);nW;UJKjyp0Nz#yg$ z5pO;%x{co*zIf8DM`d_usI0E8?oZc(+3ot(_FT))$MsRLSa&-p`0L|zC@t)Ya+z8o z8x_BQ|CX&9eu3uWdyiFBts>5tp$-9Xo#&Ci>VxjAM>4T1kmu)j-fV1aoU~EM5Q9!k z?(FQi71#WJYHBC;zgKSUFSK?pD=!~Ftl|p`3%x2y1n*K>RzhMTeca^P>Gvya+;Ap9 z2lYnKE@(DwZn`6>SYV3r6hUCprI*m~VsZ4@?`Bvnm#LNZ=YFRJgykM$64NRqHt@ZF4L zd{zpbjh#JLQv`O(rg9Um^A(0e>A!?TYBOkS%bDr8#)fjg{-NGJhAGK4LLe*gacHcyMa zj7y{Rv16Z5Q{w|eLpzsUcDrf0y7bY>B?0}cr%%rqks9cWRpSaDchl3;KR8JAC04*H;O?W9wwJROiOb`C_Qs}#V{i6 zu*gzRw!B>v(0M2)?(`bPU>+R*C@wDj>Ck9jUxX5z1G$Y(@z2aFE>;{Xb2V07hU=IE zC^)yy%a<=*M6uztBc-1OCiglYN+i5|DQQVZvl`)56%@Sxyf%4uMwgFwx;-H-ZIPan zpYQo%;ZE&B2TClbp4DAQt{bCpW_Fp8K3g1Jd;1`YBLxMk8yI`bNpJJ=YHblaY^D7P zpFdwfK$HF7qt=&ask~xyzs)z^`;+_UxFyaNq=wn{|N0deogAWE5C+U3d!cd+@T|nS zA=tFu5ZY7EqMNf`7z7&-iP>Rw>Cbrd=x+4XCHz8Zhu^2}?nVV-Sb4pPiJ958^u}cW z*yJ@c;#-DEXX9zXRqXam>dmgMuH&wC?{sPQ?p|ImxZ=?1+5nQ!u{bXOy?1(QD%|e! zS=L<{=F`SG^5{zN4l4^Ordi{0NmBZe zIyp_rh?~w)WDfR?nJo!R4~(gI`E+Ie_KTnS*OENFy!P^vcjY@fGaA!8MH9j`+ib=0 z*l%DmMq)Q)(6KT=LNw$}}BOx#U<75=D0E9qCgI3qruqyF@#vhnwol^gTz zRY7aNEv;m7YioDxxVbVAtA8T49I3fZKpM<&t5uuni|&rur(K!ly5$C^u_OOp1x0As zbJ{Kz$frAttq3f3`5ST^`gYE9T(O(7jR`BA;@i%ZLyppuw-t%>2lWiC0{#iU;5QxEEk07k>0OifAS4UR~n+O>aMooN;f$3*_2czRvy#`zdfX=kFmOHZ8;BZcT;zOz^ z>XQ92^2htthRK_`lN6Q`^r#}RtCN7gaN$DqXT~cMp<}6*T%`Pe*OR=Gnnjb;BklT$ z{T3{p!`5w%g@o~J(xXQJhjDtnOqQT@es&Cv$}M);C3CAs3ybgUIUZhqe5q>PMP zUh=lByuADXdufNWP#{OaPo~Tp+UE^%9G&AVvs9Tf`sK8=G`{+i|JH=jHPp~Ugr!-| zYY>SHZ`+NpddOFZn-Z59ab>1we*Y~B#duZkUA}x-1FRf}Agh6TdaW157@=01Lb?mr z;!1oZ+LK�y)~_kseh?$ZEY{cX}?u9v}Vv(ZEQ4i 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]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 NW^3g{DJ6Ty{Rd)nI{5$q diff --git a/res/drawable/oldtorstarting.png b/res/drawable/oldtorstarting.png deleted file mode 100644 index a56844a9ed2ae483eb9e4f5fdd75b479ce195a41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111753 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

    W!uPt3Z6qgi3u`#Ki|{XgX(q0QaAeu)3O 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� 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%0D|mk=Kqjgk>^>nl3ub* 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 R+5mvR+d9VD<(jC-{{fL-ON#&i diff --git a/res/drawable/onion32.png b/res/drawable/onion32.png deleted file mode 100644 index 7846760192f01c963ad545d32791b53136acec24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmV-F2Eh4=P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02dMf02dMgXP?qi00007bV*G`2i^n- z4-683gdnK^00qBEL_t(o!=0C1h+S71hM#w5e$tt#cFd$nCO=RnX*i2kFzzF@NhcPH z26G`v70Lv(rM09NQiLKZH|h2D_>4kjImtF9U8xfa)&3I*Ou6GTULgjWMySb5nep%oSYk_|P286vG>0+zB(TE+u-c-fm z_e4Q_xfSScM|(rEG5~yzI=W;YNt4>e#lDY5ozETiN9P`UkDPrn=32pn%meO?AE9spJe9yRQ&s_1AJ?+dPC1h@>GZ7hzmLdhMzkvXi* z9X^vg{PKP59|cI_|B00lCNf?Yz_GFP^( zL`THjlf=UEQro+CrSbR?p+5kRBds!?vpFX8E8AP@PFh(~SHyY=7*2rR_TYh3HS)6Z zP2hXLka361n%V0*Cb84zDM`P{%F5H#q}DclN6g-&siZCnZu^6|!<$HdPE~vqn8o_A z<-c~VW-~A?^#CEFX9aU0XgGQc-Wx@`Dls^VzwfMK=7hlDz952Pxd1MZOM zL4E;vO447lvQjzMhKVFL6D^WW1)y8fIm0Hw8`1qgF1RmM@oSq7q-%Lu8L*uJgSI*_ zZ)1N^(zz0M=jEbCbSJ=6tNW@ZHEf>-b_(7}Rgjh8VZ>XhiWdPS>&k>)H@aKWDe#cQ zt>9UtS@1KmM$=@`+AyUUhI7r4P(QtHlXx~&u`jMY)~Dn7|| zk(HH?+1gS~iW;U%@`bDn>wr1IDx*@k3z#sh!Tuv+xW)bVH!>l>(cEFA*%t(TsfzjB z;Zw}>LQF=(NdJ(i)uX{ls@mU#?=V~gESNKT*K#-b-=KcXU^D%>!$`y=NmY=lI13zD zkdS5oY~NDtsLe#P)>T!!8P^lg?YYAcQjg?W8v%WYd0E#adMy73{V&%o6Mm03!K%ZbUqQu%z&yaM2XC!sipSf4k z&vREA&FOTi;zl==Ebz|5u^}ByRh$IA6iaWX;X>|kPv#0)88%9O9gtxFGoysEuq__}jznu8%w73uHK~nC>@vQ;sv6*{pdmnl8P~_O zt>8a_-l6V@y@H2rew5qI diff --git a/res/drawable/tilebg.xml b/res/drawable/tilebg.xml deleted file mode 100644 index 6f0d2a3d..00000000 --- a/res/drawable/tilebg.xml +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/res/drawable/toggle.xml b/res/drawable/toggle.xml deleted file mode 100644 index 0f9a36e5..00000000 --- a/res/drawable/toggle.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/res/drawable/tor.png b/res/drawable/tor.png deleted file mode 100644 index 0d63dd97149d9a8207d0972e1368c07030d2a5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4766 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 diff --git a/res/drawable/tor25.png b/res/drawable/tor25.png deleted file mode 100644 index 20b7666c11bed7ed50ebce2eabc73d68fe27166a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2227 zcmV;k2u$~hP)P000>X1^@s6#OZ}&0008+X+uL$Nkc;* zP;zf(X>4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_00nDFL_t(Y z4W(9nY*SSfKkuVmx329r(rq2CGGTz#O${PU*bEs4L~)wY8KY!=TLK0X zB_S%PA%SR2O#6=uYJyR_Oaeif29|vg8MDAPwsvdxKKkD4`|{kkwT^6KOT5YJJ-P4P z-|w8?IrqMTX`1kVo}b#ztlPhHPc^{^g+k11SQJ@Y=%8?*zezQ$cbRSH`Hri{UK10! zE4)leWFo4SZhZBn@9?#d@yp<{8DjynMbHxt+kaU8PN41VkxlvKj?Jq3?`YB~*XIap zn+X9xD~+=;9dE%TVF=Sf2!I!z`@L`$Bv<=}cKf3K$BJTaoLkX5e6wmv zd3AiviY+@!YfEFT;U;@?FqEE41+somxk#4~r${6sv%#S~t16bBaoF6Ti_VX?)Vu(`&(nFIop*`E07 z6wiwy=Ur3?e!r(00rLoGFxX_vWIPwioHfCXq}Zfe(rDjz5g@-8Jip#|`9q&`D%yzj*xEfsbC^UjG2g(nfdJHHshbQL$SL z{Cwfum9KyN_HENlv`_iYIEZ9@MkW~ooT;tPY(4(#FDG|DS^E&Eil!&xJj1dKPzAS4 z_-C=P@$si0$!A@WmA;zy`i3ulh=CcnZ3fX@BvTGpOp4m}!t82>oj56w=R}J{9Y^K5-EzS+Fqf*Zi4BRC9r%RVD{PY)r(x+Muz8@q6 zM)bz0&L6e}EVvh2>^#`<|d1YI+z?}B4 zxsV(eKt-KwP8K974g7=z3a=wk8l;qJA`wW6m_(A1$xOnN6aHpv($qA$cn3P#d%L4| z3JP5`&!sd2v%(lqz7)6$a)CmDQz_XZN=qiliVCW#8?usygdG1JeFvw|vl(Sc@CDYy z`gGnr{YB)nSZo3ci(G6nA*g8tBE5pyAt8W(QVrjpfK<%D(`P7}Lfhl=Ej_AS_=FHp z)CLyGvR}w72`*y$wh$kPT#Ot(b@Ka9c}~V|Wo%uM@@=j7OZtDabnnds1Y zxfep;oQL>de#mz_U|bryGN5)g}0-cOeaFy2T-}W@!3F)D=%;5 zr3;;|8-sML#OdoDm!lnme&ZZs;NKu}E@r=p{{?r7IDH|j_0|9Y002ovPDHLkV1h&s BL9YM+ diff --git a/res/drawable/toroff.png b/res/drawable/toroff.png deleted file mode 100644 index a72790bb13d31e193afda21883a47166bf0b4fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39556 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 z 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ⅈG%7Ofnhl5Frxqyb!`l_C8UxGn^5;K25S8I=V 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